xref: /aosp_15_r20/system/netd/server/NdcDispatcher.h (revision 8542734a0dd1db395a4d42aae09c37f3c3c3e7a1)
1*8542734aSAndroid Build Coastguard Worker /*
2*8542734aSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*8542734aSAndroid Build Coastguard Worker  *
4*8542734aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8542734aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8542734aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8542734aSAndroid Build Coastguard Worker  *
8*8542734aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8542734aSAndroid Build Coastguard Worker  *
10*8542734aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8542734aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8542734aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8542734aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8542734aSAndroid Build Coastguard Worker  * limitations under the License.
15*8542734aSAndroid Build Coastguard Worker  */
16*8542734aSAndroid Build Coastguard Worker 
17*8542734aSAndroid Build Coastguard Worker #ifndef _NDC_DISPATCHER_H__
18*8542734aSAndroid Build Coastguard Worker #define _NDC_DISPATCHER_H__
19*8542734aSAndroid Build Coastguard Worker 
20*8542734aSAndroid Build Coastguard Worker #include <string>
21*8542734aSAndroid Build Coastguard Worker 
22*8542734aSAndroid Build Coastguard Worker #include <android-base/logging.h>
23*8542734aSAndroid Build Coastguard Worker #include <android/net/IDnsResolver.h>
24*8542734aSAndroid Build Coastguard Worker #include <android/net/INetd.h>
25*8542734aSAndroid Build Coastguard Worker #include "binder/IServiceManager.h"
26*8542734aSAndroid Build Coastguard Worker 
27*8542734aSAndroid Build Coastguard Worker #include "NetdConstants.h"
28*8542734aSAndroid Build Coastguard Worker 
29*8542734aSAndroid Build Coastguard Worker namespace android {
30*8542734aSAndroid Build Coastguard Worker namespace net {
31*8542734aSAndroid Build Coastguard Worker 
32*8542734aSAndroid Build Coastguard Worker class NdcClient {
33*8542734aSAndroid Build Coastguard Worker   public:
34*8542734aSAndroid Build Coastguard Worker     NdcClient() = default;
35*8542734aSAndroid Build Coastguard Worker     ~NdcClient() = default;
36*8542734aSAndroid Build Coastguard Worker 
sendMsg(int code,const char * msg,bool addErrno)37*8542734aSAndroid Build Coastguard Worker     int sendMsg(int code, const char* msg, bool addErrno) {
38*8542734aSAndroid Build Coastguard Worker         if (addErrno) {
39*8542734aSAndroid Build Coastguard Worker             printf("%d 0 %s (%s)\n", code, msg, strerror(errno));
40*8542734aSAndroid Build Coastguard Worker         } else {
41*8542734aSAndroid Build Coastguard Worker             printf("%d 0 %s\n", code, msg);
42*8542734aSAndroid Build Coastguard Worker         }
43*8542734aSAndroid Build Coastguard Worker         return 0;
44*8542734aSAndroid Build Coastguard Worker     }
45*8542734aSAndroid Build Coastguard Worker };
46*8542734aSAndroid Build Coastguard Worker 
47*8542734aSAndroid Build Coastguard Worker class NdcNetdCommand {
48*8542734aSAndroid Build Coastguard Worker   public:
NdcNetdCommand(std::string cmd)49*8542734aSAndroid Build Coastguard Worker     NdcNetdCommand(std::string cmd) : mCommand(std::move(cmd)) {}
~NdcNetdCommand()50*8542734aSAndroid Build Coastguard Worker     virtual ~NdcNetdCommand() {}
51*8542734aSAndroid Build Coastguard Worker 
52*8542734aSAndroid Build Coastguard Worker     virtual int runCommand(NdcClient* c, int argc, char** argv) const = 0;
53*8542734aSAndroid Build Coastguard Worker 
getCommand()54*8542734aSAndroid Build Coastguard Worker     const std::string& getCommand() const { return mCommand; }
55*8542734aSAndroid Build Coastguard Worker 
56*8542734aSAndroid Build Coastguard Worker   private:
57*8542734aSAndroid Build Coastguard Worker     std::string mCommand;
58*8542734aSAndroid Build Coastguard Worker };
59*8542734aSAndroid Build Coastguard Worker 
60*8542734aSAndroid Build Coastguard Worker class NdcDispatcher {
61*8542734aSAndroid Build Coastguard Worker   public:
62*8542734aSAndroid Build Coastguard Worker     // Matches the restrictions previously imposed by CommandListener.cpp.
63*8542734aSAndroid Build Coastguard Worker     static const int CMD_ARGS_MAX = 26;
64*8542734aSAndroid Build Coastguard Worker     // Default log level is set to minimum one.
65*8542734aSAndroid Build Coastguard Worker     static const android::base::LogSeverity LOGLEVEL = android::base::VERBOSE;
66*8542734aSAndroid Build Coastguard Worker 
67*8542734aSAndroid Build Coastguard Worker     NdcDispatcher();
68*8542734aSAndroid Build Coastguard Worker     ~NdcDispatcher() = default;
69*8542734aSAndroid Build Coastguard Worker 
70*8542734aSAndroid Build Coastguard Worker     static sp<INetd> mNetd;
71*8542734aSAndroid Build Coastguard Worker     static sp<IDnsResolver> mDnsResolver;
72*8542734aSAndroid Build Coastguard Worker     NdcClient mNdc;
73*8542734aSAndroid Build Coastguard Worker 
74*8542734aSAndroid Build Coastguard Worker     int dispatchCommand(int argc, char** argv);
75*8542734aSAndroid Build Coastguard Worker     void registerCmd(NdcNetdCommand* cmd);
76*8542734aSAndroid Build Coastguard Worker 
77*8542734aSAndroid Build Coastguard Worker   private:
78*8542734aSAndroid Build Coastguard Worker     std::vector<NdcNetdCommand*> mCommands;
79*8542734aSAndroid Build Coastguard Worker 
80*8542734aSAndroid Build Coastguard Worker     class InterfaceCmd : public NdcNetdCommand {
81*8542734aSAndroid Build Coastguard Worker       public:
82*8542734aSAndroid Build Coastguard Worker         InterfaceCmd();
~InterfaceCmd()83*8542734aSAndroid Build Coastguard Worker         virtual ~InterfaceCmd() {}
84*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
85*8542734aSAndroid Build Coastguard Worker     };
86*8542734aSAndroid Build Coastguard Worker 
87*8542734aSAndroid Build Coastguard Worker     class IpFwdCmd : public NdcNetdCommand {
88*8542734aSAndroid Build Coastguard Worker       public:
89*8542734aSAndroid Build Coastguard Worker         IpFwdCmd();
~IpFwdCmd()90*8542734aSAndroid Build Coastguard Worker         virtual ~IpFwdCmd() {}
91*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
92*8542734aSAndroid Build Coastguard Worker     };
93*8542734aSAndroid Build Coastguard Worker 
94*8542734aSAndroid Build Coastguard Worker     class TetherCmd : public NdcNetdCommand {
95*8542734aSAndroid Build Coastguard Worker       public:
96*8542734aSAndroid Build Coastguard Worker         TetherCmd();
~TetherCmd()97*8542734aSAndroid Build Coastguard Worker         virtual ~TetherCmd() {}
98*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
99*8542734aSAndroid Build Coastguard Worker     };
100*8542734aSAndroid Build Coastguard Worker 
101*8542734aSAndroid Build Coastguard Worker     class NatCmd : public NdcNetdCommand {
102*8542734aSAndroid Build Coastguard Worker       public:
103*8542734aSAndroid Build Coastguard Worker         NatCmd();
~NatCmd()104*8542734aSAndroid Build Coastguard Worker         virtual ~NatCmd() {}
105*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
106*8542734aSAndroid Build Coastguard Worker     };
107*8542734aSAndroid Build Coastguard Worker 
108*8542734aSAndroid Build Coastguard Worker     class BandwidthControlCmd : public NdcNetdCommand {
109*8542734aSAndroid Build Coastguard Worker       public:
110*8542734aSAndroid Build Coastguard Worker         BandwidthControlCmd();
~BandwidthControlCmd()111*8542734aSAndroid Build Coastguard Worker         virtual ~BandwidthControlCmd() {}
112*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
113*8542734aSAndroid Build Coastguard Worker 
114*8542734aSAndroid Build Coastguard Worker       protected:
115*8542734aSAndroid Build Coastguard Worker         void sendGenericOkFail(NdcClient* cli, int cond) const;
116*8542734aSAndroid Build Coastguard Worker         void sendGenericOpFailed(NdcClient* cli, const char* errMsg) const;
117*8542734aSAndroid Build Coastguard Worker         void sendGenericSyntaxError(NdcClient* cli, const char* usageMsg) const;
118*8542734aSAndroid Build Coastguard Worker     };
119*8542734aSAndroid Build Coastguard Worker 
120*8542734aSAndroid Build Coastguard Worker     class IdletimerControlCmd : public NdcNetdCommand {
121*8542734aSAndroid Build Coastguard Worker       public:
122*8542734aSAndroid Build Coastguard Worker         IdletimerControlCmd();
~IdletimerControlCmd()123*8542734aSAndroid Build Coastguard Worker         virtual ~IdletimerControlCmd() {}
124*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
125*8542734aSAndroid Build Coastguard Worker     };
126*8542734aSAndroid Build Coastguard Worker 
127*8542734aSAndroid Build Coastguard Worker     class FirewallCmd : public NdcNetdCommand {
128*8542734aSAndroid Build Coastguard Worker       public:
129*8542734aSAndroid Build Coastguard Worker         FirewallCmd();
~FirewallCmd()130*8542734aSAndroid Build Coastguard Worker         virtual ~FirewallCmd() {}
131*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
132*8542734aSAndroid Build Coastguard Worker 
133*8542734aSAndroid Build Coastguard Worker       protected:
134*8542734aSAndroid Build Coastguard Worker         int sendGenericOkFail(NdcClient* cli, int cond) const;
135*8542734aSAndroid Build Coastguard Worker         static int parseRule(const char* arg);
136*8542734aSAndroid Build Coastguard Worker         static int parseFirewallType(const char* arg);
137*8542734aSAndroid Build Coastguard Worker         static int parseChildChain(const char* arg);
138*8542734aSAndroid Build Coastguard Worker     };
139*8542734aSAndroid Build Coastguard Worker 
140*8542734aSAndroid Build Coastguard Worker     class StrictCmd : public NdcNetdCommand {
141*8542734aSAndroid Build Coastguard Worker       public:
142*8542734aSAndroid Build Coastguard Worker         StrictCmd();
~StrictCmd()143*8542734aSAndroid Build Coastguard Worker         virtual ~StrictCmd() {}
144*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
145*8542734aSAndroid Build Coastguard Worker 
146*8542734aSAndroid Build Coastguard Worker       protected:
147*8542734aSAndroid Build Coastguard Worker         int sendGenericOkFail(NdcClient* cli, int cond) const;
148*8542734aSAndroid Build Coastguard Worker         static int parsePenalty(const char* arg);
149*8542734aSAndroid Build Coastguard Worker     };
150*8542734aSAndroid Build Coastguard Worker 
151*8542734aSAndroid Build Coastguard Worker     class NetworkCommand : public NdcNetdCommand {
152*8542734aSAndroid Build Coastguard Worker       public:
153*8542734aSAndroid Build Coastguard Worker         NetworkCommand();
~NetworkCommand()154*8542734aSAndroid Build Coastguard Worker         virtual ~NetworkCommand() {}
155*8542734aSAndroid Build Coastguard Worker         int runCommand(NdcClient* cli, int argc, char** argv) const;
156*8542734aSAndroid Build Coastguard Worker 
157*8542734aSAndroid Build Coastguard Worker       private:
158*8542734aSAndroid Build Coastguard Worker         int syntaxError(NdcClient* cli, const char* message) const;
159*8542734aSAndroid Build Coastguard Worker         int operationError(NdcClient* cli, const char* message, int ret) const;
160*8542734aSAndroid Build Coastguard Worker         int success(NdcClient* cli) const;
161*8542734aSAndroid Build Coastguard Worker     };
162*8542734aSAndroid Build Coastguard Worker };
163*8542734aSAndroid Build Coastguard Worker 
164*8542734aSAndroid Build Coastguard Worker }  // namespace net
165*8542734aSAndroid Build Coastguard Worker }  // namespace android
166*8542734aSAndroid Build Coastguard Worker 
167*8542734aSAndroid Build Coastguard Worker #endif
168