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