]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/router-id.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / zebra / router-id.c
index e23178cb7c97eb4edc0be81c97f81ba0866d6faa..c500f79a6c2c0a275ebbf48ef6798dfad96e8fbd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Router ID for zebra daemon.
  *
- * Copyright (C) 2004 James R. Leu 
+ * Copyright (C) 2004 James R. Leu
  *
  * This file is part of Quagga routing suite.
  *
@@ -39,6 +39,7 @@
 #include "vrf.h"
 
 #include "zebra/zserv.h"
+#include "zebra/zapi_msg.h"
 #include "zebra/zebra_vrf.h"
 #include "zebra/router-id.h"
 #include "zebra/redistribute.h"
 /* master zebra server structure */
 extern struct zebra_t zebrad;
 
-static struct connected *
-router_id_find_node (struct list *l, struct connected *ifc)
+static struct connected *router_id_find_node(struct list *l,
+                                            struct connected *ifc)
 {
-  struct listnode *node;
-  struct connected *c;
+       struct listnode *node;
+       struct connected *c;
 
-  for (ALL_LIST_ELEMENTS_RO (l, node, c))
-    if (prefix_same (ifc->address, c->address))
-      return c;
+       for (ALL_LIST_ELEMENTS_RO(l, node, c))
+               if (prefix_same(ifc->address, c->address))
+                       return c;
 
-  return NULL;
+       return NULL;
 }
 
-static int
-router_id_bad_address (struct connected *ifc)
+static int router_id_bad_address(struct connected *ifc)
 {
-  if (ifc->address->family != AF_INET)
-    return 1;
-  
-  /* non-redistributable addresses shouldn't be used for RIDs either */
-  if (!zebra_check_addr (ifc->address))
-    return 1;
-  
-  return 0;
+       if (ifc->address->family != AF_INET)
+               return 1;
+
+       /* non-redistributable addresses shouldn't be used for RIDs either */
+       if (!zebra_check_addr(ifc->address))
+               return 1;
+
+       return 0;
 }
 
-void
-router_id_get (struct prefix *p, vrf_id_t vrf_id)
+void router_id_get(struct prefix *p, vrf_id_t vrf_id)
 {
-  struct listnode *node;
-  struct connected *c;
-  struct zebra_vrf *zvrf = vrf_info_get (vrf_id);
-
-  p->u.prefix4.s_addr = 0;
-  p->family = AF_INET;
-  p->prefixlen = 32;
-
-  if (zvrf->rid_user_assigned.u.prefix4.s_addr)
-    p->u.prefix4.s_addr = zvrf->rid_user_assigned.u.prefix4.s_addr;
-  else if (!list_isempty (zvrf->rid_lo_sorted_list))
-    {
-      node = listtail (zvrf->rid_lo_sorted_list);
-      c = listgetdata (node);
-      p->u.prefix4.s_addr = c->address->u.prefix4.s_addr;
-    }
-  else if (!list_isempty (zvrf->rid_all_sorted_list))
-    {
-      node = listtail (zvrf->rid_all_sorted_list);
-      c = listgetdata (node);
-      p->u.prefix4.s_addr = c->address->u.prefix4.s_addr;
-    }
+       struct listnode *node;
+       struct connected *c;
+       struct zebra_vrf *zvrf = vrf_info_get(vrf_id);
+
+       p->u.prefix4.s_addr = 0;
+       p->family = AF_INET;
+       p->prefixlen = 32;
+
+       if (zvrf->rid_user_assigned.u.prefix4.s_addr)
+               p->u.prefix4.s_addr = zvrf->rid_user_assigned.u.prefix4.s_addr;
+       else if (!list_isempty(zvrf->rid_lo_sorted_list)) {
+               node = listtail(zvrf->rid_lo_sorted_list);
+               c = listgetdata(node);
+               p->u.prefix4.s_addr = c->address->u.prefix4.s_addr;
+       } else if (!list_isempty(zvrf->rid_all_sorted_list)) {
+               node = listtail(zvrf->rid_all_sorted_list);
+               c = listgetdata(node);
+               p->u.prefix4.s_addr = c->address->u.prefix4.s_addr;
+       }
 }
 
-static void
-router_id_set (struct prefix *p, vrf_id_t vrf_id)
+static void router_id_set(struct prefix *p, vrf_id_t vrf_id)
 {
-  struct prefix p2;
-  struct listnode *node;
-  struct zserv *client;
-  struct zebra_vrf *zvrf;
-
-  if (p->u.prefix4.s_addr == 0) /* unset */
-    {
-      zvrf = vrf_info_lookup (vrf_id);
-      if (! zvrf)
-        return;
-    }
-  else /* set */
-    zvrf = vrf_info_get (vrf_id);
-
-  zvrf->rid_user_assigned.u.prefix4.s_addr = p->u.prefix4.s_addr;
-
-  router_id_get (&p2, vrf_id);
-
-  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
-    zsend_router_id_update (client, &p2, vrf_id);
+       struct prefix p2;
+       struct listnode *node;
+       struct zserv *client;
+       struct zebra_vrf *zvrf;
+
+       if (p->u.prefix4.s_addr == 0) /* unset */
+       {
+               zvrf = vrf_info_lookup(vrf_id);
+               if (!zvrf)
+                       return;
+       } else /* set */
+               zvrf = vrf_info_get(vrf_id);
+
+       zvrf->rid_user_assigned.u.prefix4.s_addr = p->u.prefix4.s_addr;
+
+       router_id_get(&p2, vrf_id);
+
+       for (ALL_LIST_ELEMENTS_RO(zebrad.client_list, node, client))
+               zsend_router_id_update(client, &p2, vrf_id);
 }
 
-void
-router_id_add_address (struct connected *ifc)
+void router_id_add_address(struct connected *ifc)
 {
-  struct list *l = NULL;
-  struct listnode *node;
-  struct prefix before;
-  struct prefix after;
-  struct zserv *client;
-  struct zebra_vrf *zvrf = vrf_info_get (ifc->ifp->vrf_id);
-
-  if (router_id_bad_address (ifc))
-    return;
-
-  router_id_get (&before, zvrf_id (zvrf));
-
-  if (!strncmp (ifc->ifp->name, "lo", 2)
-      || !strncmp (ifc->ifp->name, "dummy", 5))
-    l = zvrf->rid_lo_sorted_list;
-  else
-    l = zvrf->rid_all_sorted_list;
-  
-  if (!router_id_find_node (l, ifc))
-    listnode_add_sort (l, ifc);
-
-  router_id_get (&after, zvrf_id (zvrf));
-
-  if (prefix_same (&before, &after))
-    return;
-
-  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
-    zsend_router_id_update (client, &after, zvrf_id (zvrf));
+       struct list *l = NULL;
+       struct listnode *node;
+       struct prefix before;
+       struct prefix after;
+       struct zserv *client;
+       struct zebra_vrf *zvrf = vrf_info_get(ifc->ifp->vrf_id);
+
+       if (router_id_bad_address(ifc))
+               return;
+
+       router_id_get(&before, zvrf_id(zvrf));
+
+       if (if_is_loopback(ifc->ifp))
+               l = zvrf->rid_lo_sorted_list;
+       else
+               l = zvrf->rid_all_sorted_list;
+
+       if (!router_id_find_node(l, ifc))
+               listnode_add_sort(l, ifc);
+
+       router_id_get(&after, zvrf_id(zvrf));
+
+       if (prefix_same(&before, &after))
+               return;
+
+       for (ALL_LIST_ELEMENTS_RO(zebrad.client_list, node, client))
+               zsend_router_id_update(client, &after, zvrf_id(zvrf));
 }
 
-void
-router_id_del_address (struct connected *ifc)
+void router_id_del_address(struct connected *ifc)
 {
-  struct connected *c;
-  struct list *l;
-  struct prefix after;
-  struct prefix before;
-  struct listnode *node;
-  struct zserv *client;
-  struct zebra_vrf *zvrf = vrf_info_get (ifc->ifp->vrf_id);
+       struct connected *c;
+       struct list *l;
+       struct prefix after;
+       struct prefix before;
+       struct listnode *node;
+       struct zserv *client;
+       struct zebra_vrf *zvrf = vrf_info_get(ifc->ifp->vrf_id);
 
-  if (router_id_bad_address (ifc))
-    return;
+       if (router_id_bad_address(ifc))
+               return;
 
-  router_id_get (&before, zvrf_id (zvrf));
+       router_id_get(&before, zvrf_id(zvrf));
 
-  if (!strncmp (ifc->ifp->name, "lo", 2)
-      || !strncmp (ifc->ifp->name, "dummy", 5))
-    l = zvrf->rid_lo_sorted_list;
-  else
-    l = zvrf->rid_all_sorted_list;
+       if (if_is_loopback(ifc->ifp))
+               l = zvrf->rid_lo_sorted_list;
+       else
+               l = zvrf->rid_all_sorted_list;
 
-  if ((c = router_id_find_node (l, ifc)))
-    listnode_delete (l, c);
+       if ((c = router_id_find_node(l, ifc)))
+               listnode_delete(l, c);
 
-  router_id_get (&after, zvrf_id (zvrf));
+       router_id_get(&after, zvrf_id(zvrf));
 
-  if (prefix_same (&before, &after))
-    return;
+       if (prefix_same(&before, &after))
+               return;
 
-  for (ALL_LIST_ELEMENTS_RO (zebrad.client_list, node, client))
-    zsend_router_id_update (client, &after, zvrf_id (zvrf));
+       for (ALL_LIST_ELEMENTS_RO(zebrad.client_list, node, client))
+               zsend_router_id_update(client, &after, zvrf_id(zvrf));
 }
 
-void
-router_id_write (struct vty *vty)
+void router_id_write(struct vty *vty)
 {
-  struct vrf *vrf;
-  struct zebra_vrf *zvrf;
-
-  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
-    if ((zvrf = vrf->info) != NULL)
-      if (zvrf->rid_user_assigned.u.prefix4.s_addr)
-        {
-          if (zvrf_id (zvrf) == VRF_DEFAULT)
-            vty_out (vty, "router-id %s\n",
-                     inet_ntoa(zvrf->rid_user_assigned.u.prefix4));
-            else
-              vty_out (vty, "router-id %s vrf %s\n",
-                            inet_ntoa (zvrf->rid_user_assigned.u.prefix4),
-                            zvrf_name(zvrf));
-        }
+       struct vrf *vrf;
+       struct zebra_vrf *zvrf;
+
+       RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
+               if ((zvrf = vrf->info) != NULL)
+                       if (zvrf->rid_user_assigned.u.prefix4.s_addr) {
+                               if (zvrf_id(zvrf) == VRF_DEFAULT)
+                                       vty_out(vty, "router-id %s\n",
+                                               inet_ntoa(
+                                                       zvrf->rid_user_assigned
+                                                               .u.prefix4));
+                               else
+                                       vty_out(vty, "router-id %s vrf %s\n",
+                                               inet_ntoa(
+                                                       zvrf->rid_user_assigned
+                                                               .u.prefix4),
+                                               zvrf_name(zvrf));
+                       }
 }
 
 DEFUN (router_id,
@@ -218,25 +210,25 @@ DEFUN (router_id,
        "IP address to use for router-id\n"
        VRF_CMD_HELP_STR)
 {
-  int idx_ipv4 = 1;
-  int idx_name = 3;
+       int idx_ipv4 = 1;
+       int idx_name = 3;
 
-  struct prefix rid;
-  vrf_id_t vrf_id = VRF_DEFAULT;
+       struct prefix rid;
+       vrf_id_t vrf_id = VRF_DEFAULT;
 
-  rid.u.prefix4.s_addr = inet_addr (argv[idx_ipv4]->arg);
-  if (!rid.u.prefix4.s_addr)
-    return CMD_WARNING_CONFIG_FAILED;
+       rid.u.prefix4.s_addr = inet_addr(argv[idx_ipv4]->arg);
+       if (!rid.u.prefix4.s_addr)
+               return CMD_WARNING_CONFIG_FAILED;
 
-  rid.prefixlen = 32;
-  rid.family = AF_INET;
+       rid.prefixlen = 32;
+       rid.family = AF_INET;
 
-  if (argc > 2)
-    VRF_GET_ID (vrf_id, argv[idx_name]->arg);
+       if (argc > 2)
+               VRF_GET_ID(vrf_id, argv[idx_name]->arg, false);
 
-  router_id_set (&rid, vrf_id);
+       router_id_set(&rid, vrf_id);
 
-  return CMD_SUCCESS;
+       return CMD_SUCCESS;
 }
 
 DEFUN (no_router_id,
@@ -247,54 +239,52 @@ DEFUN (no_router_id,
        "IP address to use for router-id\n"
        VRF_CMD_HELP_STR)
 {
-  int idx_name = 4;
+       int idx_name = 4;
 
-  struct prefix rid;
-  vrf_id_t vrf_id = VRF_DEFAULT;
+       struct prefix rid;
+       vrf_id_t vrf_id = VRF_DEFAULT;
 
-  rid.u.prefix4.s_addr = 0;
-  rid.prefixlen = 0;
-  rid.family = AF_INET;
+       rid.u.prefix4.s_addr = 0;
+       rid.prefixlen = 0;
+       rid.family = AF_INET;
 
-  if (argc > 3)
-    VRF_GET_ID (vrf_id, argv[idx_name]->arg);
+       if (argc > 3)
+               VRF_GET_ID(vrf_id, argv[idx_name]->arg, false);
 
-  router_id_set (&rid, vrf_id);
+       router_id_set(&rid, vrf_id);
 
-  return CMD_SUCCESS;
+       return CMD_SUCCESS;
 }
 
 
-
-static int
-router_id_cmp (void *a, void *b)
+static int router_id_cmp(void *a, void *b)
 {
-  const struct connected *ifa = (const struct connected *)a;
-  const struct connected *ifb = (const struct connected *)b;
+       const struct connected *ifa = (const struct connected *)a;
+       const struct connected *ifb = (const struct connected *)b;
 
-  return IPV4_ADDR_CMP(&ifa->address->u.prefix4.s_addr,&ifb->address->u.prefix4.s_addr);
+       return IPV4_ADDR_CMP(&ifa->address->u.prefix4.s_addr,
+                            &ifb->address->u.prefix4.s_addr);
 }
 
-void
-router_id_cmd_init (void)
+void router_id_cmd_init(void)
 {
-  install_element (CONFIG_NODE, &router_id_cmd);
-  install_element (CONFIG_NODE, &no_router_id_cmd);
+       install_element(CONFIG_NODE, &router_id_cmd);
+       install_element(CONFIG_NODE, &no_router_id_cmd);
 }
 
-void
-router_id_init (struct zebra_vrf *zvrf)
+void router_id_init(struct zebra_vrf *zvrf)
 {
-  zvrf->rid_all_sorted_list = &zvrf->_rid_all_sorted_list;
-  zvrf->rid_lo_sorted_list = &zvrf->_rid_lo_sorted_list;
+       zvrf->rid_all_sorted_list = &zvrf->_rid_all_sorted_list;
+       zvrf->rid_lo_sorted_list = &zvrf->_rid_lo_sorted_list;
 
-  memset (zvrf->rid_all_sorted_list, 0, sizeof (zvrf->_rid_all_sorted_list));
-  memset (zvrf->rid_lo_sorted_list, 0, sizeof (zvrf->_rid_lo_sorted_list));
-  memset (&zvrf->rid_user_assigned, 0, sizeof (zvrf->rid_user_assigned));
+       memset(zvrf->rid_all_sorted_list, 0,
+              sizeof(zvrf->_rid_all_sorted_list));
+       memset(zvrf->rid_lo_sorted_list, 0, sizeof(zvrf->_rid_lo_sorted_list));
+       memset(&zvrf->rid_user_assigned, 0, sizeof(zvrf->rid_user_assigned));
 
-  zvrf->rid_all_sorted_list->cmp = router_id_cmp;
-  zvrf->rid_lo_sorted_list->cmp = router_id_cmp;
+       zvrf->rid_all_sorted_list->cmp = router_id_cmp;
+       zvrf->rid_lo_sorted_list->cmp = router_id_cmp;
 
-  zvrf->rid_user_assigned.family = AF_INET;
-  zvrf->rid_user_assigned.prefixlen = 32;
+       zvrf->rid_user_assigned.family = AF_INET;
+       zvrf->rid_user_assigned.prefixlen = 32;
 }