CommandListener.cpp revision ae37e8a4f42b658d5aaf43f312f063944b4aeecb
1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/* 2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Copyright (C) 2008 The Android Open Source Project 3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * you may not use this file except in compliance with the License. 6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * You may obtain a copy of the License at 7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Unless required by applicable law or agreed to in writing, software 11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * See the License for the specific language governing permissions and 14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * limitations under the License. 15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 171fb02dfc26e06b83e756ab3538b7ebc2136f535dJP Abgrall// #define LOG_NDEBUG 0 18db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/socket.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <netinet/in.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <arpa/inet.h> 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 26ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 28a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak#include <resolv_netid.h> 295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 302a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach#define __STDC_FORMAT_MACROS 1 312a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach#include <inttypes.h> 322a54d96c5ae809216965e6f86e70cdae2ed7e09cMatthew Leach 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 351ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti#include <cutils/log.h> 361ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti#include <netutils/ifc.h> 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 38d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 39d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 40d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 414a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include "BandwidthController.h" 420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall#include "IdletimerController.h" 43fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt#include "SecondaryTableController.h" 440031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall#include "oem_iptables_hook.h" 458e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey#include "NetdConstants.h" 46d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey#include "FirewallController.h" 475c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran#include "PermissionsController.h" 485c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran#include "RouteController.h" 495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 505c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran#include <string> 515c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran#include <vector> 525c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 53379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandrannamespace { 54379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 55379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran// Parses string permissions in argv[*nextArg], argv[*nextArg + 1], etc. and converts them into a 56379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran// Permission enum. On return, nextArg will point to one past the last valid permissions string. 57379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram RamachandranPermission parseMultiplePermissions(int argc, char** argv, int* nextArg) { 58379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran Permission permission = PERMISSION_NONE; 59379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran for (; *nextArg < argc; ++*nextArg) { 60379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran Permission p = permissionFromString(argv[*nextArg]); 61379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (p == PERMISSION_NONE) { 62379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran break; 63379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 64379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran permission = static_cast<Permission>(permission | p); 65379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 66379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return permission; 67379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran} 68379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 69379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran} // namespace 70379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 715c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram RamachandranPermissionsController* CommandListener::sPermissionsController = NULL; 725c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram RamachandranRouteController* CommandListener::sRouteController = NULL; 73a0efaece8c05370f201efe099a537ceb014c6fdfSzymon JakubczakNetworkController *CommandListener::sNetCtrl = NULL; 749d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 759ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 76d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 775af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 784a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 790031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallIdletimerController * CommandListener::sIdletimerCtrl = NULL; 802eab1f762badb7ba46b95716e62ea4548a979903Dmitry ShmidtInterfaceController *CommandListener::sInterfaceCtrl = NULL; 8189c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 82fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert GreenwaltSecondaryTableController *CommandListener::sSecondaryTableCtrl = NULL; 83d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyFirewallController *CommandListener::sFirewallCtrl = NULL; 840da73fcecc30140439f856118056df8908609627Daniel DrownClatdController *CommandListener::sClatdCtrl = NULL; 859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 868e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey/** 878e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * List of module chains to be created, along with explicit ordering. ORDERING 888e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * IS CRITICAL, AND SHOULD BE TRIPLE-CHECKED WITH EACH CHANGE. 898e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey */ 908e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_INPUT[] = { 91d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey // Bandwidth should always be early in input chain, to make sure we 92d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey // correctly count incoming traffic against data plan. 938e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_INPUT, 94d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_INPUT, 958e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 968e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 978e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 988e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_FORWARD[] = { 998e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_FILTER_FORWARD, 100d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_FORWARD, 1018e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_FORWARD, 1028e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NatController::LOCAL_FORWARD, 1038e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1048e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1058e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1068e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_OUTPUT[] = { 1078e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_FILTER_OUTPUT, 108d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_OUTPUT, 1098e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_OUTPUT, 1108e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1118e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1128e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1138e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* RAW_PREROUTING[] = { 1148e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_RAW_PREROUTING, 1155c4faf7602de0268aa09a3a525b427f83d617b5cHaoyu Bai IdletimerController::LOCAL_RAW_PREROUTING, 1168e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1178e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1188e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1198e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* MANGLE_POSTROUTING[] = { 1208e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_MANGLE_POSTROUTING, 1215c4faf7602de0268aa09a3a525b427f83d617b5cHaoyu Bai IdletimerController::LOCAL_MANGLE_POSTROUTING, 1229440e7f994901ca123393844c95fe5caa6639a3bJP Abgrall SecondaryTableController::LOCAL_MANGLE_POSTROUTING, 1238e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1248e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1258e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1269a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubakerstatic const char* MANGLE_OUTPUT[] = { 1279a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker SecondaryTableController::LOCAL_MANGLE_OUTPUT, 1289a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker NULL, 1299a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker}; 1309a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker 1318e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* NAT_PREROUTING[] = { 1328e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_NAT_PREROUTING, 1338e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1348e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1358e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1368e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* NAT_POSTROUTING[] = { 1378e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NatController::LOCAL_NAT_POSTROUTING, 1387a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker SecondaryTableController::LOCAL_NAT_POSTROUTING, 1398e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1408e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1418e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1428e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic void createChildChains(IptablesTarget target, const char* table, const char* parentChain, 1438e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey const char** childChains) { 1448e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey const char** childChain = childChains; 1458e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey do { 1468e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Order is important: 1478e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -D to delete any pre-existing jump rule (removes references 1488e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // that would prevent -X from working) 1498e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -F to flush any existing chain 1508e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -X to delete any existing chain 1518e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -N to create the chain 1528e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -A to append the chain to parent 1538e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1548e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-D", parentChain, "-j", *childChain, NULL); 1558e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-F", *childChain, NULL); 1568e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-X", *childChain, NULL); 1578e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptables(target, "-t", table, "-N", *childChain, NULL); 1588e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptables(target, "-t", table, "-A", parentChain, "-j", *childChain, NULL); 1598e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey } while (*(++childChain) != NULL); 1608e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey} 1618e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 162a0efaece8c05370f201efe099a537ceb014c6fdfSzymon JakubczakCommandListener::CommandListener() : 163a8e59f8c50aed3f91dead377b8ae21646978506cRobert Greenwalt FrameworkListener("netd", true) { 1645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 165d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 166d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 167d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 168d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 169d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 1705af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 1714a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 1720031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall registerCmd(new IdletimerControlCmd()); 17389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 174d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey registerCmd(new FirewallCmd()); 1750da73fcecc30140439f856118056df8908609627Daniel Drown registerCmd(new ClatdCmd()); 1765c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran registerCmd(new NetworkCommand()); 1779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 1785c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran if (!sPermissionsController) 1795c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran sPermissionsController = new PermissionsController(); 1805c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran if (!sRouteController) 1815c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran sRouteController = new RouteController(); 182a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak if (!sNetCtrl) 1835c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran sNetCtrl = new NetworkController(sPermissionsController, sRouteController); 184fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!sSecondaryTableCtrl) 185a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak sSecondaryTableCtrl = new SecondaryTableController(sNetCtrl); 1869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 1879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 1889ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 189a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak sNatCtrl = new NatController(sSecondaryTableCtrl, sNetCtrl); 190d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 191d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 1925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 1935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 1944a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 1954a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 1960031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!sIdletimerCtrl) 1970031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl = new IdletimerController(); 19889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 19989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 200d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!sFirewallCtrl) 201d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey sFirewallCtrl = new FirewallController(); 2022eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (!sInterfaceCtrl) 2032eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt sInterfaceCtrl = new InterfaceController(); 2040da73fcecc30140439f856118056df8908609627Daniel Drown if (!sClatdCtrl) 2050da73fcecc30140439f856118056df8908609627Daniel Drown sClatdCtrl = new ClatdController(); 2060031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 2070031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 2088e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * This is the only time we touch top-level chains in iptables; controllers 2098e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * should only mutate rules inside of their children chains, as created by 2108e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * the constants above. 2118e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * 2128e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * Modules should never ACCEPT packets (except in well-justified cases); 2138e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * they should instead defer to any remaining modules using RETURN, or 2148e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * otherwise DROP/REJECT. 2150031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2168e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 2178e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Create chains for children modules 2188e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "INPUT", FILTER_INPUT); 2198e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "FORWARD", FILTER_FORWARD); 2208e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "OUTPUT", FILTER_OUTPUT); 2218e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "raw", "PREROUTING", RAW_PREROUTING); 2228e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "mangle", "POSTROUTING", MANGLE_POSTROUTING); 2239a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker createChildChains(V4V6, "mangle", "OUTPUT", MANGLE_OUTPUT); 2248e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4, "nat", "PREROUTING", NAT_PREROUTING); 2258e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4, "nat", "POSTROUTING", NAT_POSTROUTING); 2268e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 2278e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Let each module setup their child chains 2280031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall setupOemIptablesHook(); 2298e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 230d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey /* When enabled, DROPs all packets except those matching rules. */ 231d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey sFirewallCtrl->setupIptablesHooks(); 232d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 2330031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* Does DROPs in FORWARD by default */ 2340031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sNatCtrl->setupIptablesHooks(); 2350031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 2360031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Does REJECT in INPUT, OUTPUT. Does counting also. 2370031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 2380031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2390031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->setupIptablesHooks(); 2400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 2410031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Counts in nat: PREROUTING, POSTROUTING. 2420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 2430031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2440031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl->setupIptablesHooks(); 2450031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 2460031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->enableBandwidthControl(false); 2472251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker 2482251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker sSecondaryTableCtrl->setupIptablesHooks(); 2498fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran 2508fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran sRouteController->Init(); 251d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 252d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 2535c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 2545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 255d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 256d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 2575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 258d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 2595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 2605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2635c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 2655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 2665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 2675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 2695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 2705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 2745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 2755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 2765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 2775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 2795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 2805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2812eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } else if (!strcmp(argv[1], "driver")) { 2822eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt int rc; 2832eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt char *rbuf; 2842eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt 2852eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (argc < 4) { 2862eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, 2872eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt "Usage: interface driver <interface> <cmd> <args>", false); 2882eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt return 0; 2892eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } 2902eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt rc = sInterfaceCtrl->interfaceCommand(argc, argv, &rbuf); 2912eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (rc) { 2922eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to execute command", true); 2932eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } else { 2942eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, rbuf, false); 2952eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } 2962eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt return 0; 2975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 2995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 3005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 305e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 3068830b94cf4824e5a6c738d39d3015c8eec976352Chad Brubaker // 0 1 2 3 4 5 6 7 3078830b94cf4824e5a6c738d39d3015c8eec976352Chad Brubaker // interface route add/remove iface default/secondary dest prefix gateway 3082251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker // interface fwmark rule add/remove iface 3092251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker // interface fwmark route add/remove iface dest prefix 31035c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen // interface fwmark uid add/remove iface uid_start uid_end forward_dns 3114a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker // interface fwmark exempt add/remove dest 312da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker // interface fwmark get protect 313da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker // interface fwmark get mark uid 3142251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[1], "fwmark")) { 3152251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[2], "rule")) { 3167a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (argc < 5) { 3177a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3187a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker return 0; 3197a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3207a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (!strcmp(argv[3], "add")) { 3217a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (!sSecondaryTableCtrl->addFwmarkRule(argv[4])) { 3222251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3232251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark rule successfully added", false); 3247a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else { 3257a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker cli->sendMsg(ResponseCode::OperationFailed, "Failed to add fwmark rule", 3267a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker true); 3277a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3287a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else if (!strcmp(argv[3], "remove")) { 3297a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (!sSecondaryTableCtrl->removeFwmarkRule(argv[4])) { 3302251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3312251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark rule successfully removed", false); 3327a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else { 3332251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3342251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Failed to remove fwmark rule", true); 3357a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3367a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else { 3372251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark rule cmd", 3382251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker false); 3397a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3407a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker return 0; 3412251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else if (!strcmp(argv[2], "route")) { 3422251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (argc < 7) { 3432251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3442251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return 0; 3452251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3462251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[3], "add")) { 3472251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!sSecondaryTableCtrl->addFwmarkRoute(argv[4], argv[5], atoi(argv[6]))) { 3482251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3492251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark route successfully added", false); 3502251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 3512251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3522251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Failed to add fwmark route", true); 3532251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3542251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else if (!strcmp(argv[3], "remove")) { 3552251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!sSecondaryTableCtrl->removeFwmarkRoute(argv[4], argv[5], 3562251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker atoi(argv[6]))) { 3572251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3582251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark route successfully removed", false); 3592251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 3602251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3612251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Failed to remove fwmark route", true); 3622251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3632251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 3642251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark route cmd", 3652251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker false); 3662251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3672251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return 0; 3682251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker 3692251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else if (!strcmp(argv[2], "uid")) { 37035c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen if (argc < 8) { 3719a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3729a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker return 0; 3739a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } 3749a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker if (!strcmp(argv[3], "add")) { 37535c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen if (!sSecondaryTableCtrl->addUidRule(argv[4], atoi(argv[5]), atoi(argv[6]), 37635c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen atoi(argv[7]))) { 3779a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, "uid rule successfully added", 3789a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker false); 3799a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } else { 3809a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, "Failed to add uid rule", true); 3819a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } 3829a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } else if (!strcmp(argv[3], "remove")) { 3838830b94cf4824e5a6c738d39d3015c8eec976352Chad Brubaker if (!sSecondaryTableCtrl->removeUidRule(argv[4], 3848830b94cf4824e5a6c738d39d3015c8eec976352Chad Brubaker atoi(argv[5]), atoi(argv[6]))) { 3859a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, "uid rule successfully removed", 3869a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker false); 3879a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } else { 3889a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove uid rule", 3899a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker true); 3909a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } 3919a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } else { 3929a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown uid cmd", false); 3939a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } 3949a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker return 0; 3954a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else if (!strcmp(argv[2], "exempt")) { 3964a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (argc < 5) { 3974a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3984a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker return 0; 3994a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 4004a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (!strcmp(argv[3], "add")) { 4014a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (!sSecondaryTableCtrl->addHostExemption(argv[4])) { 4024a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandOkay, "exemption rule successfully added", 4034a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker false); 4044a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else { 4054a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::OperationFailed, "Failed to add exemption rule", 4064a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker true); 4074a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 4084a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else if (!strcmp(argv[3], "remove")) { 4094a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (!sSecondaryTableCtrl->removeHostExemption(argv[4])) { 4104a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 4114a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker "exemption rule successfully removed", false); 4124a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else { 4134a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 4144a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker "Failed to remove exemption rule", true); 4154a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 4164a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else { 4174a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown exemption cmd", false); 4184a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 4194a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker return 0; 420da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } else if (!strcmp(argv[2], "get")) { 421da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker if (argc < 4) { 422da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 423da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 424da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } 425da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker if (!strcmp(argv[3], "protect")) { 426da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker sSecondaryTableCtrl->getProtectMark(cli); 427da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 428da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } else if (!strcmp(argv[3], "mark")) { 429da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker if (argc < 5) { 430da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 431da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 432da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } 433da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker sSecondaryTableCtrl->getUidMark(cli, atoi(argv[4])); 434da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 435da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } else { 436da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark get cmd", false); 437da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 438da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } 4392251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 4402251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark cmd", false); 4412251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return 0; 4429a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } 4432251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 4442251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[1], "route")) { 4452251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker int prefix_length = 0; 446fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 8) { 447e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 448e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 449e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 450fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (sscanf(argv[6], "%d", &prefix_length) != 1) { 451e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 452e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 453e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 454e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 455fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 456fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_add_route(argv[3], argv[5], prefix_length, argv[7])) { 457fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 458fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to add route to default table", true); 459fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 460fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 461fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route added to default table", false); 462fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 463fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 464fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->addRoute(cli, argv[3], argv[5], 465fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 466e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 467fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 468fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 469fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 470e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 471e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 472fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 473fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_remove_route(argv[3], argv[5], prefix_length, argv[7])) { 474fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 475fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to remove route from default table", true); 476fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 477fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 478fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route removed from default table", false); 479fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 480fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 481fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->removeRoute(cli, argv[3], argv[5], 482fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 483e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 484fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 485fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 486fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 487e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 488e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 489e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 490e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 491e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 492e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 493e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 4945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 4951d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 4961d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 4975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 4985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 4995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 5015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 5025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5031d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 5045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 505e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 5100e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 5115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 5145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 5155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 5175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 5185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 5195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 5205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 5215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 5225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 5245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 52531ea0b03afeedd17f703b7a6d1e5c9feb2d6000dJeff Sharkey asprintf(&flag_s, "%s%s%s%s%s%s", updown, brdcst, loopbk, ppp, running, multi); 5265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 5281d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 5295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 5301d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 5315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 53201fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 5335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 5355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 5365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 537e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 538e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 541778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // arglist: iface [addr prefixLength] flags 542778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (argc < 4) { 5435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5467b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Setting iface cfg"); 5475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5481d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 5495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 550778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt int index = 5; 5515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 5535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 554778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (!inet_aton(argv[3], &addr)) { 555778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // Handle flags only case 556778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt index = 3; 557778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } else { 558778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (ifc_set_addr(argv[2], addr.s_addr)) { 559778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 560778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt ifc_close(); 561778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt return 0; 562778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } 563778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt 564778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // Set prefix length on a non zero address 565778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 566778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 567778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt ifc_close(); 568778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt return 0; 569778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } 5705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 573778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt for (int i = index; i < argc; i++) { 574e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 575e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 5767b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring up %s", argv[2]); 5775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 5785ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error upping interface"); 5795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 580e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 583e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 5847b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring down %s", argv[2]); 5855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 5865ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error downing interface"); 5875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 588e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 591e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 5927c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 593e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 5947c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5957c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "running")) { 5967c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5977c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "loopback")) { 5987c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5997c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "point-to-point")) { 6007c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 6015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 6025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 603e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 6045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 6055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 6065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 607e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 6085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 609e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 610e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 611e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 612e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 6137b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Clearing all IP addresses on %s", argv[2]); 614e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 6151ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti ifc_clear_addresses(argv[2]); 6161ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti 617e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 6185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 61932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 62032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 62132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 62232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 62332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 62432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 62532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 62670afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti int enable = !strncmp(argv[3], "enable", 7); 62770afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti if (sInterfaceCtrl->setIPv6PrivacyExtensions(argv[2], enable) == 0) { 62870afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 62970afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti } else { 63032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 63132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 63232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 633c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 634c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } else if (!strcmp(argv[1], "ipv6")) { 635c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (argc != 4) { 636c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandSyntaxError, 637c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Usage: interface ipv6 <interface> <enable|disable>", 638c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync false); 639c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 640c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 641c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 64270afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti int enable = !strncmp(argv[3], "enable", 7); 64370afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti if (sInterfaceCtrl->setEnableIPv6(argv[2], enable) == 0) { 64470afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti cli->sendMsg(ResponseCode::CommandOkay, "IPv6 state changed", false); 64570afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti } else { 64632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 647c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Failed to change IPv6 state", true); 64832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 64932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 6506d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else if (!strcmp(argv[1], "getmtu")) { 6516d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt char *msg = NULL; 6526d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt int mtu = 0; 6536d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt if (sInterfaceCtrl->getMtu(argv[2], &mtu) == 0) { 6546d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt asprintf(&msg, "MTU = %d", mtu); 6556d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::InterfaceGetMtuResult, msg, false); 6566d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt free(msg); 6576d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else { 6586d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, 6596d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt "Failed to get MTU", true); 6606d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } 6616d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt return 0; 6626d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else if (!strcmp(argv[1], "setmtu")) { 6636d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt if (argc != 4) { 6646d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, 6656d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt "Usage: interface setmtu <interface> <val>", false); 6666d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt return 0; 6676d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } 6686d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt if (sInterfaceCtrl->setMtu(argv[2], argv[3]) == 0) { 6696d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "MTU changed", false); 6706d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else { 6716d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, 6726d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt "Failed to get MTU", true); 6736d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } 6746d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt return 0; 6755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 6765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 6775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 6785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 6795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 680d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 681d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 682d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 6834a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 684d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 685d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 686d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 687d5573d34c8fac49e16b20cf144486125bf940086San Mehat 688d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 689d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 690d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 691d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 692d5573d34c8fac49e16b20cf144486125bf940086San Mehat 693d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 694d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 695d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 696d5573d34c8fac49e16b20cf144486125bf940086San Mehat 697d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 698d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 699d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 700d5573d34c8fac49e16b20cf144486125bf940086San Mehat 701d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 702d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 703d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 704d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 705d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 706d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 7079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 7089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 7109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 7119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 7159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 7169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 7189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 7199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 7209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 7229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 7239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 7249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 7259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 7279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 7319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 7329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 7349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 735d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 736d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 737d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 738d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 739d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 740d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 741d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 742d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 743d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 744d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 7459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 7469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 747d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 748d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 749d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 750d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 751d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 7529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 7539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 754d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 7559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 7569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 7589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 7599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 7609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 761d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 76236971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } else if (argc == 3) { 76336971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall if (!strcmp(argv[1], "interface") && !strcmp(argv[2], "list")) { 76436971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 76536971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall InterfaceCollection::iterator it; 76636971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall for (it = ilist->begin(); it != ilist->end(); ++it) { 76736971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 76836971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } 76936971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } else if (!strcmp(argv[1], "dns") && !strcmp(argv[2], "list")) { 77036971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 77136971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall NetAddressCollection::iterator it; 77236971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall 77336971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall for (it = dlist->begin(); it != dlist->end(); ++it) { 77436971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 77536971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } 77620f95ed9db048261c18bbeb152d3204d9cbb58f1JP Abgrall } 7779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 7799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 7809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 7819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 7829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 7839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 7873208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 7883208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 7899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7913208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 7923208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 7933208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 7943208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 7953208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 7963208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 7973208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 7983208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 7993208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 8003208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 8013208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 8029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8033208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 8043208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 8059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 8069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 8079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 8089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 8099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 81020f95ed9db048261c18bbeb152d3204d9cbb58f1JP Abgrall /* else if (!strcmp(argv[2], "list")) handled above */ 8119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 8139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 8149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 8179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 8189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 81936971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall /* else if (!strcmp(argv[2], "list")) handled above */ 8209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 8229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 8239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 8279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 8319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 8329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 8339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 835d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 836d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 837d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 838d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 839d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 840d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 841d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 842d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 843d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 844d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 845d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 8469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 8479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 848fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 5) { 8499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 8509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 8539ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 854fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sNatCtrl->enableNat(argc, argv); 855c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if(!rc) { 856c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* Ignore ifaces for now. */ 857c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 858c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 8599ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 860f7bf29c8a37d65e132a4dceb7c5a4200ed5c3d79Robert Greenwalt /* Ignore ifaces for now. */ 861fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 862fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc |= sNatCtrl->disableNat(argc, argv); 8639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 8659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 8689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 8699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 8709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 8729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 873d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 874d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 875d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 876d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 877d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 878d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 879d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 880d5573d34c8fac49e16b20cf144486125bf940086San Mehat 881d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 882d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 883d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 884d5573d34c8fac49e16b20cf144486125bf940086San Mehat 885d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 886d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 887d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 888d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 889d5573d34c8fac49e16b20cf144486125bf940086San Mehat 890d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 89174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 89274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 8931c4a77955acdb730d017b15e9a92ca511e6ca106Wang Liyong memset(&dns1, 0, sizeof(struct in_addr)); 8941c4a77955acdb730d017b15e9a92ca511e6ca106Wang Liyong memset(&dns2, 0, sizeof(struct in_addr)); 895d5573d34c8fac49e16b20cf144486125bf940086San Mehat 896d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 897d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 898d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 899d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 900d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 901d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 902d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 903d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 90474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 90574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 90674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 90774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 90874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 90974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 91074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 91174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 91274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 913d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 914d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 915d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 916d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 917d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 918d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 919d5573d34c8fac49e16b20cf144486125bf940086San Mehat 920d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 921d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 922d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 923d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 924d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 925d5573d34c8fac49e16b20cf144486125bf940086San Mehat 926d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 927d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 9281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 9295af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 9305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 9315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 9325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 9345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 93525753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy int rc = ResponseCode::SoftapStatusResult; 93625753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy int flag = 0; 937666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 9385af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 93925753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy if (sSoftapCtrl == NULL) { 94025753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(ResponseCode::ServiceStartFailed, "SoftAP is not available", false); 94125753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy return -1; 94225753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy } 9435af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 94425753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(ResponseCode::CommandSyntaxError, 94525753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy "Missing argument in a SoftAP command", false); 9465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9475af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 9485af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9497e9eb7b48345af69283afa7ca58d3be0a329931bIrfan Sheriff if (!strcmp(argv[1], "startap")) { 950c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 951c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 9525af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 95331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 95431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 9555af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 95625753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy asprintf(&retbuf, "Softap service %s running", 95725753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy (sSoftapCtrl->isSoftapStarted() ? "is" : "is not")); 95825753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(rc, retbuf, false); 959666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 9605af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9615af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 9625af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 9635af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 96425753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(ResponseCode::CommandSyntaxError, "Unrecognized SoftAP command", false); 9655af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9665af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 9675af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 96825753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy if (rc >= 400 && rc < 600) 96925753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(rc, "SoftAP command has failed", false); 97025753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy else 97125753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(rc, "Ok", false); 9725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9745af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 9753e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 97689c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 97789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 97889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 97989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 980938ab2acc65ea12e84d66e5bc3f8166482d2165bSasha Levitskiyint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **margv) { 98189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 98289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 983938ab2acc65ea12e84d66e5bc3f8166482d2165bSasha Levitskiy const char **argv = const_cast<const char **>(margv); 98489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 98589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 98689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 98789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 98889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 98989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 99035c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen if (!strcmp(argv[1], "setnetdns")) { 99135c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen // "resolver setnetdns <netId> <domains> <dns1> <dns2> ..." 992dd3e46758b500d5e8c61ed30f7402e8538df7e06Robert Greenwalt if (argc >= 5) { 99335c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen rc = sResolverCtrl->setDnsServers(strtoul(argv[2], NULL, 0), argv[3], &argv[4], argc - 4); 99489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 99589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 99635c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen "Wrong number of arguments to resolver setnetdns", false); 99789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 99889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 99935c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen } else if (!strcmp(argv[1], "flushnet")) { // "resolver flushnet <netId>" 10002d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (argc == 3) { 100135c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen rc = sResolverCtrl->flushDnsCache(strtoul(argv[2], NULL, 0)); 100269f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker } else { 100369f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, 100435c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen "Wrong number of arguments to resolver flushnet", false); 100569f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker return 0; 100669f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker } 100789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 100889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 100989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 101089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 101189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 101289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 101389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 101489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 101589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 101689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 101789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 101889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 101989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 102089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 10214a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 10220dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 10234a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 10244a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 1025db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericSyntaxError(SocketClient *cli, const char *usageMsg) { 1026db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg; 1027db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall asprintf(&msg, "Usage: bandwidth %s", usageMsg); 1028db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, msg, false); 1029db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1030db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1031db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1032db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOkFail(SocketClient *cli, int cond) { 1033db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!cond) { 1034db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 1035db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } else { 1036db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", false); 1037db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1038db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1039db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1040db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOpFailed(SocketClient *cli, const char *errMsg) { 1041db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, errMsg, false); 1042db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1043db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1044fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 10454a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 1046db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "<cmds> <args...>"); 10474a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 10484a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10494a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 10503fb42e026ffebab2c8f282e42501040121e32d83Steve Block ALOGV("bwctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 1051db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10524a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 10530031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall int rc = sBandwidthCtrl->enableBandwidthControl(true); 1054db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1055db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1056db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1057db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1058db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "disable")) { 1059db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->disableBandwidthControl(); 1060db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1061db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10620dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1063db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1064db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 1065fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 1066db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequota <interface>"); 1067fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1068fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1069db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 1070db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1071db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1072fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1073db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1074db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 10758a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 10768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1077db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getquota"); 10788a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1080db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 10818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 1082db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 10838a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1085db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 10877776cea21f88c4c01eba509db09bc2ccaa28ed5dSynergyDev asprintf(&msg, "%" PRId64, bytes); 10888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 10898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 1090db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1092db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1093db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 10948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 10958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1096db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getiquota <iface>"); 10978a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10988a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1099db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1100db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 11018a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 1102db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 11038a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11048a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 11058a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 11067776cea21f88c4c01eba509db09bc2ccaa28ed5dSynergyDev asprintf(&msg, "%" PRId64, bytes); 11078a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 11088a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 1109db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11108a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1111db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1112db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 1113fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 1114db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquota <interface> <bytes>"); 1115fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1116fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1117db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 1118db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1119db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1120db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1121db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 1122db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 1123fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 1124db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquotas <bytes> <interface> ..."); 1125fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1126fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1127db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11288a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 11290dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 11300dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 11310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 11320dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 11330dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 11340dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 11350dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1136db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11370dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 11380dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1139db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1140db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11410dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1142db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1143db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 1144db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 11450dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 1146db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequotas <interface> ..."); 11470dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11480dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1149db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 11510dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 11520dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 11530dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 11540dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 11550dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 11560dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 11570dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1158db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11590dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 11600dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1161db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1162db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11630dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1164db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1165db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 11660dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 1167db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeiquota <interface>"); 11680dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11690dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1170db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 1171db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1172db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11730dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1174db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1175db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 11760dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 1177db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setiquota <interface> <bytes>"); 11780dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11790dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1180db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 1181db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1182db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1183fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1184db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1185db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 1186fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1187db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); 11884a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 1189fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1190db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 1191db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1192db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1193db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1194fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1195db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1196db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 1197fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1198db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removenaughtyapps <appUid> ..."); 1199fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1200fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1201db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 1202db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1203db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1204e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1205e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[1], "happybox")) { 1206e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (argc < 3) { 1207e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "happybox (enable | disable)"); 1208e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1209e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1210e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[2], "enable")) { 1211e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->enableHappyBox(); 1212e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1213e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1214fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1215e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1216e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[2], "disable")) { 1217e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->disableHappyBox(); 1218e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1219e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1220e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1221e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "happybox (enable | disable)"); 1222e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1223e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1224e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[1], "addniceapps") || !strcmp(argv[1], "aha")) { 1225e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (argc < 3) { 1226e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "addniceapps <appUid> ..."); 1227e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1228e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1229e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->addNiceApps(argc - 2, argv + 2); 1230e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1231e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1232e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1233e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[1], "removeniceapps") || !strcmp(argv[1], "rha")) { 1234e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (argc < 3) { 1235e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "removeniceapps <appUid> ..."); 1236e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1237e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1238e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->removeNiceApps(argc - 2, argv + 2); 1239e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1240e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1241db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1242db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 12438a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1244db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setglobalalert <bytes>"); 12458a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12468a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1247db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 1248db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1249db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1250db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1251c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugsettetherglobalalert") || !strcmp(argv[1], "dstga")) { 1252c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1253c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugsettetherglobalalert <interface0> <interface1>"); 1254c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1255c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1256c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1257c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 1258c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1259c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1260c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1261c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1262db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 12638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1264db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeglobalalert"); 12658a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1267db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlert(); 1268db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1269db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1271db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1272c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugremovetetherglobalalert") || !strcmp(argv[1], "drtga")) { 1273c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1274c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugremovetetherglobalalert <interface0> <interface1>"); 1275c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1276c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1277c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1278c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 1279c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1280c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1281c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1282c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1283db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 12848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1285db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setsharedalert <bytes>"); 12868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1288db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 1289db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1290db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1292db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1293db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 12948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1295db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removesharedalert"); 12968a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12978a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1298db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeSharedAlert(); 1299db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1300db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 13018a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1302db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1303db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 13048a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 1305db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setinterfacealert <interface> <bytes>"); 13068a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 13078a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1308db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 1309db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1310db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 13118a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1312db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1313db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 13148a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1315db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeinterfacealert <interface>"); 13168a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 13178a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1318db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 1319db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1320fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1321db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 13224a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1323db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "gettetherstats") || !strcmp(argv[1], "gts")) { 1324db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall BandwidthController::TetherStats tetherStats; 1325a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall std::string extraProcessingInfo = ""; 1326baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall if (argc < 2 || argc > 4) { 1327baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall sendGenericSyntaxError(cli, "gettetherstats [<intInterface> <extInterface>]"); 1328db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1329db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1330baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall tetherStats.intIface = argc > 2 ? argv[2] : ""; 1331baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall tetherStats.extIface = argc > 3 ? argv[3] : ""; 1332f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall // No filtering requested and there are no interface pairs to lookup. 1333f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall if (argc <= 2 && sNatCtrl->ifacePairList.empty()) { 1334f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Tethering stats list completed", false); 1335f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall return 0; 1336f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall } 1337baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall int rc = sBandwidthCtrl->getTetherStats(cli, tetherStats, extraProcessingInfo); 1338db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (rc) { 1339a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall extraProcessingInfo.insert(0, "Failed to get tethering stats.\n"); 1340a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall sendGenericOpFailed(cli, extraProcessingInfo.c_str()); 1341baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall return 0; 1342db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1343db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 13444a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 13454a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1346db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1347db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 13484a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 13494a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 13500031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13510031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallCommandListener::IdletimerControlCmd::IdletimerControlCmd() : 13520031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall NetdCommand("idletimer") { 13530031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 13540031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13550031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrallint CommandListener::IdletimerControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 13560031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // TODO(ashish): Change the error statements 13570031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (argc < 2) { 13580031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13590031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13600031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13610031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13620031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall ALOGV("idletimerctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 13630031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13640031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "enable")) { 13650031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->enableIdletimerControl()) { 13660031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13670031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13680031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Enable success", false); 13690031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13700031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13710031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13720031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13730031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "disable")) { 13740031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->disableIdletimerControl()) { 13750031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13760031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13770031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Disable success", false); 13780031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13790031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13800031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13810031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "add")) { 138298f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (argc != 5) { 13830031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13840031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13850031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 138698f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if(0 != sIdletimerCtrl->addInterfaceIdletimer( 138798f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai argv[2], atoi(argv[3]), argv[4])) { 13880031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to add interface", false); 13890031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13900031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Add success", false); 13910031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13920031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13930031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13940031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "remove")) { 139598f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (argc != 5) { 13960031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13970031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13980031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13990031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // ashish: fixme timeout 140098f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (0 != sIdletimerCtrl->removeInterfaceIdletimer( 140198f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai argv[2], atoi(argv[3]), argv[4])) { 14020031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove interface", false); 14030031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 14040031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Remove success", false); 14050031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 14060031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 14070031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 14080031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 14090031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown idletimer cmd", false); 14100031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 14110031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 1412d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1413d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyCommandListener::FirewallCmd::FirewallCmd() : 1414d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey NetdCommand("firewall") { 1415d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1416d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1417d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkeyint CommandListener::FirewallCmd::sendGenericOkFail(SocketClient *cli, int cond) { 1418d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!cond) { 1419d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandOkay, "Firewall command succeeded", false); 1420d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } else { 1421d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::OperationFailed, "Firewall command failed", false); 1422d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1423d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1424d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1425d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1426d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyFirewallRule CommandListener::FirewallCmd::parseRule(const char* arg) { 1427d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(arg, "allow")) { 1428d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return ALLOW; 1429d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } else { 1430d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return DENY; 1431d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1432d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1433d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1434d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkeyint CommandListener::FirewallCmd::runCommand(SocketClient *cli, int argc, 1435d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey char **argv) { 1436d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc < 2) { 1437d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing command", false); 1438d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1439d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1440d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1441d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "enable")) { 1442d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->enableFirewall(); 1443d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1444d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1445d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "disable")) { 1446d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->disableFirewall(); 1447d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1448d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1449d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "is_enabled")) { 1450d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->isFirewallEnabled(); 1451d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1452d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1453d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1454d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_interface_rule")) { 1455d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1456d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1457d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_interface_rule <rmnet0> <allow|deny>", false); 1458d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1459d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1460d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1461d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* iface = argv[2]; 1462d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1463d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1464d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setInterfaceRule(iface, rule); 1465d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1466d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1467d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1468d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_egress_source_rule")) { 1469d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1470d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1471d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_egress_source_rule <192.168.0.1> <allow|deny>", 1472d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1473d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1474d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1475d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1476d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* addr = argv[2]; 1477d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1478d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1479d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setEgressSourceRule(addr, rule); 1480d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1481d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1482d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1483d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_egress_dest_rule")) { 1484d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 5) { 1485d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1486d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_egress_dest_rule <192.168.0.1> <80> <allow|deny>", 1487d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1488d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1489d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1490d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1491d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* addr = argv[2]; 1492d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int port = atoi(argv[3]); 1493d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[4]); 1494d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1495d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = 0; 1496d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey res |= sFirewallCtrl->setEgressDestRule(addr, PROTOCOL_TCP, port, rule); 1497d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey res |= sFirewallCtrl->setEgressDestRule(addr, PROTOCOL_UDP, port, rule); 1498d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1499d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1500d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1501d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_uid_rule")) { 1502d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1503d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1504d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_uid_rule <1000> <allow|deny>", 1505d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1506d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1507d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1508d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1509d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int uid = atoi(argv[2]); 1510d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1511d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1512d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setUidRule(uid, rule); 1513d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1514d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1515d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1516d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown command", false); 1517d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1518d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 15190da73fcecc30140439f856118056df8908609627Daniel Drown 15200da73fcecc30140439f856118056df8908609627Daniel DrownCommandListener::ClatdCmd::ClatdCmd() : NetdCommand("clatd") { 15210da73fcecc30140439f856118056df8908609627Daniel Drown} 15220da73fcecc30140439f856118056df8908609627Daniel Drown 15230da73fcecc30140439f856118056df8908609627Daniel Drownint CommandListener::ClatdCmd::runCommand(SocketClient *cli, int argc, 15240da73fcecc30140439f856118056df8908609627Daniel Drown char **argv) { 15250da73fcecc30140439f856118056df8908609627Daniel Drown int rc = 0; 15260da73fcecc30140439f856118056df8908609627Daniel Drown if (argc < 2) { 15270da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 15280da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15290da73fcecc30140439f856118056df8908609627Daniel Drown } 15300da73fcecc30140439f856118056df8908609627Daniel Drown 15310da73fcecc30140439f856118056df8908609627Daniel Drown if(!strcmp(argv[1], "stop")) { 15320da73fcecc30140439f856118056df8908609627Daniel Drown rc = sClatdCtrl->stopClatd(); 15330da73fcecc30140439f856118056df8908609627Daniel Drown } else if (!strcmp(argv[1], "status")) { 15340da73fcecc30140439f856118056df8908609627Daniel Drown char *tmp = NULL; 15350da73fcecc30140439f856118056df8908609627Daniel Drown 15360da73fcecc30140439f856118056df8908609627Daniel Drown asprintf(&tmp, "Clatd status: %s", (sClatdCtrl->isClatdStarted() ? 15370da73fcecc30140439f856118056df8908609627Daniel Drown "started" : "stopped")); 15380da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::ClatdStatusResult, tmp, false); 15390da73fcecc30140439f856118056df8908609627Daniel Drown free(tmp); 15400da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15410da73fcecc30140439f856118056df8908609627Daniel Drown } else if(!strcmp(argv[1], "start")) { 15420da73fcecc30140439f856118056df8908609627Daniel Drown if (argc < 3) { 15430da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 15440da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15450da73fcecc30140439f856118056df8908609627Daniel Drown } 15460da73fcecc30140439f856118056df8908609627Daniel Drown rc = sClatdCtrl->startClatd(argv[2]); 15470da73fcecc30140439f856118056df8908609627Daniel Drown } else { 15480da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown clatd cmd", false); 15490da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15500da73fcecc30140439f856118056df8908609627Daniel Drown } 15510da73fcecc30140439f856118056df8908609627Daniel Drown 15520da73fcecc30140439f856118056df8908609627Daniel Drown if (!rc) { 15530da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandOkay, "Clatd operation succeeded", false); 15540da73fcecc30140439f856118056df8908609627Daniel Drown } else { 15550da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::OperationFailed, "Clatd operation failed", false); 15560da73fcecc30140439f856118056df8908609627Daniel Drown } 15570da73fcecc30140439f856118056df8908609627Daniel Drown 15580da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15590da73fcecc30140439f856118056df8908609627Daniel Drown} 1560d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15615c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram RamachandranCommandListener::NetworkCommand::NetworkCommand() : NetdCommand("network") { 15625c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran} 15635c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 15645c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::syntaxError(SocketClient* client, const char* message) { 15655c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::CommandSyntaxError, message, false); 15665c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return 0; 15675c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran} 15685c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 15695c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::paramError(SocketClient* client, const char* message) { 15705c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::CommandParameterError, message, false); 15715c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return 0; 1572d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1573d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15745c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::operationError(SocketClient* client, const char* message) { 15755c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::OperationFailed, message, true); 1576d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran return 0; 1577d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1578d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15795c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::success(SocketClient* client) { 15805c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::CommandOkay, "success", false); 1581d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran return 0; 1582d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1583d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15845c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::runCommand(SocketClient* client, int argc, char** argv) { 1585d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran if (argc < 2) { 15865c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return syntaxError(client, "Missing argument"); 1587d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran } 15885c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1589ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen // 0 1 2 3 1590ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen // network create <netId> [<permission> ...] 1591d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran if (!strcmp(argv[1], "create")) { 1592ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (argc < 3) { 15935c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return syntaxError(client, "Missing argument"); 15945c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 1595a01d6eff4316c6c10e81bd8d48ae85aa82b933e3Sreeram Ramachandran // strtoul() returns 0 on errors, which is fine because 0 is an invalid netId. 15965c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran unsigned netId = strtoul(argv[2], NULL, 0); 15975c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran if (!sNetCtrl->isNetIdValid(netId)) { 15985c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return paramError(client, "Invalid netId"); 15995c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 1600ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen int nextArg = 3; 1601379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran Permission permission = parseMultiplePermissions(argc, argv, &nextArg); 1602379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (nextArg != argc) { 1603379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Unknown trailing argument(s)"); 16045c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 1605ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (!sNetCtrl->createNetwork(netId, permission)) { 16065c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return operationError(client, "createNetwork() failed"); 16075c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 16085c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return success(client); 1609d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran } 16105c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1611d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // 0 1 2 1612d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // network destroy <netId> 1613d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran if (!strcmp(argv[1], "destroy")) { 1614379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (argc != 3) { 1615379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Incorrect number of arguments"); 16165c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 1617a01d6eff4316c6c10e81bd8d48ae85aa82b933e3Sreeram Ramachandran // strtoul() returns 0 on errors, which is fine because 0 is an invalid netId. 16185c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran unsigned netId = strtoul(argv[2], NULL, 0); 16195c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran if (!sNetCtrl->isNetIdValid(netId)) { 1620a01d6eff4316c6c10e81bd8d48ae85aa82b933e3Sreeram Ramachandran return paramError(client, "Invalid netId"); 16215c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 16225c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran if (!sNetCtrl->destroyNetwork(netId)) { 16235c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return operationError(client, "destroyNetwork() failed"); 16245c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 162535c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen// TODO: Uncomment once this API has been added to bionic. 162635c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen#if 0 1627f2611ae597cf213c91fa61b9ba84d4138a470db5Paul Jensen _resolv_delete_cache_for_net(netId); 162835c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen#endif 16295c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return success(client); 1630d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran } 16315c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1632ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen // 0 1 2 3 1633ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen // network addiface <netId> <interface> 1634ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen // network removeiface <netId> <interface> 1635ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (!strcmp(argv[1], "addiface") || !strcmp(argv[1], "removeiface")) { 1636ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (argc != 4) { 1637ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return syntaxError(client, "Missing argument"); 1638ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1639ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen // strtoul() returns 0 on errors, which is fine because 0 is an invalid netId. 1640ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen unsigned netId = strtoul(argv[2], NULL, 0); 1641ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (!sNetCtrl->isNetIdValid(netId)) { 1642ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return paramError(client, "Invalid netId"); 1643ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1644ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (!strcmp(argv[1], "addiface")) { 1645ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (!sNetCtrl->addInterfaceToNetwork(netId, argv[3])) { 1646ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return operationError(client, "addInterfaceToNetwork() failed"); 1647ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1648ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } else { 1649ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (!sNetCtrl->removeInterfaceFromNetwork(netId, argv[3])) { 1650ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return operationError(client, "removeInterfaceFromNetwork() failed"); 1651ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1652ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1653ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return success(client); 1654ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1655ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen 1656379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran // 0 1 2 3 4 1657379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran // network permission user set [<permission> ...] <uid> ... 1658379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran // network permission user clear <uid> ... 1659379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran // network permission network set [<permission> ...] <netId> ... 1660379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran // network permission network clear <netId> ... 1661379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!strcmp(argv[1], "permission")) { 1662379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (argc < 5) { 1663379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Missing argument"); 1664379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1665379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran int nextArg = 4; 1666379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran Permission permission = PERMISSION_NONE; 1667379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!strcmp(argv[3], "set")) { 1668379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran permission = parseMultiplePermissions(argc, argv, &nextArg); 1669379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } else if (strcmp(argv[3], "clear")) { 1670379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1671379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1672379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran std::vector<unsigned> ids; 1673379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran for (; nextArg < argc; ++nextArg) { 1674379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran char* endPtr; 1675379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran unsigned id = strtoul(argv[nextArg], &endPtr, 0); 1676379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!*argv[nextArg] || *endPtr) { 1677379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Invalid id"); 1678379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1679379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran ids.push_back(id); 1680379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1681379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (ids.empty()) { 1682379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Missing id"); 1683379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1684379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!strcmp(argv[2], "user")) { 1685379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!sNetCtrl->setPermissionForUser(permission, ids)) { 1686379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return operationError(client, "setPermissionForUser() failed"); 1687379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1688379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } else if (!strcmp(argv[2], "network")) { 1689379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!sNetCtrl->setPermissionForNetwork(permission, ids)) { 1690379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return operationError(client, "setPermissionForNetwork() failed"); 1691379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1692379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } else { 1693379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1694379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1695379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return success(client); 1696379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1697379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 16989c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran // 0 1 2 3 16999c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran // network default set <netId> 17009c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran // network default clear 17019c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran if (!strcmp(argv[1], "default")) { 17029c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran if (argc < 3) { 17039c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran return syntaxError(client, "Missing argument"); 17049c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } 17059c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran unsigned netId = NETID_UNSET; 17069c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran if (!strcmp(argv[2], "set")) { 17079c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran if (argc < 4) { 17089c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran return syntaxError(client, "Missing netId"); 17099c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } 17109c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran // strtoul() returns 0 on errors, which is fine because 0 is an invalid netId. 17119c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran netId = strtoul(argv[3], NULL, 0); 17129c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran if (!sNetCtrl->isNetIdValid(netId)) { 17139c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran return paramError(client, "Invalid netId"); 17149c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } 17159c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } else if (strcmp(argv[2], "clear")) { 17169c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran return syntaxError(client, "Unknown argument"); 17179c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } 17189c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran if (!sNetCtrl->setDefaultNetwork(netId)) { 17199c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran return operationError(client, "setDefaultNetwork() failed"); 17209c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } 17219c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran return success(client); 17229c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran } 17239c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran 17247619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran // 0 1 2 3 4 5 6 17257619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran // network route add <netId> <interface> <destination> [nexthop] 17267619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran // network route remove <netId> <interface> <destination> [nexthop] 17277619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran if (!strcmp(argv[1], "route")) { 17287619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran if (argc < 6 || argc > 7) { 17297619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran return syntaxError(client, "Incorrect number of arguments"); 17307619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } 17317619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran // strtoul() returns 0 on errors, which is fine because 0 is an invalid netId. 17327619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran unsigned netId = strtoul(argv[3], NULL, 0); 17337619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran if (!sNetCtrl->isNetIdValid(netId)) { 17347619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran return paramError(client, "Invalid netId"); 17357619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } 17367619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran const char* interface = argv[4]; 17377619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran const char* destination = argv[5]; 1738c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran const char* nexthop = NULL; 1739c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran // If the nexthop (gateway) is equal to INADDR_ANY or in6addr_any, the route is a directly 1740c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran // connected route, and we should not set nexthop. 1741c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran // TODO: This doesn't catch all the ways of representing the "any" address (e.g.: "0/0", 1742c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran // "::0", etc). Fix the callers to not pass us a nexthop in the first place in such cases. 1743c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran if (argc == 7 && strcmp(argv[6], "0.0.0.0") && strcmp(argv[6], "::")) { 1744c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran nexthop = argv[6]; 1745c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran } 17467619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran if (!strcmp(argv[2], "add")) { 17477619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran if (!sNetCtrl->addRoute(netId, interface, destination, nexthop)) { 17487619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran return operationError(client, "addRoute() failed"); 17497619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } 17507619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } else if (!strcmp(argv[2], "remove")) { 17517619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran if (!sNetCtrl->removeRoute(netId, interface, destination, nexthop)) { 17527619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran return operationError(client, "removeRoute() failed"); 17537619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } 17547619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } else { 17557619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran return syntaxError(client, "Unknown argument"); 17567619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } 17577619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran return success(client); 17587619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran } 17597619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran 1760d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // network legacy <uid> route <add|remove> <other-route-params> 1761d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // network vpn create <netId> [owner_uid] 1762d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // network vpn destroy <netId> 1763d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // network <bind|unbind> <netId> <uid1> .. <uidN> 1764d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // -- uid range can be specified as "uidX-uidY" 1765d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // TODO: 1766d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // o tethering 1767d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // o p2p 17685c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 17695c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1770d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1771