diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2009-04-07 14:12:59 -0700 |
---|---|---|
committer | Stephen Hemminger <shemminger@vyatta.com> | 2009-04-07 14:12:59 -0700 |
commit | c0bce17c06c56e7b0cf620558f64f3deffc15eb7 (patch) | |
tree | 8848a4d7ed20a3c1b4816e16fc8a1798740c14d6 | |
parent | 8b196e907492e09d3a26c286bd8b3ba0e78e850e (diff) | |
download | quagga-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.c | 14 |
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); } |