]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #2773 from donaldsharp/pim_ordering
authorRuss White <russ@riw.us>
Sat, 4 Aug 2018 15:43:38 +0000 (11:43 -0400)
committerGitHub <noreply@github.com>
Sat, 4 Aug 2018 15:43:38 +0000 (11:43 -0400)
Pim ordering

26 files changed:
bgpd/bgp_clist.c
bgpd/bgp_community.c
bgpd/bgp_community.h
bgpd/bgp_debug.c
bgpd/bgp_evpn_vty.c
bgpd/bgp_flowspec_vty.c
bgpd/bgp_route.c
bgpd/bgp_routemap.c
bgpd/bgp_table.c
bgpd/bgp_updgrp_adv.c
lib/routemap.c
lib/routemap.h
ospf6d/ospf6_asbr.c
ospfd/ospf_lsa.c
ospfd/ospfd.c
pimd/pim_bfd.c
pimd/pim_bfd.h
pimd/pim_instance.c
pimd/pim_msdp.c
pimd/pim_neighbor.c
pimd/pim_routemap.c
pimd/pim_rp.c
pimd/pim_ssm.c
pimd/pim_upstream.c
pimd/pimd.c
zebra/kernel_netlink.c

index b2f34dd968b8851bfda67cc986fdcd4076732085..fec4397b73c99d2b42cd3aa9b1a65db64b8c0e4f 100644 (file)
@@ -346,6 +346,36 @@ static char *community_str_get(struct community *com, int i)
        case COMMUNITY_INTERNET:
                len = strlen(" internet");
                break;
+       case COMMUNITY_GSHUT:
+               len = strlen(" graceful-shutdown");
+               break;
+       case COMMUNITY_ACCEPT_OWN:
+               len = strlen(" accept-own");
+               break;
+       case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
+               len = strlen(" route-filter-translated-v4");
+               break;
+       case COMMUNITY_ROUTE_FILTER_v4:
+               len = strlen(" route-filter-v4");
+               break;
+       case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
+               len = strlen(" route-filter-translated-v6");
+               break;
+       case COMMUNITY_ROUTE_FILTER_v6:
+               len = strlen(" route-filter-v6");
+               break;
+       case COMMUNITY_LLGR_STALE:
+               len = strlen(" llgr-stale");
+               break;
+       case COMMUNITY_NO_LLGR:
+               len = strlen(" no-llgr");
+               break;
+       case COMMUNITY_ACCEPT_OWN_NEXTHOP:
+               len = strlen(" accept-own-nexthop");
+               break;
+       case COMMUNITY_BLACKHOLE:
+               len = strlen(" blackhole");
+               break;
        case COMMUNITY_NO_EXPORT:
                len = strlen(" no-export");
                break;
@@ -355,8 +385,8 @@ static char *community_str_get(struct community *com, int i)
        case COMMUNITY_LOCAL_AS:
                len = strlen(" local-AS");
                break;
-       case COMMUNITY_GSHUT:
-               len = strlen(" graceful-shutdown");
+       case COMMUNITY_NO_PEER:
+               len = strlen(" no-peer");
                break;
        default:
                len = strlen(" 65536:65535");
@@ -371,6 +401,46 @@ static char *community_str_get(struct community *com, int i)
                strcpy(pnt, "internet");
                pnt += strlen("internet");
                break;
+       case COMMUNITY_GSHUT:
+               strcpy(pnt, "graceful-shutdown");
+               pnt += strlen("graceful-shutdown");
+               break;
+       case COMMUNITY_ACCEPT_OWN:
+               strcpy(pnt, "accept-own");
+               pnt += strlen("accept-own");
+               break;
+       case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
+               strcpy(pnt, "route-filter-translated-v4");
+               pnt += strlen("route-filter-translated-v4");
+               break;
+       case COMMUNITY_ROUTE_FILTER_v4:
+               strcpy(pnt, "route-filter-v4");
+               pnt += strlen("route-filter-v4");
+               break;
+       case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
+               strcpy(pnt, "route-filter-translated-v6");
+               pnt += strlen("route-filter-translated-v6");
+               break;
+       case COMMUNITY_ROUTE_FILTER_v6:
+               strcpy(pnt, "route-filter-v6");
+               pnt += strlen("route-filter-v6");
+               break;
+       case COMMUNITY_LLGR_STALE:
+               strcpy(pnt, "llgr-stale");
+               pnt += strlen("llgr-stale");
+               break;
+       case COMMUNITY_NO_LLGR:
+               strcpy(pnt, "no-llgr");
+               pnt += strlen("no-llgr");
+               break;
+       case COMMUNITY_ACCEPT_OWN_NEXTHOP:
+               strcpy(pnt, "accept-own-nexthop");
+               pnt += strlen("accept-own-nexthop");
+               break;
+       case COMMUNITY_BLACKHOLE:
+               strcpy(pnt, "blackhole");
+               pnt += strlen("blackhole");
+               break;
        case COMMUNITY_NO_EXPORT:
                strcpy(pnt, "no-export");
                pnt += strlen("no-export");
@@ -383,9 +453,9 @@ static char *community_str_get(struct community *com, int i)
                strcpy(pnt, "local-AS");
                pnt += strlen("local-AS");
                break;
-       case COMMUNITY_GSHUT:
-               strcpy(pnt, "graceful-shutdown");
-               pnt += strlen("graceful-shutdown");
+       case COMMUNITY_NO_PEER:
+               strcpy(pnt, "no-peer");
+               pnt += strlen("no-peer");
                break;
        default:
                as = (comval >> 16) & 0xFFFF;
@@ -547,47 +617,77 @@ static int ecommunity_regexp_match(struct ecommunity *ecom, regex_t *reg)
 static struct community *
 community_regexp_delete (struct community *com, regex_t * reg)
 {
-  int i;
-  uint32_t comval;
-  /* Maximum is "65535:65535" + '\0'. */
-  char c[12];
-  const char *str;
-
-  if (!com)
-    return NULL;
-
-  i = 0;
-  while (i < com->size)
-    {
-      memcpy (&comval, com_nthval (com, i), sizeof (uint32_t));
-      comval = ntohl (comval);
-
-      switch (comval)
-        {
-        case COMMUNITY_INTERNET:
-          str = "internet";
-          break;
-        case COMMUNITY_NO_EXPORT:
-          str = "no-export";
-          break;
-        case COMMUNITY_NO_ADVERTISE:
-          str = "no-advertise";
-          break;
-        case COMMUNITY_LOCAL_AS:
-          str = "local-AS";
-          break;
-        default:
-          sprintf (c, "%d:%d", (comval >> 16) & 0xFFFF, comval & 0xFFFF);
-          str = c;
-          break;
-        }
-
-      if (regexec (reg, str, 0, NULL, 0) == 0)
-        community_del_val (com, com_nthval (com, i));
-      else
-        i++;
-    }
-  return com;
+       int i;
+       uint32_t comval;
+       /* Maximum is "65535:65535" + '\0'. */
+       char c[12];
+       const char *str;
+
+       if (!com)
+               return NULL;
+
+       i = 0;
+       while (i < com->size)
+       {
+               memcpy (&comval, com_nthval (com, i), sizeof (uint32_t));
+               comval = ntohl (comval);
+
+               switch (comval) {
+               case COMMUNITY_INTERNET:
+                       str = "internet";
+                       break;
+               case COMMUNITY_ACCEPT_OWN:
+                       str = "accept-own";
+                       break;
+               case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
+                       str = "route-filter-translated-v4";
+                       break;
+               case COMMUNITY_ROUTE_FILTER_v4:
+                       str = "route-filter-v4";
+                       break;
+               case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
+                       str = "route-filter-translated-v6";
+                       break;
+               case COMMUNITY_ROUTE_FILTER_v6:
+                       str = "route-filter-v6";
+                       break;
+               case COMMUNITY_LLGR_STALE:
+                       str = "llgr-stale";
+                       break;
+               case COMMUNITY_NO_LLGR:
+                       str = "no-llgr";
+                       break;
+               case COMMUNITY_ACCEPT_OWN_NEXTHOP:
+                       str = "accept-own-nexthop";
+                       break;
+               case COMMUNITY_BLACKHOLE:
+                       str = "blackhole";
+                       break;
+               case COMMUNITY_NO_EXPORT:
+                       str = "no-export";
+                       break;
+               case COMMUNITY_NO_ADVERTISE:
+                       str = "no-advertise";
+                       break;
+               case COMMUNITY_LOCAL_AS:
+                       str = "local-AS";
+                       break;
+               case COMMUNITY_NO_PEER:
+                       str = "no-peer";
+                       break;
+               default:
+                       sprintf (c, "%d:%d", (comval >> 16) & 0xFFFF,
+                        comval & 0xFFFF);
+                       str = c;
+                       break;
+               }
+
+               if (regexec (reg, str, 0, NULL, 0) == 0)
+                       community_del_val (com, com_nthval (com, i));
+               else
+                       i++;
+       }
+       return com;
 }
 #endif
 
index 9170481769dd4fa9507d5ea0423aed3c8871f974..e40674d635982635742c2cdb71869b531684efb4 100644 (file)
@@ -188,10 +188,20 @@ struct community *community_uniq_sort(struct community *com)
    For Well-known communities value, below keyword is used.
 
    0x0             "internet"
+   0xFFFF0000      "graceful-shutdown"
+   0xFFFF0001      "accept-own"
+   0xFFFF0002      "route-filter-translated-v4"
+   0xFFFF0003      "route-filter-v4"
+   0xFFFF0004      "route-filter-translated-v6"
+   0xFFFF0005      "route-filter-v6"
+   0xFFFF0006      "llgr-stale"
+   0xFFFF0007      "no-llgr"
+   0xFFFF0008      "accept-own-nexthop"
+   0xFFFF029A      "blackhole"
    0xFFFFFF01      "no-export"
    0xFFFFFF02      "no-advertise"
    0xFFFFFF03      "local-AS"
-   0xFFFF0000      "graceful-shutdown"
+   0xFFFFFF04      "no-peer"
 
    For other values, "AS:VAL" format is used.  */
 static void set_community_string(struct community *com, bool make_json)
@@ -241,6 +251,36 @@ static void set_community_string(struct community *com, bool make_json)
                case COMMUNITY_INTERNET:
                        len += strlen(" internet");
                        break;
+               case COMMUNITY_GSHUT:
+                       len += strlen(" graceful-shutdown");
+                       break;
+               case COMMUNITY_ACCEPT_OWN:
+                       len += strlen(" accept-own");
+                       break;
+               case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
+                       len += strlen(" route-filter-translated-v4");
+                       break;
+               case COMMUNITY_ROUTE_FILTER_v4:
+                       len += strlen(" route-filter-v4");
+                       break;
+               case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
+                       len += strlen(" route-filter-translated-v6");
+                       break;
+               case COMMUNITY_ROUTE_FILTER_v6:
+                       len += strlen(" route-filter-v6");
+                       break;
+               case COMMUNITY_LLGR_STALE:
+                       len += strlen(" llgr-stale");
+                       break;
+               case COMMUNITY_NO_LLGR:
+                       len += strlen(" no-llgr");
+                       break;
+               case COMMUNITY_ACCEPT_OWN_NEXTHOP:
+                       len += strlen(" accept-own-nexthop");
+                       break;
+               case COMMUNITY_BLACKHOLE:
+                       len += strlen(" blackhole");
+                       break;
                case COMMUNITY_NO_EXPORT:
                        len += strlen(" no-export");
                        break;
@@ -250,8 +290,8 @@ static void set_community_string(struct community *com, bool make_json)
                case COMMUNITY_LOCAL_AS:
                        len += strlen(" local-AS");
                        break;
-               case COMMUNITY_GSHUT:
-                       len += strlen(" graceful-shutdown");
+               case COMMUNITY_NO_PEER:
+                       len += strlen(" no-peer");
                        break;
                default:
                        len += strlen(" 65536:65535");
@@ -284,6 +324,106 @@ static void set_community_string(struct community *com, bool make_json)
                                                      json_string);
                        }
                        break;
+               case COMMUNITY_GSHUT:
+                       strcpy(pnt, "graceful-shutdown");
+                       pnt += strlen("graceful-shutdown");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "gracefulShutdown");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_ACCEPT_OWN:
+                       strcpy(pnt, "accept-own");
+                       pnt += strlen("accept-own");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "acceptown");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_ROUTE_FILTER_TRANSLATED_v4:
+                       strcpy(pnt, "route-filter-translated-v4");
+                       pnt += strlen("route-filter-translated-v4");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "routeFilterTranslatedV4");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_ROUTE_FILTER_v4:
+                       strcpy(pnt, "route-filter-v4");
+                       pnt += strlen("route-filter-v4");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "routeFilterV4");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_ROUTE_FILTER_TRANSLATED_v6:
+                       strcpy(pnt, "route-filter-translated-v6");
+                       pnt += strlen("route-filter-translated-v6");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "routeFilterTranslatedV6");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_ROUTE_FILTER_v6:
+                       strcpy(pnt, "route-filter-v6");
+                       pnt += strlen("route-filter-v6");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "routeFilterV6");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_LLGR_STALE:
+                       strcpy(pnt, "llgr-stale");
+                       pnt += strlen("llgr-stale");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "llgrStale");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_NO_LLGR:
+                       strcpy(pnt, "no-llgr");
+                       pnt += strlen("no-llgr");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "noLlgr");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_ACCEPT_OWN_NEXTHOP:
+                       strcpy(pnt, "accept-own-nexthop");
+                       pnt += strlen("accept-own-nexthop");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "acceptownnexthop");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
+               case COMMUNITY_BLACKHOLE:
+                       strcpy(pnt, "blackhole");
+                       pnt += strlen("blackhole");
+                       if (make_json) {
+                               json_string = json_object_new_string(
+                                       "blackhole");
+                               json_object_array_add(json_community_list,
+                                                     json_string);
+                       }
+                       break;
                case COMMUNITY_NO_EXPORT:
                        strcpy(pnt, "no-export");
                        pnt += strlen("no-export");
@@ -313,12 +453,11 @@ static void set_community_string(struct community *com, bool make_json)
                                                      json_string);
                        }
                        break;
-               case COMMUNITY_GSHUT:
-                       strcpy(pnt, "graceful-shutdown");
-                       pnt += strlen("graceful-shutdown");
+               case COMMUNITY_NO_PEER:
+                       strcpy(pnt, "no-peer");
+                       pnt += strlen("no-peer");
                        if (make_json) {
-                               json_string = json_object_new_string(
-                                       "gracefulShutdown");
+                               json_string = json_object_new_string("noPeer");
                                json_object_array_add(json_community_list,
                                                      json_string);
                        }
@@ -508,10 +647,20 @@ struct community *community_merge(struct community *com1,
 /* Community token enum. */
 enum community_token {
        community_token_val,
+       community_token_gshut,
+       community_token_accept_own,
+       community_token_route_filter_translated_v4,
+       community_token_route_filter_v4,
+       community_token_route_filter_translated_v6,
+       community_token_route_filter_v6,
+       community_token_llgr_stale,
+       community_token_no_llgr,
+       community_token_accept_own_nexthop,
+       community_token_blackhole,
        community_token_no_export,
        community_token_no_advertise,
        community_token_local_as,
-       community_token_gshut,
+       community_token_no_peer,
        community_token_unknown
 };
 
@@ -537,6 +686,79 @@ community_gettoken(const char *buf, enum community_token *token, uint32_t *val)
                        p += strlen("internet");
                        return p;
                }
+               if (strncmp(p, "graceful-shutdown", strlen("graceful-shutdown"))
+                   == 0) {
+                       *val = COMMUNITY_GSHUT;
+                       *token = community_token_gshut;
+                       p += strlen("graceful-shutdown");
+                       return p;
+               }
+               if (strncmp(p, "accept-own", strlen("accept-own"))
+                   == 0) {
+                       *val = COMMUNITY_ACCEPT_OWN;
+                       *token = community_token_accept_own;
+                       p += strlen("accept-own");
+                       return p;
+               }
+               if (strncmp(p, "route-filter-translated-v4",
+                       strlen("route-filter-translated-v4"))
+                   == 0) {
+                       *val = COMMUNITY_ROUTE_FILTER_TRANSLATED_v4;
+                       *token = community_token_route_filter_translated_v4;
+                       p += strlen("route-filter-translated-v4");
+                       return p;
+               }
+               if (strncmp(p, "route-filter-v4", strlen("route-filter-v4"))
+                   == 0) {
+                       *val = COMMUNITY_ROUTE_FILTER_v4;
+                       *token = community_token_route_filter_v4;
+                       p += strlen("route-filter-v4");
+                       return p;
+               }
+               if (strncmp(p, "route-filter-translated-v6",
+                       strlen("route-filter-translated-v6"))
+                   == 0) {
+                       *val = COMMUNITY_ROUTE_FILTER_TRANSLATED_v6;
+                       *token = community_token_route_filter_translated_v6;
+                       p += strlen("route-filter-translated-v6");
+                       return p;
+               }
+               if (strncmp(p, "route-filter-v6", strlen("route-filter-v6"))
+                   == 0) {
+                       *val = COMMUNITY_ROUTE_FILTER_v6;
+                       *token = community_token_route_filter_v6;
+                       p += strlen("route-filter-v6");
+                       return p;
+               }
+               if (strncmp(p, "llgr-stale", strlen("llgr-stale"))
+                   == 0) {
+                       *val = COMMUNITY_LLGR_STALE;
+                       *token = community_token_llgr_stale;
+                       p += strlen("llgr-stale");
+                       return p;
+               }
+               if (strncmp(p, "no-llgr", strlen("no-llgr"))
+                   == 0) {
+                       *val = COMMUNITY_NO_LLGR;
+                       *token = community_token_no_llgr;
+                       p += strlen("no-llgr");
+                       return p;
+               }
+               if (strncmp(p, "accept-own-nexthop",
+                       strlen("accept-own-nexthop"))
+                   == 0) {
+                       *val = COMMUNITY_ACCEPT_OWN_NEXTHOP;
+                       *token = community_token_accept_own_nexthop;
+                       p += strlen("accept-own-nexthop");
+                       return p;
+               }
+               if (strncmp(p, "blackhole", strlen("blackhole"))
+                   == 0) {
+                       *val = COMMUNITY_BLACKHOLE;
+                       *token = community_token_blackhole;
+                       p += strlen("blackhole");
+                       return p;
+               }
                if (strncmp(p, "no-export", strlen("no-export")) == 0) {
                        *val = COMMUNITY_NO_EXPORT;
                        *token = community_token_no_export;
@@ -555,11 +777,10 @@ community_gettoken(const char *buf, enum community_token *token, uint32_t *val)
                        p += strlen("local-AS");
                        return p;
                }
-               if (strncmp(p, "graceful-shutdown", strlen("graceful-shutdown"))
-                   == 0) {
-                       *val = COMMUNITY_GSHUT;
-                       *token = community_token_gshut;
-                       p += strlen("graceful-shutdown");
+               if (strncmp(p, "no-peer", strlen("no-peer")) == 0) {
+                       *val = COMMUNITY_NO_PEER;
+                       *token = community_token_no_peer;
+                       p += strlen("no-peer");
                        return p;
                }
 
@@ -631,10 +852,20 @@ struct community *community_str2com(const char *str)
 
                switch (token) {
                case community_token_val:
+               case community_token_gshut:
+               case community_token_accept_own:
+               case community_token_route_filter_translated_v4:
+               case community_token_route_filter_v4:
+               case community_token_route_filter_translated_v6:
+               case community_token_route_filter_v6:
+               case community_token_llgr_stale:
+               case community_token_no_llgr:
+               case community_token_accept_own_nexthop:
+               case community_token_blackhole:
                case community_token_no_export:
                case community_token_no_advertise:
                case community_token_local_as:
-               case community_token_gshut:
+               case community_token_no_peer:
                        if (com == NULL) {
                                com = community_new();
                                com->json = NULL;
index c180bea465de02a4002b92ec9cc55f890e2d72df..61af9f038ca88351f5f781f889c7cb9168be1476 100644 (file)
@@ -43,12 +43,22 @@ struct community {
 };
 
 /* Well-known communities value.  */
-#define COMMUNITY_INTERNET              0x0
-#define COMMUNITY_NO_EXPORT             0xFFFFFF01
-#define COMMUNITY_NO_ADVERTISE          0xFFFFFF02
-#define COMMUNITY_NO_EXPORT_SUBCONFED   0xFFFFFF03
-#define COMMUNITY_LOCAL_AS              0xFFFFFF03
-#define COMMUNITY_GSHUT                 0xFFFF0000
+#define COMMUNITY_INTERNET                      0x0
+#define COMMUNITY_GSHUT                         0xFFFF0000
+#define COMMUNITY_ACCEPT_OWN                    0xFFFF0001
+#define COMMUNITY_ROUTE_FILTER_TRANSLATED_v4    0xFFFF0002
+#define COMMUNITY_ROUTE_FILTER_v4               0xFFFF0003
+#define COMMUNITY_ROUTE_FILTER_TRANSLATED_v6    0xFFFF0004
+#define COMMUNITY_ROUTE_FILTER_v6               0xFFFF0005
+#define COMMUNITY_LLGR_STALE                    0xFFFF0006
+#define COMMUNITY_NO_LLGR                       0xFFFF0007
+#define COMMUNITY_ACCEPT_OWN_NEXTHOP            0xFFFF0008
+#define COMMUNITY_BLACKHOLE                     0xFFFF029A
+#define COMMUNITY_NO_EXPORT                     0xFFFFFF01
+#define COMMUNITY_NO_ADVERTISE                  0xFFFFFF02
+#define COMMUNITY_NO_EXPORT_SUBCONFED           0xFFFFFF03
+#define COMMUNITY_LOCAL_AS                      0xFFFFFF03
+#define COMMUNITY_NO_PEER                       0xFFFFFF04
 
 /* Macros of community attribute.  */
 #define com_length(X)    ((X)->size * 4)
index 1e95a887bc5bf63e928c4f8b06d3a435e343bd0b..268356c7c3bfe6f51e55e81f415565588650332f 100644 (file)
@@ -1433,7 +1433,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
        if (afiz == AFI_L2VPN && safiz == SAFI_EVPN) {
                ret = bgp_debug_parse_evpn_prefix(vty, argv, argc, &argv_p);
                if (ret != CMD_SUCCESS)
-                       return ret;
+                       goto cleanup;
        } else {
                (void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
                apply_mask(argv_p);
@@ -1446,7 +1446,7 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
                vty_out(vty,
                        "BGP updates debugging is already enabled for %s\n",
                        argv[idx_ipv4_ipv6_prefixlen]->arg);
-               return CMD_SUCCESS;
+               goto cleanup;
        }
 
        bgp_debug_list_add_entry(bgp_debug_update_prefixes, NULL, argv_p);
@@ -1459,7 +1459,10 @@ DEFPY (debug_bgp_update_prefix_afi_safi,
                        argv[idx_ipv4_ipv6_prefixlen]->arg);
        }
 
-       return CMD_SUCCESS;
+cleanup:
+       prefix_free(argv_p);
+
+       return ret;
 }
 
 DEFPY (no_debug_bgp_update_prefix_afi_safi,
@@ -1501,7 +1504,7 @@ DEFPY (no_debug_bgp_update_prefix_afi_safi,
        if (afiz == AFI_L2VPN && safiz == SAFI_EVPN) {
                ret = bgp_debug_parse_evpn_prefix(vty, argv, argc, &argv_p);
                if (ret != CMD_SUCCESS)
-                       return ret;
+                       goto cleanup;
        } else {
                (void)str2prefix(argv[idx_ipv4_ipv6_prefixlen]->arg, argv_p);
                apply_mask(argv_p);
@@ -1530,7 +1533,10 @@ DEFPY (no_debug_bgp_update_prefix_afi_safi,
                vty_out(vty, "BGP updates debugging was not enabled for %s\n",
                        argv[idx_ipv4_ipv6_prefixlen]->arg);
 
-       return CMD_SUCCESS;
+cleanup:
+       prefix_free(argv_p);
+
+       return ret;
 }
 
 
index 5a4ebc9b173529f48279ae1a68b986b653841828..b45c1a99dbd16b6a7f3e214b004510acc014cb7f 100644 (file)
@@ -2807,9 +2807,6 @@ DEFUN (bgp_evpn_advertise_default_gw_vni,
        if (!bgp)
                return CMD_WARNING;
 
-       if (!vpn)
-               return CMD_WARNING;
-
        evpn_set_advertise_default_gw(bgp, vpn);
 
        return CMD_SUCCESS;
@@ -2827,9 +2824,6 @@ DEFUN (no_bgp_evpn_advertise_default_vni_gw,
        if (!bgp)
                return CMD_WARNING;
 
-       if (!vpn)
-               return CMD_WARNING;
-
        evpn_unset_advertise_default_gw(bgp, vpn);
 
        return CMD_SUCCESS;
@@ -2972,9 +2966,6 @@ DEFUN_HIDDEN (bgp_evpn_advertise_vni_subnet,
        if (!bgp)
                return CMD_WARNING;
 
-       if (!vpn)
-               return CMD_WARNING;
-
        bgp_vrf = bgp_lookup_by_vrf_id(vpn->tenant_vrf_id);
        if (!bgp_vrf)
                return CMD_WARNING;
@@ -2995,9 +2986,6 @@ DEFUN_HIDDEN (no_bgp_evpn_advertise_vni_subnet,
        if (!bgp)
                return CMD_WARNING;
 
-       if (!vpn)
-               return CMD_WARNING;
-
        evpn_unset_advertise_subnet(bgp, vpn);
        return CMD_SUCCESS;
 }
@@ -4225,7 +4213,7 @@ DEFUN (bgp_evpn_vni_rd,
        VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn);
        int ret;
 
-       if (!bgp || !vpn)
+       if (!bgp)
                return CMD_WARNING;
 
        if (bgp->vrf_id != VRF_DEFAULT) {
@@ -4261,7 +4249,7 @@ DEFUN (no_bgp_evpn_vni_rd,
        VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn);
        int ret;
 
-       if (!bgp || !vpn)
+       if (!bgp)
                return CMD_WARNING;
 
        if (bgp->vrf_id != VRF_DEFAULT) {
@@ -4301,7 +4289,7 @@ DEFUN (no_bgp_evpn_vni_rd_without_val,
        struct bgp *bgp = VTY_GET_CONTEXT(bgp);
        VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn);
 
-       if (!bgp || !vpn)
+       if (!bgp)
                return CMD_WARNING;
 
        if (bgp->vrf_id != VRF_DEFAULT) {
@@ -4630,7 +4618,7 @@ DEFUN (bgp_evpn_vni_rt,
        int rt_type;
        struct ecommunity *ecomadd = NULL;
 
-       if (!bgp || !vpn)
+       if (!bgp)
                return CMD_WARNING;
 
        if (bgp->vrf_id != VRF_DEFAULT) {
@@ -4698,7 +4686,7 @@ DEFUN (no_bgp_evpn_vni_rt,
        int rt_type, found_ecomdel;
        struct ecommunity *ecomdel = NULL;
 
-       if (!bgp || !vpn)
+       if (!bgp)
                return CMD_WARNING;
 
        if (bgp->vrf_id != VRF_DEFAULT) {
@@ -4797,7 +4785,7 @@ DEFUN (no_bgp_evpn_vni_rt_without_val,
        VTY_DECLVAR_CONTEXT_SUB(bgpevpn, vpn);
        int rt_type;
 
-       if (!bgp || !vpn)
+       if (!bgp)
                return CMD_WARNING;
 
        if (bgp->vrf_id != VRF_DEFAULT) {
index ace888c78d74948a93c16435427b12bf9b1675b3..f8c06132084eb8b465387d0de98da3aabeff3f26 100644 (file)
@@ -357,7 +357,7 @@ void route_vty_out_flowspec(struct vty *vty, struct prefix *p,
                        if (unit)
                                vty_out(vty, ")");
                        vty_out(vty, "\n");
-                       list_delete_all_node(list_bpm);
+                       list_delete_and_null(&list_bpm);
                } else
                        vty_out(vty, "\tnot installed in PBR\n");
        }
index 4bbc535cdc96de1ac2b05228cbf7650aa288db10..e1924f0e9a6a0630eeaf83a69ca8aba37ce649b9 100644 (file)
@@ -7737,13 +7737,6 @@ void route_vty_out_detail(struct vty *vty, struct bgp *bgp, struct prefix *p,
                        else
                                vty_out(vty, ", localpref %u",
                                        attr->local_pref);
-               } else {
-                       if (json_paths)
-                               json_object_int_add(json_path, "localpref",
-                                                   bgp->default_local_pref);
-                       else
-                               vty_out(vty, ", localpref %u",
-                                       bgp->default_local_pref);
                }
 
                if (attr->weight != 0) {
index 903018b2a2d35bcc234a546903b0a8ff6d422374..bee4fca7051d13f7c52420786222ed4540a071db 100644 (file)
@@ -4810,9 +4810,5 @@ void bgp_route_map_init(void)
 void bgp_route_map_terminate(void)
 {
        /* ToDo: Cleanup all the used memory */
-
-       route_map_add_hook(NULL);
-       route_map_delete_hook(NULL);
-       route_map_event_hook(NULL);
        route_map_finish();
 }
index 94e2d83cfe1ff287f99fbb6430c0a3a1e72f66c3..234553b6ead27dd8262d00e666f3115b86a62c9e 100644 (file)
@@ -144,9 +144,6 @@ void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p,
        struct bgp_node *node = bgp_node_from_rnode(table->route_table->top);
        struct bgp_node *matched = NULL;
 
-       if (node == NULL)
-               return;
-
        while (node && node->p.prefixlen <= p->prefixlen
               && prefix_match(&node->p, p)) {
                if (node->info && node->p.prefixlen == p->prefixlen) {
@@ -157,6 +154,9 @@ void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p,
                        &p->u.prefix, node->p.prefixlen)]);
        }
 
+       if (node == NULL)
+               return;
+
        if ((matched == NULL && node->p.prefixlen > maxlen) || !node->parent)
                return;
        else if (matched == NULL)
index f44e95a50a21ff9704f9f57a10c3a8e72207b9a3..6ffb1d448b2009b64ab02f7fff66368b6a2479de 100644 (file)
@@ -663,7 +663,7 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
 {
        struct bgp *bgp;
        struct attr attr;
-       struct bgp_info *info, init_info;
+       struct bgp_info *info, init_info, tmp_info;
        struct prefix p;
        struct peer *from;
        struct bgp_node *rn;
@@ -713,8 +713,6 @@ void subgroup_default_originate(struct update_subgroup *subgrp, int withdraw)
                for (rn = bgp_table_top(bgp->rib[afi][safi]); rn;
                     rn = bgp_route_next(rn)) {
                        for (ri = rn->info; ri; ri = ri->next) {
-                               struct bgp_info tmp_info;
-
                                tmp_info.peer = ri->peer;
                                tmp_info.attr = ri->attr;
 
index 6c4585365a34cb3eef2aff976601a1b6b76564bb..4e8682f31232230d04aee22edd65598b1a74e58c 100644 (file)
@@ -2741,6 +2741,15 @@ void route_map_finish(void)
        vector_free(route_set_vec);
        route_set_vec = NULL;
 
+       /*
+        * All protocols are setting these to NULL
+        * by default on shutdown( route_map_finish )
+        * Why are we making them do this work?
+        */
+       route_map_master.add_hook = NULL;
+       route_map_master.delete_hook = NULL;
+       route_map_master.event_hook = NULL;
+
        /* cleanup route_map */
        while (route_map_master.head) {
                struct route_map *map = route_map_master.head;
index 0f7c391f84e44247a67c5d4dcdac1b187dda102f..a193e325360c675be31041665fd3b47bf68ac572 100644 (file)
@@ -169,6 +169,12 @@ DECLARE_QOBJ_TYPE(route_map)
 
 /* Prototypes. */
 extern void route_map_init(void);
+
+/*
+ * This should only be called on shutdown
+ * Additionally this function sets the hooks to NULL
+ * before any processing is done.
+ */
 extern void route_map_finish(void);
 
 /* Add match statement to route map. */
index e6bd3faf405b6712e01c21c26e7b58f2aa60d718..5af88defeba69dc6a65251900ff33c61567a5db1 100644 (file)
@@ -1861,9 +1861,6 @@ void ospf6_asbr_redistribute_reset(void)
 void ospf6_asbr_terminate(void)
 {
        /* Cleanup route maps */
-       route_map_add_hook(NULL);
-       route_map_delete_hook(NULL);
-       route_map_event_hook(NULL);
        route_map_finish();
 }
 
index 502f23303640f4cd2b370eae68a647d86d5587e9..416533883457f33dc68add33e58e97caf7023c11 100644 (file)
@@ -1921,7 +1921,7 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf,
                        zlog_debug(
                                "ospf_translated_nssa_refresh(): Could not install "
                                "translated LSA, Id %s",
-                               type7 ? inet_ntoa(type7->data->id) : "(null)");
+                               inet_ntoa(type7->data->id));
                return NULL;
        }
 
index f315421843ee1e9df1fd9e0e4c9042de1eaf21b7..2298c2261a9af283c587dd5e29da86598cdb24e0 100644 (file)
@@ -561,9 +561,6 @@ void ospf_terminate(void)
                ospf_finish(ospf);
 
        /* Cleanup route maps */
-       route_map_add_hook(NULL);
-       route_map_delete_hook(NULL);
-       route_map_event_hook(NULL);
        route_map_finish();
 
        /* reverse prefix_list_init */
index f5772174baed91baa40f2a083ae3c9c9b0b5bdb3..4a3cf715dabb27c6f9d4e2275fdfac51fe85e7f1 100644 (file)
@@ -99,9 +99,9 @@ void pim_bfd_info_nbr_create(struct pim_interface *pim_ifp,
 /*
  * pim_bfd_info_free - Free BFD info structure
  */
-void pim_bfd_info_free(void **bfd_info)
+void pim_bfd_info_free(struct bfd_info **bfd_info)
 {
-       bfd_info_free((struct bfd_info **)bfd_info);
+       bfd_info_free(bfd_info);
 }
 
 static void pim_bfd_reg_dereg_nbr(struct pim_neighbor *nbr, int command)
@@ -151,7 +151,7 @@ int pim_bfd_reg_dereg_all_nbr(struct interface *ifp, int command)
                if (command != ZEBRA_BFD_DEST_DEREGISTER)
                        pim_bfd_info_nbr_create(pim_ifp, neigh);
                else
-                       bfd_info_free((struct bfd_info **)&neigh->bfd_info);
+                       pim_bfd_info_free((struct bfd_info **)&neigh->bfd_info);
 
                pim_bfd_reg_dereg_nbr(neigh, command);
        }
@@ -170,7 +170,7 @@ void pim_bfd_trigger_event(struct pim_interface *pim_ifp,
                pim_bfd_info_nbr_create(pim_ifp, nbr);
                pim_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_REGISTER);
        } else {
-               pim_bfd_info_free((void *)&nbr->bfd_info);
+               pim_bfd_info_free(&nbr->bfd_info);
                pim_bfd_reg_dereg_nbr(nbr, ZEBRA_BFD_DEST_DEREGISTER);
        }
 }
index 0dfd80839fe62fe75ec23759f45a8bb43f46ddf7..83def93b6674130cdb6a5f35cd740477feb5581a 100644 (file)
@@ -36,5 +36,5 @@ void pim_bfd_trigger_event(struct pim_interface *pim_ifp,
                           struct pim_neighbor *nbr, uint8_t nbr_up);
 void pim_bfd_info_nbr_create(struct pim_interface *pim_ifp,
                             struct pim_neighbor *neigh);
-void pim_bfd_info_free(void **bfd_info);
+void pim_bfd_info_free(struct bfd_info **bfd_info);
 #endif /* _PIM_BFD_H */
index 5121dc94ca278c6dd885ca2a9f9c60ad40e11df7..e664bf3062b9e83ca3030a5c64c4eefb35d9dddc 100644 (file)
@@ -54,10 +54,10 @@ static void pim_instance_terminate(struct pim_instance *pim)
                pim->rpf_hash = NULL;
        }
 
-       pim_oil_terminate(pim);
-
        pim_if_terminate(pim);
 
+       pim_oil_terminate(pim);
+
        pim_msdp_exit(pim);
 
        XFREE(MTYPE_PIM_PIM_INSTANCE, pim);
index 951e743494a8f290ea6b806b4252e15a4c04dc1e..4910cb8b38085e1724bec0863abf6b5261a8b176 100644 (file)
@@ -1242,8 +1242,10 @@ static int pim_msdp_peer_comp(const void *p1, const void *p2)
 }
 
 /************************** Mesh group management **************************/
-static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
+static void pim_msdp_mg_free(struct pim_instance *pim)
 {
+       struct pim_msdp_mg *mg = pim->msdp.mg;
+
        /* If the mesh-group has valid member or src_ip don't delete it */
        if (!mg || mg->mbr_cnt || (mg->src_ip.s_addr != INADDR_ANY)) {
                return;
@@ -1258,8 +1260,7 @@ static void pim_msdp_mg_free(struct pim_instance *pim, struct pim_msdp_mg *mg)
        if (mg->mbr_list)
                list_delete_and_null(&mg->mbr_list);
 
-       XFREE(MTYPE_PIM_MSDP_MG, mg);
-       pim->msdp.mg = NULL;
+       XFREE(MTYPE_PIM_MSDP_MG, pim->msdp.mg);
 }
 
 static struct pim_msdp_mg *pim_msdp_mg_new(const char *mesh_group_name)
@@ -1299,7 +1300,7 @@ enum pim_msdp_err pim_msdp_mg_del(struct pim_instance *pim,
        mg->src_ip.s_addr = INADDR_ANY;
 
        /* free up the mesh-group */
-       pim_msdp_mg_free(pim, mg);
+       pim_msdp_mg_free(pim);
        return PIM_MSDP_ERR_NONE;
 }
 
@@ -1438,7 +1439,7 @@ enum pim_msdp_err pim_msdp_mg_mbr_del(struct pim_instance *pim,
 
        pim_msdp_mg_mbr_do_del(mg, mbr);
        /* if there are no references to the mg free it */
-       pim_msdp_mg_free(pim, mg);
+       pim_msdp_mg_free(pim);
 
        return PIM_MSDP_ERR_NONE;
 }
@@ -1475,7 +1476,7 @@ enum pim_msdp_err pim_msdp_mg_src_del(struct pim_instance *pim,
                mg->src_ip.s_addr = INADDR_ANY;
                pim_msdp_mg_src_do_del(pim);
                /* if there are no references to the mg free it */
-               pim_msdp_mg_free(pim, mg);
+               pim_msdp_mg_free(pim);
        }
        return PIM_MSDP_ERR_NONE;
 }
@@ -1598,7 +1599,10 @@ void pim_msdp_exit(struct pim_instance *pim)
 
        /* XXX: stop listener and delete all peer sessions */
 
+       pim_msdp_mg_free(pim);
+
        if (pim->msdp.peer_hash) {
+               hash_clean(pim->msdp.peer_hash, NULL);
                hash_free(pim->msdp.peer_hash);
                pim->msdp.peer_hash = NULL;
        }
@@ -1608,6 +1612,7 @@ void pim_msdp_exit(struct pim_instance *pim)
        }
 
        if (pim->msdp.sa_hash) {
+               hash_clean(pim->msdp.sa_hash, NULL);
                hash_free(pim->msdp.sa_hash);
                pim->msdp.sa_hash = NULL;
        }
@@ -1615,4 +1620,8 @@ void pim_msdp_exit(struct pim_instance *pim)
        if (pim->msdp.sa_list) {
                list_delete_and_null(&pim->msdp.sa_list);
        }
+
+       if (pim->msdp.work_obuf)
+               stream_free(pim->msdp.work_obuf);
+       pim->msdp.work_obuf = NULL;
 }
index 2730f5e7aa36c86095966703b54ac346f0a558b4..e73422331f7c56918ce0a493abbd3fc2101f2354 100644 (file)
@@ -409,6 +409,9 @@ void pim_neighbor_free(struct pim_neighbor *neigh)
        list_delete_and_null(&neigh->upstream_jp_agg);
        THREAD_OFF(neigh->jp_timer);
 
+       if (neigh->bfd_info)
+               pim_bfd_info_free(&neigh->bfd_info);
+
        XFREE(MTYPE_PIM_NEIGHBOR, neigh);
 }
 
index b41124376f9f2546e31f61aec6f05b671ebfeba0..4230c127ad31031f89ef4784ad3fd395bd847391 100644 (file)
@@ -52,8 +52,5 @@ void pim_route_map_init(void)
 
 void pim_route_map_terminate(void)
 {
-       route_map_add_hook(NULL);
-       route_map_delete_hook(NULL);
-       route_map_event_hook(NULL);
        route_map_finish();
 }
index c1623ec15e7ebd6779e3d409786418e07dff96cd..5007d6c174d2fd9816ccacc5617bd968c1b7759c 100644 (file)
@@ -62,6 +62,9 @@ void pim_rp_list_hash_clean(void *data)
 
 static void pim_rp_info_free(struct rp_info *rp_info)
 {
+       if (rp_info->plist)
+               XFREE(MTYPE_PIM_FILTER_NAME, rp_info->plist);
+
        XFREE(MTYPE_PIM_RP, rp_info);
 }
 
@@ -600,7 +603,6 @@ int pim_rp_del(struct pim_instance *pim, const char *rp,
 
        if (rp_info->plist) {
                XFREE(MTYPE_PIM_FILTER_NAME, rp_info->plist);
-               rp_info->plist = NULL;
                was_plist = true;
        }
 
index d35f5cff7e3ceeadd046f21f2fa52993e56369f3..1f7cfcaa91e5d0828e0f4fbe581bd3966c581066 100644 (file)
@@ -146,6 +146,11 @@ void *pim_ssm_init(void)
 
 void pim_ssm_terminate(struct pim_ssm *ssm)
 {
-       if (ssm && ssm->plist_name)
+       if (!ssm)
+               return;
+
+       if (ssm->plist_name)
                XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name);
+
+       XFREE(MTYPE_PIM_SSM_INFO, ssm);
 }
index e3488b6a66d7423b527e358fa1e48cc4689583cb..db89125a98244a3d6be0d7b21f453bb5255c86bb 100644 (file)
@@ -192,7 +192,8 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
        up->rpf.source_nexthop.interface = NULL;
 
        if (up->sg.src.s_addr != INADDR_ANY) {
-               wheel_remove_item(pim->upstream_sg_wheel, up);
+               if (pim->upstream_sg_wheel)
+                       wheel_remove_item(pim->upstream_sg_wheel, up);
                notify_msdp = true;
        }
 
@@ -1546,6 +1547,10 @@ void pim_upstream_terminate(struct pim_instance *pim)
        if (pim->upstream_hash)
                hash_free(pim->upstream_hash);
        pim->upstream_hash = NULL;
+
+       if (pim->upstream_sg_wheel)
+               wheel_delete(pim->upstream_sg_wheel);
+       pim->upstream_sg_wheel = NULL;
 }
 
 int pim_upstream_equal(const void *arg1, const void *arg2)
index 5f871026266ae423d21f3fa00153b80524b5df2a..cb7b8b589afbfd2fbec846ebfbffbf97faf6a712 100644 (file)
@@ -79,8 +79,6 @@ static void pim_free()
        pim_route_map_terminate();
 
        zclient_lookup_free();
-
-       zprivs_terminate(&pimd_privs);
 }
 
 void pim_init()
index c627bda4f7c34f5fb2135c1b71629014f3dcaf67..a5c2cd69f30ad733a63d429175fbba9cea1a5ff4 100644 (file)
@@ -1085,6 +1085,7 @@ void kernel_init(struct zebra_ns *zns)
        if (nl_rcvbufsize)
                netlink_recvbuf(&zns->netlink, nl_rcvbufsize);
 
+       assert(zns->netlink.sock >= 0);
        netlink_install_filter(zns->netlink.sock,
                               zns->netlink_cmd.snl.nl_pid);
        zns->t_netlink = NULL;