]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib: Enhance prefix dump for EVPN prefixes
authorvivek <vivek@cumulusnetworks.com>
Tue, 9 Aug 2016 22:55:51 +0000 (15:55 -0700)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 14 Feb 2017 12:58:58 +0000 (13:58 +0100)
This commit is also taking into account changes related to srcdes
feature introduction in zebra folder.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by: Donald Sharp <sharpd@cumulusnetworks.com>
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Ticket: CM-12262
Reviewed By: CCR-5065
Testing Done: Manual

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
lib/prefix.c
lib/prefix.h
lib/srcdest_table.c
lib/srcdest_table.h
zebra/rib.h
zebra/zebra_rib.c

index 06ed00baa9a4b5bb9e1ceb6d386dea0277002b09..6d3de3d6c67f65ef58df06d1895f6eb24cd25453 100644 (file)
@@ -859,23 +859,39 @@ str2prefix (const char *str, struct prefix *p)
 }
 
 const char *
-prefix2str (union prefix46constptr pu, char *str, int size)
+prefix2str (union prefixconstptr pu, char *str, int size)
 {
   const struct prefix *p = pu.p;
+  char buf[PREFIX2STR_BUFFER];
 
-  if (p->family == AF_ETHERNET)
-    {
-      snprintf(str, size, "%02x:%02x:%02x:%02x:%02x:%02x/%d",
-               p->u.prefix_eth.octet[0], p->u.prefix_eth.octet[1],
-               p->u.prefix_eth.octet[2], p->u.prefix_eth.octet[3],
-               p->u.prefix_eth.octet[4], p->u.prefix_eth.octet[5],
-               p->prefixlen);
-    }
-  else
+  switch (p->family)
     {
-      char buf[PREFIX2STR_BUFFER];
-      inet_ntop(p->family, &p->u.prefix, buf, sizeof(buf));
-      snprintf(str, size, "%s/%d", buf, p->prefixlen);
+      u_char family;
+
+      case AF_INET:
+      case AF_INET6:
+        snprintf (str, size, "%s/%d",
+                  inet_ntop (p->family, &p->u.prefix, buf, PREFIX2STR_BUFFER),
+                  p->prefixlen);
+        break;
+
+      case AF_ETHERNET:
+        if (p->u.prefix_evpn.route_type == 5)
+          {
+            family = (p->u.prefix_evpn.flags & (IP_ADDR_V4 | IP_PREFIX_V4)) ?
+              AF_INET : AF_INET6;
+            snprintf (str, size, "[%d]:[%u][%s]/%d",
+                      p->u.prefix_evpn.route_type,
+                      p->u.prefix_evpn.eth_tag,
+                      inet_ntop (family, &p->u.prefix_evpn.ip.addr,
+                                 buf, PREFIX2STR_BUFFER),
+                      p->prefixlen);
+          }
+        break;
+
+      default:
+        sprintf (str, "UNK prefix");
+        break;
     }
 
   return str;
index 1756dd21c8f62b722a1f619ae8c32a9687f3a7f2..5c1c71a7c0fffce3c5da475f543ad5b76e9a9db7 100644 (file)
@@ -69,6 +69,7 @@ struct evpn_addr
   u_char ip_prefix_length;
   union
   {
+    u_char addr;
     struct in_addr v4_addr;
     struct in6_addr v6_addr;
   } ip;
@@ -185,18 +186,20 @@ struct prefix_sg
  * side, which strips type safety since the cast will accept any pointer
  * type.)
  */
-union prefix46ptr
+union prefixptr
 {
   struct prefix *p;
   struct prefix_ipv4 *p4;
   struct prefix_ipv6 *p6;
+  struct prefix_evpn *evp;
 } __attribute__ ((transparent_union));
 
-union prefix46constptr
+union prefixconstptr
 {
   const struct prefix *p;
   const struct prefix_ipv4 *p4;
   const struct prefix_ipv6 *p6;
+  const struct prefix_evpn *evp;
 } __attribute__ ((transparent_union));
 
 #ifndef INET_ADDRSTRLEN
@@ -270,7 +273,7 @@ extern int str2prefix (const char *, struct prefix *);
 
 #define PREFIX2STR_BUFFER  PREFIX_STRLEN
 
-extern const char *prefix2str (union prefix46constptr, char *, int);
+extern const char *prefix2str (union prefixconstptr, char *, int);
 extern int prefix_match (const struct prefix *, const struct prefix *);
 extern int prefix_same (const struct prefix *, const struct prefix *);
 extern int prefix_cmp (const struct prefix *, const struct prefix *);
index dd148fa41d2b906277a34e9aa2776cb320f2b09c..04c9eff79a72fb9ec9d76e0b93c8e8be24dd5711 100644 (file)
@@ -242,7 +242,7 @@ srcdest_route_next(struct route_node *rn)
 }
 
 struct route_node *
-srcdest_rnode_get (struct route_table *table, union prefix46ptr dst_pu,
+srcdest_rnode_get (struct route_table *table, union prefixptr dst_pu,
                   struct prefix_ipv6 *src_p)
 {
   struct prefix_ipv6 *dst_p = dst_pu.p6;
@@ -253,7 +253,7 @@ srcdest_rnode_get (struct route_table *table, union prefix46ptr dst_pu,
 }
 
 struct route_node *
-srcdest_rnode_lookup (struct route_table *table, union prefix46ptr dst_pu,
+srcdest_rnode_lookup (struct route_table *table, union prefixptr dst_pu,
                       struct prefix_ipv6 *src_p)
 {
   struct prefix_ipv6 *dst_p = dst_pu.p6;
index 59111b5d17b6d414519757bec80e1f6c96724f53..207f5d121d9eacfb6f3a86dfb9f82100a6642594 100644 (file)
@@ -57,10 +57,10 @@ extern route_table_delegate_t _srcdest_srcnode_delegate;
 
 extern struct route_table *srcdest_table_init(void);
 extern struct route_node *srcdest_rnode_get(struct route_table *table,
-                                            union prefix46ptr dst_pu,
+                                            union prefixptr dst_pu,
                                             struct prefix_ipv6 *src_p);
 extern struct route_node *srcdest_rnode_lookup(struct route_table *table,
-                                            union prefix46ptr dst_pu,
+                                            union prefixptr dst_pu,
                                             struct prefix_ipv6 *src_p);
 extern void srcdest_rnode_prefixes (struct route_node *rn, struct prefix **p,
                                     struct prefix **src_p);
index b246b89a53ab03efe64aa9fec36479e6203df9cc..c0cde50baf46ad9319381138662abf421176d6de 100644 (file)
@@ -314,8 +314,8 @@ extern void rib_lookup_and_dump (struct prefix_ipv4 *, vrf_id_t);
 extern void rib_lookup_and_pushup (struct prefix_ipv4 *, vrf_id_t);
 #define rib_dump(prefix, src, rib) _rib_dump(__func__, prefix, src, rib)
 extern void _rib_dump (const char *,
-                      union prefix46constptr,
-                      union prefix46constptr, const struct rib *);
+                      union prefixconstptr,
+                      union prefixconstptr, const struct rib *);
 extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *,
                                   vrf_id_t);
 #define ZEBRA_RIB_LOOKUP_ERROR -1
index 13418c509e55607abedb02cf7a0de1421558542f..08874f22fc161a834b58fba35b8cb06b84d91fca 100644 (file)
@@ -2135,8 +2135,8 @@ rib_delnode (struct route_node *rn, struct rib *rib)
  */
 
 void _rib_dump (const char * func,
-                union prefix46constptr pp,
-                union prefix46constptr src_pp,
+                union prefixconstptr pp,
+                union prefixconstptr src_pp,
                 const struct rib * rib)
 {
   const struct prefix *p = pp.p;