56a57,63
> enum mpls_packet_type {
> PT_UNKNOWN,
> PT_IPV4,
> PT_IPV6,
> PT_OSI
> };
>
65c72,73
< u_int16_t label_stack_depth = 0;
---
> u_int16_t label_stack_depth = 0;
> enum mpls_packet_type pt = PT_UNKNOWN;
73,75c81,83
< label_stack_depth ? "\n\t" : " ",
< MPLS_LABEL(label_entry));
< label_stack_depth++;
---
> (label_stack_depth && vflag) ? "\n\t" : " ",
> MPLS_LABEL(label_entry));
> label_stack_depth++;
86a95,97
> /*
> * Try to figure out the packet type.
> */
87a99
>
89,94c101,102
< case 3: /* IPv4 implicit NULL label */
< if (vflag>0) {
< printf("\n\t");
< ip_print(gndo, p, length - (p - bp));
< }
< else printf(", IP, length: %u",length);
---
> case 3: /* IPv4 implicit NULL label */
> pt = PT_IPV4;
96c104
< #ifdef INET6
---
>
98,102c106
< if (vflag>0) {
< printf("\n\t");
< ip6_print(p, length - (p - bp));
< }
< else printf(", IPv6, length: %u",length);
---
> pt = PT_IPV6;
104c108
< #endif
---
>
108,116c112,133
< * encoding, however draft-hsmit-isis-aal5mux-00.txt describes
< * a technique that looks at the first payload byte if the BOS (bottom of stack)
< * bit is set and tries to determine the network layer protocol
< * 0x45-0x4f is IPv4
< * 0x60-0x6f is IPv6
< * 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS)
< * this technique is sometimes known as NULL encapsulation
< * and decoding is particularly useful for control-plane traffic [BGP]
< * which cisco by default sends MPLS encapsulated
---
> * encoding.
> *
> * However, draft-hsmit-isis-aal5mux-00.txt describes a
> * technique for encapsulating IS-IS and IP traffic on the
> * same ATM virtual circuit; you look at the first payload
> * byte to determine the network layer protocol, based on
> * the fact that
> *
> * 1) the first byte of an IP header is 0x45-0x4f
> * for IPv4 and 0x60-0x6f for IPv6;
> *
> * 2) the first byte of an OSI CLNP packet is 0x81,
> * the first byte of an OSI ES-IS packet is 0x82,
> * and the first byte of an OSI IS-IS packet is
> * 0x83;
> *
> * so the network layer protocol can be inferred from the
> * first byte of the packet, if the protocol is one of the
> * ones listed above.
> *
> * Cisco sends control-plane traffic MPLS-encapsulated in
> * this fashion.
117a135
> switch(*p) {
119,137c137,200
< if (MPLS_STACK(label_entry)) { /* only do this if the stack bit is set */
< switch(*p) {
< case 0x45:
< case 0x46:
< case 0x47:
< case 0x48:
< case 0x49:
< case 0x4a:
< case 0x4b:
< case 0x4c:
< case 0x4d:
< case 0x4e:
< case 0x4f:
< if (vflag>0) {
< printf("\n\t");
< ip_print(gndo, p, length - (p - bp));
< }
< else printf(", IP, length: %u",length);
< break;
---
> case 0x45:
> case 0x46:
> case 0x47:
> case 0x48:
> case 0x49:
> case 0x4a:
> case 0x4b:
> case 0x4c:
> case 0x4d:
> case 0x4e:
> case 0x4f:
> pt = PT_IPV4;
> break;
>
> case 0x60:
> case 0x61:
> case 0x62:
> case 0x63:
> case 0x64:
> case 0x65:
> case 0x66:
> case 0x67:
> case 0x68:
> case 0x69:
> case 0x6a:
> case 0x6b:
> case 0x6c:
> case 0x6d:
> case 0x6e:
> case 0x6f:
> pt = PT_IPV6;
> break;
>
> case 0x81:
> case 0x82:
> case 0x83:
> pt = PT_OSI;
> break;
>
> default:
> /* ok bail out - we did not figure out what it is*/
> break;
> }
> }
>
> /*
> * Print the payload.
> */
> if (pt == PT_UNKNOWN) {
> if (!suppress_default_print)
> default_print(p, length - (p - bp));
> return;
> }
> if (vflag)
> printf("\n\t");
> else
> printf(" ");
> switch (pt) {
>
> case PT_IPV4:
> ip_print(gndo, p, length - (p - bp));
> break;
>
> case PT_IPV6:
139,160c202,204
< case 0x60:
< case 0x61:
< case 0x62:
< case 0x63:
< case 0x64:
< case 0x65:
< case 0x66:
< case 0x67:
< case 0x68:
< case 0x69:
< case 0x6a:
< case 0x6b:
< case 0x6c:
< case 0x6d:
< case 0x6e:
< case 0x6f:
< if (vflag>0) {
< printf("\n\t");
< ip6_print(p, length - (p - bp));
< }
< else printf(", IPv6, length: %u",length);
< break;
---
> ip6_print(gndo, p, length - (p - bp));
> #else
> printf("IPv6, length: %u", length);
162,176c206,213
< case 0x81:
< case 0x82:
< case 0x83:
< if (vflag>0) {
< printf("\n\t");
< isoclns_print(p, length - (p - bp), length - (p - bp));
< }
< else printf(", OSI, length: %u",length);
< break;
< default:
< /* ok bail out - we did not figure out what it is*/
< break;
< }
< }
< return;
---
> break;
>
> case PT_OSI:
> isoclns_print(p, length - (p - bp), length - (p - bp));
> break;
>
> default:
> break;
177a215
> return;
> enum mpls_packet_type {
> PT_UNKNOWN,
> PT_IPV4,
> PT_IPV6,
> PT_OSI
> };
>
65c72,73
< u_int16_t label_stack_depth = 0;
---
> u_int16_t label_stack_depth = 0;
> enum mpls_packet_type pt = PT_UNKNOWN;
73,75c81,83
< label_stack_depth ? "\n\t" : " ",
< MPLS_LABEL(label_entry));
< label_stack_depth++;
---
> (label_stack_depth && vflag) ? "\n\t" : " ",
> MPLS_LABEL(label_entry));
> label_stack_depth++;
86a95,97
> /*
> * Try to figure out the packet type.
> */
87a99
>
89,94c101,102
< case 3: /* IPv4 implicit NULL label */
< if (vflag>0) {
< printf("\n\t");
< ip_print(gndo, p, length - (p - bp));
< }
< else printf(", IP, length: %u",length);
---
> case 3: /* IPv4 implicit NULL label */
> pt = PT_IPV4;
96c104
< #ifdef INET6
---
>
98,102c106
< if (vflag>0) {
< printf("\n\t");
< ip6_print(p, length - (p - bp));
< }
< else printf(", IPv6, length: %u",length);
---
> pt = PT_IPV6;
104c108
< #endif
---
>
108,116c112,133
< * encoding, however draft-hsmit-isis-aal5mux-00.txt describes
< * a technique that looks at the first payload byte if the BOS (bottom of stack)
< * bit is set and tries to determine the network layer protocol
< * 0x45-0x4f is IPv4
< * 0x60-0x6f is IPv6
< * 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS)
< * this technique is sometimes known as NULL encapsulation
< * and decoding is particularly useful for control-plane traffic [BGP]
< * which cisco by default sends MPLS encapsulated
---
> * encoding.
> *
> * However, draft-hsmit-isis-aal5mux-00.txt describes a
> * technique for encapsulating IS-IS and IP traffic on the
> * same ATM virtual circuit; you look at the first payload
> * byte to determine the network layer protocol, based on
> * the fact that
> *
> * 1) the first byte of an IP header is 0x45-0x4f
> * for IPv4 and 0x60-0x6f for IPv6;
> *
> * 2) the first byte of an OSI CLNP packet is 0x81,
> * the first byte of an OSI ES-IS packet is 0x82,
> * and the first byte of an OSI IS-IS packet is
> * 0x83;
> *
> * so the network layer protocol can be inferred from the
> * first byte of the packet, if the protocol is one of the
> * ones listed above.
> *
> * Cisco sends control-plane traffic MPLS-encapsulated in
> * this fashion.
117a135
> switch(*p) {
119,137c137,200
< if (MPLS_STACK(label_entry)) { /* only do this if the stack bit is set */
< switch(*p) {
< case 0x45:
< case 0x46:
< case 0x47:
< case 0x48:
< case 0x49:
< case 0x4a:
< case 0x4b:
< case 0x4c:
< case 0x4d:
< case 0x4e:
< case 0x4f:
< if (vflag>0) {
< printf("\n\t");
< ip_print(gndo, p, length - (p - bp));
< }
< else printf(", IP, length: %u",length);
< break;
---
> case 0x45:
> case 0x46:
> case 0x47:
> case 0x48:
> case 0x49:
> case 0x4a:
> case 0x4b:
> case 0x4c:
> case 0x4d:
> case 0x4e:
> case 0x4f:
> pt = PT_IPV4;
> break;
>
> case 0x60:
> case 0x61:
> case 0x62:
> case 0x63:
> case 0x64:
> case 0x65:
> case 0x66:
> case 0x67:
> case 0x68:
> case 0x69:
> case 0x6a:
> case 0x6b:
> case 0x6c:
> case 0x6d:
> case 0x6e:
> case 0x6f:
> pt = PT_IPV6;
> break;
>
> case 0x81:
> case 0x82:
> case 0x83:
> pt = PT_OSI;
> break;
>
> default:
> /* ok bail out - we did not figure out what it is*/
> break;
> }
> }
>
> /*
> * Print the payload.
> */
> if (pt == PT_UNKNOWN) {
> if (!suppress_default_print)
> default_print(p, length - (p - bp));
> return;
> }
> if (vflag)
> printf("\n\t");
> else
> printf(" ");
> switch (pt) {
>
> case PT_IPV4:
> ip_print(gndo, p, length - (p - bp));
> break;
>
> case PT_IPV6:
139,160c202,204
< case 0x60:
< case 0x61:
< case 0x62:
< case 0x63:
< case 0x64:
< case 0x65:
< case 0x66:
< case 0x67:
< case 0x68:
< case 0x69:
< case 0x6a:
< case 0x6b:
< case 0x6c:
< case 0x6d:
< case 0x6e:
< case 0x6f:
< if (vflag>0) {
< printf("\n\t");
< ip6_print(p, length - (p - bp));
< }
< else printf(", IPv6, length: %u",length);
< break;
---
> ip6_print(gndo, p, length - (p - bp));
> #else
> printf("IPv6, length: %u", length);
162,176c206,213
< case 0x81:
< case 0x82:
< case 0x83:
< if (vflag>0) {
< printf("\n\t");
< isoclns_print(p, length - (p - bp), length - (p - bp));
< }
< else printf(", OSI, length: %u",length);
< break;
< default:
< /* ok bail out - we did not figure out what it is*/
< break;
< }
< }
< return;
---
> break;
>
> case PT_OSI:
> isoclns_print(p, length - (p - bp), length - (p - bp));
> break;
>
> default:
> break;
177a215
> return;