]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ppp.c
Add changes in 4.2.1.
[tcpdump] / print-ppp.c
index e10cd251f0629964c874ef57c80305260574f412..ea8e00b244f9194d1810dc92a08791ad0f513c75 100644 (file)
@@ -31,7 +31,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.112 2005-06-18 23:55:24 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.114 2005-12-05 11:35:58 hannes Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -296,6 +296,20 @@ struct tok ipcpopt_values[] = {
        { 0,              NULL }
 };
 
+#define IPCPOPT_IPCOMP_HDRCOMP 0x61  /* rfc3544 */
+#define IPCPOPT_IPCOMP_MINLEN    14
+
+struct tok ipcpopt_compproto_values[] = {
+        { PPP_VJC, "VJ-Comp" },
+        { IPCPOPT_IPCOMP_HDRCOMP, "IP Header Compression" },
+       { 0,              NULL }
+};
+
+struct tok ipcpopt_compproto_subopt_values[] = {
+        { 1, "RTP-Compression" },
+        { 2, "Enhanced RTP-Compression" },
+       { 0,              NULL }
+};
 
 /* IP6CP Config Options */
 #define IP6CP_IFID      1
@@ -531,8 +545,9 @@ handle_ctrl_proto(u_int proto, const u_char *pptr, int length)
                printf("\n\t  Magic-Num 0x%08x", EXTRACT_32BITS(tptr));
                /* XXX: need to decode Data? - hexdump for now */
                 if (len > 8) {
-                        printf("\n\t  Data");
-                        print_unknown_data(tptr+4,"\n\t    ",len-4);
+                        printf("\n\t  -----trailing data-----");
+                        TCHECK2(tptr[4], len-8);
+                        print_unknown_data(tptr+4,"\n\t  ",len-8);
                 }
                break;
        case CPCODES_ID:
@@ -964,6 +979,7 @@ static int
 print_ipcp_config_options(const u_char *p, int length)
 {
        int len, opt;
+        u_int compproto, ipcomp_subopttotallen, ipcomp_subopt, ipcomp_suboptlen;
 
        if (length < 2)
                return 0;
@@ -998,11 +1014,62 @@ print_ipcp_config_options(const u_char *p, int length)
                if (len < 4)
                        goto invlen;
                TCHECK2(*(p + 2), 2);
-               if (EXTRACT_16BITS(p + 2) == PPP_VJC) {
-                       printf("VJ-Comp");
+                compproto = EXTRACT_16BITS(p+2);
+
+                printf("%s (0x%02x):",
+                       tok2str(ipcpopt_compproto_values,"Unknown",compproto),
+                       compproto);
+
+               switch (compproto) {
+                case PPP_VJC:
                        /* XXX: VJ-Comp parameters should be decoded */
-               } else
-                       printf("unknown-comp-proto %04x", EXTRACT_16BITS(p + 2));
+                        break;
+                case IPCPOPT_IPCOMP_HDRCOMP:
+                        if (len < IPCPOPT_IPCOMP_MINLEN)
+                                goto invlen;
+
+                        TCHECK2(*(p + 2), IPCPOPT_IPCOMP_MINLEN);
+                        printf("\n\t    TCP Space %u, non-TCP Space %u" \
+                               ", maxPeriod %u, maxTime %u, maxHdr %u",
+                               EXTRACT_16BITS(p+4),
+                               EXTRACT_16BITS(p+6),
+                               EXTRACT_16BITS(p+8),
+                               EXTRACT_16BITS(p+10),
+                               EXTRACT_16BITS(p+12));
+
+                        /* suboptions present ? */
+                        if (len > IPCPOPT_IPCOMP_MINLEN) {
+                                ipcomp_subopttotallen = len - IPCPOPT_IPCOMP_MINLEN;
+                                p += IPCPOPT_IPCOMP_MINLEN;
+                                
+                                printf("\n\t      Suboptions, length %u", ipcomp_subopttotallen);
+
+                                while (ipcomp_subopttotallen >= 2) {
+                                        TCHECK2(*p, 2);
+                                        ipcomp_subopt = *p;
+                                        ipcomp_suboptlen = *(p+1);
+                                        
+                                        /* sanity check */
+                                        if (ipcomp_subopt == 0 ||
+                                            ipcomp_suboptlen == 0 )
+                                                break;
+
+                                        /* XXX: just display the suboptions for now */
+                                        printf("\n\t\t%s Suboption #%u, length %u",
+                                               tok2str(ipcpopt_compproto_subopt_values,
+                                                       "Unknown",
+                                                       ipcomp_subopt),
+                                               ipcomp_subopt,
+                                               ipcomp_suboptlen);
+
+                                        ipcomp_subopttotallen -= ipcomp_suboptlen;
+                                        p += ipcomp_suboptlen;
+                                }
+                        }
+                        break;
+                default:
+                        break;
+               }
                break;
 
        case IPCPOPT_ADDR:     /* those options share the same format - fall through */
@@ -1236,11 +1303,11 @@ ppp_hdlc(const u_char *p, int length)
                goto cleanup;
 #ifdef INET6
         case PPP_IPV6:
-            ip6_print(b+1, t - b - 1);
-            goto cleanup;
+               ip6_print(gndo, b+1, t - b - 1);
+               goto cleanup;
 #endif
         default: /* no luck - try next guess */
-            break;
+               break;
         }
 
         proto = EXTRACT_16BITS(b); /* next guess - load two octets */
@@ -1301,7 +1368,7 @@ handle_ppp(u_int proto, const u_char *p, int length)
 #ifdef INET6
        case ETHERTYPE_IPV6:    /*XXX*/
        case PPP_IPV6:
-               ip6_print(p, length);
+               ip6_print(gndo, p, length);
                break;
 #endif
        case ETHERTYPE_IPX:     /*XXX*/
@@ -1562,7 +1629,7 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
                hdrlength += 1;
        } else {
                /* Un-compressed protocol field */
-               ptype = ntohs(*(u_int16_t *)p);
+               ptype = EXTRACT_16BITS(p);
                if (eflag)
                        printf("%04x ", ptype);
                p += 2;
@@ -1582,7 +1649,7 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
                 && ph->phdr_ctl == PPP_CONTROL) {
                        if (eflag)
                                printf("%02x %02x ", q[0], q[1]);
-                       ptype = ntohs(ph->phdr_type);
+                       ptype = EXTRACT_16BITS(&ph->phdr_type);
                        if (eflag && (ptype == PPP_VJC || ptype == PPP_VJNC)) {
                                printf("%s ", tok2str(ppptype2str,
                                                "proto-#%d", ptype));
@@ -1608,11 +1675,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
                        p += hdrlength;
                        switch (ptype) {
                        case PPP_IP:
-                               ip_print(p, length);
+                               ip_print(gndo, p, length);
                                break;
 #ifdef INET6
                        case PPP_IPV6:
-                               ip6_print(p, length);
+                               ip6_print(gndo, p, length);
                                break;
 #endif
                        case PPP_MPLS_UCAST:
@@ -1627,11 +1694,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
                        p += hdrlength;
                        switch (ptype) {
                        case PPP_IP:
-                               ip_print(p, length);
+                               ip_print(gndo, p, length);
                                break;
 #ifdef INET6
                        case PPP_IPV6:
-                               ip6_print(p, length);
+                               ip6_print(gndo, p, length);
                                break;
 #endif
                        case PPP_MPLS_UCAST:
@@ -1663,12 +1730,12 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
                break;
 #ifdef INET6
        case PPP_IPV6:
-               ip6_print(p, length);
+               ip6_print(gndo, p, length);
                break;
 #endif
         case PPP_MPLS_UCAST:
         case PPP_MPLS_MCAST:
-                mpls_print(p, length);
+                mpls_print(gndo, p, length);
                 break;
        default:
                printf("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype));