]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_evpn.c
Merge pull request #4850 from lkrishnamoor/show_cli
[mirror_frr.git] / bgpd / bgp_evpn.c
index e37581c8e2b12394da76125eaafa5aa88726ca8d..3f2f11dbe237781d1c1c55f5fef6893fc8a9092f 100644 (file)
@@ -4697,59 +4697,60 @@ void bgp_evpn_route2json(struct prefix_evpn *p, json_object *json)
 {
        char buf1[ETHER_ADDR_STRLEN];
        char buf2[PREFIX2STR_BUFFER];
+       uint8_t family;
+       uint8_t prefixlen;
 
        if (!json)
                return;
 
-       if (p->prefix.route_type == BGP_EVPN_IMET_ROUTE) {
-               json_object_int_add(json, "routeType", p->prefix.route_type);
+       json_object_int_add(json, "routeType", p->prefix.route_type);
+
+       switch (p->prefix.route_type) {
+       case BGP_EVPN_MAC_IP_ROUTE:
                json_object_int_add(json, "ethTag",
-                                   p->prefix.imet_addr.eth_tag);
-               json_object_int_add(json, "ipLen",
-                                   is_evpn_prefix_ipaddr_v4(p)
-                                           ? IPV4_MAX_BITLEN
-                                           : IPV6_MAX_BITLEN);
-               json_object_string_add(json, "ip",
-                                      inet_ntoa(p->prefix.imet_addr.ip.ipaddr_v4));
-       } else if (p->prefix.route_type == BGP_EVPN_MAC_IP_ROUTE) {
-               if (is_evpn_prefix_ipaddr_none(p)) {
-                       json_object_int_add(json, "routeType",
-                                           p->prefix.route_type);
-                       json_object_int_add(json, "ethTag",
-                                           p->prefix.macip_addr.eth_tag);
-                       json_object_int_add(json, "macLen", 8 * ETH_ALEN);
-                       json_object_string_add(json, "mac",
-                                              prefix_mac2str(&p->prefix.macip_addr.mac,
-                                                             buf1,
-                                                             sizeof(buf1)));
-               } else {
-                       uint8_t family;
+                       p->prefix.macip_addr.eth_tag);
+               json_object_int_add(json, "macLen", 8 * ETH_ALEN);
+               json_object_string_add(json, "mac",
+                       prefix_mac2str(&p->prefix.macip_addr.mac, buf1,
+                       sizeof(buf1)));
+
+               if (!is_evpn_prefix_ipaddr_none(p)) {
+                       family = is_evpn_prefix_ipaddr_v4(p) ? AF_INET :
+                               AF_INET6;
+                       prefixlen = (family == AF_INET) ?
+                               IPV4_MAX_BITLEN : IPV6_MAX_BITLEN;
+                       inet_ntop(family, &p->prefix.macip_addr.ip.ip.addr,
+                               buf2, PREFIX2STR_BUFFER);
+                       json_object_int_add(json, "ipLen", prefixlen);
+                       json_object_string_add(json, "ip", buf2);
+               }
+       break;
 
-                       family = is_evpn_prefix_ipaddr_v4(p) ? AF_INET
-                                                            : AF_INET6;
+       case BGP_EVPN_IMET_ROUTE:
+               json_object_int_add(json, "ethTag",
+                       p->prefix.imet_addr.eth_tag);
+               family = is_evpn_prefix_ipaddr_v4(p) ? AF_INET : AF_INET6;
+               prefixlen = (family == AF_INET) ?  IPV4_MAX_BITLEN :
+                       IPV6_MAX_BITLEN;
+               inet_ntop(family, &p->prefix.imet_addr.ip.ip.addr, buf2,
+                       PREFIX2STR_BUFFER);
+               json_object_int_add(json, "ipLen", prefixlen);
+               json_object_string_add(json, "ip", buf2);
+       break;
 
-                       json_object_int_add(json, "routeType",
-                                           p->prefix.route_type);
-                       json_object_int_add(json, "ethTag",
-                                           p->prefix.macip_addr.eth_tag);
-                       json_object_int_add(json, "macLen", 8 * ETH_ALEN);
-                       json_object_string_add(json, "mac",
-                                              prefix_mac2str(&p->prefix.macip_addr.mac,
-                                                             buf1,
-                                                             sizeof(buf1)));
-                       json_object_int_add(json, "ipLen",
-                                           is_evpn_prefix_ipaddr_v4(p)
-                                                   ? IPV4_MAX_BITLEN
-                                                   : IPV6_MAX_BITLEN);
-                       json_object_string_add(
-                               json, "ip",
-                               inet_ntop(family,
-                                         &p->prefix.macip_addr.ip.ip.addr,
-                                         buf2,
-                                         PREFIX2STR_BUFFER));
-               }
-       } else {
-               /* Currently, this is to cater to other AF_ETHERNET code. */
+       case BGP_EVPN_IP_PREFIX_ROUTE:
+               json_object_int_add(json, "ethTag",
+                       p->prefix.prefix_addr.eth_tag);
+               family = is_evpn_prefix_ipaddr_v4(p) ? AF_INET : AF_INET6;
+               inet_ntop(family, &p->prefix.prefix_addr.ip.ip.addr,
+                         buf2, sizeof(buf2));
+               json_object_int_add(json, "ipLen",
+                                   p->prefix.prefix_addr.ip_prefix_length);
+               json_object_string_add(json, "ip", buf2);
+       break;
+
+       default:
+       break;
        }
 }
 
@@ -6008,3 +6009,19 @@ void bgp_evpn_vrf_delete(struct bgp *bgp_vrf)
 {
        bgp_evpn_unmap_vrf_from_its_rts(bgp_vrf);
 }
+
+/*
+ * Get the prefixlen of the ip prefix carried within the type5 evpn route.
+ */
+int bgp_evpn_get_type5_prefixlen(struct prefix *pfx)
+{
+       struct prefix_evpn *evp = (struct prefix_evpn *)pfx;
+
+       if (!pfx || pfx->family != AF_EVPN)
+               return 0;
+
+       if (evp->prefix.route_type != BGP_EVPN_IP_PREFIX_ROUTE)
+               return 0;
+
+       return evp->prefix.prefix_addr.ip_prefix_length;
+}