diff options
Diffstat (limited to 'ripngd/ripng_interface.c')
| -rw-r--r-- | ripngd/ripng_interface.c | 1592 |
1 files changed, 776 insertions, 816 deletions
diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c index e4b45c54af..c762d8ace7 100644 --- a/ripngd/ripng_interface.c +++ b/ripngd/ripng_interface.c @@ -50,439 +50,431 @@ extern struct zebra_privs_t ripngd_privs; /* Static utility function. */ -static void ripng_enable_apply (struct interface *); -static void ripng_passive_interface_apply (struct interface *); -static int ripng_enable_if_lookup (const char *); -static int ripng_enable_network_lookup2 (struct connected *); -static void ripng_enable_apply_all (void); +static void ripng_enable_apply(struct interface *); +static void ripng_passive_interface_apply(struct interface *); +static int ripng_enable_if_lookup(const char *); +static int ripng_enable_network_lookup2(struct connected *); +static void ripng_enable_apply_all(void); /* Join to the all rip routers multicast group. */ -static int -ripng_multicast_join (struct interface *ifp) +static int ripng_multicast_join(struct interface *ifp) { - int ret; - struct ipv6_mreq mreq; - int save_errno; - - if (if_is_multicast (ifp)) { - memset (&mreq, 0, sizeof (mreq)); - inet_pton(AF_INET6, RIPNG_GROUP, &mreq.ipv6mr_multiaddr); - mreq.ipv6mr_interface = ifp->ifindex; - - /* - * NetBSD 1.6.2 requires root to join groups on gif(4). - * While this is bogus, privs are available and easy to use - * for this call as a workaround. - */ - if (ripngd_privs.change (ZPRIVS_RAISE)) - zlog_err ("ripng_multicast_join: could not raise privs"); - - ret = setsockopt (ripng->sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, - (char *) &mreq, sizeof (mreq)); - save_errno = errno; - - if (ripngd_privs.change (ZPRIVS_LOWER)) - zlog_err ("ripng_multicast_join: could not lower privs"); - - if (ret < 0 && save_errno == EADDRINUSE) - { - /* - * Group is already joined. This occurs due to sloppy group - * management, in particular declining to leave the group on - * an interface that has just gone down. - */ - zlog_warn ("ripng join on %s EADDRINUSE (ignoring)\n", ifp->name); - return 0; /* not an error */ - } - - if (ret < 0) - zlog_warn ("can't setsockopt IPV6_JOIN_GROUP: %s", - safe_strerror (save_errno)); - - if (IS_RIPNG_DEBUG_EVENT) - zlog_debug ("RIPng %s join to all-rip-routers multicast group", ifp->name); - - if (ret < 0) - return -1; - } - return 0; + int ret; + struct ipv6_mreq mreq; + int save_errno; + + if (if_is_multicast(ifp)) { + memset(&mreq, 0, sizeof(mreq)); + inet_pton(AF_INET6, RIPNG_GROUP, &mreq.ipv6mr_multiaddr); + mreq.ipv6mr_interface = ifp->ifindex; + + /* + * NetBSD 1.6.2 requires root to join groups on gif(4). + * While this is bogus, privs are available and easy to use + * for this call as a workaround. + */ + if (ripngd_privs.change(ZPRIVS_RAISE)) + zlog_err("ripng_multicast_join: could not raise privs"); + + ret = setsockopt(ripng->sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, + (char *)&mreq, sizeof(mreq)); + save_errno = errno; + + if (ripngd_privs.change(ZPRIVS_LOWER)) + zlog_err("ripng_multicast_join: could not lower privs"); + + if (ret < 0 && save_errno == EADDRINUSE) { + /* + * Group is already joined. This occurs due to sloppy + * group + * management, in particular declining to leave the + * group on + * an interface that has just gone down. + */ + zlog_warn("ripng join on %s EADDRINUSE (ignoring)\n", + ifp->name); + return 0; /* not an error */ + } + + if (ret < 0) + zlog_warn("can't setsockopt IPV6_JOIN_GROUP: %s", + safe_strerror(save_errno)); + + if (IS_RIPNG_DEBUG_EVENT) + zlog_debug( + "RIPng %s join to all-rip-routers multicast group", + ifp->name); + + if (ret < 0) + return -1; + } + return 0; } /* Leave from the all rip routers multicast group. */ -static int -ripng_multicast_leave (struct interface *ifp) +static int ripng_multicast_leave(struct interface *ifp) { - int ret; - struct ipv6_mreq mreq; - - if (if_is_multicast (ifp)) { - memset (&mreq, 0, sizeof (mreq)); - inet_pton(AF_INET6, RIPNG_GROUP, &mreq.ipv6mr_multiaddr); - mreq.ipv6mr_interface = ifp->ifindex; - - ret = setsockopt (ripng->sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, - (char *) &mreq, sizeof (mreq)); - if (ret < 0) - zlog_warn ("can't setsockopt IPV6_LEAVE_GROUP: %s\n", safe_strerror (errno)); - - if (IS_RIPNG_DEBUG_EVENT) - zlog_debug ("RIPng %s leave from all-rip-routers multicast group", - ifp->name); - - if (ret < 0) - return -1; - } + int ret; + struct ipv6_mreq mreq; + + if (if_is_multicast(ifp)) { + memset(&mreq, 0, sizeof(mreq)); + inet_pton(AF_INET6, RIPNG_GROUP, &mreq.ipv6mr_multiaddr); + mreq.ipv6mr_interface = ifp->ifindex; + + ret = setsockopt(ripng->sock, IPPROTO_IPV6, IPV6_LEAVE_GROUP, + (char *)&mreq, sizeof(mreq)); + if (ret < 0) + zlog_warn("can't setsockopt IPV6_LEAVE_GROUP: %s\n", + safe_strerror(errno)); + + if (IS_RIPNG_DEBUG_EVENT) + zlog_debug( + "RIPng %s leave from all-rip-routers multicast group", + ifp->name); + + if (ret < 0) + return -1; + } - return 0; + return 0; } /* How many link local IPv6 address could be used on the interface ? */ -static int -ripng_if_ipv6_lladdress_check (struct interface *ifp) +static int ripng_if_ipv6_lladdress_check(struct interface *ifp) { - struct listnode *nn; - struct connected *connected; - int count = 0; + struct listnode *nn; + struct connected *connected; + int count = 0; - for (ALL_LIST_ELEMENTS_RO (ifp->connected, nn, connected)) - { - struct prefix *p; - p = connected->address; + for (ALL_LIST_ELEMENTS_RO(ifp->connected, nn, connected)) { + struct prefix *p; + p = connected->address; - if ((p->family == AF_INET6) && - IN6_IS_ADDR_LINKLOCAL (&p->u.prefix6)) - count++; - } + if ((p->family == AF_INET6) + && IN6_IS_ADDR_LINKLOCAL(&p->u.prefix6)) + count++; + } - return count; + return count; } -static int -ripng_if_down (struct interface *ifp) +static int ripng_if_down(struct interface *ifp) { - struct route_node *rp; - struct ripng_info *rinfo; - struct ripng_interface *ri; - struct list *list = NULL; - struct listnode *listnode = NULL, *nextnode = NULL; - - if (ripng) - for (rp = route_top (ripng->table); rp; rp = route_next (rp)) - if ((list = rp->info) != NULL) - for (ALL_LIST_ELEMENTS (list, listnode, nextnode, rinfo)) - if (rinfo->ifindex == ifp->ifindex) - ripng_ecmp_delete (rinfo); - - ri = ifp->info; - - if (ri->running) - { - if (IS_RIPNG_DEBUG_EVENT) - zlog_debug ("turn off %s", ifp->name); - - /* Leave from multicast group. */ - ripng_multicast_leave (ifp); - - ri->running = 0; - } - - return 0; + struct route_node *rp; + struct ripng_info *rinfo; + struct ripng_interface *ri; + struct list *list = NULL; + struct listnode *listnode = NULL, *nextnode = NULL; + + if (ripng) + for (rp = route_top(ripng->table); rp; rp = route_next(rp)) + if ((list = rp->info) != NULL) + for (ALL_LIST_ELEMENTS(list, listnode, nextnode, + rinfo)) + if (rinfo->ifindex == ifp->ifindex) + ripng_ecmp_delete(rinfo); + + ri = ifp->info; + + if (ri->running) { + if (IS_RIPNG_DEBUG_EVENT) + zlog_debug("turn off %s", ifp->name); + + /* Leave from multicast group. */ + ripng_multicast_leave(ifp); + + ri->running = 0; + } + + return 0; } /* Inteface link up message processing. */ -int -ripng_interface_up (int command, struct zclient *zclient, zebra_size_t length, - vrf_id_t vrf_id) +int ripng_interface_up(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct stream *s; - struct interface *ifp; + struct stream *s; + struct interface *ifp; - /* zebra_interface_state_read() updates interface structure in iflist. */ - s = zclient->ibuf; - ifp = zebra_interface_state_read (s, vrf_id); + /* zebra_interface_state_read() updates interface structure in iflist. + */ + s = zclient->ibuf; + ifp = zebra_interface_state_read(s, vrf_id); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - if (IS_RIPNG_DEBUG_ZEBRA) - zlog_debug ("interface up %s index %d flags %llx metric %d mtu %d", - ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, - ifp->metric, ifp->mtu6); + if (IS_RIPNG_DEBUG_ZEBRA) + zlog_debug( + "interface up %s index %d flags %llx metric %d mtu %d", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu6); - /* Check if this interface is RIPng enabled or not. */ - ripng_enable_apply (ifp); + /* Check if this interface is RIPng enabled or not. */ + ripng_enable_apply(ifp); - /* Check for a passive interface. */ - ripng_passive_interface_apply (ifp); + /* Check for a passive interface. */ + ripng_passive_interface_apply(ifp); - /* Apply distribute list to the all interface. */ - ripng_distribute_update_interface (ifp); + /* Apply distribute list to the all interface. */ + ripng_distribute_update_interface(ifp); - return 0; + return 0; } /* Inteface link down message processing. */ -int -ripng_interface_down (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int ripng_interface_down(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct stream *s; - struct interface *ifp; + struct stream *s; + struct interface *ifp; - /* zebra_interface_state_read() updates interface structure in iflist. */ - s = zclient->ibuf; - ifp = zebra_interface_state_read (s, vrf_id); + /* zebra_interface_state_read() updates interface structure in iflist. + */ + s = zclient->ibuf; + ifp = zebra_interface_state_read(s, vrf_id); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - ripng_if_down (ifp); + ripng_if_down(ifp); - if (IS_RIPNG_DEBUG_ZEBRA) - zlog_debug ("interface down %s index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->ifindex, - (unsigned long long) ifp->flags, ifp->metric, ifp->mtu6); + if (IS_RIPNG_DEBUG_ZEBRA) + zlog_debug( + "interface down %s index %d flags %#llx metric %d mtu %d", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu6); - return 0; + return 0; } /* Inteface addition message from zebra. */ -int -ripng_interface_add (int command, struct zclient *zclient, zebra_size_t length, - vrf_id_t vrf_id) +int ripng_interface_add(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct interface *ifp; + struct interface *ifp; - ifp = zebra_interface_add_read (zclient->ibuf, vrf_id); + ifp = zebra_interface_add_read(zclient->ibuf, vrf_id); - if (IS_RIPNG_DEBUG_ZEBRA) - zlog_debug ("RIPng interface add %s index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->ifindex, (unsigned long long) ifp->flags, - ifp->metric, ifp->mtu6); + if (IS_RIPNG_DEBUG_ZEBRA) + zlog_debug( + "RIPng interface add %s index %d flags %#llx metric %d mtu %d", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu6); - /* Check is this interface is RIP enabled or not.*/ - ripng_enable_apply (ifp); + /* Check is this interface is RIP enabled or not.*/ + ripng_enable_apply(ifp); - /* Apply distribute list to the interface. */ - ripng_distribute_update_interface (ifp); + /* Apply distribute list to the interface. */ + ripng_distribute_update_interface(ifp); - /* Check interface routemap. */ - ripng_if_rmap_update_interface (ifp); + /* Check interface routemap. */ + ripng_if_rmap_update_interface(ifp); - return 0; + return 0; } -int -ripng_interface_delete (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int ripng_interface_delete(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct interface *ifp; - struct stream *s; + struct interface *ifp; + struct stream *s; - s = zclient->ibuf; - /* zebra_interface_state_read() updates interface structure in iflist */ - ifp = zebra_interface_state_read (s, vrf_id); + s = zclient->ibuf; + /* zebra_interface_state_read() updates interface structure in iflist + */ + ifp = zebra_interface_state_read(s, vrf_id); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - if (if_is_up (ifp)) { - ripng_if_down(ifp); - } + if (if_is_up(ifp)) { + ripng_if_down(ifp); + } - zlog_info("interface delete %s index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->ifindex, (unsigned long long) ifp->flags, - ifp->metric, ifp->mtu6); + zlog_info("interface delete %s index %d flags %#llx metric %d mtu %d", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu6); - /* To support pseudo interface do not free interface structure. */ - /* if_delete(ifp); */ - ifp->ifindex = IFINDEX_DELETED; + /* To support pseudo interface do not free interface structure. */ + /* if_delete(ifp); */ + ifp->ifindex = IFINDEX_DELETED; - return 0; + return 0; } -void -ripng_interface_clean (void) +void ripng_interface_clean(void) { - struct listnode *node, *nnode; - struct interface *ifp; - struct ripng_interface *ri; - - for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT), node, nnode, ifp)) - { - ri = ifp->info; - - ri->enable_network = 0; - ri->enable_interface = 0; - ri->running = 0; - - if (ri->t_wakeup) - { - thread_cancel (ri->t_wakeup); - ri->t_wakeup = NULL; - } - } -} + struct listnode *node, *nnode; + struct interface *ifp; + struct ripng_interface *ri; -void -ripng_interface_reset (void) -{ - struct listnode *node; - struct interface *ifp; - struct ripng_interface *ri; - - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - { - ri = ifp->info; - - ri->enable_network = 0; - ri->enable_interface = 0; - ri->running = 0; + for (ALL_LIST_ELEMENTS(vrf_iflist(VRF_DEFAULT), node, nnode, ifp)) { + ri = ifp->info; - ri->split_horizon = RIPNG_NO_SPLIT_HORIZON; - ri->split_horizon_default = RIPNG_NO_SPLIT_HORIZON; + ri->enable_network = 0; + ri->enable_interface = 0; + ri->running = 0; - ri->list[RIPNG_FILTER_IN] = NULL; - ri->list[RIPNG_FILTER_OUT] = NULL; - - ri->prefix[RIPNG_FILTER_IN] = NULL; - ri->prefix[RIPNG_FILTER_OUT] = NULL; + if (ri->t_wakeup) { + thread_cancel(ri->t_wakeup); + ri->t_wakeup = NULL; + } + } +} - if (ri->t_wakeup) - { - thread_cancel (ri->t_wakeup); - ri->t_wakeup = NULL; - } +void ripng_interface_reset(void) +{ + struct listnode *node; + struct interface *ifp; + struct ripng_interface *ri; - ri->passive = 0; - } -} + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) { + ri = ifp->info; -static void -ripng_apply_address_add (struct connected *ifc) { - struct prefix_ipv6 address; - struct prefix *p; + ri->enable_network = 0; + ri->enable_interface = 0; + ri->running = 0; - if (!ripng) - return; + ri->split_horizon = RIPNG_NO_SPLIT_HORIZON; + ri->split_horizon_default = RIPNG_NO_SPLIT_HORIZON; - if (! if_is_up(ifc->ifp)) - return; + ri->list[RIPNG_FILTER_IN] = NULL; + ri->list[RIPNG_FILTER_OUT] = NULL; - p = ifc->address; + ri->prefix[RIPNG_FILTER_IN] = NULL; + ri->prefix[RIPNG_FILTER_OUT] = NULL; - memset (&address, 0, sizeof (address)); - address.family = p->family; - address.prefix = p->u.prefix6; - address.prefixlen = p->prefixlen; - apply_mask_ipv6(&address); + if (ri->t_wakeup) { + thread_cancel(ri->t_wakeup); + ri->t_wakeup = NULL; + } - /* Check if this interface is RIP enabled or not - or Check if this address's prefix is RIP enabled */ - if ((ripng_enable_if_lookup(ifc->ifp->name) >= 0) || - (ripng_enable_network_lookup2(ifc) >= 0)) - ripng_redistribute_add(ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_INTERFACE, - &address, ifc->ifp->ifindex, NULL, 0); + ri->passive = 0; + } +} +static void ripng_apply_address_add(struct connected *ifc) +{ + struct prefix_ipv6 address; + struct prefix *p; + + if (!ripng) + return; + + if (!if_is_up(ifc->ifp)) + return; + + p = ifc->address; + + memset(&address, 0, sizeof(address)); + address.family = p->family; + address.prefix = p->u.prefix6; + address.prefixlen = p->prefixlen; + apply_mask_ipv6(&address); + + /* Check if this interface is RIP enabled or not + or Check if this address's prefix is RIP enabled */ + if ((ripng_enable_if_lookup(ifc->ifp->name) >= 0) + || (ripng_enable_network_lookup2(ifc) >= 0)) + ripng_redistribute_add(ZEBRA_ROUTE_CONNECT, + RIPNG_ROUTE_INTERFACE, &address, + ifc->ifp->ifindex, NULL, 0); } -int -ripng_interface_address_add (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int ripng_interface_address_add(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct connected *c; - struct prefix *p; + struct connected *c; + struct prefix *p; - c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_ADD, - zclient->ibuf, vrf_id); + c = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_ADD, + zclient->ibuf, vrf_id); - if (c == NULL) - return 0; + if (c == NULL) + return 0; - p = c->address; + p = c->address; - if (p->family == AF_INET6) - { - struct ripng_interface *ri = c->ifp->info; - - if (IS_RIPNG_DEBUG_ZEBRA) - zlog_debug ("RIPng connected address %s/%d add", - inet6_ntoa(p->u.prefix6), - p->prefixlen); - - /* Check is this prefix needs to be redistributed. */ - ripng_apply_address_add(c); + if (p->family == AF_INET6) { + struct ripng_interface *ri = c->ifp->info; - /* Let's try once again whether the interface could be activated */ - if (!ri->running) { - /* Check if this interface is RIP enabled or not.*/ - ripng_enable_apply (c->ifp); + if (IS_RIPNG_DEBUG_ZEBRA) + zlog_debug("RIPng connected address %s/%d add", + inet6_ntoa(p->u.prefix6), p->prefixlen); - /* Apply distribute list to the interface. */ - ripng_distribute_update_interface (c->ifp); + /* Check is this prefix needs to be redistributed. */ + ripng_apply_address_add(c); - /* Check interface routemap. */ - ripng_if_rmap_update_interface (c->ifp); - } + /* Let's try once again whether the interface could be activated + */ + if (!ri->running) { + /* Check if this interface is RIP enabled or not.*/ + ripng_enable_apply(c->ifp); - } + /* Apply distribute list to the interface. */ + ripng_distribute_update_interface(c->ifp); - return 0; + /* Check interface routemap. */ + ripng_if_rmap_update_interface(c->ifp); + } + } + + return 0; } -static void -ripng_apply_address_del (struct connected *ifc) { - struct prefix_ipv6 address; - struct prefix *p; +static void ripng_apply_address_del(struct connected *ifc) +{ + struct prefix_ipv6 address; + struct prefix *p; - if (!ripng) - return; + if (!ripng) + return; - if (! if_is_up(ifc->ifp)) - return; + if (!if_is_up(ifc->ifp)) + return; - p = ifc->address; + p = ifc->address; - memset (&address, 0, sizeof (address)); - address.family = p->family; - address.prefix = p->u.prefix6; - address.prefixlen = p->prefixlen; - apply_mask_ipv6(&address); + memset(&address, 0, sizeof(address)); + address.family = p->family; + address.prefix = p->u.prefix6; + address.prefixlen = p->prefixlen; + apply_mask_ipv6(&address); - ripng_redistribute_delete(ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_INTERFACE, - &address, ifc->ifp->ifindex); + ripng_redistribute_delete(ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_INTERFACE, + &address, ifc->ifp->ifindex); } -int -ripng_interface_address_delete (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int ripng_interface_address_delete(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct connected *ifc; - struct prefix *p; - char buf[INET6_ADDRSTRLEN]; - - ifc = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE, - zclient->ibuf, vrf_id); - - if (ifc) - { - p = ifc->address; - - if (p->family == AF_INET6) - { - if (IS_RIPNG_DEBUG_ZEBRA) - zlog_debug ("RIPng connected address %s/%d delete", - inet_ntop (AF_INET6, &p->u.prefix6, buf, - INET6_ADDRSTRLEN), - p->prefixlen); - - /* Check wether this prefix needs to be removed. */ - ripng_apply_address_del(ifc); + struct connected *ifc; + struct prefix *p; + char buf[INET6_ADDRSTRLEN]; + + ifc = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_DELETE, + zclient->ibuf, vrf_id); + + if (ifc) { + p = ifc->address; + + if (p->family == AF_INET6) { + if (IS_RIPNG_DEBUG_ZEBRA) + zlog_debug( + "RIPng connected address %s/%d delete", + inet_ntop(AF_INET6, &p->u.prefix6, buf, + INET6_ADDRSTRLEN), + p->prefixlen); + + /* Check wether this prefix needs to be removed. */ + ripng_apply_address_del(ifc); + } + connected_free(ifc); } - connected_free (ifc); - } - return 0; + return 0; } /* RIPng enable interface vector. */ @@ -494,449 +486,426 @@ struct route_table *ripng_enable_network; /* Lookup RIPng enable network. */ /* Check wether the interface has at least a connected prefix that * is within the ripng_enable_network table. */ -static int -ripng_enable_network_lookup_if (struct interface *ifp) +static int ripng_enable_network_lookup_if(struct interface *ifp) { - struct listnode *node; - struct connected *connected; - struct prefix_ipv6 address; - - for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, connected)) - { - struct prefix *p; - struct route_node *node; - - p = connected->address; - - if (p->family == AF_INET6) - { - address.family = AF_INET6; - address.prefix = p->u.prefix6; - address.prefixlen = IPV6_MAX_BITLEN; - - node = route_node_match (ripng_enable_network, - (struct prefix *)&address); - if (node) - { - route_unlock_node (node); - return 1; - } - } - } - return -1; + struct listnode *node; + struct connected *connected; + struct prefix_ipv6 address; + + for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, connected)) { + struct prefix *p; + struct route_node *node; + + p = connected->address; + + if (p->family == AF_INET6) { + address.family = AF_INET6; + address.prefix = p->u.prefix6; + address.prefixlen = IPV6_MAX_BITLEN; + + node = route_node_match(ripng_enable_network, + (struct prefix *)&address); + if (node) { + route_unlock_node(node); + return 1; + } + } + } + return -1; } /* Check wether connected is within the ripng_enable_network table. */ -static int -ripng_enable_network_lookup2 (struct connected *connected) +static int ripng_enable_network_lookup2(struct connected *connected) { - struct prefix_ipv6 address; - struct prefix *p; + struct prefix_ipv6 address; + struct prefix *p; - p = connected->address; + p = connected->address; - if (p->family == AF_INET6) { - struct route_node *node; + if (p->family == AF_INET6) { + struct route_node *node; - address.family = p->family; - address.prefix = p->u.prefix6; - address.prefixlen = IPV6_MAX_BITLEN; + address.family = p->family; + address.prefix = p->u.prefix6; + address.prefixlen = IPV6_MAX_BITLEN; - /* LPM on p->family, p->u.prefix6/IPV6_MAX_BITLEN within ripng_enable_network */ - node = route_node_match (ripng_enable_network, - (struct prefix *)&address); + /* LPM on p->family, p->u.prefix6/IPV6_MAX_BITLEN within + * ripng_enable_network */ + node = route_node_match(ripng_enable_network, + (struct prefix *)&address); - if (node) { - route_unlock_node (node); - return 1; - } - } + if (node) { + route_unlock_node(node); + return 1; + } + } - return -1; + return -1; } /* Add RIPng enable network. */ -static int -ripng_enable_network_add (struct prefix *p) +static int ripng_enable_network_add(struct prefix *p) { - struct route_node *node; + struct route_node *node; - node = route_node_get (ripng_enable_network, p); + node = route_node_get(ripng_enable_network, p); - if (node->info) - { - route_unlock_node (node); - return -1; - } - else - node->info = (void *)1; + if (node->info) { + route_unlock_node(node); + return -1; + } else + node->info = (void *)1; - /* XXX: One should find a better solution than a generic one */ - ripng_enable_apply_all(); + /* XXX: One should find a better solution than a generic one */ + ripng_enable_apply_all(); - return 1; + return 1; } /* Delete RIPng enable network. */ -static int -ripng_enable_network_delete (struct prefix *p) +static int ripng_enable_network_delete(struct prefix *p) { - struct route_node *node; + struct route_node *node; - node = route_node_lookup (ripng_enable_network, p); - if (node) - { - node->info = NULL; + node = route_node_lookup(ripng_enable_network, p); + if (node) { + node->info = NULL; - /* Unlock info lock. */ - route_unlock_node (node); + /* Unlock info lock. */ + route_unlock_node(node); - /* Unlock lookup lock. */ - route_unlock_node (node); + /* Unlock lookup lock. */ + route_unlock_node(node); - return 1; - } - return -1; + return 1; + } + return -1; } /* Lookup function. */ -static int -ripng_enable_if_lookup (const char *ifname) +static int ripng_enable_if_lookup(const char *ifname) { - unsigned int i; - char *str; - - for (i = 0; i < vector_active (ripng_enable_if); i++) - if ((str = vector_slot (ripng_enable_if, i)) != NULL) - if (strcmp (str, ifname) == 0) - return i; - return -1; + unsigned int i; + char *str; + + for (i = 0; i < vector_active(ripng_enable_if); i++) + if ((str = vector_slot(ripng_enable_if, i)) != NULL) + if (strcmp(str, ifname) == 0) + return i; + return -1; } /* Add interface to ripng_enable_if. */ -static int -ripng_enable_if_add (const char *ifname) +static int ripng_enable_if_add(const char *ifname) { - int ret; + int ret; - ret = ripng_enable_if_lookup (ifname); - if (ret >= 0) - return -1; + ret = ripng_enable_if_lookup(ifname); + if (ret >= 0) + return -1; - vector_set (ripng_enable_if, strdup (ifname)); + vector_set(ripng_enable_if, strdup(ifname)); - ripng_enable_apply_all(); + ripng_enable_apply_all(); - return 1; + return 1; } /* Delete interface from ripng_enable_if. */ -static int -ripng_enable_if_delete (const char *ifname) +static int ripng_enable_if_delete(const char *ifname) { - int index; - char *str; + int index; + char *str; - index = ripng_enable_if_lookup (ifname); - if (index < 0) - return -1; + index = ripng_enable_if_lookup(ifname); + if (index < 0) + return -1; - str = vector_slot (ripng_enable_if, index); - free (str); - vector_unset (ripng_enable_if, index); + str = vector_slot(ripng_enable_if, index); + free(str); + vector_unset(ripng_enable_if, index); - ripng_enable_apply_all(); + ripng_enable_apply_all(); - return 1; + return 1; } /* Wake up interface. */ -static int -ripng_interface_wakeup (struct thread *t) +static int ripng_interface_wakeup(struct thread *t) { - struct interface *ifp; - struct ripng_interface *ri; + struct interface *ifp; + struct ripng_interface *ri; - /* Get interface. */ - ifp = THREAD_ARG (t); + /* Get interface. */ + ifp = THREAD_ARG(t); - ri = ifp->info; - ri->t_wakeup = NULL; + ri = ifp->info; + ri->t_wakeup = NULL; - /* Join to multicast group. */ - if (ripng_multicast_join (ifp) < 0) { - zlog_err ("multicast join failed, interface %s not running", ifp->name); - return 0; - } - - /* Set running flag. */ - ri->running = 1; + /* Join to multicast group. */ + if (ripng_multicast_join(ifp) < 0) { + zlog_err("multicast join failed, interface %s not running", + ifp->name); + return 0; + } + + /* Set running flag. */ + ri->running = 1; - /* Send RIP request to the interface. */ - ripng_request (ifp); + /* Send RIP request to the interface. */ + ripng_request(ifp); - return 0; + return 0; } -static void -ripng_connect_set (struct interface *ifp, int set) +static void ripng_connect_set(struct interface *ifp, int set) { - struct listnode *node, *nnode; - struct connected *connected; - struct prefix_ipv6 address; - - for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected)) - { - struct prefix *p; - p = connected->address; - - if (p->family != AF_INET6) - continue; - - address.family = AF_INET6; - address.prefix = p->u.prefix6; - address.prefixlen = p->prefixlen; - apply_mask_ipv6 (&address); - - if (set) { - /* Check once more wether this prefix is within a "network IF_OR_PREF" one */ - if ((ripng_enable_if_lookup(connected->ifp->name) >= 0) || - (ripng_enable_network_lookup2(connected) >= 0)) - ripng_redistribute_add (ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_INTERFACE, - &address, connected->ifp->ifindex, NULL, 0); - } else { - ripng_redistribute_delete (ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_INTERFACE, - &address, connected->ifp->ifindex); - if (ripng_redistribute_check (ZEBRA_ROUTE_CONNECT)) - ripng_redistribute_add (ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_REDISTRIBUTE, - &address, connected->ifp->ifindex, NULL, 0); - } - } + struct listnode *node, *nnode; + struct connected *connected; + struct prefix_ipv6 address; + + for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { + struct prefix *p; + p = connected->address; + + if (p->family != AF_INET6) + continue; + + address.family = AF_INET6; + address.prefix = p->u.prefix6; + address.prefixlen = p->prefixlen; + apply_mask_ipv6(&address); + + if (set) { + /* Check once more wether this prefix is within a + * "network IF_OR_PREF" one */ + if ((ripng_enable_if_lookup(connected->ifp->name) >= 0) + || (ripng_enable_network_lookup2(connected) >= 0)) + ripng_redistribute_add( + ZEBRA_ROUTE_CONNECT, + RIPNG_ROUTE_INTERFACE, &address, + connected->ifp->ifindex, NULL, 0); + } else { + ripng_redistribute_delete( + ZEBRA_ROUTE_CONNECT, RIPNG_ROUTE_INTERFACE, + &address, connected->ifp->ifindex); + if (ripng_redistribute_check(ZEBRA_ROUTE_CONNECT)) + ripng_redistribute_add( + ZEBRA_ROUTE_CONNECT, + RIPNG_ROUTE_REDISTRIBUTE, &address, + connected->ifp->ifindex, NULL, 0); + } + } } /* Check RIPng is enabed on this interface. */ -void -ripng_enable_apply (struct interface *ifp) +void ripng_enable_apply(struct interface *ifp) { - int ret; - struct ripng_interface *ri = NULL; - - /* Check interface. */ - if (! if_is_up (ifp)) - return; - - ri = ifp->info; - - /* Is this interface a candidate for RIPng ? */ - ret = ripng_enable_network_lookup_if (ifp); - - /* If the interface is matched. */ - if (ret > 0) - ri->enable_network = 1; - else - ri->enable_network = 0; - - /* Check interface name configuration. */ - ret = ripng_enable_if_lookup (ifp->name); - if (ret >= 0) - ri->enable_interface = 1; - else - ri->enable_interface = 0; - - /* any candidate interface MUST have a link-local IPv6 address */ - if ((! ripng_if_ipv6_lladdress_check (ifp)) && - (ri->enable_network || ri->enable_interface)) { - ri->enable_network = 0; - ri->enable_interface = 0; - zlog_warn("Interface %s does not have any link-local address", - ifp->name); - } - - /* Update running status of the interface. */ - if (ri->enable_network || ri->enable_interface) - { - zlog_info ("RIPng INTERFACE ON %s", ifp->name); - - /* Add interface wake up thread. */ - thread_add_timer(master, ripng_interface_wakeup, ifp, 1, - &ri->t_wakeup); - - ripng_connect_set (ifp, 1); - } - else - { - if (ri->running) - { - /* Might as well clean up the route table as well - * ripng_if_down sets to 0 ri->running, and displays "turn off %s" - **/ - ripng_if_down(ifp); - - ripng_connect_set (ifp, 0); + int ret; + struct ripng_interface *ri = NULL; + + /* Check interface. */ + if (!if_is_up(ifp)) + return; + + ri = ifp->info; + + /* Is this interface a candidate for RIPng ? */ + ret = ripng_enable_network_lookup_if(ifp); + + /* If the interface is matched. */ + if (ret > 0) + ri->enable_network = 1; + else + ri->enable_network = 0; + + /* Check interface name configuration. */ + ret = ripng_enable_if_lookup(ifp->name); + if (ret >= 0) + ri->enable_interface = 1; + else + ri->enable_interface = 0; + + /* any candidate interface MUST have a link-local IPv6 address */ + if ((!ripng_if_ipv6_lladdress_check(ifp)) + && (ri->enable_network || ri->enable_interface)) { + ri->enable_network = 0; + ri->enable_interface = 0; + zlog_warn("Interface %s does not have any link-local address", + ifp->name); + } + + /* Update running status of the interface. */ + if (ri->enable_network || ri->enable_interface) { + zlog_info("RIPng INTERFACE ON %s", ifp->name); + + /* Add interface wake up thread. */ + thread_add_timer(master, ripng_interface_wakeup, ifp, 1, + &ri->t_wakeup); + + ripng_connect_set(ifp, 1); + } else { + if (ri->running) { + /* Might as well clean up the route table as well + * ripng_if_down sets to 0 ri->running, and displays + *"turn off %s" + **/ + ripng_if_down(ifp); + + ripng_connect_set(ifp, 0); + } } - } } /* Set distribute list to all interfaces. */ -static void -ripng_enable_apply_all (void) +static void ripng_enable_apply_all(void) { - struct interface *ifp; - struct listnode *node; + struct interface *ifp; + struct listnode *node; - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - ripng_enable_apply (ifp); + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) + ripng_enable_apply(ifp); } /* Clear all network and neighbor configuration */ -void -ripng_clean_network () +void ripng_clean_network() { - unsigned int i; - char *str; - struct route_node *rn; - - /* ripng_enable_network */ - for (rn = route_top (ripng_enable_network); rn; rn = route_next (rn)) - if (rn->info) { - rn->info = NULL; - route_unlock_node(rn); - } - - /* ripng_enable_if */ - for (i = 0; i < vector_active (ripng_enable_if); i++) - if ((str = vector_slot (ripng_enable_if, i)) != NULL) { - free (str); - vector_slot (ripng_enable_if, i) = NULL; - } + unsigned int i; + char *str; + struct route_node *rn; + + /* ripng_enable_network */ + for (rn = route_top(ripng_enable_network); rn; rn = route_next(rn)) + if (rn->info) { + rn->info = NULL; + route_unlock_node(rn); + } + + /* ripng_enable_if */ + for (i = 0; i < vector_active(ripng_enable_if); i++) + if ((str = vector_slot(ripng_enable_if, i)) != NULL) { + free(str); + vector_slot(ripng_enable_if, i) = NULL; + } } /* Vector to store passive-interface name. */ vector Vripng_passive_interface; /* Utility function for looking up passive interface settings. */ -static int -ripng_passive_interface_lookup (const char *ifname) +static int ripng_passive_interface_lookup(const char *ifname) { - unsigned int i; - char *str; - - for (i = 0; i < vector_active (Vripng_passive_interface); i++) - if ((str = vector_slot (Vripng_passive_interface, i)) != NULL) - if (strcmp (str, ifname) == 0) - return i; - return -1; + unsigned int i; + char *str; + + for (i = 0; i < vector_active(Vripng_passive_interface); i++) + if ((str = vector_slot(Vripng_passive_interface, i)) != NULL) + if (strcmp(str, ifname) == 0) + return i; + return -1; } -void -ripng_passive_interface_apply (struct interface *ifp) +void ripng_passive_interface_apply(struct interface *ifp) { - int ret; - struct ripng_interface *ri; + int ret; + struct ripng_interface *ri; - ri = ifp->info; + ri = ifp->info; - ret = ripng_passive_interface_lookup (ifp->name); - if (ret < 0) - ri->passive = 0; - else - ri->passive = 1; + ret = ripng_passive_interface_lookup(ifp->name); + if (ret < 0) + ri->passive = 0; + else + ri->passive = 1; } -static void -ripng_passive_interface_apply_all (void) +static void ripng_passive_interface_apply_all(void) { - struct interface *ifp; - struct listnode *node; + struct interface *ifp; + struct listnode *node; - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - ripng_passive_interface_apply (ifp); + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) + ripng_passive_interface_apply(ifp); } /* Passive interface. */ -static int -ripng_passive_interface_set (struct vty *vty, const char *ifname) +static int ripng_passive_interface_set(struct vty *vty, const char *ifname) { - if (ripng_passive_interface_lookup (ifname) >= 0) - return CMD_WARNING_CONFIG_FAILED; + if (ripng_passive_interface_lookup(ifname) >= 0) + return CMD_WARNING_CONFIG_FAILED; - vector_set (Vripng_passive_interface, strdup (ifname)); + vector_set(Vripng_passive_interface, strdup(ifname)); - ripng_passive_interface_apply_all (); + ripng_passive_interface_apply_all(); - return CMD_SUCCESS; + return CMD_SUCCESS; } -static int -ripng_passive_interface_unset (struct vty *vty, const char *ifname) +static int ripng_passive_interface_unset(struct vty *vty, const char *ifname) { - int i; - char *str; + int i; + char *str; - i = ripng_passive_interface_lookup (ifname); - if (i < 0) - return CMD_WARNING_CONFIG_FAILED; + i = ripng_passive_interface_lookup(ifname); + if (i < 0) + return CMD_WARNING_CONFIG_FAILED; - str = vector_slot (Vripng_passive_interface, i); - free (str); - vector_unset (Vripng_passive_interface, i); + str = vector_slot(Vripng_passive_interface, i); + free(str); + vector_unset(Vripng_passive_interface, i); - ripng_passive_interface_apply_all (); + ripng_passive_interface_apply_all(); - return CMD_SUCCESS; + return CMD_SUCCESS; } /* Free all configured RIP passive-interface settings. */ -void -ripng_passive_interface_clean (void) +void ripng_passive_interface_clean(void) { - unsigned int i; - char *str; - - for (i = 0; i < vector_active (Vripng_passive_interface); i++) - if ((str = vector_slot (Vripng_passive_interface, i)) != NULL) - { - free (str); - vector_slot (Vripng_passive_interface, i) = NULL; - } - ripng_passive_interface_apply_all (); + unsigned int i; + char *str; + + for (i = 0; i < vector_active(Vripng_passive_interface); i++) + if ((str = vector_slot(Vripng_passive_interface, i)) != NULL) { + free(str); + vector_slot(Vripng_passive_interface, i) = NULL; + } + ripng_passive_interface_apply_all(); } /* Write RIPng enable network and interface to the vty. */ -int -ripng_network_write (struct vty *vty, int config_mode) +int ripng_network_write(struct vty *vty, int config_mode) { - unsigned int i; - const char *ifname; - struct route_node *node; - char buf[BUFSIZ]; - - /* Write enable network. */ - for (node = route_top (ripng_enable_network); node; node = route_next (node)) - if (node->info) - { - struct prefix *p = &node->p; - vty_out (vty, "%s%s/%d\n", - config_mode ? " network " : " ", - inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), - p->prefixlen); - - } - - /* Write enable interface. */ - for (i = 0; i < vector_active (ripng_enable_if); i++) - if ((ifname = vector_slot (ripng_enable_if, i)) != NULL) - vty_out (vty, "%s%s\n", - config_mode ? " network " : " ", - ifname); - - /* Write passive interface. */ - if (config_mode) - for (i = 0; i < vector_active (Vripng_passive_interface); i++) - if ((ifname = vector_slot (Vripng_passive_interface, i)) != NULL) - vty_out (vty, " passive-interface %s\n", ifname); - - return 0; + unsigned int i; + const char *ifname; + struct route_node *node; + char buf[BUFSIZ]; + + /* Write enable network. */ + for (node = route_top(ripng_enable_network); node; + node = route_next(node)) + if (node->info) { + struct prefix *p = &node->p; + vty_out(vty, "%s%s/%d\n", + config_mode ? " network " : " ", + inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ), + p->prefixlen); + } + + /* Write enable interface. */ + for (i = 0; i < vector_active(ripng_enable_if); i++) + if ((ifname = vector_slot(ripng_enable_if, i)) != NULL) + vty_out(vty, "%s%s\n", + config_mode ? " network " : " ", ifname); + + /* Write passive interface. */ + if (config_mode) + for (i = 0; i < vector_active(Vripng_passive_interface); i++) + if ((ifname = vector_slot(Vripng_passive_interface, i)) + != NULL) + vty_out(vty, " passive-interface %s\n", ifname); + + return 0; } /* RIPng enable on specified interface or matched network. */ @@ -946,26 +915,25 @@ DEFUN (ripng_network, "RIPng enable on specified interface or network.\n" "Interface or address\n") { - int idx_if_or_addr = 1; - int ret; - struct prefix p; - - ret = str2prefix (argv[idx_if_or_addr]->arg, &p); - - /* Given string is IPv6 network or interface name. */ - if (ret) - ret = ripng_enable_network_add (&p); - else - ret = ripng_enable_if_add (argv[idx_if_or_addr]->arg); - - if (ret < 0) - { - vty_out (vty, "There is same network configuration %s\n", - argv[idx_if_or_addr]->arg); - return CMD_WARNING_CONFIG_FAILED; - } - - return CMD_SUCCESS; + int idx_if_or_addr = 1; + int ret; + struct prefix p; + + ret = str2prefix(argv[idx_if_or_addr]->arg, &p); + + /* Given string is IPv6 network or interface name. */ + if (ret) + ret = ripng_enable_network_add(&p); + else + ret = ripng_enable_if_add(argv[idx_if_or_addr]->arg); + + if (ret < 0) { + vty_out(vty, "There is same network configuration %s\n", + argv[idx_if_or_addr]->arg); + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; } /* RIPng enable on specified interface or matched network. */ @@ -976,25 +944,25 @@ DEFUN (no_ripng_network, "RIPng enable on specified interface or network.\n" "Interface or address\n") { - int idx_if_or_addr = 2; - int ret; - struct prefix p; - - ret = str2prefix (argv[idx_if_or_addr]->arg, &p); - - /* Given string is interface name. */ - if (ret) - ret = ripng_enable_network_delete (&p); - else - ret = ripng_enable_if_delete (argv[idx_if_or_addr]->arg); - - if (ret < 0) - { - vty_out (vty, "can't find network %s\n",argv[idx_if_or_addr]->arg); - return CMD_WARNING_CONFIG_FAILED; - } - - return CMD_SUCCESS; + int idx_if_or_addr = 2; + int ret; + struct prefix p; + + ret = str2prefix(argv[idx_if_or_addr]->arg, &p); + + /* Given string is interface name. */ + if (ret) + ret = ripng_enable_network_delete(&p); + else + ret = ripng_enable_if_delete(argv[idx_if_or_addr]->arg); + + if (ret < 0) { + vty_out(vty, "can't find network %s\n", + argv[idx_if_or_addr]->arg); + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; } DEFUN (ipv6_ripng_split_horizon, @@ -1004,13 +972,13 @@ DEFUN (ipv6_ripng_split_horizon, "Routing Information Protocol\n" "Perform split horizon\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct ripng_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct ripng_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->split_horizon = RIPNG_SPLIT_HORIZON; - return CMD_SUCCESS; + ri->split_horizon = RIPNG_SPLIT_HORIZON; + return CMD_SUCCESS; } DEFUN (ipv6_ripng_split_horizon_poisoned_reverse, @@ -1021,13 +989,13 @@ DEFUN (ipv6_ripng_split_horizon_poisoned_reverse, "Perform split horizon\n" "With poisoned-reverse\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct ripng_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct ripng_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->split_horizon = RIPNG_SPLIT_HORIZON_POISONED_REVERSE; - return CMD_SUCCESS; + ri->split_horizon = RIPNG_SPLIT_HORIZON_POISONED_REVERSE; + return CMD_SUCCESS; } DEFUN (no_ipv6_ripng_split_horizon, @@ -1039,13 +1007,13 @@ DEFUN (no_ipv6_ripng_split_horizon, "Perform split horizon\n" "With poisoned-reverse\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct ripng_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct ripng_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->split_horizon = RIPNG_NO_SPLIT_HORIZON; - return CMD_SUCCESS; + ri->split_horizon = RIPNG_NO_SPLIT_HORIZON; + return CMD_SUCCESS; } DEFUN (ripng_passive_interface, @@ -1054,8 +1022,8 @@ DEFUN (ripng_passive_interface, "Suppress routing updates on an interface\n" "Interface name\n") { - int idx_ifname = 1; - return ripng_passive_interface_set (vty, argv[idx_ifname]->arg); + int idx_ifname = 1; + return ripng_passive_interface_set(vty, argv[idx_ifname]->arg); } DEFUN (no_ripng_passive_interface, @@ -1065,125 +1033,117 @@ DEFUN (no_ripng_passive_interface, "Suppress routing updates on an interface\n" "Interface name\n") { - int idx_ifname = 2; - return ripng_passive_interface_unset (vty, argv[idx_ifname]->arg); + int idx_ifname = 2; + return ripng_passive_interface_unset(vty, argv[idx_ifname]->arg); } -static struct ripng_interface * -ri_new (void) +static struct ripng_interface *ri_new(void) { - struct ripng_interface *ri; - ri = XCALLOC (MTYPE_IF, sizeof (struct ripng_interface)); + struct ripng_interface *ri; + ri = XCALLOC(MTYPE_IF, sizeof(struct ripng_interface)); - /* Set default split-horizon behavior. If the interface is Frame - Relay or SMDS is enabled, the default value for split-horizon is - off. But currently Zebra does detect Frame Relay or SMDS - interface. So all interface is set to split horizon. */ - ri->split_horizon_default = RIPNG_SPLIT_HORIZON; - ri->split_horizon = ri->split_horizon_default; + /* Set default split-horizon behavior. If the interface is Frame + Relay or SMDS is enabled, the default value for split-horizon is + off. But currently Zebra does detect Frame Relay or SMDS + interface. So all interface is set to split horizon. */ + ri->split_horizon_default = RIPNG_SPLIT_HORIZON; + ri->split_horizon = ri->split_horizon_default; - return ri; + return ri; } -static int -ripng_if_new_hook (struct interface *ifp) +static int ripng_if_new_hook(struct interface *ifp) { - ifp->info = ri_new (); - return 0; + ifp->info = ri_new(); + return 0; } /* Called when interface structure deleted. */ -static int -ripng_if_delete_hook (struct interface *ifp) +static int ripng_if_delete_hook(struct interface *ifp) { - XFREE (MTYPE_IF, ifp->info); - ifp->info = NULL; - return 0; + XFREE(MTYPE_IF, ifp->info); + ifp->info = NULL; + return 0; } /* Configuration write function for ripngd. */ -static int -interface_config_write (struct vty *vty) +static int interface_config_write(struct vty *vty) { - struct listnode *node; - struct interface *ifp; - struct ripng_interface *ri; - int write = 0; - - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - { - ri = ifp->info; - - /* Do not display the interface if there is no - * configuration about it. - **/ - if ((!ifp->desc) && - (ri->split_horizon == ri->split_horizon_default)) - continue; - - vty_out (vty, "interface %s\n",ifp->name); - if (ifp->desc) - vty_out (vty, " description %s\n",ifp->desc); - - /* Split horizon. */ - if (ri->split_horizon != ri->split_horizon_default) - { - switch (ri->split_horizon) { - case RIPNG_SPLIT_HORIZON: - vty_out (vty, " ipv6 ripng split-horizon\n"); - break; - case RIPNG_SPLIT_HORIZON_POISONED_REVERSE: - vty_out (vty," ipv6 ripng split-horizon poisoned-reverse\n"); - break; - case RIPNG_NO_SPLIT_HORIZON: - default: - vty_out (vty, " no ipv6 ripng split-horizon\n"); - break; - } + struct listnode *node; + struct interface *ifp; + struct ripng_interface *ri; + int write = 0; + + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) { + ri = ifp->info; + + /* Do not display the interface if there is no + * configuration about it. + **/ + if ((!ifp->desc) + && (ri->split_horizon == ri->split_horizon_default)) + continue; + + vty_out(vty, "interface %s\n", ifp->name); + if (ifp->desc) + vty_out(vty, " description %s\n", ifp->desc); + + /* Split horizon. */ + if (ri->split_horizon != ri->split_horizon_default) { + switch (ri->split_horizon) { + case RIPNG_SPLIT_HORIZON: + vty_out(vty, " ipv6 ripng split-horizon\n"); + break; + case RIPNG_SPLIT_HORIZON_POISONED_REVERSE: + vty_out(vty, + " ipv6 ripng split-horizon poisoned-reverse\n"); + break; + case RIPNG_NO_SPLIT_HORIZON: + default: + vty_out(vty, " no ipv6 ripng split-horizon\n"); + break; + } + } + + vty_out(vty, "!\n"); + + write++; } - - vty_out (vty, "!\n"); - - write++; - } - return write; + return write; } /* ripngd's interface node. */ -static struct cmd_node interface_node = -{ - INTERFACE_NODE, - "%s(config-if)# ", - 1 /* VTYSH */ +static struct cmd_node interface_node = { + INTERFACE_NODE, "%s(config-if)# ", 1 /* VTYSH */ }; /* Initialization of interface. */ -void -ripng_if_init () +void ripng_if_init() { - /* Interface initialize. */ - if_add_hook (IF_NEW_HOOK, ripng_if_new_hook); - if_add_hook (IF_DELETE_HOOK, ripng_if_delete_hook); + /* Interface initialize. */ + if_add_hook(IF_NEW_HOOK, ripng_if_new_hook); + if_add_hook(IF_DELETE_HOOK, ripng_if_delete_hook); - /* RIPng enable network init. */ - ripng_enable_network = route_table_init (); + /* RIPng enable network init. */ + ripng_enable_network = route_table_init(); - /* RIPng enable interface init. */ - ripng_enable_if = vector_init (1); + /* RIPng enable interface init. */ + ripng_enable_if = vector_init(1); - /* RIPng passive interface. */ - Vripng_passive_interface = vector_init (1); + /* RIPng passive interface. */ + Vripng_passive_interface = vector_init(1); - /* Install interface node. */ - install_node (&interface_node, interface_config_write); - if_cmd_init (); + /* Install interface node. */ + install_node(&interface_node, interface_config_write); + if_cmd_init(); - install_element (RIPNG_NODE, &ripng_network_cmd); - install_element (RIPNG_NODE, &no_ripng_network_cmd); - install_element (RIPNG_NODE, &ripng_passive_interface_cmd); - install_element (RIPNG_NODE, &no_ripng_passive_interface_cmd); + install_element(RIPNG_NODE, &ripng_network_cmd); + install_element(RIPNG_NODE, &no_ripng_network_cmd); + install_element(RIPNG_NODE, &ripng_passive_interface_cmd); + install_element(RIPNG_NODE, &no_ripng_passive_interface_cmd); - install_element (INTERFACE_NODE, &ipv6_ripng_split_horizon_cmd); - install_element (INTERFACE_NODE, &ipv6_ripng_split_horizon_poisoned_reverse_cmd); - install_element (INTERFACE_NODE, &no_ipv6_ripng_split_horizon_cmd); + install_element(INTERFACE_NODE, &ipv6_ripng_split_horizon_cmd); + install_element(INTERFACE_NODE, + &ipv6_ripng_split_horizon_poisoned_reverse_cmd); + install_element(INTERFACE_NODE, &no_ipv6_ripng_split_horizon_cmd); } |
