ndp: fixup route replication
authorSteven Barth <steven@midlink.org>
Mon, 13 Jul 2015 20:46:25 +0000 (22:46 +0200)
committerSteven Barth <steven@midlink.org>
Mon, 13 Jul 2015 20:47:46 +0000 (22:47 +0200)
src/ndp.c

index a6f8427e6041902e8ff490b8c1cd44eaaff30cc1..176eaecd268cf147dd6331a299da40467ea2fc84 100644 (file)
--- a/src/ndp.c
+++ b/src/ndp.c
@@ -361,6 +361,7 @@ static void handle_rtnetlink(_unused void *addr, void *data, size_t len,
                ssize_t alen = NLMSG_PAYLOAD(nh, rta_offset);
                struct in6_addr *addr = NULL;
                int *ifindex = (!is_route) ? &ndm->ndm_ifindex : NULL;
+               int *metric = NULL;
 
                for (struct rtattr *rta = (void*)(((uint8_t*)ndm) + rta_offset);
                                RTA_OK(rta, alen); rta = RTA_NEXT(rta, alen)) {
@@ -373,6 +374,8 @@ static void handle_rtnetlink(_unused void *addr, void *data, size_t len,
                        } else if (is_route && rta->rta_type == RTA_GATEWAY) {
                                ifindex = NULL;
                                break;
+                       } else if (is_route && rta->rta_type == RTA_PRIORITY) {
+                               metric = (int*)RTA_DATA(rta);
                        }
                }
 
@@ -491,6 +494,7 @@ static void handle_rtnetlink(_unused void *addr, void *data, size_t len,
                                list_for_each_entry(c, &interfaces, head) {
                                        if (c->ndp == RELAYD_RELAY && !c->master) {
                                                *ifindex = c->ifindex;
+                                               *metric = (*metric & 0xffff) | (c->ifindex << 16);
                                                send(rtnl_event.uloop.fd, nh, nh->nlmsg_len, MSG_DONTWAIT);
                                        }
                                }