]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_ecommunity.c
Merge pull request #3502 from donaldsharp/socket_to_me_baby
[mirror_frr.git] / bgpd / bgp_ecommunity.c
index 20f5e15d6943243bede138153551d16d53f8f262..ed0900a7218c93b14df79672bc6f52541631d6e7 100644 (file)
@@ -65,7 +65,6 @@ void ecommunity_free(struct ecommunity **ecom)
        if ((*ecom)->str)
                XFREE(MTYPE_ECOMMUNITY_STR, (*ecom)->str);
        XFREE(MTYPE_ECOMMUNITY, *ecom);
-       ecom = NULL;
 }
 
 static void ecommunity_hash_free(struct ecommunity *ecom)
@@ -254,16 +253,16 @@ unsigned int ecommunity_hash_make(void *arg)
 }
 
 /* Compare two Extended Communities Attribute structure.  */
-int ecommunity_cmp(const void *arg1, const void *arg2)
+bool ecommunity_cmp(const void *arg1, const void *arg2)
 {
        const struct ecommunity *ecom1 = arg1;
        const struct ecommunity *ecom2 = arg2;
 
        if (ecom1 == NULL && ecom2 == NULL)
-               return 1;
+               return true;
 
        if (ecom1 == NULL || ecom2 == NULL)
-               return 0;
+               return false;
 
        return (ecom1->size == ecom2->size
                && memcmp(ecom1->val, ecom2->val, ecom1->size * ECOMMUNITY_SIZE)
@@ -689,9 +688,23 @@ char *ecommunity_ecom2str(struct ecommunity *ecom, int format, int filter)
                        /* Low-order octet of type. */
                        sub_type = *pnt++;
                        if (sub_type != ECOMMUNITY_ROUTE_TARGET
-                           && sub_type != ECOMMUNITY_SITE_ORIGIN)
-                               unk_ecom = 1;
-                       else
+                           && sub_type != ECOMMUNITY_SITE_ORIGIN) {
+                               if (sub_type ==
+                                   ECOMMUNITY_FLOWSPEC_REDIRECT_IPV4 &&
+                                   type == ECOMMUNITY_ENCODE_IP) {
+                                       struct in_addr *ipv4 =
+                                               (struct in_addr *)pnt;
+                                       char ipv4str[INET_ADDRSTRLEN];
+
+                                       inet_ntop(AF_INET, ipv4,
+                                                 ipv4str,
+                                                 INET_ADDRSTRLEN);
+                                       len = sprintf(str_buf + str_pnt,
+                                                     "NH:%s:%d",
+                                                     ipv4str, pnt[5]);
+                               } else
+                                       unk_ecom = 1;
+                       } else
                                len = ecommunity_rt_soo_str(str_buf + str_pnt,
                                                            pnt, type, sub_type,
                                                            format);
@@ -740,6 +753,13 @@ char *ecommunity_ecom2str(struct ecommunity *ecom, int format, int filter)
                                else
                                        len = sprintf(str_buf + str_pnt,
                                                      "MM:%u", seqnum);
+                       } else if (*pnt == ECOMMUNITY_EVPN_SUBTYPE_ND) {
+                               uint8_t flags = *++pnt;
+
+                               if (flags
+                                   & ECOMMUNITY_EVPN_SUBTYPE_ND_ROUTER_FLAG)
+                                       len = sprintf(str_buf + str_pnt,
+                                                     "ND:Router Flag");
                        } else
                                unk_ecom = 1;
                } else if (type == ECOMMUNITY_ENCODE_REDIRECT_IP_NH) {
@@ -801,6 +821,21 @@ char *ecommunity_ecom2str(struct ecommunity *ecom, int format, int filter)
                                len = sprintf(
                                        str_buf + str_pnt,
                                        "FS:marking %u", *(pnt+5));
+                       } else if (*pnt
+                                  == ECOMMUNITY_EVPN_SUBTYPE_ES_IMPORT_RT) {
+                               struct ethaddr mac;
+
+                               pnt++;
+                               memcpy(&mac, pnt, ETH_ALEN);
+                               len = sprintf(
+                                       str_buf + str_pnt,
+                                       "ES-Import-Rt:%02x:%02x:%02x:%02x:%02x:%02x",
+                                       (uint8_t)mac.octet[0],
+                                       (uint8_t)mac.octet[1],
+                                       (uint8_t)mac.octet[2],
+                                       (uint8_t)mac.octet[3],
+                                       (uint8_t)mac.octet[4],
+                                       (uint8_t)mac.octet[5]);
                        } else
                                unk_ecom = 1;
                } else {