Skip to content
Snippets Groups Projects
Commit 3ce5505e authored by Marina Maslova's avatar Marina Maslova Committed by Anjan Chanda
Browse files

Update IP addresses for local interfaces

parent 830967cb
No related branches found
No related tags found
1 merge request!43Update IP addresses for local interfaces
Pipeline #202144 passed
...@@ -408,6 +408,51 @@ static int hostmngr_handle_nlevents_link(struct hostmngr_private *priv, ...@@ -408,6 +408,51 @@ static int hostmngr_handle_nlevents_link(struct hostmngr_private *priv,
return NL_OK; return NL_OK;
} }
static int hostmngr_handle_nlevents_addr(struct hostmngr_private *priv,
struct nlmsghdr *hdr)
{
struct ifaddrmsg *ifa = nlmsg_data(hdr);
struct nlattr *nla[__IFA_MAX];
struct local_interface *iface = NULL;
char ifname[IFNAMSIZ] = {0};
struct ip_address ips[32] = {0};
int num_ipaddrs = 32;
int ret;
if (!nlmsg_valid_hdr(hdr, sizeof(*ifa)) ||
(ifa->ifa_family != AF_INET6 && ifa->ifa_family != AF_INET))
return NL_SKIP;
nlmsg_parse(hdr, sizeof(*ifa), nla, __IFA_MAX - 1, NULL);
if_indextoname(ifa->ifa_index, ifname);
iface = hostmngr_ifname_to_interface(priv, ifname);
if (!iface)
return NL_SKIP;
ret = if_getaddrs(iface->ifname, ips, &num_ipaddrs);
if (ret)
return NL_SKIP;
if (num_ipaddrs == iface->num_ipaddrs &&
memcmp(iface->ipaddrs, ips, num_ipaddrs * sizeof(struct ip_address)) == 0)
return NL_OK;
free(iface->ipaddrs);
iface->ipaddrs = NULL;
iface->num_ipaddrs = 0;
if (num_ipaddrs > 0) {
iface->ipaddrs = calloc(num_ipaddrs, sizeof(struct ip_address));
if (iface->ipaddrs) {
iface->num_ipaddrs = num_ipaddrs;
memcpy(iface->ipaddrs, ips, num_ipaddrs * sizeof(struct ip_address));
}
}
return NL_OK;
}
static int hostmngr_nlevents_cb(struct nl_msg *msg, void *arg) static int hostmngr_nlevents_cb(struct nl_msg *msg, void *arg)
{ {
struct nlmsghdr *hdr = nlmsg_hdr(msg); struct nlmsghdr *hdr = nlmsg_hdr(msg);
...@@ -422,13 +467,11 @@ static int hostmngr_nlevents_cb(struct nl_msg *msg, void *arg) ...@@ -422,13 +467,11 @@ static int hostmngr_nlevents_cb(struct nl_msg *msg, void *arg)
case RTM_DELLINK: case RTM_DELLINK:
ret = hostmngr_handle_nlevents_link(priv, hdr, add); ret = hostmngr_handle_nlevents_link(priv, hdr, add);
break; break;
#if 0 //TODO: when needed
case RTM_NEWADDR: case RTM_NEWADDR:
add = true; /* falltrough */
case RTM_DELADDR: case RTM_DELADDR:
ret = hostmngr_handle_nlevents_addr(priv, hdr, add); ret = hostmngr_handle_nlevents_addr(priv, hdr);
break; break;
#endif
case RTM_NEWNEIGH: case RTM_NEWNEIGH:
add = true; add = true;
case RTM_DELNEIGH: case RTM_DELNEIGH:
...@@ -493,6 +536,7 @@ int hostmngr_register_nlevents(struct hostmngr_private *priv) ...@@ -493,6 +536,7 @@ int hostmngr_register_nlevents(struct hostmngr_private *priv)
hostmngr_nlevents_cb, priv); hostmngr_nlevents_cb, priv);
if (nl_socket_add_memberships(rtnl_event.sock, if (nl_socket_add_memberships(rtnl_event.sock,
RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR,
RTNLGRP_NEIGH, RTNLGRP_LINK, 0)) RTNLGRP_NEIGH, RTNLGRP_LINK, 0))
goto out_err; goto out_err;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment