| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _NDC_DISPATCHER_H__ |
| #define _NDC_DISPATCHER_H__ |
| |
| #include <string> |
| |
| #include <android-base/logging.h> |
| #include <android/net/IDnsResolver.h> |
| #include <android/net/INetd.h> |
| #include "binder/IServiceManager.h" |
| |
| #include "NetdConstants.h" |
| |
| namespace android { |
| namespace net { |
| |
| class NdcClient { |
| public: |
| NdcClient() = default; |
| ~NdcClient() = default; |
| |
| int sendMsg(int code, const char* msg, bool addErrno) { |
| if (addErrno) { |
| printf("%d 0 %s (%s)\n", code, msg, strerror(errno)); |
| } else { |
| printf("%d 0 %s\n", code, msg); |
| } |
| return 0; |
| } |
| }; |
| |
| class NdcNetdCommand { |
| public: |
| NdcNetdCommand(std::string cmd) : mCommand(std::move(cmd)) {} |
| virtual ~NdcNetdCommand() {} |
| |
| virtual int runCommand(NdcClient* c, int argc, char** argv) const = 0; |
| |
| const std::string& getCommand() const { return mCommand; } |
| |
| private: |
| std::string mCommand; |
| }; |
| |
| class NdcDispatcher { |
| public: |
| // Matches the restrictions previously imposed by CommandListener.cpp. |
| static const int CMD_ARGS_MAX = 26; |
| // Default log level is set to minimum one. |
| static const android::base::LogSeverity LOGLEVEL = android::base::VERBOSE; |
| |
| NdcDispatcher(); |
| ~NdcDispatcher() = default; |
| |
| static sp<INetd> mNetd; |
| static sp<IDnsResolver> mDnsResolver; |
| NdcClient mNdc; |
| |
| int dispatchCommand(int argc, char** argv); |
| void registerCmd(NdcNetdCommand* cmd); |
| |
| private: |
| std::vector<NdcNetdCommand*> mCommands; |
| |
| class InterfaceCmd : public NdcNetdCommand { |
| public: |
| InterfaceCmd(); |
| virtual ~InterfaceCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| }; |
| |
| class IpFwdCmd : public NdcNetdCommand { |
| public: |
| IpFwdCmd(); |
| virtual ~IpFwdCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| }; |
| |
| class TetherCmd : public NdcNetdCommand { |
| public: |
| TetherCmd(); |
| virtual ~TetherCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| }; |
| |
| class NatCmd : public NdcNetdCommand { |
| public: |
| NatCmd(); |
| virtual ~NatCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| }; |
| |
| class BandwidthControlCmd : public NdcNetdCommand { |
| public: |
| BandwidthControlCmd(); |
| virtual ~BandwidthControlCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| |
| protected: |
| void sendGenericOkFail(NdcClient* cli, int cond) const; |
| void sendGenericOpFailed(NdcClient* cli, const char* errMsg) const; |
| void sendGenericSyntaxError(NdcClient* cli, const char* usageMsg) const; |
| }; |
| |
| class IdletimerControlCmd : public NdcNetdCommand { |
| public: |
| IdletimerControlCmd(); |
| virtual ~IdletimerControlCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| }; |
| |
| class FirewallCmd : public NdcNetdCommand { |
| public: |
| FirewallCmd(); |
| virtual ~FirewallCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| |
| protected: |
| int sendGenericOkFail(NdcClient* cli, int cond) const; |
| static int parseRule(const char* arg); |
| static int parseFirewallType(const char* arg); |
| static int parseChildChain(const char* arg); |
| }; |
| |
| class ClatdCmd : public NdcNetdCommand { |
| public: |
| ClatdCmd(); |
| virtual ~ClatdCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| }; |
| |
| class StrictCmd : public NdcNetdCommand { |
| public: |
| StrictCmd(); |
| virtual ~StrictCmd() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| |
| protected: |
| int sendGenericOkFail(NdcClient* cli, int cond) const; |
| static int parsePenalty(const char* arg); |
| }; |
| |
| class NetworkCommand : public NdcNetdCommand { |
| public: |
| NetworkCommand(); |
| virtual ~NetworkCommand() {} |
| int runCommand(NdcClient* cli, int argc, char** argv) const; |
| |
| private: |
| int syntaxError(NdcClient* cli, const char* message) const; |
| int operationError(NdcClient* cli, const char* message, int ret) const; |
| int success(NdcClient* cli) const; |
| }; |
| }; |
| |
| } // namespace net |
| } // namespace android |
| |
| #endif |