1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 1675897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart 177eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal#include <errno.h> 187eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal#include <stdio.h> 1975897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart#include <time.h> 20b893bed2d3dd98a1fe761b078dcd41fe7bffb0beGaurav Shah#include <unistd.h> 21b893bed2d3dd98a1fe761b078dcd41fe7bffb0beGaurav Shah 2275897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart#include <string> 238f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal#include <vector> 2475897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart 257370e4f0e15e9d08a37a90eb9b28d41885a5d977Samuel Tan#include <base/bind.h> 26ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone#include <base/command_line.h> 27a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/files/file_path.h> 28782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly#include <base/strings/string_number_conversions.h> 29a0ddf46e466bd4ba3d20952f0a6988c680c1af14Ben Chan#include <base/strings/string_split.h> 3003e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko#include <brillo/minijail/minijail.h> 3103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko#include <brillo/syslog_logging.h> 32ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone 3359b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan#include "shill/daemon_task.h" 345a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons#include "shill/error.h" 35b691efd71561246065eae3cdd73a96ca1b8a528dChristopher Wiley#include "shill/logging.h" 36633ac6f0d56a62f8fd21ba7d9a15818fe080fb2fDarin Petkov#include "shill/shill_config.h" 3760ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan#include "shill/shill_daemon.h" 38dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu#include "shill/technology.h" 39dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu 400e1cdeae24dd678a5fe27c840802582c0ca45ec0Albert Chaulkusing base::FilePath; 4175897df1154ac38b7a4512a687241ad6a197ee40Paul Stewartusing std::string; 428f317b600a218afe05f2d73c59204bb98269a950mukesh agrawalusing std::vector; 4375897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart 44ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonenamespace switches { 4575897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart 46ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// Don't daemon()ize; run in foreground. 47ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonestatic const char kForeground[] = "foreground"; 488f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal// Don't attempt to manage these devices. 498f317b600a218afe05f2d73c59204bb98269a950mukesh agrawalstatic const char kDeviceBlackList[] = "device-black-list"; 50c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant// Manage only these devices. 51c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grantstatic const char kDeviceWhiteList[] = "device-white-list"; 5283d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart// Ignore Ethernet-like devices that don't have any driver information. 5383d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewartstatic const char kIgnoreUnknownEthernet[] = "ignore-unknown-ethernet"; 5410e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart// Technologies to enable for portal check at startup. 5510e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewartstatic const char kPortalList[] = "portal-list"; 561d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu// When in passive mode, Shill will not manage any devices by default. 571d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu// Remote service can instruct Shill to manage/unmanage devices through 581d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu// org.chromium.flimflam.Manager's ClaimInterface/ReleaseInterface APIs. 591d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiustatic const char kPassiveMode[] = "passive-mode"; 605a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons// Default priority order of the technologies. 611ce231c71932200e4d02c71567f8e93788120781Paul Stewartstatic const char kTechnologyOrder[] = "default-technology-order"; 62c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly// Comma-separated list of DNS servers to prepend to the resolver list. 63c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kellystatic const char kPrependDNSServers[] = "prepend-dns-servers"; 64782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly// The minimum MTU value that will be respected in DHCP responses. 65782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kellystatic const char kMinimumMTU[] = "minimum-mtu"; 6608add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein// Accept hostname from the DHCP server for the specified devices. 6708add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein// eg. eth0 or eth* 6808add488849f90600a5657a6f54f4dbc34701b8fMatthew Weinstatic const char kAcceptHostnameFrom[] = "accept-hostname-from"; 69d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#ifndef DISABLE_DHCPV6 70d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu// List of devices to enable DHCPv6. 71d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiustatic const char kDhcpv6EnabledDevices[] = "dhcpv6-enabled-devices"; 72d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#endif // DISABLE_DHCPV6 73ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// Flag that causes shill to show the help message and exit. 74ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonestatic const char kHelp[] = "help"; 75ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone 76ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// The help message shown if help flag is passed to the program. 77ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masonestatic const char kHelpMessage[] = "\n" 78ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone "Available Switches: \n" 79ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone " --foreground\n" 80ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone " Don\'t daemon()ize; run in foreground.\n" 818f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal " --device-black-list=device1,device2\n" 828f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal " Do not manage devices named device1 or device2\n" 83c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant " --device-white-list=device1,device2\n" 84c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant " Manage only devices named device1 and device2\n" 8583d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart " --ignore-unknown-ethernet\n" 8683d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart " Ignore Ethernet-like devices that do not report a driver\n" 877ccc8197eb210aaf7f658008ef22d38c0a70fa17Chris Masone " --log-level=N\n" 88156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan " Logging level:\n" 89156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan " 0 = LOG(INFO), 1 = LOG(WARNING), 2 = LOG(ERROR),\n" 90156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan " -1 = SLOG(..., 1), -2 = SLOG(..., 2), etc.\n" 91156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan " --log-scopes=\"*scope1+scope2\".\n" 92156e73f6800eca070d2e3c2a7d40c281c77ecac1Ben Chan " Scopes to enable for SLOG()-based logging.\n" 9310e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart " --portal-list=technology1,technology2\n" 941d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu " Specify technologies to perform portal detection on at startup.\n" 951d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu " --passive-mode\n" 965a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons " Do not manage any devices by default\n" 975a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons " --default-technology-order=technology1,technology2\n" 98c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly " Specify the default priority order of the technologies.\n" 99c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly " --prepend-dns-servers=server1,server2,...\n" 100782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly " Prepend the provided DNS servers to the resolver list.\n" 10108add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein " --accept-hostname-from=eth0 or --accept-hostname-from=eth*\n" 10208add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein " Accept a hostname from the DHCP server for the matching devices.\n" 103d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#ifndef DISABLE_DHCPV6 104d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu " --dhcpv6-enabled-devices=device1,device2\n" 105d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu " Enable DHCPv6 for devices named device1 and device2\n" 106d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#endif // DISABLE_DHCPV6 107782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly " --minimum-mtu=mtu\n" 108782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly " Set the minimum value to respect as the MTU from DHCP responses.\n"; 109ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone} // namespace switches 11075897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart 1117eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawalnamespace { 1127eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal 113ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#if !defined(__ANDROID__) 1141a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewartconst char* kLoggerCommand = "/usr/bin/logger"; 1151a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewartconst char* kLoggerUser = "syslog"; 116ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#endif // __ANDROID__ 117ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu 1181a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewartconst char* kDefaultTechnologyOrder = "vpn,ethernet,wifi,wimax,cellular"; 1197eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal 1207eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal} // namespace 1217eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal 122ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// Always logs to the syslog and logs to stderr if 123ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone// we are running in the foreground. 124dde57ef146d3868130cd8597e805b42395440c9aPeter Qiuvoid SetupLogging(bool foreground, const char* daemon_name) { 125ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone int log_flags = 0; 12603e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko log_flags |= brillo::kLogToSyslog; 12703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko log_flags |= brillo::kLogHeader; 128ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone if (foreground) { 12903e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko log_flags |= brillo::kLogToStderr; 13075897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart } 13103e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko brillo::InitLog(log_flags); 1327eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal 133ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#if !defined(__ANDROID__) 134ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu // Logger utility doesn't exist on Android, so do not run it on Android. 135ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu // TODO(zqiu): add support to redirect stderr logs from child processes 136ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu // to Android logging facility. 1377eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal if (!foreground) { 1381a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart vector<char*> logger_command_line; 1397eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal int logger_stdin_fd; 1401a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart logger_command_line.push_back(const_cast<char*>(kLoggerCommand)); 1411a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart logger_command_line.push_back(const_cast<char*>("--priority")); 1421a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart logger_command_line.push_back(const_cast<char*>("daemon.err")); 1431a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart logger_command_line.push_back(const_cast<char*>("--tag")); 144dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu logger_command_line.push_back(const_cast<char*>(daemon_name)); 145cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan logger_command_line.push_back(nullptr); 1468c1706f09b15e6140b89b9a49cd599d8050380d5Jorge Lucangeli Obes 14703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko brillo::Minijail* minijail = brillo::Minijail::GetInstance(); 1481a212a6b98b22ad1d69652bb26a9e94138635476Paul Stewart struct minijail* jail = minijail->New(); 149e4c6aff3afa8eec213691e6ab1941d6dd6463ce0Utkarsh Sanghi minijail->DropRoot(jail, kLoggerUser, kLoggerUser); 1508c1706f09b15e6140b89b9a49cd599d8050380d5Jorge Lucangeli Obes 151cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan if (!minijail->RunPipeAndDestroy(jail, logger_command_line, nullptr, 152cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan &logger_stdin_fd)) { 1537eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal LOG(ERROR) << "Unable to spawn logger. " 1547eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal << "Writes to stderr will be discarded."; 1557eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal return; 1567eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal } 1577eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal 1587eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal // Note that we don't set O_CLOEXEC here. This means that stderr 1597eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal // from any child processes will, by default, be logged to syslog. 1607eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal if (dup2(logger_stdin_fd, fileno(stderr)) != fileno(stderr)) { 161af19870a5717a0a9f05c4fd957d4a05f48b8b090Alex Deymo PLOG(ERROR) << "Failed to redirect stderr to syslog"; 1627eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal } 1637eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal close(logger_stdin_fd); 1647eb028996873abf5813bbedbff35df0cb78580cbmukesh agrawal } 165ddce70da26f410225a977bc7d9f651f279a5a5b4Peter Qiu#endif // __ANDROID__ 166ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone} 167ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone 168dde57ef146d3868130cd8597e805b42395440c9aPeter Qiuvoid OnStartup(const char *daemon_name, base::CommandLine* cl) { 169dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu SetupLogging(cl->HasSwitch(switches::kForeground), daemon_name); 170dde57ef146d3868130cd8597e805b42395440c9aPeter Qiu shill::SetLogLevelFromCommandLine(cl); 1711271d6828b226f951fa69ed9927fa7c9a358318aThieu Le} 1721271d6828b226f951fa69ed9927fa7c9a358318aThieu Le 173ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masoneint main(int argc, char** argv) { 174127f2565a985650963d6109fc3a32c3da6a17d32Alex Vakulenko base::CommandLine::Init(argc, argv); 175127f2565a985650963d6109fc3a32c3da6a17d32Alex Vakulenko base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); 176ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone 177ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone if (cl->HasSwitch(switches::kHelp)) { 178ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone LOG(INFO) << switches::kHelpMessage; 179ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone return 0; 180ee929b7ab2a89bbf2d1aecf85bbd49e53fbea059Chris Masone } 181b716325521ef1229161198dcb6917b1dfc0a78ccPaul Stewart 18259b397b6ac7fa39edf26d8e0ff2ecac6ac8ebc5bSamuel Tan shill::DaemonTask::Settings settings; 1831ce231c71932200e4d02c71567f8e93788120781Paul Stewart if (cl->HasSwitch(switches::kTechnologyOrder)) { 1845a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons shill::Error error; 1855a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons string order_flag = cl->GetSwitchValueASCII( 1861ce231c71932200e4d02c71567f8e93788120781Paul Stewart switches::kTechnologyOrder); 1871ce231c71932200e4d02c71567f8e93788120781Paul Stewart vector<shill::Technology::Identifier> test_order_vector; 1881ce231c71932200e4d02c71567f8e93788120781Paul Stewart if (shill::Technology::GetTechnologyVectorFromString( 1891ce231c71932200e4d02c71567f8e93788120781Paul Stewart order_flag, &test_order_vector, &error)) { 1901ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.default_technology_order = order_flag; 1911ce231c71932200e4d02c71567f8e93788120781Paul Stewart } else { 1925a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons LOG(ERROR) << "Invalid default technology order: [" << order_flag 1935a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons << "] Error: " << error.message(); 1945a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons } 1955a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons } 1961ce231c71932200e4d02c71567f8e93788120781Paul Stewart if (settings.default_technology_order.empty()) { 1971ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.default_technology_order = kDefaultTechnologyOrder; 1985a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons } 1995a2097c0f4db1704dd5b7b0b874b669bb21c42adJason Simmons 2008f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal if (cl->HasSwitch(switches::kDeviceBlackList)) { 2013a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko settings.device_blacklist = base::SplitString( 2023a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko cl->GetSwitchValueASCII(switches::kDeviceBlackList), ",", 2033a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 2048f317b600a218afe05f2d73c59204bb98269a950mukesh agrawal } 2051271d6828b226f951fa69ed9927fa7c9a358318aThieu Le 206c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant if (cl->HasSwitch(switches::kDeviceWhiteList)) { 2073a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko settings.device_whitelist = base::SplitString( 2083a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko cl->GetSwitchValueASCII(switches::kDeviceWhiteList), ",", 2093a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 210c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant } 211c1d447354db29b83262c7db0857baa84e05e0c2aChristopher Grant 2121ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.ignore_unknown_ethernet = 2131ce231c71932200e4d02c71567f8e93788120781Paul Stewart cl->HasSwitch(switches::kIgnoreUnknownEthernet); 21483d625655edbc7c35fc436b8b8fe744886d0aae1Paul Stewart 21510e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart if (cl->HasSwitch(switches::kPortalList)) { 2161ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.use_portal_list = true; 2171ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.portal_list = cl->GetSwitchValueASCII(switches::kPortalList); 21810e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart } 21910e9e4e93537a0673524d47535cbf0f723470a0dPaul Stewart 2201ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.passive_mode = cl->HasSwitch(switches::kPassiveMode); 2211d499ed2d5eede24f55c7f6b8aaba06136ef4f22Peter Qiu 222c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly if (cl->HasSwitch(switches::kPrependDNSServers)) { 2231ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.prepend_dns_servers = 2241ce231c71932200e4d02c71567f8e93788120781Paul Stewart cl->GetSwitchValueASCII(switches::kPrependDNSServers); 225c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly } 226c5f89d131e5b03f448b73fd02d16cab30e438521Garret Kelly 227782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly if (cl->HasSwitch(switches::kMinimumMTU)) { 228782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly int mtu; 229782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly std::string value = cl->GetSwitchValueASCII(switches::kMinimumMTU); 230782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly if (!base::StringToInt(value, &mtu)) { 231782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly LOG(FATAL) << "Could not convert '" << value << "' to integer."; 232782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly } 2331ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.minimum_mtu = mtu; 234782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly } 235782cdcea789d76a7ad7802cf9410b14a2399c0a9Garret Kelly 23608add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein if (cl->HasSwitch(switches::kAcceptHostnameFrom)) { 2371ce231c71932200e4d02c71567f8e93788120781Paul Stewart settings.accept_hostname_from = 2381ce231c71932200e4d02c71567f8e93788120781Paul Stewart cl->GetSwitchValueASCII(switches::kAcceptHostnameFrom); 23908add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein } 24008add488849f90600a5657a6f54f4dbc34701b8fMatthew Wein 241d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#ifndef DISABLE_DHCPV6 242d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu if (cl->HasSwitch(switches::kDhcpv6EnabledDevices)) { 2433a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko settings.dhcpv6_enabled_devices = base::SplitString( 2443a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko cl->GetSwitchValueASCII(switches::kDhcpv6EnabledDevices), ",", 2453a62e235646ec19bee71e8dbee5208282dcd13b5Alex Vakulenko base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); 246d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu } 247d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu#endif // DISABLE_DHCPV6 248d48fa0c5531e2102d4f537e81b9f92afc2d60955Peter Qiu 2491ce231c71932200e4d02c71567f8e93788120781Paul Stewart shill::Config config; 2501ce231c71932200e4d02c71567f8e93788120781Paul Stewart 25160ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan shill::ShillDaemon daemon(base::Bind(&OnStartup, argv[0], cl), settings, 25260ea15d40a3ad77536e01f2bb780181aa9c3c084Samuel Tan &config); 253646c7e891789ea8abadd9e88bdd625d8bea2536dSamuel Tan daemon.Run(); 25475897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart 2558dc5e7b99920ab79d2bee7f99fec9fa5765fda68Paul Stewart LOG(INFO) << "Process exiting."; 2568dc5e7b99920ab79d2bee7f99fec9fa5765fda68Paul Stewart 25775897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart return 0; 25875897df1154ac38b7a4512a687241ad6a197ee40Paul Stewart} 259