diff options
-rw-r--r-- | lib/if.h | 3 | ||||
-rw-r--r-- | zebra/connected.c | 10 | ||||
-rw-r--r-- | zebra/connected.h | 4 | ||||
-rw-r--r-- | zebra/if_ioctl.c | 6 | ||||
-rw-r--r-- | zebra/if_ioctl_solaris.c | 4 | ||||
-rw-r--r-- | zebra/if_proc.c | 2 | ||||
-rw-r--r-- | zebra/interface.c | 5 | ||||
-rw-r--r-- | zebra/kernel_null.c | 2 | ||||
-rw-r--r-- | zebra/kernel_socket.c | 4 | ||||
-rw-r--r-- | zebra/rt_netlink.c | 4 |
10 files changed, 28 insertions, 16 deletions
@@ -172,6 +172,9 @@ struct connected /* Label for Linux 2.2.X and upper. */ char *label; + + /* scope value, Linux only */ + unsigned scope; }; /* Does the destination field contain a peer address? */ diff --git a/zebra/connected.c b/zebra/connected.c index 25186a80..82c531e4 100644 --- a/zebra/connected.c +++ b/zebra/connected.c @@ -269,7 +269,7 @@ connected_up_ipv4 (struct interface *ifp, struct connected *ifc) void connected_add_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, u_char prefixlen, struct in_addr *broad, - const char *label) + const char *label, unsigned scope) { struct prefix_ipv4 *p; struct connected *ifc; @@ -341,6 +341,8 @@ connected_add_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, if (label) ifc->label = XSTRDUP (MTYPE_CONNECTED_LABEL, label); + ifc->scope = scope; + /* nothing to do? */ if ((ifc = connected_implicit_withdraw (ifp, ifc)) == NULL) return; @@ -436,7 +438,7 @@ connected_up_ipv6 (struct interface *ifp, struct connected *ifc) void connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *addr, u_char prefixlen, struct in6_addr *broad, - const char *label) + const char *label, unsigned scope) { struct prefix_ipv6 *p; struct connected *ifc; @@ -479,7 +481,9 @@ connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *addr, /* Label of this address. */ if (label) ifc->label = XSTRDUP (MTYPE_CONNECTED_LABEL, label); - + + ifc->scope = scope; + if ((ifc = connected_implicit_withdraw (ifp, ifc)) == NULL) return; diff --git a/zebra/connected.h b/zebra/connected.h index d7934055..5ea6d54d 100644 --- a/zebra/connected.h +++ b/zebra/connected.h @@ -31,7 +31,7 @@ connected_check_ptp (struct interface *ifp, struct prefix *p, struct prefix *d); extern void connected_add_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, u_char prefixlen, struct in_addr *broad, - const char *label); + const char *label, unsigned scope); extern void connected_delete_ipv4 (struct interface *ifp, int flags, struct in_addr *addr, @@ -44,7 +44,7 @@ extern void connected_down_ipv4 (struct interface *, struct connected *); extern void connected_add_ipv6 (struct interface *ifp, int flags, struct in6_addr *address, u_char prefixlen, struct in6_addr *broad, - const char *label); + const char *label, unsigned scope); extern void connected_delete_ipv6 (struct interface *ifp, struct in6_addr *address, u_char prefixlen, struct in6_addr *broad); diff --git a/zebra/if_ioctl.c b/zebra/if_ioctl.c index f357e154..e85c744c 100644 --- a/zebra/if_ioctl.c +++ b/zebra/if_ioctl.c @@ -276,7 +276,7 @@ if_getaddrs (void) } connected_add_ipv4 (ifp, flags, &addr->sin_addr, - prefixlen, dest_pnt, NULL); + prefixlen, dest_pnt, NULL, 0); } #ifdef HAVE_IPV6 if (ifap->ifa_addr->sa_family == AF_INET6) @@ -321,7 +321,7 @@ if_getaddrs (void) #endif connected_add_ipv6 (ifp, flags, &addr->sin6_addr, prefixlen, - dest_pnt, NULL); + dest_pnt, NULL, 0); } #endif /* HAVE_IPV6 */ } @@ -412,7 +412,7 @@ if_get_addr (struct interface *ifp) /* Set address to the interface. */ - connected_add_ipv4 (ifp, flags, &addr.sin_addr, prefixlen, dest_pnt, NULL); + connected_add_ipv4 (ifp, flags, &addr.sin_addr, prefixlen, dest_pnt, NULL, 0); return 0; } diff --git a/zebra/if_ioctl_solaris.c b/zebra/if_ioctl_solaris.c index fc384ea2..86fcc484 100644 --- a/zebra/if_ioctl_solaris.c +++ b/zebra/if_ioctl_solaris.c @@ -327,11 +327,11 @@ if_get_addr (struct interface *ifp, struct sockaddr *addr, const char *label) /* Set address to the interface. */ if (af == AF_INET) connected_add_ipv4 (ifp, flags, &SIN (addr)->sin_addr, prefixlen, - (struct in_addr *) dest_pnt, label); + (struct in_addr *) dest_pnt, label, 0); #ifdef HAVE_IPV6 else if (af == AF_INET6) connected_add_ipv6 (ifp, flags, &SIN6 (addr)->sin6_addr, prefixlen, - (struct in6_addr *) dest_pnt, label); + (struct in6_addr *) dest_pnt, label, 0); #endif /* HAVE_IPV6 */ return 0; diff --git a/zebra/if_proc.c b/zebra/if_proc.c index 3aec530b..6c538116 100644 --- a/zebra/if_proc.c +++ b/zebra/if_proc.c @@ -240,7 +240,7 @@ ifaddr_proc_ipv6 () str2in6_addr (addr, &p.prefix); p.prefixlen = plen; - connected_add_ipv6 (ifp, 0, &p.prefix, p.prefixlen, NULL, ifname); + connected_add_ipv6 (ifp, 0, &p.prefix, p.prefixlen, NULL, ifname, 0); } fclose (fp); return 0; diff --git a/zebra/interface.c b/zebra/interface.c index 76131aef..10cb95bb 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -595,6 +595,11 @@ connected_dump_vty (struct vty *vty, struct connected *connected) vty_out (vty, "/%d", connected->destination->prefixlen); } +#ifdef HAVE_NETLINK + if (connected->scope != 0) + vty_out (vty, " scope %s", connected_scope_name (connected->scope)); +#endif + if (CHECK_FLAG (connected->flags, ZEBRA_IFA_SECONDARY)) vty_out (vty, " secondary"); diff --git a/zebra/kernel_null.c b/zebra/kernel_null.c index 6b96c6df..fa90b99b 100644 --- a/zebra/kernel_null.c +++ b/zebra/kernel_null.c @@ -25,7 +25,7 @@ int kernel_address_add_ipv4 (struct interface *a, struct connected *b) SET_FLAG (b->conf, ZEBRA_IFC_REAL); connected_add_ipv4 (a, 0, &b->address->u.prefix4, b->address->prefixlen, (b->destination ? &b->destination->u.prefix4 : NULL), - NULL); + NULL, 0); return 0; } diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index feeaf5d0..5a0359ea 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -658,7 +658,7 @@ ifam_read (struct ifa_msghdr *ifam) connected_add_ipv4 (ifp, flags, &addr.sin.sin_addr, ip_masklen (mask.sin.sin_addr), &brd.sin.sin_addr, - (isalias ? ifname : NULL)); + (isalias ? ifname : NULL), 0); else connected_delete_ipv4 (ifp, flags, &addr.sin.sin_addr, ip_masklen (mask.sin.sin_addr), @@ -675,7 +675,7 @@ ifam_read (struct ifa_msghdr *ifam) connected_add_ipv6 (ifp, flags, &addr.sin6.sin6_addr, ip6_masklen (mask.sin6.sin6_addr), &brd.sin6.sin6_addr, - (isalias ? ifname : NULL)); + (isalias ? ifname : NULL), 0); else connected_delete_ipv6 (ifp, &addr.sin6.sin6_addr, diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index da255e0f..e947603e 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -617,7 +617,7 @@ netlink_interface_addr (struct sockaddr_nl *snl, struct nlmsghdr *h) if (h->nlmsg_type == RTM_NEWADDR) connected_add_ipv4 (ifp, flags, (struct in_addr *) addr, ifa->ifa_prefixlen, - (struct in_addr *) broad, label); + (struct in_addr *) broad, label, ifa->ifa_scope); else connected_delete_ipv4 (ifp, flags, (struct in_addr *) addr, ifa->ifa_prefixlen, @@ -629,7 +629,7 @@ netlink_interface_addr (struct sockaddr_nl *snl, struct nlmsghdr *h) if (h->nlmsg_type == RTM_NEWADDR) connected_add_ipv6 (ifp, flags, (struct in6_addr *) addr, ifa->ifa_prefixlen, - (struct in6_addr *) broad, label); + (struct in6_addr *) broad, label, ifa->ifa_scope); else connected_delete_ipv6 (ifp, (struct in6_addr *) addr, ifa->ifa_prefixlen, |