CommandListener.cpp revision 87475a1471373b72ffc9f81f17dfd7884723fa86
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 "RouteController.h" 48b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran#include "UidRanges.h" 495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 505c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran#include <string> 515c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran#include <vector> 525c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 53379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandrannamespace { 54379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 55ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram RamachandranPermission stringToPermission(const char* arg) { 56ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran if (!strcmp(arg, "android.permission.CHANGE_NETWORK_STATE")) { 57ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return PERMISSION_NETWORK; 58ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran } 59ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran if (!strcmp(arg, "android.permission.CONNECTIVITY_INTERNAL")) { 60ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return PERMISSION_SYSTEM; 61ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran } 62ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return PERMISSION_NONE; 63379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran} 64379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 6587475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandranunsigned stringToNetId(const char* arg) { 6687475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (!strcmp(arg, "local")) { 6787475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran return NetworkController::LOCAL_NET_ID; 6887475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran } 6987475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // strtoul() returns 0 on errors, which is fine because 0 is an invalid netId. 7087475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran return strtoul(arg, NULL, 0); 7187475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran} 7287475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran 73379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran} // namespace 74379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 75a0efaece8c05370f201efe099a537ceb014c6fdfSzymon JakubczakNetworkController *CommandListener::sNetCtrl = NULL; 769d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 779ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 78d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 795af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 804a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 810031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallIdletimerController * CommandListener::sIdletimerCtrl = NULL; 822eab1f762badb7ba46b95716e62ea4548a979903Dmitry ShmidtInterfaceController *CommandListener::sInterfaceCtrl = NULL; 8389c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 84fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert GreenwaltSecondaryTableController *CommandListener::sSecondaryTableCtrl = NULL; 85d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyFirewallController *CommandListener::sFirewallCtrl = NULL; 860da73fcecc30140439f856118056df8908609627Daniel DrownClatdController *CommandListener::sClatdCtrl = NULL; 879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 888e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey/** 898e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * List of module chains to be created, along with explicit ordering. ORDERING 908e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * IS CRITICAL, AND SHOULD BE TRIPLE-CHECKED WITH EACH CHANGE. 918e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey */ 928e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_INPUT[] = { 93d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey // Bandwidth should always be early in input chain, to make sure we 94d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey // correctly count incoming traffic against data plan. 958e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_INPUT, 96d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_INPUT, 978e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 988e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 998e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1008e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_FORWARD[] = { 1018e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_FILTER_FORWARD, 102d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_FORWARD, 1038e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_FORWARD, 1048e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NatController::LOCAL_FORWARD, 1058e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1068e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1078e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1088e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_OUTPUT[] = { 1098e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_FILTER_OUTPUT, 110d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_OUTPUT, 1118e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_OUTPUT, 1128e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1138e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1148e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1158e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* RAW_PREROUTING[] = { 1168e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_RAW_PREROUTING, 1175c4faf7602de0268aa09a3a525b427f83d617b5cHaoyu Bai IdletimerController::LOCAL_RAW_PREROUTING, 1188e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1198e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1208e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1218e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* MANGLE_POSTROUTING[] = { 1228e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_MANGLE_POSTROUTING, 1235c4faf7602de0268aa09a3a525b427f83d617b5cHaoyu Bai IdletimerController::LOCAL_MANGLE_POSTROUTING, 1249440e7f994901ca123393844c95fe5caa6639a3bJP Abgrall SecondaryTableController::LOCAL_MANGLE_POSTROUTING, 1258e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1268e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1278e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1289a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubakerstatic const char* MANGLE_OUTPUT[] = { 1299a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker SecondaryTableController::LOCAL_MANGLE_OUTPUT, 1309a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker NULL, 1319a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker}; 1329a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker 1338e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* NAT_PREROUTING[] = { 1348e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_NAT_PREROUTING, 1358e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1368e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1378e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1388e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* NAT_POSTROUTING[] = { 1398e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NatController::LOCAL_NAT_POSTROUTING, 1407a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker SecondaryTableController::LOCAL_NAT_POSTROUTING, 1418e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1428e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1438e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1448e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic void createChildChains(IptablesTarget target, const char* table, const char* parentChain, 1458e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey const char** childChains) { 1468e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey const char** childChain = childChains; 1478e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey do { 1488e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Order is important: 1498e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -D to delete any pre-existing jump rule (removes references 1508e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // that would prevent -X from working) 1518e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -F to flush any existing chain 1528e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -X to delete any existing chain 1538e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -N to create the chain 1548e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -A to append the chain to parent 1558e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1568e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-D", parentChain, "-j", *childChain, NULL); 1578e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-F", *childChain, NULL); 1588e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-X", *childChain, NULL); 1598e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptables(target, "-t", table, "-N", *childChain, NULL); 1608e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptables(target, "-t", table, "-A", parentChain, "-j", *childChain, NULL); 1618e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey } while (*(++childChain) != NULL); 1628e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey} 1638e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 164a0efaece8c05370f201efe099a537ceb014c6fdfSzymon JakubczakCommandListener::CommandListener() : 165a8e59f8c50aed3f91dead377b8ae21646978506cRobert Greenwalt FrameworkListener("netd", true) { 1665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 167d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 168d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 169d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 170d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 171d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 1725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 1734a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 1740031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall registerCmd(new IdletimerControlCmd()); 17589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 176d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey registerCmd(new FirewallCmd()); 1770da73fcecc30140439f856118056df8908609627Daniel Drown registerCmd(new ClatdCmd()); 1785c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran registerCmd(new NetworkCommand()); 1799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 180a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak if (!sNetCtrl) 181f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran sNetCtrl = new NetworkController(); 182fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!sSecondaryTableCtrl) 183a0efaece8c05370f201efe099a537ceb014c6fdfSzymon Jakubczak sSecondaryTableCtrl = new SecondaryTableController(sNetCtrl); 1849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 18587475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran sTetherCtrl = new TetherController(); 1869ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 18787475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran sNatCtrl = new NatController(); 188d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 189d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 1905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 1915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 1924a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 1934a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 1940031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!sIdletimerCtrl) 1950031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl = new IdletimerController(); 19689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 19789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 198d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!sFirewallCtrl) 199d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey sFirewallCtrl = new FirewallController(); 2002eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (!sInterfaceCtrl) 2012eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt sInterfaceCtrl = new InterfaceController(); 2020da73fcecc30140439f856118056df8908609627Daniel Drown if (!sClatdCtrl) 20384c1d035fdef996602ab8878d952c4fcb1f6963dPaul Jensen sClatdCtrl = new ClatdController(sNetCtrl); 2040031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 2050031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 2068e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * This is the only time we touch top-level chains in iptables; controllers 2078e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * should only mutate rules inside of their children chains, as created by 2088e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * the constants above. 2098e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * 2108e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * Modules should never ACCEPT packets (except in well-justified cases); 2118e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * they should instead defer to any remaining modules using RETURN, or 2128e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * otherwise DROP/REJECT. 2130031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2148e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 2158e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Create chains for children modules 2168e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "INPUT", FILTER_INPUT); 2178e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "FORWARD", FILTER_FORWARD); 2188e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "OUTPUT", FILTER_OUTPUT); 2198e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "raw", "PREROUTING", RAW_PREROUTING); 2208e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "mangle", "POSTROUTING", MANGLE_POSTROUTING); 2219a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker createChildChains(V4V6, "mangle", "OUTPUT", MANGLE_OUTPUT); 2228e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4, "nat", "PREROUTING", NAT_PREROUTING); 2238e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4, "nat", "POSTROUTING", NAT_POSTROUTING); 2248e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 2258e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Let each module setup their child chains 2260031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall setupOemIptablesHook(); 2278e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 228d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey /* When enabled, DROPs all packets except those matching rules. */ 229d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey sFirewallCtrl->setupIptablesHooks(); 230d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 2310031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* Does DROPs in FORWARD by default */ 2320031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sNatCtrl->setupIptablesHooks(); 2330031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 2340031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Does REJECT in INPUT, OUTPUT. Does counting also. 2350031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 2360031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2370031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->setupIptablesHooks(); 2380031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 2390031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Counts in nat: PREROUTING, POSTROUTING. 2400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 2410031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl->setupIptablesHooks(); 2430031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 2440031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->enableBandwidthControl(false); 2452251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker 2462251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker sSecondaryTableCtrl->setupIptablesHooks(); 2478fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran 24887475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (int ret = RouteController::Init(NetworkController::LOCAL_NET_ID)) { 249f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran ALOGE("failed to initialize RouteController (%s)", strerror(-ret)); 250f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 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 3104a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker // interface fwmark exempt add/remove dest 311da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker // interface fwmark get protect 312da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker // interface fwmark get mark uid 3132251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[1], "fwmark")) { 3142251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[2], "rule")) { 3157a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (argc < 5) { 3167a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3177a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker return 0; 3187a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3197a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (!strcmp(argv[3], "add")) { 3207a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (!sSecondaryTableCtrl->addFwmarkRule(argv[4])) { 3212251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3222251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark rule successfully added", false); 3237a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else { 3247a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker cli->sendMsg(ResponseCode::OperationFailed, "Failed to add fwmark rule", 3257a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker true); 3267a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3277a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else if (!strcmp(argv[3], "remove")) { 3287a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker if (!sSecondaryTableCtrl->removeFwmarkRule(argv[4])) { 3292251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3302251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark rule successfully removed", false); 3317a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else { 3322251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3332251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Failed to remove fwmark rule", true); 3347a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3357a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } else { 3362251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark rule cmd", 3372251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker false); 3387a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker } 3397a6ce4bed8569745798bcc26f51d6f306ebdba94Chad Brubaker return 0; 3402251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else if (!strcmp(argv[2], "route")) { 3412251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (argc < 7) { 3422251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3432251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return 0; 3442251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3452251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[3], "add")) { 3462251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!sSecondaryTableCtrl->addFwmarkRoute(argv[4], argv[5], atoi(argv[6]))) { 3472251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3482251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark route successfully added", false); 3492251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 3502251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3512251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Failed to add fwmark route", true); 3522251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3532251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else if (!strcmp(argv[3], "remove")) { 3542251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!sSecondaryTableCtrl->removeFwmarkRoute(argv[4], argv[5], 3552251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker atoi(argv[6]))) { 3562251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3572251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Fwmark route successfully removed", false); 3582251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 3592251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3602251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker "Failed to remove fwmark route", true); 3612251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3622251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 3632251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark route cmd", 3642251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker false); 3652251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 3662251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return 0; 3674a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else if (!strcmp(argv[2], "exempt")) { 3684a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (argc < 5) { 3694a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3704a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker return 0; 3714a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 3724a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (!strcmp(argv[3], "add")) { 3734a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (!sSecondaryTableCtrl->addHostExemption(argv[4])) { 3744a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandOkay, "exemption rule successfully added", 3754a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker false); 3764a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else { 3774a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::OperationFailed, "Failed to add exemption rule", 3784a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker true); 3794a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 3804a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else if (!strcmp(argv[3], "remove")) { 3814a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker if (!sSecondaryTableCtrl->removeHostExemption(argv[4])) { 3824a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandOkay, 3834a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker "exemption rule successfully removed", false); 3844a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else { 3854a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::OperationFailed, 3864a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker "Failed to remove exemption rule", true); 3874a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 3884a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } else { 3894a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown exemption cmd", false); 3904a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker } 3914a946095dad15548ae399665be111be9cb1d9aa6Chad Brubaker return 0; 392da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } else if (!strcmp(argv[2], "get")) { 393da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker if (argc < 4) { 394da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 395da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 396da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } 397da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker if (!strcmp(argv[3], "protect")) { 398da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker sSecondaryTableCtrl->getProtectMark(cli); 399da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 400da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } else if (!strcmp(argv[3], "mark")) { 401da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker if (argc < 5) { 402da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 403da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 404da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } 405da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker sSecondaryTableCtrl->getUidMark(cli, atoi(argv[4])); 406da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 407da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } else { 408da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark get cmd", false); 409da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker return 0; 410da7df7c8f009f014486343cfbbaaae2a766f3a2bChad Brubaker } 4112251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } else { 4122251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown fwmark cmd", false); 4132251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker return 0; 4149a50889a22c1d93c9e1a14873cde8fc1508f66fdChad Brubaker } 4152251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker } 4162251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker if (!strcmp(argv[1], "route")) { 4172251c0fbcf24a9c8fd77b23851f60304087bab2bChad Brubaker int prefix_length = 0; 418fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 8) { 419e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 420e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 421e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 422fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (sscanf(argv[6], "%d", &prefix_length) != 1) { 423e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 424e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 425e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 426e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 427fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 428fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_add_route(argv[3], argv[5], prefix_length, argv[7])) { 429fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 430fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to add route to default table", true); 431fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 432fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 433fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route added to default table", false); 434fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 435fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 436fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->addRoute(cli, argv[3], argv[5], 437fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 438e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 439fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 440fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 441fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 442e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 443e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 444fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 445fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_remove_route(argv[3], argv[5], prefix_length, argv[7])) { 446fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 447fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to remove route from default table", true); 448fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 449fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 450fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route removed from default table", false); 451fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 452fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 453fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->removeRoute(cli, argv[3], argv[5], 454fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 455e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 456fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 457fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 458fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 459e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 460e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 461e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 462e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 463e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 464e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 465e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 4665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 4671d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 4681d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 4695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 4705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 4715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 4735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 4745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4751d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 4765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 477e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 4785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 4820e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 4835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 4865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 4875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 4895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 4905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 4915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 4925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 4935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 4945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 4965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 49731ea0b03afeedd17f703b7a6d1e5c9feb2d6000dJeff Sharkey asprintf(&flag_s, "%s%s%s%s%s%s", updown, brdcst, loopbk, ppp, running, multi); 4985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 5001d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 5015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 5021d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 5035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 50401fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 5055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 5075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 5085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 509e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 510e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 513778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // arglist: iface [addr prefixLength] flags 514778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (argc < 4) { 5155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5187b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Setting iface cfg"); 5195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5201d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 521778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt int index = 5; 5225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 5245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 525778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (!inet_aton(argv[3], &addr)) { 526778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // Handle flags only case 527778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt index = 3; 528778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } else { 529778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (ifc_set_addr(argv[2], addr.s_addr)) { 530778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 531778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt ifc_close(); 532778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt return 0; 533778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } 534778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt 535778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // Set prefix length on a non zero address 536778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 537778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 538778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt ifc_close(); 539778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt return 0; 540778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } 5415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 5435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 544778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt for (int i = index; i < argc; i++) { 545e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 546e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 5477b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring up %s", argv[2]); 5485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 5495ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error upping interface"); 5505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 551e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 554e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 5557b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring down %s", argv[2]); 5565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 5575ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error downing interface"); 5585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 559e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 562e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 5637c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 564e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 5657c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5667c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "running")) { 5677c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5687c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "loopback")) { 5697c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5707c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "point-to-point")) { 5717c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 5735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 574e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 578e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 5795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 580e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 581e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 582e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 583e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 5847b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Clearing all IP addresses on %s", argv[2]); 585e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 5861ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti ifc_clear_addresses(argv[2]); 5871ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti 588e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 5895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 59032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 59132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 59232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 59332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 59432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 59532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 59632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 59770afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti int enable = !strncmp(argv[3], "enable", 7); 59870afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti if (sInterfaceCtrl->setIPv6PrivacyExtensions(argv[2], enable) == 0) { 59970afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 60070afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti } else { 60132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 60232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 60332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 604c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 605c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } else if (!strcmp(argv[1], "ipv6")) { 606c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (argc != 4) { 607c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandSyntaxError, 608c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Usage: interface ipv6 <interface> <enable|disable>", 609c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync false); 610c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 611c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 612c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 61370afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti int enable = !strncmp(argv[3], "enable", 7); 61470afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti if (sInterfaceCtrl->setEnableIPv6(argv[2], enable) == 0) { 61570afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti cli->sendMsg(ResponseCode::CommandOkay, "IPv6 state changed", false); 61670afde6ad9b5fce63cca594ac9b230d2fc9b21eeLorenzo Colitti } else { 61732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 618c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Failed to change IPv6 state", true); 61932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 62032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 6216d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else if (!strcmp(argv[1], "getmtu")) { 6226d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt char *msg = NULL; 6236d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt int mtu = 0; 6246d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt if (sInterfaceCtrl->getMtu(argv[2], &mtu) == 0) { 6256d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt asprintf(&msg, "MTU = %d", mtu); 6266d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::InterfaceGetMtuResult, msg, false); 6276d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt free(msg); 6286d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else { 6296d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, 6306d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt "Failed to get MTU", true); 6316d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } 6326d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt return 0; 6336d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else if (!strcmp(argv[1], "setmtu")) { 6346d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt if (argc != 4) { 6356d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, 6366d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt "Usage: interface setmtu <interface> <val>", false); 6376d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt return 0; 6386d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } 6396d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt if (sInterfaceCtrl->setMtu(argv[2], argv[3]) == 0) { 6406d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "MTU changed", false); 6416d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } else { 6426d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, 6436d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt "Failed to get MTU", true); 6446d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt } 6456d6c0e6f1164e3182538cb48c2b95d90a2eb780cDmitry Shmidt return 0; 6465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 6475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 6485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 6495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 6505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 651d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 652d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 653d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 6544a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 655d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 656d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 657d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 658d5573d34c8fac49e16b20cf144486125bf940086San Mehat 659d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 66056afacf838d24cf8e54d2cf0d8ab9182ab704125Sreeram Ramachandran int /* argc */, char ** /* argv */) { 661d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 662d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 663d5573d34c8fac49e16b20cf144486125bf940086San Mehat 664d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 665d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 666d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 667d5573d34c8fac49e16b20cf144486125bf940086San Mehat 668d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 669d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 670d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 671d5573d34c8fac49e16b20cf144486125bf940086San Mehat 672d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 673d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 674d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 675d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 676d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 677d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 6789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 6799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 6819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 6869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 6879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 6899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 6909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 6919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 6939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 6949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 6959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 6969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 6989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 7029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 7039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 7059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 706d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 707d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 708d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 709d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 710d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 711d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 712d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 713d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 714d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 715d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 7169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 7179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 718d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 719d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 720d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 721d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 722d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 7239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 7249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 725d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 7269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 7279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 7299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 7309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 7319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 732d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 73336971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } else if (argc == 3) { 73436971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall if (!strcmp(argv[1], "interface") && !strcmp(argv[2], "list")) { 73536971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 73636971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall InterfaceCollection::iterator it; 73736971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall for (it = ilist->begin(); it != ilist->end(); ++it) { 73836971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 73936971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } 74036971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } else if (!strcmp(argv[1], "dns") && !strcmp(argv[2], "list")) { 74136971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 74236971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall NetAddressCollection::iterator it; 74336971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall 74436971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall for (it = dlist->begin(); it != dlist->end(); ++it) { 74536971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 74636971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall } 74720f95ed9db048261c18bbeb152d3204d9cbb58f1JP Abgrall } 7489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 7509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 7519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 7529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 7539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 7549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 7583208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 7593208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 7609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7623208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 7633208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 7643208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 7653208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 7663208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 7673208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 7683208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 7693208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 7703208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 7713208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 7723208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 7739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7743208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 7753208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 7769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 7779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 7789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 7799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 7809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 78120f95ed9db048261c18bbeb152d3204d9cbb58f1JP Abgrall /* else if (!strcmp(argv[2], "list")) handled above */ 7829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 7849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 7859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 7889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 7899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 79036971a687bf3a6edc2bf5af8a8b2a3176e7d4691JP Abgrall /* else if (!strcmp(argv[2], "list")) handled above */ 7919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 7939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 7949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 7989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 8029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 8039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 8049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 806d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 807d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 808d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 809d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 810d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 811d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 812d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 813d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 814d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 815d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 816d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 8179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 8189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 819fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 5) { 8209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 8219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 82487475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // 0 1 2 3 82587475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // nat enable intiface extiface 82687475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // nat disable intiface extiface 82787475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (!strcmp(argv[1], "enable") && argc >= 4) { 82887475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran rc = sNatCtrl->enableNat(argv[2], argv[3]); 829c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if(!rc) { 830c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* Ignore ifaces for now. */ 831c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 832c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 83387475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran } else if (!strcmp(argv[1], "disable") && argc >= 4) { 834f7bf29c8a37d65e132a4dceb7c5a4200ed5c3d79Robert Greenwalt /* Ignore ifaces for now. */ 835fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 83687475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran rc |= sNatCtrl->disableNat(argv[2], argv[3]); 8379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 8399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 8409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 8419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 8429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 8439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 8449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 8459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 8469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 847d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 848d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 849d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 850d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 851d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 852d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 853d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 854d5573d34c8fac49e16b20cf144486125bf940086San Mehat 855d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 856d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 857d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 858d5573d34c8fac49e16b20cf144486125bf940086San Mehat 859d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 860d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 861d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 862d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 863d5573d34c8fac49e16b20cf144486125bf940086San Mehat 864d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 86574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 86674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 8671c4a77955acdb730d017b15e9a92ca511e6ca106Wang Liyong memset(&dns1, 0, sizeof(struct in_addr)); 8681c4a77955acdb730d017b15e9a92ca511e6ca106Wang Liyong memset(&dns2, 0, sizeof(struct in_addr)); 869d5573d34c8fac49e16b20cf144486125bf940086San Mehat 870d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 871d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 872d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 873d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 874d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 875d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 876d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 877d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 87874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 87974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 88074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 88174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 88274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 88374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 88474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 88574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 88674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 887d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 888d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 889d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 890d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 891d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 892d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 893d5573d34c8fac49e16b20cf144486125bf940086San Mehat 894d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 895d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 896d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 897d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 898d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 899d5573d34c8fac49e16b20cf144486125bf940086San Mehat 900d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 901d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 9021bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 9035af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 9045af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 9055af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 9065af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9075af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 9085af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 90925753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy int rc = ResponseCode::SoftapStatusResult; 910666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 9115af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 91225753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy if (sSoftapCtrl == NULL) { 91325753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(ResponseCode::ServiceStartFailed, "SoftAP is not available", false); 91425753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy return -1; 91525753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy } 9165af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 91725753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(ResponseCode::CommandSyntaxError, 91825753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy "Missing argument in a SoftAP command", false); 9195af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9205af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 9215af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9227e9eb7b48345af69283afa7ca58d3be0a329931bIrfan Sheriff if (!strcmp(argv[1], "startap")) { 923c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 924c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 9255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 92631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 92731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 9285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 92925753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy asprintf(&retbuf, "Softap service %s running", 93025753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy (sSoftapCtrl->isSoftapStarted() ? "is" : "is not")); 93125753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(rc, retbuf, false); 932666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 9335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 9355af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 9365af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 93725753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(ResponseCode::CommandSyntaxError, "Unrecognized SoftAP command", false); 9385af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9395af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 9405af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 94125753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy if (rc >= 400 && rc < 600) 94225753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(rc, "SoftAP command has failed", false); 94325753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy else 94425753d500d9ef6ee04dad43ffa27287a6dc959acSasha Levitskiy cli->sendMsg(rc, "Ok", false); 9455af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9475af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 9483e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 94989c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 95089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 95189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 95289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 953938ab2acc65ea12e84d66e5bc3f8166482d2165bSasha Levitskiyint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **margv) { 95489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 955938ab2acc65ea12e84d66e5bc3f8166482d2165bSasha Levitskiy const char **argv = const_cast<const char **>(margv); 95689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 95789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 95889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 95989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 96089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 96189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 96235c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen if (!strcmp(argv[1], "setnetdns")) { 96335c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen // "resolver setnetdns <netId> <domains> <dns1> <dns2> ..." 964dd3e46758b500d5e8c61ed30f7402e8538df7e06Robert Greenwalt if (argc >= 5) { 96535c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen rc = sResolverCtrl->setDnsServers(strtoul(argv[2], NULL, 0), argv[3], &argv[4], argc - 4); 96689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 96789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 96835c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen "Wrong number of arguments to resolver setnetdns", false); 96989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 97089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 97135c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen } else if (!strcmp(argv[1], "flushnet")) { // "resolver flushnet <netId>" 9722d4610ec34cc78799a3353638fa05ee53276892aMattias Falk if (argc == 3) { 97335c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen rc = sResolverCtrl->flushDnsCache(strtoul(argv[2], NULL, 0)); 97469f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker } else { 97569f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker cli->sendMsg(ResponseCode::CommandSyntaxError, 97635c77e32b27694a138e9a7877b9a5b474441c58bPaul Jensen "Wrong number of arguments to resolver flushnet", false); 97769f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker return 0; 97869f74f372fad2875f94d1ac093c3f1ba86e6f4c2Chad Brubaker } 97989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 98089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 98189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 98289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 98389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 98489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 98589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 98689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 98789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 98889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 98989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 99089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 99189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 99289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 9934a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 9940dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 9954a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 9964a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 997db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericSyntaxError(SocketClient *cli, const char *usageMsg) { 998db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg; 999db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall asprintf(&msg, "Usage: bandwidth %s", usageMsg); 1000db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, msg, false); 1001db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1002db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1003db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1004db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOkFail(SocketClient *cli, int cond) { 1005db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!cond) { 1006db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 1007db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } else { 1008db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", false); 1009db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1010db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1011db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1012db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOpFailed(SocketClient *cli, const char *errMsg) { 1013db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, errMsg, false); 1014db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1015db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1016fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 10174a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 1018db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "<cmds> <args...>"); 10194a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 10204a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10214a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 10223fb42e026ffebab2c8f282e42501040121e32d83Steve Block ALOGV("bwctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 1023db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10244a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 10250031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall int rc = sBandwidthCtrl->enableBandwidthControl(true); 1026db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1027db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1028db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1029db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1030db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "disable")) { 1031db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->disableBandwidthControl(); 1032db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1033db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10340dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1035db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1036db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 1037fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 1038db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequota <interface>"); 1039fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1040fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1041db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 1042db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1043db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1044fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1045db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1046db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 10478a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 10488a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1049db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getquota"); 10508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10518a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1052db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 10538a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 1054db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 10558a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1057db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10588a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 10597776cea21f88c4c01eba509db09bc2ccaa28ed5dSynergyDev asprintf(&msg, "%" PRId64, bytes); 10608a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 10618a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 1062db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1064db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1065db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 10668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 10678a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1068db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getiquota <iface>"); 10698a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1071db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1072db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 10738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 1074db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 10758a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 10778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 10787776cea21f88c4c01eba509db09bc2ccaa28ed5dSynergyDev asprintf(&msg, "%" PRId64, bytes); 10798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 10808a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 1081db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1083db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1084db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 1085fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 1086db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquota <interface> <bytes>"); 1087fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1088fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1089db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 1090db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1091db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1092db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1093db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 1094db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 1095fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 1096db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquotas <bytes> <interface> ..."); 1097fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1098fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1099db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11008a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 11010dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 11020dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 11030dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 11040dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 11050dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 11060dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 11070dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1108db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11090dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 11100dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1111db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1112db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11130dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1114db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1115db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 1116db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 11170dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 1118db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequotas <interface> ..."); 11190dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11200dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1121db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11228a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 11230dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 11240dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 11250dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 11260dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 11270dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 11280dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 11290dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1130db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 11320dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1133db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1134db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11350dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1136db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1137db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 11380dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 1139db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeiquota <interface>"); 11400dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11410dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1142db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 1143db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1144db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11450dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1146db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1147db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 11480dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 1149db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setiquota <interface> <bytes>"); 11500dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11510dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1152db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 1153db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1154db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1155fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1156db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1157db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 1158fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1159db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); 11604a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 1161fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1162db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 1163db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1164db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1165db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1166fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1167db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1168db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 1169fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1170db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removenaughtyapps <appUid> ..."); 1171fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1172fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1173db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 1174db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1175db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1176e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1177e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[1], "happybox")) { 1178e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (argc < 3) { 1179e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "happybox (enable | disable)"); 1180e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1181e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1182e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[2], "enable")) { 1183e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->enableHappyBox(); 1184e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1185e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1186fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1187e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1188e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[2], "disable")) { 1189e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->disableHappyBox(); 1190e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1191e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1192e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1193e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "happybox (enable | disable)"); 1194e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1195e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1196e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[1], "addniceapps") || !strcmp(argv[1], "aha")) { 1197e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (argc < 3) { 1198e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "addniceapps <appUid> ..."); 1199e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1200e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1201e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->addNiceApps(argc - 2, argv + 2); 1202e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1203e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1204e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1205e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (!strcmp(argv[1], "removeniceapps") || !strcmp(argv[1], "rha")) { 1206e478873947f995e44e8c559342462c177a420ae0JP Abgrall if (argc < 3) { 1207e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericSyntaxError(cli, "removeniceapps <appUid> ..."); 1208e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1209e478873947f995e44e8c559342462c177a420ae0JP Abgrall } 1210e478873947f995e44e8c559342462c177a420ae0JP Abgrall int rc = sBandwidthCtrl->removeNiceApps(argc - 2, argv + 2); 1211e478873947f995e44e8c559342462c177a420ae0JP Abgrall sendGenericOkFail(cli, rc); 1212e478873947f995e44e8c559342462c177a420ae0JP Abgrall return 0; 1213db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1214db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 12158a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1216db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setglobalalert <bytes>"); 12178a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12188a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1219db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 1220db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1221db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1222db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1223c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugsettetherglobalalert") || !strcmp(argv[1], "dstga")) { 1224c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1225c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugsettetherglobalalert <interface0> <interface1>"); 1226c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1227c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1228c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1229c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 1230c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1231c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1232c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1233c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1234db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 12358a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1236db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeglobalalert"); 12378a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12388a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1239db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlert(); 1240db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1241db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12428a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1243db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1244c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugremovetetherglobalalert") || !strcmp(argv[1], "drtga")) { 1245c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1246c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugremovetetherglobalalert <interface0> <interface1>"); 1247c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1248c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1249c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1250c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 1251c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1252c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1253c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1254c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1255db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 12568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1257db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setsharedalert <bytes>"); 12588a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12598a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1260db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 1261db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1262db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1264db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1265db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 12668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1267db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removesharedalert"); 12688a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12698a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1270db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeSharedAlert(); 1271db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1272db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1274db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1275db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 12768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 1277db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setinterfacealert <interface> <bytes>"); 12788a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1280db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 1281db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1282db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12838a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1284db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1285db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 12868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1287db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeinterfacealert <interface>"); 12888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1290db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 1291db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1292fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1293db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 12944a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1295db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "gettetherstats") || !strcmp(argv[1], "gts")) { 1296db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall BandwidthController::TetherStats tetherStats; 1297a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall std::string extraProcessingInfo = ""; 1298baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall if (argc < 2 || argc > 4) { 1299baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall sendGenericSyntaxError(cli, "gettetherstats [<intInterface> <extInterface>]"); 1300db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1301db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1302baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall tetherStats.intIface = argc > 2 ? argv[2] : ""; 1303baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall tetherStats.extIface = argc > 3 ? argv[3] : ""; 1304f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall // No filtering requested and there are no interface pairs to lookup. 1305f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall if (argc <= 2 && sNatCtrl->ifacePairList.empty()) { 1306f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Tethering stats list completed", false); 1307f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall return 0; 1308f3cc83fa5b14455589af83b20998885452cdc46dJP Abgrall } 1309baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall int rc = sBandwidthCtrl->getTetherStats(cli, tetherStats, extraProcessingInfo); 1310db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (rc) { 1311a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall extraProcessingInfo.insert(0, "Failed to get tethering stats.\n"); 1312a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall sendGenericOpFailed(cli, extraProcessingInfo.c_str()); 1313baeccc455b293c2c83dbe6463f56b741177bd612JP Abgrall return 0; 1314db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1315db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 13164a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 13174a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1318db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1319db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 13204a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 13214a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 13220031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13230031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallCommandListener::IdletimerControlCmd::IdletimerControlCmd() : 13240031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall NetdCommand("idletimer") { 13250031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 13260031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13270031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrallint CommandListener::IdletimerControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 13280031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // TODO(ashish): Change the error statements 13290031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (argc < 2) { 13300031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13310031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13320031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13330031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13340031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall ALOGV("idletimerctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 13350031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13360031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "enable")) { 13370031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->enableIdletimerControl()) { 13380031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13390031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Enable success", false); 13410031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13430031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13440031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13450031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "disable")) { 13460031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->disableIdletimerControl()) { 13470031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13480031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13490031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Disable success", false); 13500031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13510031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13520031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13530031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "add")) { 135498f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (argc != 5) { 13550031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13560031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13570031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 135898f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if(0 != sIdletimerCtrl->addInterfaceIdletimer( 135998f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai argv[2], atoi(argv[3]), argv[4])) { 13600031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to add interface", false); 13610031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13620031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Add success", false); 13630031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13640031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13650031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13660031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "remove")) { 136798f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (argc != 5) { 13680031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13690031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13700031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13710031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // ashish: fixme timeout 137298f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (0 != sIdletimerCtrl->removeInterfaceIdletimer( 137398f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai argv[2], atoi(argv[3]), argv[4])) { 13740031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove interface", false); 13750031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13760031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Remove success", false); 13770031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13780031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13790031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13800031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13810031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown idletimer cmd", false); 13820031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13830031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 1384d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1385d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyCommandListener::FirewallCmd::FirewallCmd() : 1386d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey NetdCommand("firewall") { 1387d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1388d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1389d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkeyint CommandListener::FirewallCmd::sendGenericOkFail(SocketClient *cli, int cond) { 1390d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!cond) { 1391d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandOkay, "Firewall command succeeded", false); 1392d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } else { 1393d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::OperationFailed, "Firewall command failed", false); 1394d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1395d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1396d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1397d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1398d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyFirewallRule CommandListener::FirewallCmd::parseRule(const char* arg) { 1399d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(arg, "allow")) { 1400d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return ALLOW; 1401d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } else { 1402d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return DENY; 1403d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1404d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1405d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1406d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkeyint CommandListener::FirewallCmd::runCommand(SocketClient *cli, int argc, 1407d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey char **argv) { 1408d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc < 2) { 1409d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing command", false); 1410d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1411d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1412d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1413d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "enable")) { 1414d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->enableFirewall(); 1415d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1416d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1417d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "disable")) { 1418d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->disableFirewall(); 1419d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1420d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1421d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "is_enabled")) { 1422d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->isFirewallEnabled(); 1423d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1424d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1425d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1426d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_interface_rule")) { 1427d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1428d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1429d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_interface_rule <rmnet0> <allow|deny>", false); 1430d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1431d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1432d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1433d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* iface = argv[2]; 1434d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1435d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1436d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setInterfaceRule(iface, rule); 1437d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1438d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1439d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1440d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_egress_source_rule")) { 1441d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1442d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1443d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_egress_source_rule <192.168.0.1> <allow|deny>", 1444d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1445d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1446d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1447d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1448d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* addr = argv[2]; 1449d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1450d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1451d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setEgressSourceRule(addr, rule); 1452d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1453d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1454d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1455d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_egress_dest_rule")) { 1456d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 5) { 1457d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1458d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_egress_dest_rule <192.168.0.1> <80> <allow|deny>", 1459d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1460d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1461d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1462d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1463d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* addr = argv[2]; 1464d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int port = atoi(argv[3]); 1465d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[4]); 1466d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1467d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = 0; 1468d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey res |= sFirewallCtrl->setEgressDestRule(addr, PROTOCOL_TCP, port, rule); 1469d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey res |= sFirewallCtrl->setEgressDestRule(addr, PROTOCOL_UDP, port, rule); 1470d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1471d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1472d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1473d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_uid_rule")) { 1474d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1475d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1476d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_uid_rule <1000> <allow|deny>", 1477d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1478d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1479d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1480d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1481d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int uid = atoi(argv[2]); 1482d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1483d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1484d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setUidRule(uid, rule); 1485d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1486d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1487d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1488d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown command", false); 1489d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1490d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 14910da73fcecc30140439f856118056df8908609627Daniel Drown 14920da73fcecc30140439f856118056df8908609627Daniel DrownCommandListener::ClatdCmd::ClatdCmd() : NetdCommand("clatd") { 14930da73fcecc30140439f856118056df8908609627Daniel Drown} 14940da73fcecc30140439f856118056df8908609627Daniel Drown 14950da73fcecc30140439f856118056df8908609627Daniel Drownint CommandListener::ClatdCmd::runCommand(SocketClient *cli, int argc, 14960da73fcecc30140439f856118056df8908609627Daniel Drown char **argv) { 14970da73fcecc30140439f856118056df8908609627Daniel Drown int rc = 0; 14980da73fcecc30140439f856118056df8908609627Daniel Drown if (argc < 2) { 14990da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 15000da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15010da73fcecc30140439f856118056df8908609627Daniel Drown } 15020da73fcecc30140439f856118056df8908609627Daniel Drown 15030da73fcecc30140439f856118056df8908609627Daniel Drown if(!strcmp(argv[1], "stop")) { 15040da73fcecc30140439f856118056df8908609627Daniel Drown rc = sClatdCtrl->stopClatd(); 15050da73fcecc30140439f856118056df8908609627Daniel Drown } else if (!strcmp(argv[1], "status")) { 15060da73fcecc30140439f856118056df8908609627Daniel Drown char *tmp = NULL; 15070da73fcecc30140439f856118056df8908609627Daniel Drown 15080da73fcecc30140439f856118056df8908609627Daniel Drown asprintf(&tmp, "Clatd status: %s", (sClatdCtrl->isClatdStarted() ? 15090da73fcecc30140439f856118056df8908609627Daniel Drown "started" : "stopped")); 15100da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::ClatdStatusResult, tmp, false); 15110da73fcecc30140439f856118056df8908609627Daniel Drown free(tmp); 15120da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15130da73fcecc30140439f856118056df8908609627Daniel Drown } else if(!strcmp(argv[1], "start")) { 15140da73fcecc30140439f856118056df8908609627Daniel Drown if (argc < 3) { 15150da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 15160da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15170da73fcecc30140439f856118056df8908609627Daniel Drown } 15180da73fcecc30140439f856118056df8908609627Daniel Drown rc = sClatdCtrl->startClatd(argv[2]); 15190da73fcecc30140439f856118056df8908609627Daniel Drown } else { 15200da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown clatd cmd", false); 15210da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15220da73fcecc30140439f856118056df8908609627Daniel Drown } 15230da73fcecc30140439f856118056df8908609627Daniel Drown 15240da73fcecc30140439f856118056df8908609627Daniel Drown if (!rc) { 15250da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::CommandOkay, "Clatd operation succeeded", false); 15260da73fcecc30140439f856118056df8908609627Daniel Drown } else { 15270da73fcecc30140439f856118056df8908609627Daniel Drown cli->sendMsg(ResponseCode::OperationFailed, "Clatd operation failed", false); 15280da73fcecc30140439f856118056df8908609627Daniel Drown } 15290da73fcecc30140439f856118056df8908609627Daniel Drown 15300da73fcecc30140439f856118056df8908609627Daniel Drown return 0; 15310da73fcecc30140439f856118056df8908609627Daniel Drown} 1532d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15335c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram RamachandranCommandListener::NetworkCommand::NetworkCommand() : NetdCommand("network") { 15345c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran} 15355c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 15365c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::syntaxError(SocketClient* client, const char* message) { 15375c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::CommandSyntaxError, message, false); 15385c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return 0; 15395c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran} 15405c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1541f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandranint CommandListener::NetworkCommand::operationError(SocketClient* client, const char* message, 1542f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran int ret) { 1543f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran errno = -ret; 15445c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::OperationFailed, message, true); 1545d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran return 0; 1546d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1547d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15485c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::success(SocketClient* client) { 15495c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran client->sendMsg(ResponseCode::CommandOkay, "success", false); 1550d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran return 0; 1551d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1552d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran 15535c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranint CommandListener::NetworkCommand::runCommand(SocketClient* client, int argc, char** argv) { 1554d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran if (argc < 2) { 15555c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return syntaxError(client, "Missing argument"); 1556d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran } 15575c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1558f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran // 0 1 2 3 4 5 6 7 8 1559f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran // network route [legacy <uid>] add <netId> <interface> <destination> [nexthop] 1560f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran // network route [legacy <uid>] remove <netId> <interface> <destination> [nexthop] 1561f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (!strcmp(argv[1], "route")) { 1562f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (argc < 6 || argc > 9) { 1563f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return syntaxError(client, "Incorrect number of arguments"); 1564f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1565f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 1566f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran int nextArg = 2; 1567f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran bool legacy = false; 1568f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran uid_t uid = 0; 1569f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (!strcmp(argv[nextArg], "legacy")) { 1570f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran ++nextArg; 1571f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran legacy = true; 1572f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran uid = strtoul(argv[nextArg++], NULL, 0); 1573f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1574f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 1575f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran bool add = false; 1576f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (!strcmp(argv[nextArg], "add")) { 1577f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran add = true; 1578f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } else if (strcmp(argv[nextArg], "remove")) { 1579f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return syntaxError(client, "Unknown argument"); 1580f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1581f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran ++nextArg; 1582f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 158387475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran unsigned netId = stringToNetId(argv[nextArg++]); 1584f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran const char* interface = argv[nextArg++]; 1585f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran const char* destination = argv[nextArg++]; 1586f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran const char* nexthop = argc > nextArg ? argv[nextArg] : NULL; 1587f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 1588f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran int ret; 1589f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (add) { 1590f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran ret = sNetCtrl->addRoute(netId, interface, destination, nexthop, legacy, uid); 1591f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } else { 1592f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran ret = sNetCtrl->removeRoute(netId, interface, destination, nexthop, legacy, uid); 1593f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1594f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (ret) { 1595f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return operationError(client, add ? "addRoute() failed" : "removeRoute() failed", ret); 1596f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1597f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 1598f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return success(client); 1599f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1600f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 160187475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // 0 1 2 3 4 160287475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // network interface add <netId> <interface> 160387475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran // network interface remove <netId> <interface> 160487475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (!strcmp(argv[1], "interface")) { 160587475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (argc != 5) { 1606f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return syntaxError(client, "Missing argument"); 1607f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 160887475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran unsigned netId = stringToNetId(argv[3]); 160987475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (!strcmp(argv[2], "add")) { 161087475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (int ret = sNetCtrl->addInterfaceToNetwork(netId, argv[4])) { 1611f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return operationError(client, "addInterfaceToNetwork() failed", ret); 1612f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 161387475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran } else if (!strcmp(argv[2], "remove")) { 161487475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran if (int ret = sNetCtrl->removeInterfaceFromNetwork(netId, argv[4])) { 1615f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return operationError(client, "removeInterfaceFromNetwork() failed", ret); 1616f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 161787475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran } else { 161887475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran return syntaxError(client, "Unknown argument"); 1619f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1620f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return success(client); 1621f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1622f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran 1623ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // 0 1 2 3 1624ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // network create <netId> [permission] 16254043f01f8e25f24246efadc710ad7440aab75529Sreeram Ramachandran // 1626e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran // 0 1 2 3 4 1627e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran // network create <netId> vpn <hasDns> 1628d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran if (!strcmp(argv[1], "create")) { 1629ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen if (argc < 3) { 16305c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return syntaxError(client, "Missing argument"); 16315c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 163287475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran unsigned netId = stringToNetId(argv[2]); 1633e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran if (argc == 5 && !strcmp(argv[3], "vpn")) { 1634e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran bool hasDns = atoi(argv[4]); 1635e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran if (int ret = sNetCtrl->createVirtualNetwork(netId, hasDns)) { 1636e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran return operationError(client, "createVirtualNetwork() failed", ret); 16374043f01f8e25f24246efadc710ad7440aab75529Sreeram Ramachandran } 1638ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran } else if (argc > 4) { 1639ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return syntaxError(client, "Unknown trailing argument(s)"); 16404043f01f8e25f24246efadc710ad7440aab75529Sreeram Ramachandran } else { 1641ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran Permission permission = PERMISSION_NONE; 1642ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran if (argc == 4) { 1643ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran permission = stringToPermission(argv[3]); 1644ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran if (permission == PERMISSION_NONE) { 1645ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return syntaxError(client, "Unknown permission"); 1646ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran } 16474043f01f8e25f24246efadc710ad7440aab75529Sreeram Ramachandran } 1648e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran if (int ret = sNetCtrl->createPhysicalNetwork(netId, permission)) { 1649e09b20aee85f1dfd8c18c3d8581ac875d939ba70Sreeram Ramachandran return operationError(client, "createPhysicalNetwork() failed", ret); 16504043f01f8e25f24246efadc710ad7440aab75529Sreeram Ramachandran } 16515c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 16525c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return success(client); 1653d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran } 16545c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1655d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // 0 1 2 1656d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran // network destroy <netId> 1657d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran if (!strcmp(argv[1], "destroy")) { 1658379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (argc != 3) { 1659379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Incorrect number of arguments"); 16605c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 166187475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran unsigned netId = stringToNetId(argv[2]); 1662f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (int ret = sNetCtrl->destroyNetwork(netId)) { 1663f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return operationError(client, "destroyNetwork() failed", ret); 16645c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran } 16655c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return success(client); 1666d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran } 16675c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran 1668f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran // 0 1 2 3 1669f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran // network default set <netId> 1670f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran // network default clear 1671f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (!strcmp(argv[1], "default")) { 1672f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (argc < 3) { 1673ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return syntaxError(client, "Missing argument"); 1674ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1675f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran unsigned netId = NETID_UNSET; 1676f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (!strcmp(argv[2], "set")) { 1677f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (argc < 4) { 1678f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return syntaxError(client, "Missing netId"); 1679ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 168087475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran netId = stringToNetId(argv[3]); 1681f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } else if (strcmp(argv[2], "clear")) { 1682f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return syntaxError(client, "Unknown argument"); 1683f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran } 1684f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (int ret = sNetCtrl->setDefaultNetwork(netId)) { 1685f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return operationError(client, "setDefaultNetwork() failed", ret); 1686ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1687ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen return success(client); 1688ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen } 1689ae37e8a4f42b658d5aaf43f312f063944b4aeecbPaul Jensen 1690ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // 0 1 2 3 4 5 1691ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // network permission user set <permission> <uid> ... 1692ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // network permission user clear <uid> ... 1693ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // network permission network set <permission> <netId> ... 1694ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran // network permission network clear <netId> ... 1695379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!strcmp(argv[1], "permission")) { 1696379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (argc < 5) { 1697379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Missing argument"); 1698379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1699379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran int nextArg = 4; 1700379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran Permission permission = PERMISSION_NONE; 1701379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!strcmp(argv[3], "set")) { 1702ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran permission = stringToPermission(argv[4]); 1703ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran if (permission == PERMISSION_NONE) { 1704ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return syntaxError(client, "Unknown permission"); 1705ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran } 1706ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran nextArg = 5; 1707379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } else if (strcmp(argv[3], "clear")) { 1708379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1709379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1710ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran if (nextArg == argc) { 1711ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran return syntaxError(client, "Missing id"); 1712ed4bd1f7d219f9f5f56763ea02cf4947e78397f6Sreeram Ramachandran } 1713379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran std::vector<unsigned> ids; 1714379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran for (; nextArg < argc; ++nextArg) { 1715379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran char* endPtr; 1716379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran unsigned id = strtoul(argv[nextArg], &endPtr, 0); 1717379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!*argv[nextArg] || *endPtr) { 1718379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Invalid id"); 1719379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1720379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran ids.push_back(id); 1721379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1722379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran if (!strcmp(argv[2], "user")) { 1723f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran sNetCtrl->setPermissionForUsers(permission, ids); 1724379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } else if (!strcmp(argv[2], "network")) { 1725f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran if (int ret = sNetCtrl->setPermissionForNetworks(permission, ids)) { 1726f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502Sreeram Ramachandran return operationError(client, "setPermissionForNetworks() failed", ret); 1727379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1728379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } else { 1729379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1730379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1731379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran return success(client); 1732379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran } 1733379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran 1734b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran // 0 1 2 3 4 1735b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran // network users add <netId> [<uid>[-<uid>]] ... 1736b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran // network users remove <netId> [<uid>[-<uid>]] ... 1737b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran if (!strcmp(argv[1], "users")) { 1738b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran if (argc < 4) { 1739b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran return syntaxError(client, "Missing argument"); 1740b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } 174187475a1471373b72ffc9f81f17dfd7884723fa86Sreeram Ramachandran unsigned netId = stringToNetId(argv[3]); 1742b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran UidRanges uidRanges; 1743b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran if (!uidRanges.parseFrom(argc - 4, argv + 4)) { 1744b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran return syntaxError(client, "Invalid UIDs"); 1745b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } 1746b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran if (!strcmp(argv[2], "add")) { 1747b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran if (int ret = sNetCtrl->addUsersToNetwork(netId, uidRanges)) { 1748b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran return operationError(client, "addUsersToNetwork() failed", ret); 1749b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } 1750b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } else if (!strcmp(argv[2], "remove")) { 1751b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran if (int ret = sNetCtrl->removeUsersFromNetwork(netId, uidRanges)) { 1752b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran return operationError(client, "removeUsersFromNetwork() failed", ret); 1753b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } 1754b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } else { 1755b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1756b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } 1757b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran return success(client); 1758b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran } 1759b1425cc09f8a29350520db0d4f489331df5a689bSreeram Ramachandran 176089dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran // 0 1 2 3 176189dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran // network protect allow <uid> ... 176289dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran // network protect deny <uid> ... 176389dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran if (!strcmp(argv[1], "protect")) { 176489dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran if (argc < 4) { 176589dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran return syntaxError(client, "Missing argument"); 176689dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran } 176789dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran std::vector<uid_t> uids; 176889dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran for (int i = 3; i < argc; ++i) { 176989dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran uids.push_back(strtoul(argv[i], NULL, 0)); 177089dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran } 177189dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran if (!strcmp(argv[2], "allow")) { 177289dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran sNetCtrl->allowProtect(uids); 177389dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran } else if (!strcmp(argv[2], "deny")) { 177489dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran sNetCtrl->denyProtect(uids); 177589dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran } else { 177689dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran return syntaxError(client, "Unknown argument"); 177789dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran } 177889dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran return success(client); 177989dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran } 178089dad013e4dd98434b0409a84567f38782894029Sreeram Ramachandran 17815c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran return syntaxError(client, "Unknown argument"); 1782d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran} 1783