From: Erik Kline Date: Tue, 2 Aug 2016 06:22:53 +0000 (+0900) Subject: Support adding/removing IPv4 and IPv6 addresses on interfaces X-Git-Tag: android-x86-7.1-r1~21^2~4 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=c296f098b63a986265ded8adf13118ba512a0fa7;p=android-x86%2Fsystem-netd.git Support adding/removing IPv4 and IPv6 addresses on interfaces Bug: 30298058 Change-Id: Ic25cd165476d1a781595460b7d764e8df4707c65 --- diff --git a/server/InterfaceController.cpp b/server/InterfaceController.cpp index cbc3611..4129c0f 100644 --- a/server/InterfaceController.cpp +++ b/server/InterfaceController.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "InterfaceController.h" #include "RouteController.h" @@ -192,6 +193,17 @@ int InterfaceController::setMtu(const char *interface, const char *mtu) return writeValueToPath(sys_net_path, interface, "mtu", mtu); } + +int InterfaceController::addAddress(const char *interface, + const char *addrString, int prefixLength) { + return ifc_add_address(interface, addrString, prefixLength); +} + +int InterfaceController::delAddress(const char *interface, + const char *addrString, int prefixLength) { + return ifc_del_address(interface, addrString, prefixLength); +} + void InterfaceController::setBaseReachableTimeMs(unsigned int millis) { std::string value(StringPrintf("%u", millis)); setOnAllInterfaces(ipv4_neigh_conf_dir, "base_reachable_time_ms", value.c_str()); diff --git a/server/InterfaceController.h b/server/InterfaceController.h index 4c8057e..356cc5a 100644 --- a/server/InterfaceController.h +++ b/server/InterfaceController.h @@ -27,6 +27,8 @@ public: static int setIPv6PrivacyExtensions(const char *interface, const int on); static int setIPv6NdOffload(char* interface, const int on); static int setMtu(const char *interface, const char *mtu); + static int addAddress(const char *interface, const char *addrString, int prefixLength); + static int delAddress(const char *interface, const char *addrString, int prefixLength); private: static void setAcceptRA(const char* value); diff --git a/server/NetdNativeService.cpp b/server/NetdNativeService.cpp index 5e5b8fd..8dc4d93 100644 --- a/server/NetdNativeService.cpp +++ b/server/NetdNativeService.cpp @@ -209,5 +209,31 @@ binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) { return binder::Status::ok(); } +binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName, + const std::string &addrString, int prefixLength) { + ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); + + const int err = InterfaceController::addAddress( + ifName.c_str(), addrString.c_str(), prefixLength); + if (err != 0) { + return binder::Status::fromServiceSpecificError(-err, + String8::format("InterfaceController error: %s", strerror(-err))); + } + return binder::Status::ok(); +} + +binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName, + const std::string &addrString, int prefixLength) { + ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); + + const int err = InterfaceController::delAddress( + ifName.c_str(), addrString.c_str(), prefixLength); + if (err != 0) { + return binder::Status::fromServiceSpecificError(-err, + String8::format("InterfaceController error: %s", strerror(-err))); + } + return binder::Status::ok(); +} + } // namespace net } // namespace android diff --git a/server/NetdNativeService.h b/server/NetdNativeService.h index c5d9114..c39e2a8 100644 --- a/server/NetdNativeService.h +++ b/server/NetdNativeService.h @@ -50,6 +50,11 @@ class NetdNativeService : public BinderService, public BnNetd // Tethering-related commands. binder::Status tetherApplyDnsInterfaces(bool *ret) override; + + binder::Status interfaceAddAddress(const std::string &ifName, + const std::string &addrString, int prefixLength) override; + binder::Status interfaceDelAddress(const std::string &ifName, + const std::string &addrString, int prefixLength) override; }; } // namespace net diff --git a/server/binder/android/net/INetd.aidl b/server/binder/android/net/INetd.aidl index 1b901b8..e092b76 100644 --- a/server/binder/android/net/INetd.aidl +++ b/server/binder/android/net/INetd.aidl @@ -155,4 +155,19 @@ interface INetd { * TODO: Return something richer than just a boolean. */ boolean tetherApplyDnsInterfaces(); + + /** + * Add/Remove and IP address from an interface. + * + * @param ifName the interface name + * @param addrString the IP address to add/remove as a string literal + * @param prefixLength the prefix length associated with this IP address + * + * @throws ServiceSpecificException in case of failure, with an error code corresponding to the + * unix errno. + */ + void interfaceAddAddress(in @utf8InCpp String ifName, in @utf8InCpp String addrString, + int prefixLength); + void interfaceDelAddress(in @utf8InCpp String ifName, in @utf8InCpp String addrString, + int prefixLength); }