summaryrefslogtreecommitdiff
path: root/ripd/rip_interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'ripd/rip_interface.c')
-rw-r--r--ripd/rip_interface.c2492
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);
}