#include <android-base/stringprintf.h>
#include <cutils/log.h>
#include <logwrap/logwrap.h>
+#include <netutils/ifc.h>
#include "InterfaceController.h"
#include "RouteController.h"
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());
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);
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
// 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
* 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);
}