From 1368851611518cf458050c9ec692cff764cbfab2 Mon Sep 17 00:00:00 2001 From: Tim Kourt Date: Tue, 25 Jun 2019 15:20:55 -0700 Subject: [PATCH] netconfig: Obtain all currently assigned IPv4 addresses --- src/netconfig.c | 25 +++++++++++++++++++++++++ src/rtnlutil.c | 21 +++++++++++++++++++++ src/rtnlutil.h | 3 +++ 3 files changed, 49 insertions(+) diff --git a/src/netconfig.c b/src/netconfig.c index 5c699796..460c81b2 100644 --- a/src/netconfig.c +++ b/src/netconfig.c @@ -195,6 +195,22 @@ static void netconfig_ifaddr_notify(uint16_t type, const void *data, } } +static void netconfig_ifaddr_cmd_cb(int error, uint16_t type, + const void *data, uint32_t len, + void *user_data) +{ + if (error) { + l_error("netconfig: ifaddr command failure. " + "Error %d: %s", error, strerror(-error)); + return; + } + + if (type != RTM_NEWADDR) + return; + + netconfig_ifaddr_notify(type, data, len, user_data); +} + bool netconfig_ifindex_add(uint32_t ifindex) { struct netconfig *netconfig; @@ -272,6 +288,15 @@ static int netconfig_init(void) return r; } + r = rtnl_ifaddr_get(rtnl, netconfig_ifaddr_cmd_cb, NULL, NULL); + if (!r) { + l_error("netconfig: Failed to get addresses from RTNL link."); + l_netlink_destroy(rtnl); + rtnl = NULL; + + return r; + } + netconfig_list = l_queue_new(); return 0; diff --git a/src/rtnlutil.c b/src/rtnlutil.c index 963faed3..cf4d419b 100644 --- a/src/rtnlutil.c +++ b/src/rtnlutil.c @@ -110,3 +110,24 @@ void rtnl_ifaddr_extract(const struct ifaddrmsg *ifa, int bytes, } } } + +uint32_t rtnl_ifaddr_get(struct l_netlink *rtnl, l_netlink_command_func_t cb, + void *user_data, + l_netlink_destroy_func_t destroy) +{ + struct ifaddrmsg *rtmmsg; + uint32_t id; + + rtmmsg = l_malloc(sizeof(struct ifaddrmsg)); + explicit_bzero(rtmmsg, sizeof(struct ifaddrmsg)); + + rtmmsg->ifa_family = AF_INET; + + id = l_netlink_send(rtnl, RTM_GETADDR, NLM_F_DUMP, rtmmsg, + sizeof(struct ifaddrmsg), cb, user_data, + destroy); + + l_free(rtmmsg); + + return id; +} diff --git a/src/rtnlutil.h b/src/rtnlutil.h index 030a6baf..2e86fd93 100644 --- a/src/rtnlutil.h +++ b/src/rtnlutil.h @@ -28,3 +28,6 @@ uint32_t rtnl_set_linkmode_and_operstate(struct l_netlink *rtnl, int ifindex, void rtnl_ifaddr_extract(const struct ifaddrmsg *ifa, int bytes, char **label, char **ip, char **broadcast); +uint32_t rtnl_ifaddr_get(struct l_netlink *rtnl, l_netlink_command_func_t cb, + void *user_data, + l_netlink_destroy_func_t destroy);