This is part of the core VPN and Encap SAFI changes. 

Signed-off-by: Lou Berger <[email protected]>
Signed-off-by: David Lamparter <[email protected]>
---
 bgpd/bgp_mplsvpn.c | 81 ++++++++++++++++++++++++++++++++++++++++--------------
 bgpd/bgp_mplsvpn.h |  2 ++
 2 files changed, 62 insertions(+), 21 deletions(-)

diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index 18627ad..d5211d6 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -39,6 +39,7 @@ decode_rd_type (u_char *pnt)
   
   v = ((u_int16_t) *pnt++ << 8);
   v |= (u_int16_t) *pnt;
+
   return v;
 }
 
@@ -53,6 +54,7 @@ decode_label (u_char *pnt)
   return l;
 }
 
+/* type == RD_TYPE_AS */
 static void
 decode_rd_as (u_char *pnt, struct rd_as *rd_as)
 {
@@ -65,6 +67,20 @@ decode_rd_as (u_char *pnt, struct rd_as *rd_as)
   rd_as->val |= (u_int32_t) *pnt;
 }
 
+/* type == RD_TYPE_AS4 */
+static void
+decode_rd_as4 (u_char *pnt, struct rd_as *rd_as)
+{
+  rd_as->as  = (u_int32_t) *pnt++ << 24;
+  rd_as->as |= (u_int32_t) *pnt++ << 16;
+  rd_as->as |= (u_int32_t) *pnt++ << 8;
+  rd_as->as |= (u_int32_t) *pnt++;
+  
+  rd_as->val  = ((u_int16_t) *pnt++ << 8);
+  rd_as->val |= (u_int16_t) *pnt;
+}
+
+/* type == RD_TYPE_IP */
 static void
 decode_rd_ip (u_char *pnt, struct rd_ip *rd_ip)
 {
@@ -126,29 +142,31 @@ bgp_nlri_parse_vpnv4 (struct peer *peer, struct attr 
*attr,
       /* Decode RD type. */
       type = decode_rd_type (pnt + 3);
 
-      /* Decode RD value. */
-      if (type == RD_TYPE_AS)
-       decode_rd_as (pnt + 5, &rd_as);
-      else if (type == RD_TYPE_IP)
-       decode_rd_ip (pnt + 5, &rd_ip);
-      else
-       {
-         zlog_err ("Invalid RD type %d", type);
-         return -1;
-       }
+      switch (type)
+        {
+        case RD_TYPE_AS:
+          decode_rd_as (pnt + 5, &rd_as);
+          break;
+
+        case RD_TYPE_AS4:
+          decode_rd_as4 (pnt + 5, &rd_as);
+          break;
+
+        case RD_TYPE_IP:
+          decode_rd_ip (pnt + 5, &rd_ip);
+          break;
+
+        case RD_TYPE_EOI:
+          break;
+
+        default:
+          zlog_err ("Invalid RD type %d", type);
+          return -1;
+        }
 
       p.prefixlen = prefixlen - 88;
       memcpy (&p.u.prefix, pnt + 11, psize - 11);
 
-#if 0
-      if (type == RD_TYPE_AS)
-       zlog_info ("prefix %ld:%ld:%ld:%s/%d", label, rd_as.as, rd_as.val,
-                  inet_ntoa (p.u.prefix4), p.prefixlen);
-      else if (type == RD_TYPE_IP)
-       zlog_info ("prefix %ld:%s:%ld:%s/%d", label, inet_ntoa (rd_ip.ip),
-                  rd_ip.val, inet_ntoa (p.u.prefix4), p.prefixlen);
-#endif /* 0 */
-
       if (pnt + psize > lim)
        return -1;
 
@@ -273,12 +291,25 @@ prefix_rd2str (struct prefix_rd *prd, char *buf, size_t 
size)
       snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val);
       return buf;
     }
+  else if (type == RD_TYPE_AS4)
+    {
+      decode_rd_as4 (pnt + 2, &rd_as);
+      snprintf (buf, size, "%u:%d", rd_as.as, rd_as.val);
+      return buf;
+    }
   else if (type == RD_TYPE_IP)
     {
       decode_rd_ip (pnt + 2, &rd_ip);
       snprintf (buf, size, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
       return buf;
     }
+  else if (type == RD_TYPE_EOI)
+    {
+      snprintf(buf, size, "LHI:%d, %02x:%02x:%02x:%02x:%02x:%02x",
+               pnt[1], /* LHI */
+               pnt[2], pnt[3], pnt[4], pnt[5], pnt[6], pnt[7]); /* MAC */
+      return buf;
+    }
 
   return NULL;
 }
@@ -385,6 +416,8 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, 
struct prefix_rd *prd)
                     /* Decode RD value. */
                     if (type == RD_TYPE_AS)
                       decode_rd_as (pnt + 2, &rd_as);
+                    else if (type == RD_TYPE_AS4)
+                      decode_rd_as4 (pnt + 2, &rd_as);
                     else if (type == RD_TYPE_IP)
                       decode_rd_ip (pnt + 2, &rd_ip);
 
@@ -392,6 +425,8 @@ show_adj_route_vpn (struct vty *vty, struct peer *peer, 
struct prefix_rd *prd)
 
                     if (type == RD_TYPE_AS)
                       vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
+                    else if (type == RD_TYPE_AS4)
+                      vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
                     else if (type == RD_TYPE_IP)
                       vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
 
@@ -492,15 +527,19 @@ bgp_show_mpls_vpn (struct vty *vty, struct prefix_rd 
*prd, enum bgp_show_type ty
                    /* Decode RD value. */
                    if (type == RD_TYPE_AS)
                      decode_rd_as (pnt + 2, &rd_as);
+                   else if (type == RD_TYPE_AS4)
+                     decode_rd_as4 (pnt + 2, &rd_as);
                    else if (type == RD_TYPE_IP)
                      decode_rd_ip (pnt + 2, &rd_ip);
 
                    vty_out (vty, "Route Distinguisher: ");
 
                    if (type == RD_TYPE_AS)
-                     vty_out (vty, "%u:%d", rd_as.as, rd_as.val);
+                     vty_out (vty, "as2 %u:%d", rd_as.as, rd_as.val);
+                   else if (type == RD_TYPE_AS4)
+                     vty_out (vty, "as4 %u:%d", rd_as.as, rd_as.val);
                    else if (type == RD_TYPE_IP)
-                     vty_out (vty, "%s:%d", inet_ntoa (rd_ip.ip), rd_ip.val);
+                     vty_out (vty, "ip %s:%d", inet_ntoa (rd_ip.ip), 
rd_ip.val);
                  
                    vty_out (vty, "%s", VTY_NEWLINE);             
                    rd_header = 0;
diff --git a/bgpd/bgp_mplsvpn.h b/bgpd/bgp_mplsvpn.h
index b221c3b..0cb9dec 100644
--- a/bgpd/bgp_mplsvpn.h
+++ b/bgpd/bgp_mplsvpn.h
@@ -23,6 +23,8 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, 
Boston, MA
 
 #define RD_TYPE_AS      0
 #define RD_TYPE_IP      1
+#define RD_TYPE_AS4     2
+#define RD_TYPE_EOI    0xff00
 
 #define RD_ADDRSTRLEN  28
 
-- 
2.1.3


_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev

Reply via email to