]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_routemap.c
Merge pull request #13368 from Keelan10/nhrpd-memory-leak
[mirror_frr.git] / bgpd / bgp_routemap.c
index 4fcee75ae09cfa7b195870cfae16533c158b20a8..10fc3ecda4455abb5e9ed8f4f3566dd950baf4de 100644 (file)
@@ -461,7 +461,8 @@ route_match_ip_address(void *rule, const struct prefix *prefix, void *object)
        if (prefix->family == AF_INET) {
                alist = access_list_lookup(AFI_IP, (char *)rule);
                if (alist == NULL) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Access-List Specified: %s does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -521,7 +522,8 @@ route_match_ip_next_hop(void *rule, const struct prefix *prefix, void *object)
 
                alist = access_list_lookup(AFI_IP, (char *)rule);
                if (alist == NULL) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Access-List Specified: %s does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -581,7 +583,8 @@ route_match_ip_route_source(void *rule, const struct prefix *pfx, void *object)
 
                alist = access_list_lookup(AFI_IP, (char *)rule);
                if (alist == NULL) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Access-List Specified: %s does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -676,7 +679,7 @@ route_match_address_prefix_list(void *rule, afi_t afi,
 
        plist = prefix_list_lookup(afi, (char *)rule);
        if (plist == NULL) {
-               if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+               if (unlikely(CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL)))
                        zlog_debug(
                                "%s: Prefix List %s specified does not exist defaulting to NO_MATCH",
                                __func__, (char *)rule);
@@ -737,7 +740,8 @@ route_match_ip_next_hop_prefix_list(void *rule, const struct prefix *prefix,
 
                plist = prefix_list_lookup(AFI_IP, (char *)rule);
                if (plist == NULL) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Prefix List %s specified does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -786,7 +790,8 @@ route_match_ipv6_next_hop_prefix_list(void *rule, const struct prefix *prefix,
 
                plist = prefix_list_lookup(AFI_IP6, (char *)rule);
                if (!plist) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Prefix List %s specified does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -891,7 +896,8 @@ route_match_ip_route_source_prefix_list(void *rule, const struct prefix *prefix,
 
                plist = prefix_list_lookup(AFI_IP, (char *)rule);
                if (plist == NULL) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Prefix List %s specified does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -956,7 +962,7 @@ route_match_mac_address(void *rule, const struct prefix *prefix, void *object)
 
        alist = access_list_lookup(AFI_L2VPN, (char *)rule);
        if (alist == NULL) {
-               if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+               if (unlikely(CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL)))
                        zlog_debug(
                                "%s: Access-List Specified: %s does not exist defaulting to NO_MATCH",
                                __func__, (char *)rule);
@@ -964,7 +970,7 @@ route_match_mac_address(void *rule, const struct prefix *prefix, void *object)
                return RMAP_NOMATCH;
        }
        if (prefix->u.prefix_evpn.route_type != BGP_EVPN_MAC_IP_ROUTE) {
-               if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+               if (unlikely(CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL)))
                        zlog_debug(
                                "%s: Prefix %pFX is not a EVPN MAC IP ROUTE defaulting to NO_MATCH",
                                __func__, prefix);
@@ -2861,6 +2867,29 @@ static const struct route_map_rule_cmd route_set_ecommunity_soo_cmd = {
        route_set_ecommunity_free,
 };
 
+static void *route_set_ecommunity_nt_compile(const char *arg)
+{
+       struct rmap_ecom_set *rcs;
+       struct ecommunity *ecom;
+
+       ecom = ecommunity_str2com(arg, ECOMMUNITY_NODE_TARGET, 0);
+       if (!ecom)
+               return NULL;
+
+       rcs = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct rmap_ecom_set));
+       rcs->ecom = ecommunity_intern(ecom);
+       rcs->none = false;
+
+       return rcs;
+}
+
+static const struct route_map_rule_cmd route_set_ecommunity_nt_cmd = {
+       "extcommunity nt",
+       route_set_ecommunity,
+       route_set_ecommunity_nt_compile,
+       route_set_ecommunity_free,
+};
+
 /* `set extcommunity bandwidth' */
 
 struct rmap_ecomm_lb_set {
@@ -3242,7 +3271,8 @@ route_match_ipv6_address(void *rule, const struct prefix *prefix, void *object)
        if (prefix->family == AF_INET6) {
                alist = access_list_lookup(AFI_IP6, (char *)rule);
                if (alist == NULL) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Access-List Specified: %s does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -3299,7 +3329,8 @@ route_match_ipv6_next_hop(void *rule, const struct prefix *prefix, void *object)
 
                alist = access_list_lookup(AFI_IP6, (char *)rule);
                if (!alist) {
-                       if (CHECK_FLAG(rmap_debug, DEBUG_ROUTEMAP_DETAIL))
+                       if (unlikely(CHECK_FLAG(rmap_debug,
+                                               DEBUG_ROUTEMAP_DETAIL)))
                                zlog_debug(
                                        "%s: Access-List Specified: %s does not exist defaulting to NO_MATCH",
                                        __func__, (char *)rule);
@@ -4357,7 +4388,7 @@ static void bgp_route_map_mark_update(const char *rmap_name)
        /* If new update is received before the current timer timed out,
         * turn it off and start a new timer.
         */
-       THREAD_OFF(bm->t_rmap_update);
+       EVENT_OFF(bm->t_rmap_update);
 
        /* rmap_update_timer of 0 means don't do route updates */
        if (bm->rmap_update_timer) {
@@ -6410,6 +6441,55 @@ ALIAS_YANG (no_set_ecommunity_lb,
             "BGP extended community attribute\n"
             "Link bandwidth extended community\n")
 
+DEFPY_YANG (set_ecommunity_nt,
+           set_ecommunity_nt_cmd,
+           "set extcommunity nt RTLIST...",
+           SET_STR
+           "BGP extended community attribute\n"
+           "Node Target extended community\n"
+           "Node Target ID\n")
+{
+       int idx_nt = 3;
+       char *str;
+       int ret;
+       const char *xpath =
+               "./set-action[action='frr-bgp-route-map:set-extcommunity-nt']";
+       char xpath_value[XPATH_MAXLEN];
+
+       nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL);
+
+       snprintf(xpath_value, sizeof(xpath_value),
+                "%s/rmap-set-action/frr-bgp-route-map:extcommunity-nt", xpath);
+       str = argv_concat(argv, argc, idx_nt);
+       nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, str);
+       ret = nb_cli_apply_changes(vty, NULL);
+       XFREE(MTYPE_TMP, str);
+       return ret;
+}
+
+DEFPY_YANG (no_set_ecommunity_nt,
+           no_set_ecommunity_nt_cmd,
+           "no set extcommunity nt RTLIST...",
+           NO_STR
+           SET_STR
+           "BGP extended community attribute\n"
+           "Node Target extended community\n"
+           "Node Target ID\n")
+{
+       const char *xpath =
+               "./set-action[action='frr-bgp-route-map:set-extcommunity-nt']";
+       nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL);
+       return nb_cli_apply_changes(vty, NULL);
+}
+
+ALIAS_YANG (no_set_ecommunity_nt,
+            no_set_ecommunity_nt_short_cmd,
+            "no set extcommunity nt",
+            NO_STR
+            SET_STR
+            "BGP extended community attribute\n"
+            "Node Target extended community\n")
+
 DEFUN_YANG (set_origin,
            set_origin_cmd,
            "set origin <egp|igp|incomplete>",
@@ -7215,6 +7295,7 @@ void bgp_route_map_init(void)
        route_map_install_set(&route_set_vpnv6_nexthop_cmd);
        route_map_install_set(&route_set_originator_id_cmd);
        route_map_install_set(&route_set_ecommunity_rt_cmd);
+       route_map_install_set(&route_set_ecommunity_nt_cmd);
        route_map_install_set(&route_set_ecommunity_soo_cmd);
        route_map_install_set(&route_set_ecommunity_lb_cmd);
        route_map_install_set(&route_set_ecommunity_none_cmd);
@@ -7317,6 +7398,9 @@ void bgp_route_map_init(void)
        install_element(RMAP_NODE, &no_set_ecommunity_lb_short_cmd);
        install_element(RMAP_NODE, &set_ecommunity_none_cmd);
        install_element(RMAP_NODE, &no_set_ecommunity_none_cmd);
+       install_element(RMAP_NODE, &set_ecommunity_nt_cmd);
+       install_element(RMAP_NODE, &no_set_ecommunity_nt_cmd);
+       install_element(RMAP_NODE, &no_set_ecommunity_nt_short_cmd);
 #ifdef KEEP_OLD_VPN_COMMANDS
        install_element(RMAP_NODE, &set_vpn_nexthop_cmd);
        install_element(RMAP_NODE, &no_set_vpn_nexthop_cmd);