return;
}
- if (!strcmp(subsys, "net")) {
+ if (!strcmp(subsys, "interface")) {
int action = evt->getAction();
const char *iface = evt->findParam("INTERFACE");
notifyInterfaceLinkChanged(iface, false);
}
+ } else if (!strcmp(subsys, "address")) {
+ const char *address = evt->findParam("ADDRESS");
+ const char *iface = evt->findParam("IFACE");
+ const char *flags = evt->findParam("FLAGS");
+ const char *scope = evt->findParam("SCOPE");
+
+ if (iface && flags && scope) {
+ notifyAddressChanged(evt->getAction(), address, iface, flags, scope);
+ }
+
} else if (!strcmp(subsys, "qlog")) {
const char *alertName = evt->findParam("ALERT_NAME");
const char *iface = evt->findParam("INTERFACE");
mNm->getBroadcaster()->sendBroadcast(
ResponseCode::InterfaceClassActivity, msg, false);
}
+
+void NetlinkHandler::notifyAddressChanged(int action, const char *addr,
+ const char *iface, const char *flags,
+ const char *scope) {
+ char msg[255];
+ snprintf(msg, sizeof(msg), "Address %s %s %s %s %s",
+ (action == NetlinkEvent::NlActionAdd) ? "updated" : "removed",
+ addr, iface, flags, scope);
+
+ mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceAddressChange,
+ msg, false);
+}
void notifyInterfaceLinkChanged(const char *name, bool isUp);
void notifyQuotaLimitReached(const char *name, const char *iface);
void notifyInterfaceClassActivity(const char *name, bool isActive);
+ void notifyAddressChanged(int action, const char *addr, const char *iface,
+ const char *flags, const char *scope);
};
#endif
return -1;
}
- if ((mRouteHandler = setupSocket(&mRouteSock, NETLINK_ROUTE, RTMGRP_LINK,
+ if ((mRouteHandler = setupSocket(&mRouteSock, NETLINK_ROUTE,
+ RTMGRP_LINK |
+ RTMGRP_IPV4_IFADDR |
+ RTMGRP_IPV6_IFADDR |
+ (1 << (RTNLGRP_ND_USEROPT - 1)),
NetlinkListener::NETLINK_FORMAT_BINARY)) == NULL) {
return -1;
}