diff options
Diffstat (limited to 'ripd/rip_interface.c')
| -rw-r--r-- | ripd/rip_interface.c | 2492 |
1 files changed, 1205 insertions, 1287 deletions
diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c index ea68872bca..ef40b0782e 100644 --- a/ripd/rip_interface.c +++ b/ripd/rip_interface.c @@ -16,7 +16,7 @@ * You should have received a copy of the GNU General Public License * along with GNU Zebra; see the file COPYING. If not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. + * 02111-1307, USA. */ #include <zebra.h> @@ -42,25 +42,22 @@ #include "ripd/rip_debug.h" #include "ripd/rip_interface.h" -DEFINE_HOOK(rip_ifaddr_add, (struct connected *ifc), (ifc)) -DEFINE_HOOK(rip_ifaddr_del, (struct connected *ifc), (ifc)) +DEFINE_HOOK(rip_ifaddr_add, (struct connected * ifc), (ifc)) +DEFINE_HOOK(rip_ifaddr_del, (struct connected * ifc), (ifc)) /* static prototypes */ -static void rip_enable_apply (struct interface *); -static void rip_passive_interface_apply (struct interface *); +static void rip_enable_apply(struct interface *); +static void rip_passive_interface_apply(struct interface *); static int rip_if_down(struct interface *ifp); -static int rip_enable_if_lookup (const char *ifname); -static int rip_enable_network_lookup2 (struct connected *connected); -static void rip_enable_apply_all (void); +static int rip_enable_if_lookup(const char *ifname); +static int rip_enable_network_lookup2(struct connected *connected); +static void rip_enable_apply_all(void); -const struct message ri_version_msg[] = -{ - {RI_RIP_VERSION_1, "1"}, - {RI_RIP_VERSION_2, "2"}, - {RI_RIP_VERSION_1_AND_2, "1 2"}, - {RI_RIP_VERSION_NONE, "none"}, - { 0 } -}; +const struct message ri_version_msg[] = {{RI_RIP_VERSION_1, "1"}, + {RI_RIP_VERSION_2, "2"}, + {RI_RIP_VERSION_1_AND_2, "1 2"}, + {RI_RIP_VERSION_NONE, "none"}, + {0}}; extern struct zebra_privs_t ripd_privs; @@ -71,167 +68,158 @@ vector rip_enable_interface; struct route_table *rip_enable_network; /* Vector to store passive-interface name. */ -static int passive_default; /* are we in passive-interface default mode? */ +static int passive_default; /* are we in passive-interface default mode? */ vector Vrip_passive_nondefault; /* Join to the RIP version 2 multicast group. */ -static int -ipv4_multicast_join (int sock, - struct in_addr group, - struct in_addr ifa, - ifindex_t ifindex) +static int ipv4_multicast_join(int sock, struct in_addr group, + struct in_addr ifa, ifindex_t ifindex) { - int ret; + int ret; - ret = setsockopt_ipv4_multicast (sock, - IP_ADD_MEMBERSHIP, - ifa, - group.s_addr, - ifindex); + ret = setsockopt_ipv4_multicast(sock, IP_ADD_MEMBERSHIP, ifa, + group.s_addr, ifindex); - if (ret < 0) - zlog_info("can't setsockopt IP_ADD_MEMBERSHIP %s", safe_strerror(errno)); + if (ret < 0) + zlog_info("can't setsockopt IP_ADD_MEMBERSHIP %s", + safe_strerror(errno)); - return ret; + return ret; } /* Leave from the RIP version 2 multicast group. */ -static int -ipv4_multicast_leave (int sock, - struct in_addr group, - struct in_addr ifa, - ifindex_t ifindex) +static int ipv4_multicast_leave(int sock, struct in_addr group, + struct in_addr ifa, ifindex_t ifindex) { - int ret; + int ret; - ret = setsockopt_ipv4_multicast (sock, - IP_DROP_MEMBERSHIP, - ifa, - group.s_addr, - ifindex); + ret = setsockopt_ipv4_multicast(sock, IP_DROP_MEMBERSHIP, ifa, + group.s_addr, ifindex); - if (ret < 0) - zlog_info("can't setsockopt IP_DROP_MEMBERSHIP"); + if (ret < 0) + zlog_info("can't setsockopt IP_DROP_MEMBERSHIP"); - return ret; + return ret; } -static void rip_interface_reset (struct rip_interface *); +static void rip_interface_reset(struct rip_interface *); /* Allocate new RIP's interface configuration. */ -static struct rip_interface * -rip_interface_new (void) +static struct rip_interface *rip_interface_new(void) { - struct rip_interface *ri; + struct rip_interface *ri; - ri = XCALLOC (MTYPE_RIP_INTERFACE, sizeof (struct rip_interface)); + ri = XCALLOC(MTYPE_RIP_INTERFACE, sizeof(struct rip_interface)); - rip_interface_reset (ri); + rip_interface_reset(ri); - return ri; + return ri; } -void -rip_interface_multicast_set (int sock, struct connected *connected) +void rip_interface_multicast_set(int sock, struct connected *connected) { - struct in_addr addr; + struct in_addr addr; - assert (connected != NULL); + assert(connected != NULL); - addr = CONNECTED_ID(connected)->u.prefix4; + addr = CONNECTED_ID(connected)->u.prefix4; + + if (setsockopt_ipv4_multicast_if(sock, addr, connected->ifp->ifindex) + < 0) { + zlog_warn( + "Can't setsockopt IP_MULTICAST_IF on fd %d to " + "ifindex %d for interface %s", + sock, connected->ifp->ifindex, connected->ifp->name); + } - if (setsockopt_ipv4_multicast_if (sock, addr, connected->ifp->ifindex) < 0) - { - zlog_warn ("Can't setsockopt IP_MULTICAST_IF on fd %d to " - "ifindex %d for interface %s", - sock, connected->ifp->ifindex, - connected->ifp->name); - } - - return; + return; } /* Send RIP request packet to specified interface. */ -static void -rip_request_interface_send (struct interface *ifp, u_char version) +static void rip_request_interface_send(struct interface *ifp, u_char version) { - struct sockaddr_in to; + struct sockaddr_in to; - /* RIPv2 support multicast. */ - if (version == RIPv2 && if_is_multicast (ifp)) - { - - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("multicast request on %s", ifp->name); + /* RIPv2 support multicast. */ + if (version == RIPv2 && if_is_multicast(ifp)) { - rip_request_send (NULL, ifp, version, NULL); - return; - } + if (IS_RIP_DEBUG_EVENT) + zlog_debug("multicast request on %s", ifp->name); - /* RIPv1 and non multicast interface. */ - if (if_is_pointopoint (ifp) || if_is_broadcast (ifp)) - { - struct listnode *cnode, *cnnode; - struct connected *connected; - - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("broadcast request to %s", ifp->name); + rip_request_send(NULL, ifp, version, NULL); + return; + } - for (ALL_LIST_ELEMENTS (ifp->connected, cnode, cnnode, connected)) - { - if (connected->address->family == AF_INET) - { - memset (&to, 0, sizeof (struct sockaddr_in)); - to.sin_port = htons (RIP_PORT_DEFAULT); - if (connected->destination) - /* use specified broadcast or peer destination addr */ - to.sin_addr = connected->destination->u.prefix4; - else if (connected->address->prefixlen < IPV4_MAX_PREFIXLEN) - /* calculate the appropriate broadcast address */ - to.sin_addr.s_addr = - ipv4_broadcast_addr(connected->address->u.prefix4.s_addr, - connected->address->prefixlen); - else - /* do not know where to send the packet */ - continue; - - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("SEND request to %s", inet_ntoa (to.sin_addr)); - - rip_request_send (&to, ifp, version, connected); - } + /* RIPv1 and non multicast interface. */ + if (if_is_pointopoint(ifp) || if_is_broadcast(ifp)) { + struct listnode *cnode, *cnnode; + struct connected *connected; + + if (IS_RIP_DEBUG_EVENT) + zlog_debug("broadcast request to %s", ifp->name); + + for (ALL_LIST_ELEMENTS(ifp->connected, cnode, cnnode, + connected)) { + if (connected->address->family == AF_INET) { + memset(&to, 0, sizeof(struct sockaddr_in)); + to.sin_port = htons(RIP_PORT_DEFAULT); + if (connected->destination) + /* use specified broadcast or peer + * destination addr */ + to.sin_addr = connected->destination->u + .prefix4; + else if (connected->address->prefixlen + < IPV4_MAX_PREFIXLEN) + /* calculate the appropriate broadcast + * address */ + to.sin_addr + .s_addr = ipv4_broadcast_addr( + connected->address->u.prefix4 + .s_addr, + connected->address->prefixlen); + else + /* do not know where to send the packet + */ + continue; + + if (IS_RIP_DEBUG_EVENT) + zlog_debug("SEND request to %s", + inet_ntoa(to.sin_addr)); + + rip_request_send(&to, ifp, version, connected); + } + } } - } } /* This will be executed when interface goes up. */ -static void -rip_request_interface (struct interface *ifp) +static void rip_request_interface(struct interface *ifp) { - struct rip_interface *ri; + struct rip_interface *ri; - /* In default ripd doesn't send RIP_REQUEST to the loopback interface. */ - if (if_is_loopback (ifp)) - return; + /* In default ripd doesn't send RIP_REQUEST to the loopback interface. + */ + if (if_is_loopback(ifp)) + return; - /* If interface is down, don't send RIP packet. */ - if (! if_is_operative (ifp)) - return; + /* If interface is down, don't send RIP packet. */ + if (!if_is_operative(ifp)) + return; - /* Fetch RIP interface information. */ - ri = ifp->info; + /* Fetch RIP interface information. */ + ri = ifp->info; - /* If there is no version configuration in the interface, - use rip's version setting. */ - { - int vsend = ((ri->ri_send == RI_RIP_UNSPEC) ? - rip->version_send : ri->ri_send); - if (vsend & RIPv1) - rip_request_interface_send (ifp, RIPv1); - if (vsend & RIPv2) - rip_request_interface_send (ifp, RIPv2); - } + /* If there is no version configuration in the interface, + use rip's version setting. */ + { + int vsend = ((ri->ri_send == RI_RIP_UNSPEC) ? rip->version_send + : ri->ri_send); + if (vsend & RIPv1) + rip_request_interface_send(ifp, RIPv1); + if (vsend & RIPv2) + rip_request_interface_send(ifp, RIPv2); + } } #if 0 @@ -268,950 +256,893 @@ rip_request_neighbor_all (void) #endif /* Multicast packet receive socket. */ -static int -rip_multicast_join (struct interface *ifp, int sock) +static int rip_multicast_join(struct interface *ifp, int sock) { - struct listnode *cnode; - struct connected *ifc; + struct listnode *cnode; + struct connected *ifc; - if (if_is_operative (ifp) && if_is_multicast (ifp)) - { - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("multicast join at %s", ifp->name); + if (if_is_operative(ifp) && if_is_multicast(ifp)) { + if (IS_RIP_DEBUG_EVENT) + zlog_debug("multicast join at %s", ifp->name); - for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, ifc)) - { - struct prefix_ipv4 *p; - struct in_addr group; - - p = (struct prefix_ipv4 *) ifc->address; - - if (p->family != AF_INET) - continue; - - group.s_addr = htonl (INADDR_RIP_GROUP); - if (ipv4_multicast_join (sock, group, p->prefix, ifp->ifindex) < 0) - return -1; - else - return 0; + for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, ifc)) { + struct prefix_ipv4 *p; + struct in_addr group; + + p = (struct prefix_ipv4 *)ifc->address; + + if (p->family != AF_INET) + continue; + + group.s_addr = htonl(INADDR_RIP_GROUP); + if (ipv4_multicast_join(sock, group, p->prefix, + ifp->ifindex) + < 0) + return -1; + else + return 0; + } } - } - return 0; + return 0; } /* Leave from multicast group. */ -static void -rip_multicast_leave (struct interface *ifp, int sock) +static void rip_multicast_leave(struct interface *ifp, int sock) { - struct listnode *cnode; - struct connected *connected; + struct listnode *cnode; + struct connected *connected; - if (if_is_up (ifp) && if_is_multicast (ifp)) - { - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("multicast leave from %s", ifp->name); + if (if_is_up(ifp) && if_is_multicast(ifp)) { + if (IS_RIP_DEBUG_EVENT) + zlog_debug("multicast leave from %s", ifp->name); - for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected)) - { - struct prefix_ipv4 *p; - struct in_addr group; - - p = (struct prefix_ipv4 *) connected->address; - - if (p->family != AF_INET) - continue; - - group.s_addr = htonl (INADDR_RIP_GROUP); - if (ipv4_multicast_leave (sock, group, p->prefix, ifp->ifindex) == 0) - return; - } - } + for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { + struct prefix_ipv4 *p; + struct in_addr group; + + p = (struct prefix_ipv4 *)connected->address; + + if (p->family != AF_INET) + continue; + + group.s_addr = htonl(INADDR_RIP_GROUP); + if (ipv4_multicast_leave(sock, group, p->prefix, + ifp->ifindex) + == 0) + return; + } + } } /* Is there and address on interface that I could use ? */ -static int -rip_if_ipv4_address_check (struct interface *ifp) +static int rip_if_ipv4_address_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; + for (ALL_LIST_ELEMENTS_RO(ifp->connected, nn, connected)) { + struct prefix *p; - p = connected->address; + p = connected->address; - if (p->family == AF_INET) - count++; - } - - return count; + if (p->family == AF_INET) + count++; + } + + return count; } - - - + /* Does this address belongs to me ? */ -int -if_check_address (struct in_addr addr) -{ - struct listnode *node; - struct interface *ifp; - - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - { - struct listnode *cnode; - struct connected *connected; - - for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected)) - { - struct prefix_ipv4 *p; +int if_check_address(struct in_addr addr) +{ + struct listnode *node; + struct interface *ifp; + + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) { + struct listnode *cnode; + struct connected *connected; - p = (struct prefix_ipv4 *) connected->address; + for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, connected)) { + struct prefix_ipv4 *p; - if (p->family != AF_INET) - continue; + p = (struct prefix_ipv4 *)connected->address; - if (IPV4_ADDR_CMP (&p->prefix, &addr) == 0) - return 1; + if (p->family != AF_INET) + continue; + + if (IPV4_ADDR_CMP(&p->prefix, &addr) == 0) + return 1; + } } - } - return 0; + return 0; } /* Inteface link down message processing. */ -int -rip_interface_down (int command, struct zclient *zclient, zebra_size_t length, - vrf_id_t vrf_id) +int rip_interface_down(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; - s = zclient->ibuf; + /* zebra_interface_state_read() updates interface structure in + iflist. */ + ifp = zebra_interface_state_read(s, vrf_id); - /* 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; + rip_if_down(ifp); - rip_if_down(ifp); - - if (IS_RIP_DEBUG_ZEBRA) - zlog_debug ("interface %s index %d flags %llx metric %d mtu %d is down", - ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, - ifp->metric, ifp->mtu); + if (IS_RIP_DEBUG_ZEBRA) + zlog_debug( + "interface %s index %d flags %llx metric %d mtu %d is down", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu); - return 0; + return 0; } /* Inteface link up message processing */ -int -rip_interface_up (int command, struct zclient *zclient, zebra_size_t length, - vrf_id_t vrf_id) +int rip_interface_up(int command, struct zclient *zclient, zebra_size_t length, + vrf_id_t vrf_id) { - struct interface *ifp; + struct interface *ifp; - /* zebra_interface_state_read () updates interface structure in - iflist. */ - ifp = zebra_interface_state_read (zclient->ibuf, vrf_id); + /* zebra_interface_state_read () updates interface structure in + iflist. */ + ifp = zebra_interface_state_read(zclient->ibuf, vrf_id); - if (ifp == NULL) - return 0; + if (ifp == NULL) + return 0; - if (IS_RIP_DEBUG_ZEBRA) - zlog_debug ("interface %s index %d flags %#llx metric %d mtu %d is up", - ifp->name, ifp->ifindex, (unsigned long long) ifp->flags, - ifp->metric, ifp->mtu); + if (IS_RIP_DEBUG_ZEBRA) + zlog_debug( + "interface %s index %d flags %#llx metric %d mtu %d is up", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu); - /* Check if this interface is RIP enabled or not.*/ - rip_enable_apply (ifp); - - /* Check for a passive interface */ - rip_passive_interface_apply (ifp); + /* Check if this interface is RIP enabled or not.*/ + rip_enable_apply(ifp); - /* Apply distribute list to the all interface. */ - rip_distribute_update_interface (ifp); + /* Check for a passive interface */ + rip_passive_interface_apply(ifp); - return 0; + /* Apply distribute list to the all interface. */ + rip_distribute_update_interface(ifp); + + return 0; } /* Inteface addition message from zebra. */ -int -rip_interface_add (int command, struct zclient *zclient, zebra_size_t length, - vrf_id_t vrf_id) +int rip_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_RIP_DEBUG_ZEBRA) + zlog_debug( + "interface add %s index %d flags %#llx metric %d mtu %d", + ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, + ifp->metric, ifp->mtu); - if (IS_RIP_DEBUG_ZEBRA) - zlog_debug ("interface add %s index %d flags %#llx metric %d mtu %d", - ifp->name, ifp->ifindex, (unsigned long long) ifp->flags, - ifp->metric, ifp->mtu); + /* Check if this interface is RIP enabled or not.*/ + rip_enable_apply(ifp); - /* Check if this interface is RIP enabled or not.*/ - rip_enable_apply (ifp); - - /* Check for a passive interface */ - rip_passive_interface_apply (ifp); + /* Check for a passive interface */ + rip_passive_interface_apply(ifp); - /* Apply distribute list to the all interface. */ - rip_distribute_update_interface (ifp); + /* Apply distribute list to the all interface. */ + rip_distribute_update_interface(ifp); - /* rip_request_neighbor_all (); */ + /* rip_request_neighbor_all (); */ - /* Check interface routemap. */ - rip_if_rmap_update_interface (ifp); + /* Check interface routemap. */ + rip_if_rmap_update_interface(ifp); - return 0; + return 0; } -int -rip_interface_delete (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int rip_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); + if (ifp == NULL) + return 0; - s = zclient->ibuf; - /* zebra_interface_state_read() updates interface structure in iflist */ - ifp = zebra_interface_state_read (s, vrf_id); + if (if_is_up(ifp)) { + rip_if_down(ifp); + } - if (ifp == NULL) - return 0; + 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->mtu); - if (if_is_up (ifp)) { - rip_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->mtu); - - /* 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; } -static void -rip_interface_clean (struct rip_interface *ri) +static void rip_interface_clean(struct rip_interface *ri) { - ri->enable_network = 0; - ri->enable_interface = 0; - ri->running = 0; + ri->enable_network = 0; + ri->enable_interface = 0; + ri->running = 0; - 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 -rip_interfaces_clean (void) +void rip_interfaces_clean(void) { - struct listnode *node; - struct interface *ifp; + struct listnode *node; + struct interface *ifp; - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - rip_interface_clean (ifp->info); + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) + rip_interface_clean(ifp->info); } -static void -rip_interface_reset (struct rip_interface *ri) +static void rip_interface_reset(struct rip_interface *ri) { - /* Default authentication type is simple password for Cisco - compatibility. */ - ri->auth_type = RIP_NO_AUTH; - ri->md5_auth_len = RIP_AUTH_MD5_COMPAT_SIZE; + /* Default authentication type is simple password for Cisco + compatibility. */ + ri->auth_type = RIP_NO_AUTH; + ri->md5_auth_len = RIP_AUTH_MD5_COMPAT_SIZE; - /* 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 = RIP_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 = RIP_SPLIT_HORIZON; + ri->split_horizon = ri->split_horizon_default; - ri->ri_send = RI_RIP_UNSPEC; - ri->ri_receive = RI_RIP_UNSPEC; + ri->ri_send = RI_RIP_UNSPEC; + ri->ri_receive = RI_RIP_UNSPEC; - ri->v2_broadcast = 0; + ri->v2_broadcast = 0; - if (ri->auth_str) - { - free (ri->auth_str); - ri->auth_str = NULL; - } - if (ri->key_chain) - { - free (ri->key_chain); - ri->key_chain = NULL; - } + if (ri->auth_str) { + free(ri->auth_str); + ri->auth_str = NULL; + } + if (ri->key_chain) { + free(ri->key_chain); + ri->key_chain = NULL; + } - ri->list[RIP_FILTER_IN] = NULL; - ri->list[RIP_FILTER_OUT] = NULL; + ri->list[RIP_FILTER_IN] = NULL; + ri->list[RIP_FILTER_OUT] = NULL; - ri->prefix[RIP_FILTER_IN] = NULL; - ri->prefix[RIP_FILTER_OUT] = NULL; + ri->prefix[RIP_FILTER_IN] = NULL; + ri->prefix[RIP_FILTER_OUT] = NULL; - ri->recv_badpackets = 0; - ri->recv_badroutes = 0; - ri->sent_updates = 0; + ri->recv_badpackets = 0; + ri->recv_badroutes = 0; + ri->sent_updates = 0; - ri->passive = 0; - - rip_interface_clean (ri); + ri->passive = 0; + + rip_interface_clean(ri); } -void -rip_interfaces_reset (void) +void rip_interfaces_reset(void) { - struct listnode *node; - struct interface *ifp; + struct listnode *node; + struct interface *ifp; - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - rip_interface_reset (ifp->info); + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) + rip_interface_reset(ifp->info); } -int -rip_if_down(struct interface *ifp) +int rip_if_down(struct interface *ifp) { - struct route_node *rp; - struct rip_info *rinfo; - struct rip_interface *ri = NULL; - struct list *list = NULL; - struct listnode *listnode = NULL, *nextnode = NULL; - if (rip) - { - for (rp = route_top (rip->table); rp; rp = route_next (rp)) - if ((list = rp->info) != NULL) - for (ALL_LIST_ELEMENTS (list, listnode, nextnode, rinfo)) - if (rinfo->ifindex == ifp->ifindex) - rip_ecmp_delete (rinfo); - - ri = ifp->info; - - if (ri->running) - { - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("turn off %s", ifp->name); - - /* Leave from multicast group. */ - rip_multicast_leave (ifp, rip->sock); - - ri->running = 0; - } - } - - return 0; + struct route_node *rp; + struct rip_info *rinfo; + struct rip_interface *ri = NULL; + struct list *list = NULL; + struct listnode *listnode = NULL, *nextnode = NULL; + if (rip) { + for (rp = route_top(rip->table); rp; rp = route_next(rp)) + if ((list = rp->info) != NULL) + for (ALL_LIST_ELEMENTS(list, listnode, nextnode, + rinfo)) + if (rinfo->ifindex == ifp->ifindex) + rip_ecmp_delete(rinfo); + + ri = ifp->info; + + if (ri->running) { + if (IS_RIP_DEBUG_EVENT) + zlog_debug("turn off %s", ifp->name); + + /* Leave from multicast group. */ + rip_multicast_leave(ifp, rip->sock); + + ri->running = 0; + } + } + + return 0; } /* Needed for stop RIP process. */ -void -rip_if_down_all () +void rip_if_down_all() { - struct interface *ifp; - struct listnode *node, *nnode; + struct interface *ifp; + struct listnode *node, *nnode; - for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT), node, nnode, ifp)) - rip_if_down (ifp); + for (ALL_LIST_ELEMENTS(vrf_iflist(VRF_DEFAULT), node, nnode, ifp)) + rip_if_down(ifp); } -static void -rip_apply_address_add (struct connected *ifc) +static void rip_apply_address_add(struct connected *ifc) { - struct prefix_ipv4 address; - struct prefix *p; - - if (!rip) - return; + struct prefix_ipv4 address; + struct prefix *p; - if (! if_is_up(ifc->ifp)) - return; + if (!rip) + return; - p = ifc->address; + if (!if_is_up(ifc->ifp)) + return; - memset (&address, 0, sizeof (address)); - address.family = p->family; - address.prefix = p->u.prefix4; - address.prefixlen = p->prefixlen; - apply_mask_ipv4(&address); + p = ifc->address; - /* Check if this interface is RIP enabled or not - or Check if this address's prefix is RIP enabled */ - if ((rip_enable_if_lookup(ifc->ifp->name) >= 0) || - (rip_enable_network_lookup2(ifc) >= 0)) - rip_redistribute_add(ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE, - &address, ifc->ifp->ifindex, NULL, 0, 0, 0); + memset(&address, 0, sizeof(address)); + address.family = p->family; + address.prefix = p->u.prefix4; + address.prefixlen = p->prefixlen; + apply_mask_ipv4(&address); + /* Check if this interface is RIP enabled or not + or Check if this address's prefix is RIP enabled */ + if ((rip_enable_if_lookup(ifc->ifp->name) >= 0) + || (rip_enable_network_lookup2(ifc) >= 0)) + rip_redistribute_add(ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE, + &address, ifc->ifp->ifindex, NULL, 0, 0, + 0); } -int -rip_interface_address_add (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int rip_interface_address_add(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct connected *ifc; - struct prefix *p; + struct connected *ifc; + struct prefix *p; - ifc = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_ADD, - zclient->ibuf, vrf_id); + ifc = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_ADD, + zclient->ibuf, vrf_id); - if (ifc == NULL) - return 0; + if (ifc == NULL) + return 0; - p = ifc->address; + p = ifc->address; - if (p->family == AF_INET) - { - if (IS_RIP_DEBUG_ZEBRA) - zlog_debug ("connected address %s/%d is added", - inet_ntoa (p->u.prefix4), p->prefixlen); + if (p->family == AF_INET) { + if (IS_RIP_DEBUG_ZEBRA) + zlog_debug("connected address %s/%d is added", + inet_ntoa(p->u.prefix4), p->prefixlen); - rip_enable_apply(ifc->ifp); - /* Check if this prefix needs to be redistributed */ - rip_apply_address_add(ifc); + rip_enable_apply(ifc->ifp); + /* Check if this prefix needs to be redistributed */ + rip_apply_address_add(ifc); - hook_call(rip_ifaddr_add, ifc); - } + hook_call(rip_ifaddr_add, ifc); + } - return 0; + return 0; } -static void -rip_apply_address_del (struct connected *ifc) { - struct prefix_ipv4 address; - struct prefix *p; +static void rip_apply_address_del(struct connected *ifc) +{ + struct prefix_ipv4 address; + struct prefix *p; - if (!rip) - return; + if (!rip) + 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.prefix4; - address.prefixlen = p->prefixlen; - apply_mask_ipv4(&address); + memset(&address, 0, sizeof(address)); + address.family = p->family; + address.prefix = p->u.prefix4; + address.prefixlen = p->prefixlen; + apply_mask_ipv4(&address); - rip_redistribute_delete(ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE, - &address, ifc->ifp->ifindex); + rip_redistribute_delete(ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE, + &address, ifc->ifp->ifindex); } -int -rip_interface_address_delete (int command, struct zclient *zclient, - zebra_size_t length, vrf_id_t vrf_id) +int rip_interface_address_delete(int command, struct zclient *zclient, + zebra_size_t length, vrf_id_t vrf_id) { - struct connected *ifc; - struct prefix *p; - - ifc = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE, - zclient->ibuf, vrf_id); - - if (ifc) - { - p = ifc->address; - if (p->family == AF_INET) - { - if (IS_RIP_DEBUG_ZEBRA) - zlog_debug ("connected address %s/%d is deleted", - inet_ntoa (p->u.prefix4), p->prefixlen); + struct connected *ifc; + struct prefix *p; - hook_call(rip_ifaddr_del, ifc); + ifc = zebra_interface_address_read(ZEBRA_INTERFACE_ADDRESS_DELETE, + zclient->ibuf, vrf_id); - /* Chech wether this prefix needs to be removed */ - rip_apply_address_del(ifc); + if (ifc) { + p = ifc->address; + if (p->family == AF_INET) { + if (IS_RIP_DEBUG_ZEBRA) + zlog_debug("connected address %s/%d is deleted", + inet_ntoa(p->u.prefix4), + p->prefixlen); - } + hook_call(rip_ifaddr_del, ifc); - connected_free (ifc); + /* Chech wether this prefix needs to be removed */ + rip_apply_address_del(ifc); + } - } + connected_free(ifc); + } - return 0; + return 0; } /* Check interface is enabled by network statement. */ /* Check wether the interface has at least a connected prefix that * is within the ripng_enable_network table. */ -static int -rip_enable_network_lookup_if (struct interface *ifp) -{ - struct listnode *node, *nnode; - struct connected *connected; - struct prefix_ipv4 address; - - for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected)) - { - struct prefix *p; - struct route_node *node; - - p = connected->address; - - if (p->family == AF_INET) - { - address.family = AF_INET; - address.prefix = p->u.prefix4; - address.prefixlen = IPV4_MAX_BITLEN; - - node = route_node_match (rip_enable_network, - (struct prefix *)&address); - if (node) - { - route_unlock_node (node); - return 1; - } - } - } - return -1; +static int rip_enable_network_lookup_if(struct interface *ifp) +{ + struct listnode *node, *nnode; + struct connected *connected; + struct prefix_ipv4 address; + + for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { + struct prefix *p; + struct route_node *node; + + p = connected->address; + + if (p->family == AF_INET) { + address.family = AF_INET; + address.prefix = p->u.prefix4; + address.prefixlen = IPV4_MAX_BITLEN; + + node = route_node_match(rip_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. */ -int -rip_enable_network_lookup2 (struct connected *connected) +int rip_enable_network_lookup2(struct connected *connected) { - struct prefix_ipv4 address; - struct prefix *p; + struct prefix_ipv4 address; + struct prefix *p; - p = connected->address; + p = connected->address; - if (p->family == AF_INET) { - struct route_node *node; + if (p->family == AF_INET) { + struct route_node *node; - address.family = p->family; - address.prefix = p->u.prefix4; - address.prefixlen = IPV4_MAX_BITLEN; + address.family = p->family; + address.prefix = p->u.prefix4; + address.prefixlen = IPV4_MAX_BITLEN; - /* LPM on p->family, p->u.prefix4/IPV4_MAX_BITLEN within rip_enable_network */ - node = route_node_match (rip_enable_network, - (struct prefix *)&address); + /* LPM on p->family, p->u.prefix4/IPV4_MAX_BITLEN within + * rip_enable_network */ + node = route_node_match(rip_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 RIP enable network. */ -static int -rip_enable_network_add (struct prefix *p) +static int rip_enable_network_add(struct prefix *p) { - struct route_node *node; + struct route_node *node; - node = route_node_get (rip_enable_network, p); + node = route_node_get(rip_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 */ - rip_enable_apply_all(); + /* XXX: One should find a better solution than a generic one */ + rip_enable_apply_all(); - return 1; + return 1; } /* Delete RIP enable network. */ -static int -rip_enable_network_delete (struct prefix *p) +static int rip_enable_network_delete(struct prefix *p) { - struct route_node *node; + struct route_node *node; - node = route_node_lookup (rip_enable_network, p); - if (node) - { - node->info = NULL; + node = route_node_lookup(rip_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); - /* XXX: One should find a better solution than a generic one */ - rip_enable_apply_all (); + /* XXX: One should find a better solution than a generic one */ + rip_enable_apply_all(); - return 1; - } - return -1; + return 1; + } + return -1; } /* Check interface is enabled by ifname statement. */ -static int -rip_enable_if_lookup (const char *ifname) +static int rip_enable_if_lookup(const char *ifname) { - unsigned int i; - char *str; + unsigned int i; + char *str; - for (i = 0; i < vector_active (rip_enable_interface); i++) - if ((str = vector_slot (rip_enable_interface, i)) != NULL) - if (strcmp (str, ifname) == 0) - return i; - return -1; + for (i = 0; i < vector_active(rip_enable_interface); i++) + if ((str = vector_slot(rip_enable_interface, i)) != NULL) + if (strcmp(str, ifname) == 0) + return i; + return -1; } /* Add interface to rip_enable_if. */ -static int -rip_enable_if_add (const char *ifname) +static int rip_enable_if_add(const char *ifname) { - int ret; + int ret; - ret = rip_enable_if_lookup (ifname); - if (ret >= 0) - return -1; + ret = rip_enable_if_lookup(ifname); + if (ret >= 0) + return -1; - vector_set (rip_enable_interface, strdup (ifname)); + vector_set(rip_enable_interface, strdup(ifname)); - rip_enable_apply_all(); /* TODOVJ */ + rip_enable_apply_all(); /* TODOVJ */ - return 1; + return 1; } /* Delete interface from rip_enable_if. */ -static int -rip_enable_if_delete (const char *ifname) +static int rip_enable_if_delete(const char *ifname) { - int index; - char *str; + int index; + char *str; - index = rip_enable_if_lookup (ifname); - if (index < 0) - return -1; + index = rip_enable_if_lookup(ifname); + if (index < 0) + return -1; - str = vector_slot (rip_enable_interface, index); - free (str); - vector_unset (rip_enable_interface, index); + str = vector_slot(rip_enable_interface, index); + free(str); + vector_unset(rip_enable_interface, index); - rip_enable_apply_all(); /* TODOVJ */ + rip_enable_apply_all(); /* TODOVJ */ - return 1; + return 1; } /* Join to multicast group and send request to the interface. */ -static int -rip_interface_wakeup (struct thread *t) +static int rip_interface_wakeup(struct thread *t) { - struct interface *ifp; - struct rip_interface *ri; + struct interface *ifp; + struct rip_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 (rip_multicast_join (ifp, rip->sock) < 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. */ - rip_request_interface (ifp); - - return 0; -} + /* Join to multicast group. */ + if (rip_multicast_join(ifp, rip->sock) < 0) { + zlog_err("multicast join failed, interface %s not running", + ifp->name); + return 0; + } -static void -rip_connect_set (struct interface *ifp, int set) -{ - struct listnode *node, *nnode; - struct connected *connected; - struct prefix_ipv4 address; - - for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected)) - { - struct prefix *p; - p = connected->address; - - if (p->family != AF_INET) - continue; - - address.family = AF_INET; - address.prefix = p->u.prefix4; - address.prefixlen = p->prefixlen; - apply_mask_ipv4 (&address); - - if (set) { - /* Check once more wether this prefix is within a "network IF_OR_PREF" one */ - if ((rip_enable_if_lookup(connected->ifp->name) >= 0) || - (rip_enable_network_lookup2(connected) >= 0)) - rip_redistribute_add (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE, - &address, connected->ifp->ifindex, - NULL, 0, 0, 0); - } else - { - rip_redistribute_delete (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_INTERFACE, - &address, connected->ifp->ifindex); - if (rip_redistribute_check (ZEBRA_ROUTE_CONNECT)) - rip_redistribute_add (ZEBRA_ROUTE_CONNECT, RIP_ROUTE_REDISTRIBUTE, - &address, connected->ifp->ifindex, - NULL, 0, 0, 0); - } - } + /* Set running flag. */ + ri->running = 1; + + /* Send RIP request to the interface. */ + rip_request_interface(ifp); + + return 0; +} + +static void rip_connect_set(struct interface *ifp, int set) +{ + struct listnode *node, *nnode; + struct connected *connected; + struct prefix_ipv4 address; + + for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) { + struct prefix *p; + p = connected->address; + + if (p->family != AF_INET) + continue; + + address.family = AF_INET; + address.prefix = p->u.prefix4; + address.prefixlen = p->prefixlen; + apply_mask_ipv4(&address); + + if (set) { + /* Check once more wether this prefix is within a + * "network IF_OR_PREF" one */ + if ((rip_enable_if_lookup(connected->ifp->name) >= 0) + || (rip_enable_network_lookup2(connected) >= 0)) + rip_redistribute_add( + ZEBRA_ROUTE_CONNECT, + RIP_ROUTE_INTERFACE, &address, + connected->ifp->ifindex, NULL, 0, 0, 0); + } else { + rip_redistribute_delete(ZEBRA_ROUTE_CONNECT, + RIP_ROUTE_INTERFACE, &address, + connected->ifp->ifindex); + if (rip_redistribute_check(ZEBRA_ROUTE_CONNECT)) + rip_redistribute_add( + ZEBRA_ROUTE_CONNECT, + RIP_ROUTE_REDISTRIBUTE, &address, + connected->ifp->ifindex, NULL, 0, 0, 0); + } + } } /* Update interface status. */ -void -rip_enable_apply (struct interface *ifp) +void rip_enable_apply(struct interface *ifp) { - int ret; - struct rip_interface *ri = NULL; + int ret; + struct rip_interface *ri = NULL; - /* Check interface. */ - if (! if_is_operative (ifp)) - return; + /* Check interface. */ + if (!if_is_operative(ifp)) + return; - ri = ifp->info; - - /* Check network configuration. */ - ret = rip_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 = rip_enable_if_lookup (ifp->name); - if (ret >= 0) - ri->enable_interface = 1; - else - ri->enable_interface = 0; - - /* any interface MUST have an IPv4 address */ - if ( ! rip_if_ipv4_address_check (ifp) ) - { - ri->enable_network = 0; - ri->enable_interface = 0; - } - - /* Update running status of the interface. */ - if (ri->enable_network || ri->enable_interface) - { - { - if (IS_RIP_DEBUG_EVENT) - zlog_debug ("turn on %s", ifp->name); - - /* Add interface wake up thread. */ - if (! ri->t_wakeup) - ri->t_wakeup = thread_add_timer (master, rip_interface_wakeup, - ifp, 1); - rip_connect_set (ifp, 1); + ri = ifp->info; + + /* Check network configuration. */ + ret = rip_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 = rip_enable_if_lookup(ifp->name); + if (ret >= 0) + ri->enable_interface = 1; + else + ri->enable_interface = 0; + + /* any interface MUST have an IPv4 address */ + if (!rip_if_ipv4_address_check(ifp)) { + ri->enable_network = 0; + ri->enable_interface = 0; } - } - else - { - if (ri->running) - { - /* Might as well clean up the route table as well - * rip_if_down sets to 0 ri->running, and displays "turn off %s" - **/ - rip_if_down(ifp); - rip_connect_set (ifp, 0); + /* Update running status of the interface. */ + if (ri->enable_network || ri->enable_interface) { + { + if (IS_RIP_DEBUG_EVENT) + zlog_debug("turn on %s", ifp->name); + + /* Add interface wake up thread. */ + if (!ri->t_wakeup) + ri->t_wakeup = thread_add_timer( + master, rip_interface_wakeup, ifp, 1); + rip_connect_set(ifp, 1); + } + } else { + if (ri->running) { + /* Might as well clean up the route table as well + * rip_if_down sets to 0 ri->running, and displays "turn + *off %s" + **/ + rip_if_down(ifp); + + rip_connect_set(ifp, 0); + } } - } } /* Apply network configuration to all interface. */ -void -rip_enable_apply_all () +void rip_enable_apply_all() { - struct interface *ifp; - struct listnode *node, *nnode; + struct interface *ifp; + struct listnode *node, *nnode; - /* Check each interface. */ - for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT), node, nnode, ifp)) - rip_enable_apply (ifp); + /* Check each interface. */ + for (ALL_LIST_ELEMENTS(vrf_iflist(VRF_DEFAULT), node, nnode, ifp)) + rip_enable_apply(ifp); } -int -rip_neighbor_lookup (struct sockaddr_in *from) +int rip_neighbor_lookup(struct sockaddr_in *from) { - struct prefix_ipv4 p; - struct route_node *node; + struct prefix_ipv4 p; + struct route_node *node; - memset (&p, 0, sizeof (struct prefix_ipv4)); - p.family = AF_INET; - p.prefix = from->sin_addr; - p.prefixlen = IPV4_MAX_BITLEN; + memset(&p, 0, sizeof(struct prefix_ipv4)); + p.family = AF_INET; + p.prefix = from->sin_addr; + p.prefixlen = IPV4_MAX_BITLEN; - node = route_node_lookup (rip->neighbor, (struct prefix *) &p); - if (node) - { - route_unlock_node (node); - return 1; - } - return 0; + node = route_node_lookup(rip->neighbor, (struct prefix *)&p); + if (node) { + route_unlock_node(node); + return 1; + } + return 0; } /* Add new RIP neighbor to the neighbor tree. */ -static int -rip_neighbor_add (struct prefix_ipv4 *p) +static int rip_neighbor_add(struct prefix_ipv4 *p) { - struct route_node *node; + struct route_node *node; - node = route_node_get (rip->neighbor, (struct prefix *) p); + node = route_node_get(rip->neighbor, (struct prefix *)p); - if (node->info) - return -1; + if (node->info) + return -1; - node->info = rip->neighbor; + node->info = rip->neighbor; - return 0; + return 0; } /* Delete RIP neighbor from the neighbor tree. */ -static int -rip_neighbor_delete (struct prefix_ipv4 *p) +static int rip_neighbor_delete(struct prefix_ipv4 *p) { - struct route_node *node; + struct route_node *node; + + /* Lock for look up. */ + node = route_node_lookup(rip->neighbor, (struct prefix *)p); + if (!node) + return -1; - /* Lock for look up. */ - node = route_node_lookup (rip->neighbor, (struct prefix *) p); - if (! node) - return -1; - - node->info = NULL; + node->info = NULL; - /* Unlock lookup lock. */ - route_unlock_node (node); + /* Unlock lookup lock. */ + route_unlock_node(node); - /* Unlock real neighbor information lock. */ - route_unlock_node (node); + /* Unlock real neighbor information lock. */ + route_unlock_node(node); - return 0; + return 0; } /* Clear all network and neighbor configuration. */ -void -rip_clean_network () -{ - unsigned int i; - char *str; - struct route_node *rn; - - /* rip_enable_network. */ - for (rn = route_top (rip_enable_network); rn; rn = route_next (rn)) - if (rn->info) - { - rn->info = NULL; - route_unlock_node (rn); - } - - /* rip_enable_interface. */ - for (i = 0; i < vector_active (rip_enable_interface); i++) - if ((str = vector_slot (rip_enable_interface, i)) != NULL) - { - free (str); - vector_slot (rip_enable_interface, i) = NULL; - } +void rip_clean_network() +{ + unsigned int i; + char *str; + struct route_node *rn; + + /* rip_enable_network. */ + for (rn = route_top(rip_enable_network); rn; rn = route_next(rn)) + if (rn->info) { + rn->info = NULL; + route_unlock_node(rn); + } + + /* rip_enable_interface. */ + for (i = 0; i < vector_active(rip_enable_interface); i++) + if ((str = vector_slot(rip_enable_interface, i)) != NULL) { + free(str); + vector_slot(rip_enable_interface, i) = NULL; + } } /* Utility function for looking up passive interface settings. */ -static int -rip_passive_nondefault_lookup (const char *ifname) +static int rip_passive_nondefault_lookup(const char *ifname) { - unsigned int i; - char *str; + unsigned int i; + char *str; - for (i = 0; i < vector_active (Vrip_passive_nondefault); i++) - if ((str = vector_slot (Vrip_passive_nondefault, i)) != NULL) - if (strcmp (str, ifname) == 0) - return i; - return -1; + for (i = 0; i < vector_active(Vrip_passive_nondefault); i++) + if ((str = vector_slot(Vrip_passive_nondefault, i)) != NULL) + if (strcmp(str, ifname) == 0) + return i; + return -1; } -void -rip_passive_interface_apply (struct interface *ifp) +void rip_passive_interface_apply(struct interface *ifp) { - struct rip_interface *ri; + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->passive = ((rip_passive_nondefault_lookup (ifp->name) < 0) ? - passive_default : !passive_default); + ri->passive = ((rip_passive_nondefault_lookup(ifp->name) < 0) + ? passive_default + : !passive_default); - if (IS_RIP_DEBUG_ZEBRA) - zlog_debug ("interface %s: passive = %d",ifp->name,ri->passive); + if (IS_RIP_DEBUG_ZEBRA) + zlog_debug("interface %s: passive = %d", ifp->name, + ri->passive); } -static void -rip_passive_interface_apply_all (void) +static void rip_passive_interface_apply_all(void) { - struct interface *ifp; - struct listnode *node, *nnode; + struct interface *ifp; + struct listnode *node, *nnode; - for (ALL_LIST_ELEMENTS (vrf_iflist (VRF_DEFAULT), node, nnode, ifp)) - rip_passive_interface_apply (ifp); + for (ALL_LIST_ELEMENTS(vrf_iflist(VRF_DEFAULT), node, nnode, ifp)) + rip_passive_interface_apply(ifp); } /* Passive interface. */ -static int -rip_passive_nondefault_set (struct vty *vty, const char *ifname) +static int rip_passive_nondefault_set(struct vty *vty, const char *ifname) { - if (rip_passive_nondefault_lookup (ifname) >= 0) - return CMD_WARNING; + if (rip_passive_nondefault_lookup(ifname) >= 0) + return CMD_WARNING; - vector_set (Vrip_passive_nondefault, strdup (ifname)); + vector_set(Vrip_passive_nondefault, strdup(ifname)); - rip_passive_interface_apply_all (); + rip_passive_interface_apply_all(); - return CMD_SUCCESS; + return CMD_SUCCESS; } -static int -rip_passive_nondefault_unset (struct vty *vty, const char *ifname) +static int rip_passive_nondefault_unset(struct vty *vty, const char *ifname) { - int i; - char *str; + int i; + char *str; - i = rip_passive_nondefault_lookup (ifname); - if (i < 0) - return CMD_WARNING; + i = rip_passive_nondefault_lookup(ifname); + if (i < 0) + return CMD_WARNING; - str = vector_slot (Vrip_passive_nondefault, i); - free (str); - vector_unset (Vrip_passive_nondefault, i); + str = vector_slot(Vrip_passive_nondefault, i); + free(str); + vector_unset(Vrip_passive_nondefault, i); - rip_passive_interface_apply_all (); + rip_passive_interface_apply_all(); - return CMD_SUCCESS; + return CMD_SUCCESS; } /* Free all configured RIP passive-interface settings. */ -void -rip_passive_nondefault_clean (void) +void rip_passive_nondefault_clean(void) { - unsigned int i; - char *str; + unsigned int i; + char *str; - for (i = 0; i < vector_active (Vrip_passive_nondefault); i++) - if ((str = vector_slot (Vrip_passive_nondefault, i)) != NULL) - { - free (str); - vector_slot (Vrip_passive_nondefault, i) = NULL; - } - rip_passive_interface_apply_all (); + for (i = 0; i < vector_active(Vrip_passive_nondefault); i++) + if ((str = vector_slot(Vrip_passive_nondefault, i)) != NULL) { + free(str); + vector_slot(Vrip_passive_nondefault, i) = NULL; + } + rip_passive_interface_apply_all(); } /* RIP enable network or interface configuration. */ @@ -1222,25 +1153,24 @@ DEFUN (rip_network, "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Interface name\n") { - int idx_ipv4_word = 1; - int ret; - struct prefix_ipv4 p; + int idx_ipv4_word = 1; + int ret; + struct prefix_ipv4 p; - ret = str2prefix_ipv4 (argv[idx_ipv4_word]->arg, &p); + ret = str2prefix_ipv4(argv[idx_ipv4_word]->arg, &p); - if (ret) - ret = rip_enable_network_add ((struct prefix *) &p); - else - ret = rip_enable_if_add (argv[idx_ipv4_word]->arg); + if (ret) + ret = rip_enable_network_add((struct prefix *)&p); + else + ret = rip_enable_if_add(argv[idx_ipv4_word]->arg); - if (ret < 0) - { - vty_out (vty, "There is a same network configuration %s%s", argv[idx_ipv4_word]->arg, - VTY_NEWLINE); - return CMD_WARNING; - } + if (ret < 0) { + vty_out(vty, "There is a same network configuration %s%s", + argv[idx_ipv4_word]->arg, VTY_NEWLINE); + return CMD_WARNING; + } - return CMD_SUCCESS; + return CMD_SUCCESS; } /* RIP enable network or interface configuration. */ @@ -1252,25 +1182,24 @@ DEFUN (no_rip_network, "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n" "Interface name\n") { - int idx_ipv4_word = 2; - int ret; - struct prefix_ipv4 p; + int idx_ipv4_word = 2; + int ret; + struct prefix_ipv4 p; - ret = str2prefix_ipv4 (argv[idx_ipv4_word]->arg, &p); + ret = str2prefix_ipv4(argv[idx_ipv4_word]->arg, &p); - if (ret) - ret = rip_enable_network_delete ((struct prefix *) &p); - else - ret = rip_enable_if_delete (argv[idx_ipv4_word]->arg); + if (ret) + ret = rip_enable_network_delete((struct prefix *)&p); + else + ret = rip_enable_if_delete(argv[idx_ipv4_word]->arg); - if (ret < 0) - { - vty_out (vty, "Can't find network configuration %s%s", argv[idx_ipv4_word]->arg, - VTY_NEWLINE); - return CMD_WARNING; - } + if (ret < 0) { + vty_out(vty, "Can't find network configuration %s%s", + argv[idx_ipv4_word]->arg, VTY_NEWLINE); + return CMD_WARNING; + } - return CMD_SUCCESS; + return CMD_SUCCESS; } /* RIP neighbor configuration set. */ @@ -1280,21 +1209,21 @@ DEFUN (rip_neighbor, "Specify a neighbor router\n" "Neighbor address\n") { - int idx_ipv4 = 1; - int ret; - struct prefix_ipv4 p; + int idx_ipv4 = 1; + int ret; + struct prefix_ipv4 p; - ret = str2prefix_ipv4 (argv[idx_ipv4]->arg, &p); + ret = str2prefix_ipv4(argv[idx_ipv4]->arg, &p); + + if (ret <= 0) { + vty_out(vty, "Please specify address by A.B.C.D%s", + VTY_NEWLINE); + return CMD_WARNING; + } - if (ret <= 0) - { - vty_out (vty, "Please specify address by A.B.C.D%s", VTY_NEWLINE); - return CMD_WARNING; - } + rip_neighbor_add(&p); - rip_neighbor_add (&p); - - return CMD_SUCCESS; + return CMD_SUCCESS; } /* RIP neighbor configuration unset. */ @@ -1305,21 +1234,21 @@ DEFUN (no_rip_neighbor, "Specify a neighbor router\n" "Neighbor address\n") { - int idx_ipv4 = 2; - int ret; - struct prefix_ipv4 p; + int idx_ipv4 = 2; + int ret; + struct prefix_ipv4 p; - ret = str2prefix_ipv4 (argv[idx_ipv4]->arg, &p); + ret = str2prefix_ipv4(argv[idx_ipv4]->arg, &p); - if (ret <= 0) - { - vty_out (vty, "Please specify address by A.B.C.D%s", VTY_NEWLINE); - return CMD_WARNING; - } + if (ret <= 0) { + vty_out(vty, "Please specify address by A.B.C.D%s", + VTY_NEWLINE); + return CMD_WARNING; + } + + rip_neighbor_delete(&p); - rip_neighbor_delete (&p); - - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (ip_rip_receive_version, @@ -1333,28 +1262,27 @@ DEFUN (ip_rip_receive_version, "RIP version 2\n" "None\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - int idx_type = 4; - struct rip_interface *ri; - - ri = ifp->info; - - switch (argv[idx_type]->arg[0]) - { - case '1': - ri->ri_receive = RI_RIP_VERSION_1; - return CMD_SUCCESS; - case '2': - ri->ri_receive = RI_RIP_VERSION_2; - return CMD_SUCCESS; - case 'n': - ri->ri_receive = RI_RIP_VERSION_NONE; - return CMD_SUCCESS; - default: - break; - } + VTY_DECLVAR_CONTEXT(interface, ifp); + int idx_type = 4; + struct rip_interface *ri; + + ri = ifp->info; + + switch (argv[idx_type]->arg[0]) { + case '1': + ri->ri_receive = RI_RIP_VERSION_1; + return CMD_SUCCESS; + case '2': + ri->ri_receive = RI_RIP_VERSION_2; + return CMD_SUCCESS; + case 'n': + ri->ri_receive = RI_RIP_VERSION_NONE; + return CMD_SUCCESS; + default: + break; + } - return CMD_WARNING; + return CMD_WARNING; } DEFUN (ip_rip_receive_version_1, @@ -1367,14 +1295,14 @@ DEFUN (ip_rip_receive_version_1, "RIP version 1\n" "RIP version 2\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - /* Version 1 and 2. */ - ri->ri_receive = RI_RIP_VERSION_1_AND_2; - return CMD_SUCCESS; + /* Version 1 and 2. */ + ri->ri_receive = RI_RIP_VERSION_1_AND_2; + return CMD_SUCCESS; } DEFUN (ip_rip_receive_version_2, @@ -1387,14 +1315,14 @@ DEFUN (ip_rip_receive_version_2, "RIP version 2\n" "RIP version 1\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - /* Version 1 and 2. */ - ri->ri_receive = RI_RIP_VERSION_1_AND_2; - return CMD_SUCCESS; + /* Version 1 and 2. */ + ri->ri_receive = RI_RIP_VERSION_1_AND_2; + return CMD_SUCCESS; } DEFUN (no_ip_rip_receive_version, @@ -1408,13 +1336,13 @@ DEFUN (no_ip_rip_receive_version, "Version 1\n" "Version 2\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->ri_receive = RI_RIP_UNSPEC; - return CMD_SUCCESS; + ri->ri_receive = RI_RIP_UNSPEC; + return CMD_SUCCESS; } @@ -1428,24 +1356,22 @@ DEFUN (ip_rip_send_version, "RIP version 1\n" "RIP version 2\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - int idx_type = 4; - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + int idx_type = 4; + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - /* Version 1. */ - if (atoi (argv[idx_type]->arg) == 1) - { - ri->ri_send = RI_RIP_VERSION_1; - return CMD_SUCCESS; - } - if (atoi (argv[idx_type]->arg) == 2) - { - ri->ri_send = RI_RIP_VERSION_2; - return CMD_SUCCESS; - } - return CMD_WARNING; + /* Version 1. */ + if (atoi(argv[idx_type]->arg) == 1) { + ri->ri_send = RI_RIP_VERSION_1; + return CMD_SUCCESS; + } + if (atoi(argv[idx_type]->arg) == 2) { + ri->ri_send = RI_RIP_VERSION_2; + return CMD_SUCCESS; + } + return CMD_WARNING; } DEFUN (ip_rip_send_version_1, @@ -1458,14 +1384,14 @@ DEFUN (ip_rip_send_version_1, "RIP version 1\n" "RIP version 2\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - /* Version 1 and 2. */ - ri->ri_send = RI_RIP_VERSION_1_AND_2; - return CMD_SUCCESS; + /* Version 1 and 2. */ + ri->ri_send = RI_RIP_VERSION_1_AND_2; + return CMD_SUCCESS; } DEFUN (ip_rip_send_version_2, @@ -1478,14 +1404,14 @@ DEFUN (ip_rip_send_version_2, "RIP version 2\n" "RIP version 1\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - /* Version 1 and 2. */ - ri->ri_send = RI_RIP_VERSION_1_AND_2; - return CMD_SUCCESS; + /* Version 1 and 2. */ + ri->ri_send = RI_RIP_VERSION_1_AND_2; + return CMD_SUCCESS; } DEFUN (no_ip_rip_send_version, @@ -1499,13 +1425,13 @@ DEFUN (no_ip_rip_send_version, "Version 1\n" "Version 2\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->ri_send = RI_RIP_UNSPEC; - return CMD_SUCCESS; + ri->ri_send = RI_RIP_UNSPEC; + return CMD_SUCCESS; } @@ -1516,13 +1442,13 @@ DEFUN (ip_rip_v2_broadcast, "Routing Information Protocol\n" "Send ip broadcast v2 update\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->v2_broadcast = 1; - return CMD_SUCCESS; + ri->v2_broadcast = 1; + return CMD_SUCCESS; } DEFUN (no_ip_rip_v2_broadcast, @@ -1533,13 +1459,13 @@ DEFUN (no_ip_rip_v2_broadcast, "Routing Information Protocol\n" "Send ip broadcast v2 update\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->v2_broadcast = 0; - return CMD_SUCCESS; + ri->v2_broadcast = 0; + return CMD_SUCCESS; } DEFUN (ip_rip_authentication_mode, @@ -1555,40 +1481,39 @@ DEFUN (ip_rip_authentication_mode, "RFC compatible\n" "Old ripd compatible\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - char *cryptmode = argv[4]->text; - char *authlen = (argc > 5) ? argv[6]->text : NULL; - struct rip_interface *ri; - int auth_type; - - ri = ifp->info; - - if (strmatch ("md5", cryptmode)) - auth_type = RIP_AUTH_MD5; - else { - assert (strmatch ("text", cryptmode)); - auth_type = RIP_AUTH_SIMPLE_PASSWORD; - } - - ri->auth_type = auth_type; - - if (argc > 5) - { - if (auth_type != RIP_AUTH_MD5) - { - vty_out (vty, "auth length argument only valid for md5%s", VTY_NEWLINE); - return CMD_WARNING; - } - if (strmatch ("rfc", authlen)) - ri->md5_auth_len = RIP_AUTH_MD5_SIZE; - else - { - assert (strmatch ("old-ripd", authlen)); - ri->md5_auth_len = RIP_AUTH_MD5_COMPAT_SIZE; - } - } - - return CMD_SUCCESS; + VTY_DECLVAR_CONTEXT(interface, ifp); + char *cryptmode = argv[4]->text; + char *authlen = (argc > 5) ? argv[6]->text : NULL; + struct rip_interface *ri; + int auth_type; + + ri = ifp->info; + + if (strmatch("md5", cryptmode)) + auth_type = RIP_AUTH_MD5; + else { + assert(strmatch("text", cryptmode)); + auth_type = RIP_AUTH_SIMPLE_PASSWORD; + } + + ri->auth_type = auth_type; + + if (argc > 5) { + if (auth_type != RIP_AUTH_MD5) { + vty_out(vty, + "auth length argument only valid for md5%s", + VTY_NEWLINE); + return CMD_WARNING; + } + if (strmatch("rfc", authlen)) + ri->md5_auth_len = RIP_AUTH_MD5_SIZE; + else { + assert(strmatch("old-ripd", authlen)); + ri->md5_auth_len = RIP_AUTH_MD5_COMPAT_SIZE; + } + } + + return CMD_SUCCESS; } DEFUN (no_ip_rip_authentication_mode, @@ -1605,15 +1530,15 @@ DEFUN (no_ip_rip_authentication_mode, "RFC compatible\n" "Old ripd compatible\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->auth_type = RIP_NO_AUTH; - ri->md5_auth_len = RIP_AUTH_MD5_COMPAT_SIZE; + ri->auth_type = RIP_NO_AUTH; + ri->md5_auth_len = RIP_AUTH_MD5_COMPAT_SIZE; - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (ip_rip_authentication_string, @@ -1625,31 +1550,31 @@ DEFUN (ip_rip_authentication_string, "Authentication string\n" "Authentication string\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - int idx_line = 4; - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + int idx_line = 4; + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - if (strlen (argv[idx_line]->arg) > 16) - { - vty_out (vty, "%% RIPv2 authentication string must be shorter than 16%s", - VTY_NEWLINE); - return CMD_WARNING; - } + if (strlen(argv[idx_line]->arg) > 16) { + vty_out(vty, + "%% RIPv2 authentication string must be shorter than 16%s", + VTY_NEWLINE); + return CMD_WARNING; + } - if (ri->key_chain) - { - vty_out (vty, "%% key-chain configuration exists%s", VTY_NEWLINE); - return CMD_WARNING; - } + if (ri->key_chain) { + vty_out(vty, "%% key-chain configuration exists%s", + VTY_NEWLINE); + return CMD_WARNING; + } - if (ri->auth_str) - free (ri->auth_str); + if (ri->auth_str) + free(ri->auth_str); - ri->auth_str = strdup (argv[idx_line]->arg); + ri->auth_str = strdup(argv[idx_line]->arg); - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (no_ip_rip_authentication_string, @@ -1662,17 +1587,17 @@ DEFUN (no_ip_rip_authentication_string, "Authentication string\n" "Authentication string\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - if (ri->auth_str) - free (ri->auth_str); + if (ri->auth_str) + free(ri->auth_str); - ri->auth_str = NULL; + ri->auth_str = NULL; - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -1685,25 +1610,24 @@ DEFUN (ip_rip_authentication_key_chain, "Authentication key-chain\n" "name of key-chain\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - int idx_line = 4; - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + int idx_line = 4; + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - if (ri->auth_str) - { - vty_out (vty, "%% authentication string configuration exists%s", - VTY_NEWLINE); - return CMD_WARNING; - } + if (ri->auth_str) { + vty_out(vty, "%% authentication string configuration exists%s", + VTY_NEWLINE); + return CMD_WARNING; + } - if (ri->key_chain) - free (ri->key_chain); + if (ri->key_chain) + free(ri->key_chain); - ri->key_chain = strdup (argv[idx_line]->arg); + ri->key_chain = strdup(argv[idx_line]->arg); - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (no_ip_rip_authentication_key_chain, @@ -1716,17 +1640,17 @@ DEFUN (no_ip_rip_authentication_key_chain, "Authentication key-chain\n" "name of key-chain\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - if (ri->key_chain) - free (ri->key_chain); + if (ri->key_chain) + free(ri->key_chain); - ri->key_chain = NULL; + ri->key_chain = NULL; - return CMD_SUCCESS; + return CMD_SUCCESS; } @@ -1741,13 +1665,13 @@ DEFUN (ip_rip_split_horizon, "Routing Information Protocol\n" "Perform split horizon\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->split_horizon = RIP_SPLIT_HORIZON; - return CMD_SUCCESS; + ri->split_horizon = RIP_SPLIT_HORIZON; + return CMD_SUCCESS; } DEFUN (ip_rip_split_horizon_poisoned_reverse, @@ -1758,13 +1682,13 @@ DEFUN (ip_rip_split_horizon_poisoned_reverse, "Perform split horizon\n" "With poisoned-reverse\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->split_horizon = RIP_SPLIT_HORIZON_POISONED_REVERSE; - return CMD_SUCCESS; + ri->split_horizon = RIP_SPLIT_HORIZON_POISONED_REVERSE; + return CMD_SUCCESS; } /* CHANGED: no ip rip split-horizon @@ -1779,13 +1703,13 @@ DEFUN (no_ip_rip_split_horizon, "Routing Information Protocol\n" "Perform split horizon\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - ri->split_horizon = RIP_NO_SPLIT_HORIZON; - return CMD_SUCCESS; + ri->split_horizon = RIP_NO_SPLIT_HORIZON; + return CMD_SUCCESS; } DEFUN (no_ip_rip_split_horizon_poisoned_reverse, @@ -1797,20 +1721,19 @@ DEFUN (no_ip_rip_split_horizon_poisoned_reverse, "Perform split horizon\n" "With poisoned-reverse\n") { - VTY_DECLVAR_CONTEXT(interface, ifp); - struct rip_interface *ri; + VTY_DECLVAR_CONTEXT(interface, ifp); + struct rip_interface *ri; - ri = ifp->info; + ri = ifp->info; - switch( ri->split_horizon ) - { - case RIP_SPLIT_HORIZON_POISONED_REVERSE: - ri->split_horizon = RIP_SPLIT_HORIZON; - default: - break; - } + switch (ri->split_horizon) { + case RIP_SPLIT_HORIZON_POISONED_REVERSE: + ri->split_horizon = RIP_SPLIT_HORIZON; + default: + break; + } - return CMD_SUCCESS; + return CMD_SUCCESS; } DEFUN (rip_passive_interface, @@ -1820,15 +1743,15 @@ DEFUN (rip_passive_interface, "Interface name\n" "default for all interfaces\n") { - if (argv[1]->type == WORD_TKN) { // user passed 'default' - passive_default = 1; - rip_passive_nondefault_clean(); - return CMD_SUCCESS; - } - if (passive_default) - return rip_passive_nondefault_unset (vty, argv[1]->arg); - else - return rip_passive_nondefault_set (vty, argv[1]->arg); + if (argv[1]->type == WORD_TKN) { // user passed 'default' + passive_default = 1; + rip_passive_nondefault_clean(); + return CMD_SUCCESS; + } + if (passive_default) + return rip_passive_nondefault_unset(vty, argv[1]->arg); + else + return rip_passive_nondefault_set(vty, argv[1]->arg); } DEFUN (no_rip_passive_interface, @@ -1839,234 +1762,229 @@ DEFUN (no_rip_passive_interface, "Interface name\n" "default for all interfaces\n") { - if (argv[2]->type == WORD_TKN) { - passive_default = 0; - rip_passive_nondefault_clean(); - return CMD_SUCCESS; - } - if (passive_default) - return rip_passive_nondefault_set (vty, argv[2]->arg); - else - return rip_passive_nondefault_unset (vty, argv[2]->arg); + if (argv[2]->type == WORD_TKN) { + passive_default = 0; + rip_passive_nondefault_clean(); + return CMD_SUCCESS; + } + if (passive_default) + return rip_passive_nondefault_set(vty, argv[2]->arg); + else + return rip_passive_nondefault_unset(vty, argv[2]->arg); } /* Write rip configuration of each interface. */ -static int -rip_interface_config_write (struct vty *vty) -{ - struct listnode *node; - struct interface *ifp; - - for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) - { - struct rip_interface *ri; - - if (ifp->ifindex == IFINDEX_DELETED) - continue; - - 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) && - (ri->ri_send == RI_RIP_UNSPEC) && - (ri->ri_receive == RI_RIP_UNSPEC) && - (ri->auth_type != RIP_AUTH_MD5) && - (!ri->v2_broadcast) && - (ri->md5_auth_len != RIP_AUTH_MD5_SIZE) && - (!ri->auth_str) && - (!ri->key_chain) ) - continue; - - vty_out (vty, "interface %s%s", ifp->name, - VTY_NEWLINE); - - if (ifp->desc) - vty_out (vty, " description %s%s", ifp->desc, - VTY_NEWLINE); - - /* Split horizon. */ - if (ri->split_horizon != ri->split_horizon_default) - { - switch (ri->split_horizon) { - case RIP_SPLIT_HORIZON: - vty_out (vty, " ip rip split-horizon%s", VTY_NEWLINE); - break; - case RIP_SPLIT_HORIZON_POISONED_REVERSE: - vty_out (vty, " ip rip split-horizon poisoned-reverse%s", - VTY_NEWLINE); - break; - case RIP_NO_SPLIT_HORIZON: - default: - vty_out (vty, " no ip rip split-horizon%s", VTY_NEWLINE); - break; - } +static int rip_interface_config_write(struct vty *vty) +{ + struct listnode *node; + struct interface *ifp; + + for (ALL_LIST_ELEMENTS_RO(vrf_iflist(VRF_DEFAULT), node, ifp)) { + struct rip_interface *ri; + + if (ifp->ifindex == IFINDEX_DELETED) + continue; + + 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) + && (ri->ri_send == RI_RIP_UNSPEC) + && (ri->ri_receive == RI_RIP_UNSPEC) + && (ri->auth_type != RIP_AUTH_MD5) && (!ri->v2_broadcast) + && (ri->md5_auth_len != RIP_AUTH_MD5_SIZE) + && (!ri->auth_str) && (!ri->key_chain)) + continue; + + vty_out(vty, "interface %s%s", ifp->name, VTY_NEWLINE); + + if (ifp->desc) + vty_out(vty, " description %s%s", ifp->desc, + VTY_NEWLINE); + + /* Split horizon. */ + if (ri->split_horizon != ri->split_horizon_default) { + switch (ri->split_horizon) { + case RIP_SPLIT_HORIZON: + vty_out(vty, " ip rip split-horizon%s", + VTY_NEWLINE); + break; + case RIP_SPLIT_HORIZON_POISONED_REVERSE: + vty_out(vty, + " ip rip split-horizon poisoned-reverse%s", + VTY_NEWLINE); + break; + case RIP_NO_SPLIT_HORIZON: + default: + vty_out(vty, " no ip rip split-horizon%s", + VTY_NEWLINE); + break; + } + } + + /* RIP version setting. */ + if (ri->ri_send != RI_RIP_UNSPEC) + vty_out(vty, " ip rip send version %s%s", + lookup_msg(ri_version_msg, ri->ri_send, NULL), + VTY_NEWLINE); + + if (ri->ri_receive != RI_RIP_UNSPEC) + vty_out(vty, " ip rip receive version %s%s", + lookup_msg(ri_version_msg, ri->ri_receive, + NULL), + VTY_NEWLINE); + + if (ri->v2_broadcast) + vty_out(vty, " ip rip v2-broadcast%s", VTY_NEWLINE); + + /* RIP authentication. */ + if (ri->auth_type == RIP_AUTH_SIMPLE_PASSWORD) + vty_out(vty, " ip rip authentication mode text%s", + VTY_NEWLINE); + + if (ri->auth_type == RIP_AUTH_MD5) { + vty_out(vty, " ip rip authentication mode md5"); + if (ri->md5_auth_len == RIP_AUTH_MD5_COMPAT_SIZE) + vty_out(vty, " auth-length old-ripd"); + else + vty_out(vty, " auth-length rfc"); + vty_out(vty, "%s", VTY_NEWLINE); + } + + if (ri->auth_str) + vty_out(vty, " ip rip authentication string %s%s", + ri->auth_str, VTY_NEWLINE); + + if (ri->key_chain) + vty_out(vty, " ip rip authentication key-chain %s%s", + ri->key_chain, VTY_NEWLINE); + + vty_out(vty, "!%s", VTY_NEWLINE); } + return 0; +} + +int config_write_rip_network(struct vty *vty, int config_mode) +{ + unsigned int i; + char *ifname; + struct route_node *node; + + /* Network type RIP enable interface statement. */ + for (node = route_top(rip_enable_network); node; + node = route_next(node)) + if (node->info) + vty_out(vty, "%s%s/%d%s", + config_mode ? " network " : " ", + inet_ntoa(node->p.u.prefix4), node->p.prefixlen, + VTY_NEWLINE); + + /* Interface name RIP enable statement. */ + for (i = 0; i < vector_active(rip_enable_interface); i++) + if ((ifname = vector_slot(rip_enable_interface, i)) != NULL) + vty_out(vty, "%s%s%s", + config_mode ? " network " : " ", ifname, + VTY_NEWLINE); + + /* RIP neighbors listing. */ + for (node = route_top(rip->neighbor); node; node = route_next(node)) + if (node->info) + vty_out(vty, "%s%s%s", + config_mode ? " neighbor " : " ", + inet_ntoa(node->p.u.prefix4), VTY_NEWLINE); + + /* RIP passive interface listing. */ + if (config_mode) { + if (passive_default) + vty_out(vty, " passive-interface default%s", + VTY_NEWLINE); + for (i = 0; i < vector_active(Vrip_passive_nondefault); i++) + if ((ifname = vector_slot(Vrip_passive_nondefault, i)) + != NULL) + vty_out(vty, " %spassive-interface %s%s", + (passive_default ? "no " : ""), ifname, + VTY_NEWLINE); + } + + return 0; +} - /* RIP version setting. */ - if (ri->ri_send != RI_RIP_UNSPEC) - vty_out (vty, " ip rip send version %s%s", - lookup_msg(ri_version_msg, ri->ri_send, NULL), - VTY_NEWLINE); - - if (ri->ri_receive != RI_RIP_UNSPEC) - vty_out (vty, " ip rip receive version %s%s", - lookup_msg(ri_version_msg, ri->ri_receive, NULL), - VTY_NEWLINE); - - if (ri->v2_broadcast) - vty_out (vty, " ip rip v2-broadcast%s", VTY_NEWLINE); - - /* RIP authentication. */ - if (ri->auth_type == RIP_AUTH_SIMPLE_PASSWORD) - vty_out (vty, " ip rip authentication mode text%s", VTY_NEWLINE); - - if (ri->auth_type == RIP_AUTH_MD5) - { - vty_out (vty, " ip rip authentication mode md5"); - if (ri->md5_auth_len == RIP_AUTH_MD5_COMPAT_SIZE) - vty_out (vty, " auth-length old-ripd"); - else - vty_out (vty, " auth-length rfc"); - vty_out (vty, "%s", VTY_NEWLINE); - } - - if (ri->auth_str) - vty_out (vty, " ip rip authentication string %s%s", - ri->auth_str, VTY_NEWLINE); - - if (ri->key_chain) - vty_out (vty, " ip rip authentication key-chain %s%s", - ri->key_chain, VTY_NEWLINE); - - vty_out (vty, "!%s", VTY_NEWLINE); - } - return 0; -} - -int -config_write_rip_network (struct vty *vty, int config_mode) -{ - unsigned int i; - char *ifname; - struct route_node *node; - - /* Network type RIP enable interface statement. */ - for (node = route_top (rip_enable_network); node; node = route_next (node)) - if (node->info) - vty_out (vty, "%s%s/%d%s", - config_mode ? " network " : " ", - inet_ntoa (node->p.u.prefix4), - node->p.prefixlen, - VTY_NEWLINE); - - /* Interface name RIP enable statement. */ - for (i = 0; i < vector_active (rip_enable_interface); i++) - if ((ifname = vector_slot (rip_enable_interface, i)) != NULL) - vty_out (vty, "%s%s%s", - config_mode ? " network " : " ", - ifname, - VTY_NEWLINE); - - /* RIP neighbors listing. */ - for (node = route_top (rip->neighbor); node; node = route_next (node)) - if (node->info) - vty_out (vty, "%s%s%s", - config_mode ? " neighbor " : " ", - inet_ntoa (node->p.u.prefix4), - VTY_NEWLINE); - - /* RIP passive interface listing. */ - if (config_mode) { - if (passive_default) - vty_out (vty, " passive-interface default%s", VTY_NEWLINE); - for (i = 0; i < vector_active (Vrip_passive_nondefault); i++) - if ((ifname = vector_slot (Vrip_passive_nondefault, i)) != NULL) - vty_out (vty, " %spassive-interface %s%s", - (passive_default ? "no " : ""), ifname, VTY_NEWLINE); - } - - return 0; -} - -static struct cmd_node interface_node = -{ - INTERFACE_NODE, - "%s(config-if)# ", - 1, +static struct cmd_node interface_node = { + INTERFACE_NODE, "%s(config-if)# ", 1, }; /* Called when interface structure allocated. */ -static int -rip_interface_new_hook (struct interface *ifp) +static int rip_interface_new_hook(struct interface *ifp) { - ifp->info = rip_interface_new (); - return 0; + ifp->info = rip_interface_new(); + return 0; } /* Called when interface structure deleted. */ -static int -rip_interface_delete_hook (struct interface *ifp) +static int rip_interface_delete_hook(struct interface *ifp) { - XFREE (MTYPE_RIP_INTERFACE, ifp->info); - ifp->info = NULL; - return 0; + XFREE(MTYPE_RIP_INTERFACE, ifp->info); + ifp->info = NULL; + return 0; } /* Allocate and initialize interface vector. */ -void -rip_if_init (void) -{ - /* Default initial size of interface vector. */ - if_add_hook (IF_NEW_HOOK, rip_interface_new_hook); - if_add_hook (IF_DELETE_HOOK, rip_interface_delete_hook); - - /* RIP network init. */ - rip_enable_interface = vector_init (1); - rip_enable_network = route_table_init (); - - /* RIP passive interface. */ - Vrip_passive_nondefault = vector_init (1); - - /* Install interface node. */ - install_node (&interface_node, rip_interface_config_write); - if_cmd_init (); - - /* Install commands. */ - install_element (RIP_NODE, &rip_network_cmd); - install_element (RIP_NODE, &no_rip_network_cmd); - install_element (RIP_NODE, &rip_neighbor_cmd); - install_element (RIP_NODE, &no_rip_neighbor_cmd); - - install_element (RIP_NODE, &rip_passive_interface_cmd); - install_element (RIP_NODE, &no_rip_passive_interface_cmd); - - install_element (INTERFACE_NODE, &ip_rip_send_version_cmd); - install_element (INTERFACE_NODE, &ip_rip_send_version_1_cmd); - install_element (INTERFACE_NODE, &ip_rip_send_version_2_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_send_version_cmd); - - install_element (INTERFACE_NODE, &ip_rip_receive_version_cmd); - install_element (INTERFACE_NODE, &ip_rip_receive_version_1_cmd); - install_element (INTERFACE_NODE, &ip_rip_receive_version_2_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_receive_version_cmd); - - install_element (INTERFACE_NODE, &ip_rip_v2_broadcast_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_v2_broadcast_cmd); - - install_element (INTERFACE_NODE, &ip_rip_authentication_mode_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_authentication_mode_cmd); - - install_element (INTERFACE_NODE, &ip_rip_authentication_key_chain_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_authentication_key_chain_cmd); - - install_element (INTERFACE_NODE, &ip_rip_authentication_string_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_authentication_string_cmd); - - install_element (INTERFACE_NODE, &ip_rip_split_horizon_cmd); - install_element (INTERFACE_NODE, &ip_rip_split_horizon_poisoned_reverse_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_split_horizon_cmd); - install_element (INTERFACE_NODE, &no_ip_rip_split_horizon_poisoned_reverse_cmd); +void rip_if_init(void) +{ + /* Default initial size of interface vector. */ + if_add_hook(IF_NEW_HOOK, rip_interface_new_hook); + if_add_hook(IF_DELETE_HOOK, rip_interface_delete_hook); + + /* RIP network init. */ + rip_enable_interface = vector_init(1); + rip_enable_network = route_table_init(); + + /* RIP passive interface. */ + Vrip_passive_nondefault = vector_init(1); + + /* Install interface node. */ + install_node(&interface_node, rip_interface_config_write); + if_cmd_init(); + + /* Install commands. */ + install_element(RIP_NODE, &rip_network_cmd); + install_element(RIP_NODE, &no_rip_network_cmd); + install_element(RIP_NODE, &rip_neighbor_cmd); + install_element(RIP_NODE, &no_rip_neighbor_cmd); + + install_element(RIP_NODE, &rip_passive_interface_cmd); + install_element(RIP_NODE, &no_rip_passive_interface_cmd); + + install_element(INTERFACE_NODE, &ip_rip_send_version_cmd); + install_element(INTERFACE_NODE, &ip_rip_send_version_1_cmd); + install_element(INTERFACE_NODE, &ip_rip_send_version_2_cmd); + install_element(INTERFACE_NODE, &no_ip_rip_send_version_cmd); + + install_element(INTERFACE_NODE, &ip_rip_receive_version_cmd); + install_element(INTERFACE_NODE, &ip_rip_receive_version_1_cmd); + install_element(INTERFACE_NODE, &ip_rip_receive_version_2_cmd); + install_element(INTERFACE_NODE, &no_ip_rip_receive_version_cmd); + + install_element(INTERFACE_NODE, &ip_rip_v2_broadcast_cmd); + install_element(INTERFACE_NODE, &no_ip_rip_v2_broadcast_cmd); + + install_element(INTERFACE_NODE, &ip_rip_authentication_mode_cmd); + install_element(INTERFACE_NODE, &no_ip_rip_authentication_mode_cmd); + + install_element(INTERFACE_NODE, &ip_rip_authentication_key_chain_cmd); + install_element(INTERFACE_NODE, + &no_ip_rip_authentication_key_chain_cmd); + + install_element(INTERFACE_NODE, &ip_rip_authentication_string_cmd); + install_element(INTERFACE_NODE, &no_ip_rip_authentication_string_cmd); + + install_element(INTERFACE_NODE, &ip_rip_split_horizon_cmd); + install_element(INTERFACE_NODE, + &ip_rip_split_horizon_poisoned_reverse_cmd); + install_element(INTERFACE_NODE, &no_ip_rip_split_horizon_cmd); + install_element(INTERFACE_NODE, + &no_ip_rip_split_horizon_poisoned_reverse_cmd); } |
