summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2009-04-07 14:12:59 -0700
committerStephen Hemminger <shemminger@vyatta.com>2009-04-07 14:12:59 -0700
commitc0bce17c06c56e7b0cf620558f64f3deffc15eb7 (patch)
tree8848a4d7ed20a3c1b4816e16fc8a1798740c14d6
parent8b196e907492e09d3a26c286bd8b3ba0e78e850e (diff)
downloadquagga-c0bce17c06c56e7b0cf620558f64f3deffc15eb7.tar.bz2
quagga-c0bce17c06c56e7b0cf620558f64f3deffc15eb7.tar.xz
Zebra: remember metric of kernel route
When kernel notifies zebra about route, zebra needs to remember and use that metric.
-rw-r--r--zebra/rt_netlink.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index b7ab7607..33171481 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -666,7 +666,7 @@ netlink_routing_table (struct sockaddr_nl *snl, struct nlmsghdr *h)
int index;
int table;
- int metric;
+ u_int32_t metric;
void *dest;
void *gate;
@@ -784,6 +784,8 @@ netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
int index;
int table;
+ u_int32_t metric;
+
void *dest;
void *gate;
void *src;
@@ -841,6 +843,7 @@ netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
}
index = 0;
+ metric = 0;
dest = NULL;
gate = NULL;
src = NULL;
@@ -859,6 +862,9 @@ netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
if (tb[RTA_PREFSRC])
src = RTA_DATA (tb[RTA_PREFSRC]);
+ if (tb[RTA_PRIORITY])
+ metric = *(uint32_t *) RTA_DATA(tb[RTA_PRIORITY]);
+
if (rtm->rtm_family == AF_INET)
{
struct prefix_ipv4 p;
@@ -877,8 +883,8 @@ netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
}
if (h->nlmsg_type == RTM_NEWROUTE)
- rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, src, index, table, 0,
- 0, rtm->rtm_scope, rtm->rtm_protocol);
+ rib_add_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, src, index, table,
+ metric, 0, rtm->rtm_scope, rtm->rtm_protocol);
else
rib_delete_ipv4 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, table);
}
@@ -906,7 +912,7 @@ netlink_route_change (struct sockaddr_nl *snl, struct nlmsghdr *h)
}
if (h->nlmsg_type == RTM_NEWROUTE)
- rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0, 0, 0);
+ rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0, metric, 0);
else
rib_delete_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0);
}