]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_routemap.c
bgpd: Strip `delete` keyword when looking up for lcommunities
[mirror_frr.git] / bgpd / bgp_routemap.c
index 18cb332ab7415f96cd580f7928eb3a4f302bc943..2e274124905042f1ccbcaf2c47d88453341c08a5 100644 (file)
@@ -197,8 +197,6 @@ static void *route_value_compile(const char *arg)
        }
 
        rv = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_value));
-       if (!rv)
-               return NULL;
 
        rv->action = action;
        rv->variable = var;
@@ -324,8 +322,7 @@ static void route_match_peer_free(void *rule)
 {
        struct bgp_match_peer_compiled *pc = rule;
 
-       if (pc->interface)
-               XFREE(MTYPE_ROUTE_MAP_COMPILED, pc->interface);
+       XFREE(MTYPE_ROUTE_MAP_COMPILED, pc->interface);
 
        XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);
 }
@@ -837,8 +834,6 @@ static void *route_match_vni_compile(const char *arg)
        char *end = NULL;
 
        vni = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(vni_t));
-       if (!vni)
-               return NULL;
 
        *vni = strtoul(arg, &end, 10);
        if (*end != '\0') {
@@ -910,10 +905,9 @@ struct route_map_rule_cmd route_match_evpn_route_type_cmd = {
        route_match_evpn_route_type_compile, route_match_evpn_route_type_free};
 
 /* Route map commands for VRF route leak with source vrf matching */
-static route_map_result_t route_match_vrl_source_vrf(void *rule,
-                                                    struct prefix *prefix,
-                                                    route_map_object_t type,
-                                                    void *object)
+static route_map_result_t
+route_match_vrl_source_vrf(void *rule, const struct prefix *prefix,
+                          route_map_object_t type, void *object)
 {
        struct bgp_path_info *path;
        char *vrf_name;
@@ -999,9 +993,6 @@ static void *route_match_local_pref_compile(const char *arg)
 
        local_pref = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(uint32_t));
 
-       if (!local_pref)
-               return local_pref;
-
        *local_pref = tmpval;
        return local_pref;
 }
@@ -1556,8 +1547,7 @@ static void route_set_ip_nexthop_free(void *rule)
 {
        struct rmap_ip_nexthop_set *rins = rule;
 
-       if (rins->address)
-               XFREE(MTYPE_ROUTE_MAP_COMPILED, rins->address);
+       XFREE(MTYPE_ROUTE_MAP_COMPILED, rins->address);
 
        XFREE(MTYPE_ROUTE_MAP_COMPILED, rins);
 }
@@ -2047,22 +2037,19 @@ static route_map_result_t route_set_lcommunity_delete(void *rule,
 static void *route_set_lcommunity_delete_compile(const char *arg)
 {
        struct rmap_community *rcom;
-       char *p;
-       char *str;
-       int len;
+       char **splits;
+       int num;
+
+       frrstr_split(arg, " ", &splits, &num);
 
        rcom = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_community));
+       rcom->name = XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, splits[0]);
+       rcom->name_hash = bgp_clist_hash_key(rcom->name);
 
-       p = strchr(arg, ' ');
-       if (p) {
-               len = p - arg;
-               str = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, len + 1);
-               memcpy(str, arg, len);
-       } else
-               str = NULL;
+       for (int i = 0; i < num; i++)
+               XFREE(MTYPE_TMP, splits[i]);
+       XFREE(MTYPE_TMP, splits);
 
-       rcom->name = str;
-       rcom->name_hash = bgp_clist_hash_key(rcom->name);
        return rcom;
 }
 
@@ -2142,22 +2129,12 @@ static route_map_result_t route_set_community_delete(
 static void *route_set_community_delete_compile(const char *arg)
 {
        struct rmap_community *rcom;
-       char *p;
-       char *str;
-       int len;
 
        rcom = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_community));
 
-       p = strchr(arg, ' ');
-       if (p) {
-               len = p - arg;
-               str = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, len + 1);
-               memcpy(str, arg, len);
-       } else
-               str = NULL;
-
-       rcom->name = str;
+       rcom->name = XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);
        rcom->name_hash = bgp_clist_hash_key(rcom->name);
+
        return rcom;
 }
 
@@ -2715,11 +2692,11 @@ route_set_ipv6_nexthop_prefer_global(void *rule, const struct prefix *prefix,
                    && peer->su_remote
                    && sockunion_family(peer->su_remote) == AF_INET6) {
                        /* Set next hop preference to global */
-                       path->attr->mp_nexthop_prefer_global = TRUE;
+                       path->attr->mp_nexthop_prefer_global = true;
                        SET_FLAG(path->attr->rmap_change_flags,
                                 BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED);
                } else {
-                       path->attr->mp_nexthop_prefer_global = FALSE;
+                       path->attr->mp_nexthop_prefer_global = false;
                        SET_FLAG(path->attr->rmap_change_flags,
                                 BATTR_RMAP_IPV6_PREFER_GLOBAL_CHANGED);
                }
@@ -3106,10 +3083,8 @@ static int bgp_route_match_delete(struct vty *vty, const char *command,
                break;
        }
 
-       if (dep_name)
-               XFREE(MTYPE_ROUTE_MAP_RULE, dep_name);
-       if (rmap_name)
-               XFREE(MTYPE_ROUTE_MAP_NAME, rmap_name);
+       XFREE(MTYPE_ROUTE_MAP_RULE, dep_name);
+       XFREE(MTYPE_ROUTE_MAP_NAME, rmap_name);
 
        return retval;
 }
@@ -3400,7 +3375,7 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
                                "Processing route_map %s update on advertise type5 route command",
                                rmap_name);
 
-               if (route_update) {
+               if (route_update && advertise_type5_routes(bgp, afi)) {
                        bgp_evpn_withdraw_type5_routes(bgp, afi, safi);
                        bgp_evpn_advertise_type5_routes(bgp, afi, safi);
                }
@@ -4352,17 +4327,13 @@ DEFUN (set_community_delete,
        "Delete matching communities\n")
 {
        int idx_comm_list = 2;
-       char *str;
-
-       str = XCALLOC(MTYPE_TMP,
-                     strlen(argv[idx_comm_list]->arg) + strlen(" delete") + 1);
-       strcpy(str, argv[idx_comm_list]->arg);
-       strcpy(str + strlen(argv[idx_comm_list]->arg), " delete");
+       char *args;
 
+       args = argv_concat(argv, argc, idx_comm_list);
        generic_set_add(vty, VTY_GET_CONTEXT(route_map_index), "comm-list",
-                       str);
+                       args);
+       XFREE(MTYPE_TMP, args);
 
-       XFREE(MTYPE_TMP, str);
        return CMD_SUCCESS;
 }
 
@@ -4451,16 +4422,14 @@ DEFUN (set_lcommunity_delete,
        "Large Community-list name\n"
        "Delete matching large communities\n")
 {
-       char *str;
-
-       str = XCALLOC(MTYPE_TMP, strlen(argv[2]->arg) + strlen(" delete") + 1);
-       strcpy(str, argv[2]->arg);
-       strcpy(str + strlen(argv[2]->arg), " delete");
+       int idx_lcomm_list = 2;
+       char *args;
 
+       args = argv_concat(argv, argc, idx_lcomm_list);
        generic_set_add(vty, VTY_GET_CONTEXT(route_map_index),
-                       "large-comm-list", str);
+                       "large-comm-list", args);
+       XFREE(MTYPE_TMP, args);
 
-       XFREE(MTYPE_TMP, str);
        return CMD_SUCCESS;
 }