summaryrefslogtreecommitdiff
path: root/src/network/networkd-link.c
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-12-08 19:54:06 +0100
committerTom Gundersen <teg@jklm.no>2014-12-08 22:13:40 +0100
commit45af44d47da6933b260c734ad9ff721f63f80a4d (patch)
tree0aae958af8aba2c93a202b9e681749cfc9e19b66 /src/network/networkd-link.c
parent2173cbf847fc53ca24950e77958c902edecfc207 (diff)
networkd: manager - enumerate addresses globally, rather than per-link
The kernel always returns all addresses, rather than only for the given link, so let's only enumerate once.
Diffstat (limited to 'src/network/networkd-link.c')
-rw-r--r--src/network/networkd-link.c63
1 files changed, 16 insertions, 47 deletions
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 4ad0bb47f8..b9f1b992d3 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -576,32 +576,6 @@ int link_route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
return 1;
}
-int link_get_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
- _cleanup_link_unref_ Link *link = userdata;
- int r;
-
- assert(rtnl);
- assert(m);
- assert(link);
- assert(link->manager);
-
- for (; m; m = sd_rtnl_message_next(m)) {
- r = sd_rtnl_message_get_errno(m);
- if (r < 0) {
- log_link_debug(link, "getting address failed: %s",
- strerror(-r));
- continue;
- }
-
- r = link_rtnl_process_address(rtnl, m, link->manager);
- if (r < 0)
- log_link_warning(link, "could not process address: %s",
- strerror(-r));
- }
-
- return 1;
-}
-
static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
_cleanup_link_unref_ Link *link = userdata;
int r;
@@ -622,11 +596,8 @@ static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
r = sd_rtnl_message_get_errno(m);
if (r < 0 && r != -EEXIST)
log_link_warning_errno(link, -r, "%-*s: could not set address: %m", IFNAMSIZ, link->ifname);
- else if (r >= 0) {
- /* calling handler directly so take a ref */
- link_ref(link);
- link_get_address_handler(rtnl, m, link);
- }
+ else if (r >= 0)
+ link_rtnl_process_address(rtnl, m, link->manager);
if (link->link_messages == 0) {
log_link_debug(link, "addresses set");
@@ -1417,8 +1388,7 @@ int link_initialized(Link *link, struct udev_device *device) {
return 0;
}
-int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
- void *userdata) {
+int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
Manager *m = userdata;
Link *link = NULL;
uint16_t type;
@@ -1434,6 +1404,14 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
assert(message);
assert(m);
+ if (sd_rtnl_message_is_error(message)) {
+ r = sd_rtnl_message_get_errno(message);
+ if (r < 0)
+ log_warning_errno(r, "rtnl: failed to receive address: %m");
+
+ return 0;
+ }
+
r = sd_rtnl_message_get_type(message, &type);
if (r < 0) {
log_warning("rtnl: could not get message type");
@@ -1441,8 +1419,11 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message,
}
r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
- if (r < 0 || ifindex <= 0) {
- log_warning("rtnl: received address message without valid ifindex, ignoring");
+ if (r < 0) {
+ log_warning_errno(r, "rtnl: could not get ifindex: %m");
+ return 0;
+ } else if (ifindex <= 0) {
+ log_warning("rtnl: received address message with invalid ifindex: %d", ifindex);
return 0;
} else {
r = link_get(m, ifindex, &link);
@@ -1594,18 +1575,6 @@ int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
log_link_debug(link, "link %d added", link->ifindex);
- r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, link->ifindex,
- 0);
- if (r < 0)
- return r;
-
- r = sd_rtnl_call_async(m->rtnl, req, link_get_address_handler, link, 0,
- NULL);
- if (r < 0)
- return r;
-
- link_ref(link);
-
if (detect_container(NULL) <= 0) {
/* not in a container, udev will be around */
sprintf(ifindex_str, "n%d", link->ifindex);