diff options
Diffstat (limited to 'zebra/rt_socket.c')
-rw-r--r-- | zebra/rt_socket.c | 69 |
1 files changed, 25 insertions, 44 deletions
diff --git a/zebra/rt_socket.c b/zebra/rt_socket.c index bf21ca95..00093c2a 100644 --- a/zebra/rt_socket.c +++ b/zebra/rt_socket.c @@ -214,34 +214,6 @@ kernel_rtm_ipv4 (int cmd, struct prefix *p, struct rib *rib, int family) return 0; /*XXX*/ } -int -kernel_add_ipv4 (struct prefix *p, struct rib *rib) -{ - int route; - - if (zserv_privs.change(ZPRIVS_RAISE)) - zlog (NULL, LOG_ERR, "Can't raise privileges"); - route = kernel_rtm_ipv4 (RTM_ADD, p, rib, AF_INET); - if (zserv_privs.change(ZPRIVS_LOWER)) - zlog (NULL, LOG_ERR, "Can't lower privileges"); - - return route; -} - -int -kernel_delete_ipv4 (struct prefix *p, struct rib *rib) -{ - int route; - - if (zserv_privs.change(ZPRIVS_RAISE)) - zlog (NULL, LOG_ERR, "Can't raise privileges"); - route = kernel_rtm_ipv4 (RTM_DELETE, p, rib, AF_INET); - if (zserv_privs.change(ZPRIVS_LOWER)) - zlog (NULL, LOG_ERR, "Can't lower privileges"); - - return route; -} - #ifdef HAVE_IPV6 /* Calculate sin6_len value for netmask socket value. */ @@ -384,31 +356,40 @@ kernel_rtm_ipv6_multipath (int cmd, struct prefix *p, struct rib *rib, return 0; /*XXX*/ } +#endif + int -kernel_add_ipv6 (struct prefix *p, struct rib *rib) +kernel_route_rib (struct prefix *p, struct rib *old, struct rib *new) { - int route; + struct rib *rib; + int route = 0, cmd; - if (zserv_privs.change(ZPRIVS_RAISE)) - zlog (NULL, LOG_ERR, "Can't raise privileges"); - route = kernel_rtm_ipv6_multipath (RTM_ADD, p, rib, AF_INET6); - if (zserv_privs.change(ZPRIVS_LOWER)) - zlog (NULL, LOG_ERR, "Can't lower privileges"); + if (!old && new) + cmd = RTM_ADD; + else if (old && !new) + cmd = RTM_DEL; + else + cmd = RTM_CHANGE; - return route; -} - -int -kernel_delete_ipv6 (struct prefix *p, struct rib *rib) -{ - int route; + rib = new ? new : old; if (zserv_privs.change(ZPRIVS_RAISE)) zlog (NULL, LOG_ERR, "Can't raise privileges"); - route = kernel_rtm_ipv6_multipath (RTM_DELETE, p, rib, AF_INET6); + + switch (PREFIX_FAMILY(p)) + { + case AF_INET: + route = kernel_rtm_ipv4 (cmd, p, rib, AF_INET); + break; +#ifdef HAVE_IPV6 + case AF_INET6: + route = kernel_rtm_ipv6 (cmd, p, rib, AF_INET6); + break; +#endif + } + if (zserv_privs.change(ZPRIVS_LOWER)) zlog (NULL, LOG_ERR, "Can't lower privileges"); return route; } -#endif /* HAVE_IPV6 */ |