OSDN Git Service

Support adding/removing IPv4 and IPv6 addresses on interfaces
authorErik Kline <ek@google.com>
Tue, 2 Aug 2016 06:22:53 +0000 (15:22 +0900)
committerErik Kline <ek@google.com>
Tue, 2 Aug 2016 08:17:08 +0000 (17:17 +0900)
Bug: 30298058
Change-Id: Ic25cd165476d1a781595460b7d764e8df4707c65

server/InterfaceController.cpp
server/InterfaceController.h
server/NetdNativeService.cpp
server/NetdNativeService.h
server/binder/android/net/INetd.aidl

index cbc3611..4129c0f 100644 (file)
@@ -23,6 +23,7 @@
 #include <android-base/stringprintf.h>
 #include <cutils/log.h>
 #include <logwrap/logwrap.h>
+#include <netutils/ifc.h>
 
 #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());
index 4c8057e..356cc5a 100644 (file)
@@ -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);
index 5e5b8fd..8dc4d93 100644 (file)
@@ -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
index c5d9114..c39e2a8 100644 (file)
@@ -50,6 +50,11 @@ class NetdNativeService : public BinderService<NetdNativeService>, 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
index 1b901b8..e092b76 100644 (file)
@@ -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);
 }