add support for the ATTR SET attribute per draft-marques-ppvpn-ibgp
  TODO boundary and recursion check
add reference (draft-marques-ppvpn-rt-constrain)
  to the Route Target Information SAFI
diff --git a/print-bgp.c b/print-bgp.c
index e4b8330..2a4208d 100644
--- a/print-bgp.c
+++ b/print-bgp.c
@@ -36,7 +36,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-     "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.74 2003-11-16 09:36:15 guy Exp $";
+     "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.75 2003-12-23 22:07:56 hannes Exp $";
 #endif
 
 #include <tcpdump-stdinc.h>
@@ -139,6 +139,7 @@
 #define BGPTYPE_MP_REACH_NLRI		14	/* RFC2283 */
 #define BGPTYPE_MP_UNREACH_NLRI		15	/* RFC2283 */
 #define BGPTYPE_EXTD_COMMUNITIES        16      /* draft-ietf-idr-bgp-ext-communities */
+#define BGPTYPE_ATTR_SET               128      /* draft-marques-ppvpn-ibgp */
 
 static struct tok bgp_attr_values[] = {
     { BGPTYPE_ORIGIN,           "Origin"},
@@ -157,6 +158,7 @@
     { BGPTYPE_MP_REACH_NLRI,    "Multi-Protocol Reach NLRI"},
     { BGPTYPE_MP_UNREACH_NLRI,  "Multi-Protocol Unreach NLRI"},
     { BGPTYPE_EXTD_COMMUNITIES, "Extended Community"},
+    { BGPTYPE_ATTR_SET,         "Attribute Set"},
     { 255,                      "Reserved for development"},
     { 0, NULL}
 };
@@ -288,7 +290,7 @@
     { SAFNUM_VPNUNICAST,        "labeled VPN Unicast"},
     { SAFNUM_VPNMULTICAST,      "labeled VPN Multicast"},
     { SAFNUM_VPNUNIMULTICAST,   "labeled VPN Unicast+Multicast"},
-    { SAFNUM_RT_ROUTING_INFO,   "Route Target Routing Information"},
+    { SAFNUM_RT_ROUTING_INFO,   "Route Target Routing Information"}, /* draft-marques-ppvpn-rt-constrain-01.txt */
     { 0, NULL }
 };
 
@@ -1230,6 +1232,42 @@
                 }
                 break;
 
+        case BGPTYPE_ATTR_SET:
+                printf("\n\t    Origin AS: %u", EXTRACT_32BITS(tptr));
+                tptr+=4;
+                len -=4;
+
+                while (len >= 2 ) {
+                    int alen;
+                    struct bgp_attr bgpa;
+                    
+                    memcpy(&bgpa, tptr, sizeof(bgpa));
+                    alen = bgp_attr_len(&bgpa);
+                    tptr += bgp_attr_off(&bgpa);
+                    len -= bgp_attr_off(&bgpa);
+                    
+                    printf("\n\t      %s (%u), length: %u",
+                           tok2str(bgp_attr_values, "Unknown Attribute", bgpa.bgpa_type),
+                           bgpa.bgpa_type,
+                           alen);
+                    
+                    if (bgpa.bgpa_flags) {
+                        printf(", Flags [%s%s%s%s",
+                               bgpa.bgpa_flags & 0x80 ? "O" : "",
+                               bgpa.bgpa_flags & 0x40 ? "T" : "",
+                               bgpa.bgpa_flags & 0x20 ? "P" : "",
+                               bgpa.bgpa_flags & 0x10 ? "E" : "");
+                        if (bgpa.bgpa_flags & 0xf)
+                            printf("+%x", bgpa.bgpa_flags & 0xf);
+                        printf("]: ");
+                    }
+                    bgp_attr_print(&bgpa, tptr, alen); /* FIXME check for recursion */
+                    tptr += alen;
+                    len -= alen;
+		}
+
+           
+
 	default:
             printf("\n\t    no Attribute %u decoder",attr->bgpa_type); /* we have no decoder for the attribute */
             if (vflag <= 1)