static void netlink_notification (NMNetlinkMonitor *monitor, struct nl_msg *msg, gpointer user_data) { NMIP6Manager *manager = (NMIP6Manager *) user_data; NMIP6Device *device; struct nlmsghdr *hdr; hdr = nlmsg_hdr (msg); nm_log_dbg (LOGD_HW, "netlink event type %d", hdr->nlmsg_type); switch (hdr->nlmsg_type) { case RTM_NEWADDR: case RTM_DELADDR: device = process_address_change (manager, msg); break; case RTM_NEWROUTE: case RTM_DELROUTE: device = process_route_change (manager, msg); break; case RTM_NEWNDUSEROPT: device = process_nduseropt (manager, msg); break; case RTM_NEWLINK: device = process_newlink (manager, msg); break; default: return; } if (device) { nm_ip6_device_sync_from_netlink (device); } }
void process_nl_add_address (struct nlmsghdr *nlh) { struct ifaddrmsg *ifa = NULL; struct rtattr *rth = NULL; int iface_index = 0; int rt_length = 0; lispd_iface_elt *iface = NULL; lisp_addr_t new_addr; char iface_name[IF_NAMESIZE]; /* * Get the new address from the net link message */ ifa = (struct ifaddrmsg *) NLMSG_DATA (nlh); iface_index = ifa->ifa_index; iface = get_interface_from_index(iface_index); if (iface == NULL){ if_indextoname(iface_index, iface_name); lispd_log_msg(LISP_LOG_DEBUG_2, "process_nl_add_address: the netlink message is not for any interface associated with RLOCs (%s / %d)", iface_name, iface_index); return; } rth = IFA_RTA (ifa); rt_length = IFA_PAYLOAD (nlh); for (;rt_length && RTA_OK (rth, rt_length); rth = RTA_NEXT (rth,rt_length)) { if (ifa->ifa_family == AF_INET && rth->rta_type == IFA_LOCAL){ memcpy (&(new_addr.address),(struct in_addr *)RTA_DATA(rth),sizeof(struct in_addr)); new_addr.afi = AF_INET; process_address_change (iface, new_addr); } if (ifa->ifa_family == AF_INET6 && rth->rta_type == IFA_ADDRESS){ memcpy (&(new_addr.address),(struct in6_addr *)RTA_DATA(rth),sizeof(struct in6_addr)); new_addr.afi = AF_INET6; process_address_change (iface, new_addr); } } }