]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ppp.c
CI: Add warning exemptions for Sun C (suncc-5.14) on Solaris 10
[tcpdump] / print-ppp.c
index d11fd5010cf01aa16c074edb056e108632525c74..f7af42a582f51bace038f1d84dc79b5dd2cd31db 100644 (file)
  * o BAP support
  */
 
-#ifdef HAVE_CONFIG_H
 #include <config.h>
-#endif
 
 #include "netdissect-stdinc.h"
 
-#ifdef __bsdi__
-#include <net/slcompress.h>
-#include <net/if_ppp.h>
-#endif
+#include <stdlib.h>
 
 #include "netdissect.h"
 #include "extract.h"
@@ -194,7 +189,7 @@ static const char *lcpconfopts[] = {
        "deprecated(12)",       /* used to be a Multi-Link-Procedure*/
        "Call-Back",            /* (13) */
        "deprecated(14)",       /* used to be a Connect-Time */
-       "deprecated(15)",       /* used to be a Compund-Frames */
+       "deprecated(15)",       /* used to be a Compound-Frames */
        "deprecated(16)",       /* used to be a Nominal-Data-Encap */
        "MRRU",                 /* (17) */
        "12-Bit seq #",         /* (18) */
@@ -700,7 +695,6 @@ print_lcp_config_options(netdissect_options *ndo,
                        ND_PRINT(" (length bogus, should be >= 3)");
                        return 0;
                }
-               ND_PRINT(": ");
                ND_PRINT(": Callback Operation %s (%u)",
                        tok2str(ppp_callback_values, "Unknown", GET_U_1(p + 2)),
                        GET_U_1(p + 2));
@@ -859,7 +853,7 @@ handle_chap(netdissect_options *ndo,
         * don't know which flavor of CHAP (i.e. CHAP-MD5, MS-CHAPv1,
         * MS-CHAPv2) is used at this point, we can't decode packet
         * specifically to each algorithms. Instead, we simply decode
-        * the GCD (Gratest Common Denominator) for all algorithms.
+        * the GCD (Greatest Common Denominator) for all algorithms.
         */
        switch (code) {
        case CHAP_CHAL:
@@ -877,19 +871,13 @@ handle_chap(netdissect_options *ndo,
                }
                name_size = len - (u_int)(p - p0);
                ND_PRINT(", Name ");
-               for (i = 0; i < name_size; i++) {
-                       fn_print_char(ndo, GET_U_1(p));
-                       p++;
-               }
+               nd_printjn(ndo, p, name_size);
                break;
        case CHAP_SUCC:
        case CHAP_FAIL:
                msg_size = len - (u_int)(p - p0);
                ND_PRINT(", Msg ");
-               for (i = 0; i< msg_size; i++) {
-                       fn_print_char(ndo, GET_U_1(p));
-                       p++;
-               }
+               nd_printjn(ndo, p, msg_size);
                break;
        }
 }
@@ -902,7 +890,6 @@ handle_pap(netdissect_options *ndo,
        u_int code, len;
        u_int peerid_len, passwd_len, msg_len;
        const u_char *p0;
-       u_int i;
 
        p0 = p;
        if (length < 1) {
@@ -947,10 +934,8 @@ handle_pap(netdissect_options *ndo,
                if (length - (p - p0) < peerid_len)
                        return;
                ND_PRINT(", Peer ");
-               for (i = 0; i < peerid_len; i++) {
-                       fn_print_char(ndo, GET_U_1(p));
-                       p++;
-               }
+               nd_printjn(ndo, p, peerid_len);
+               p += peerid_len;
 
                if (length - (p - p0) < 1)
                        return;
@@ -959,10 +944,7 @@ handle_pap(netdissect_options *ndo,
                if (length - (p - p0) < passwd_len)
                        return;
                ND_PRINT(", Name ");
-               for (i = 0; i < passwd_len; i++) {
-                       fn_print_char(ndo, GET_U_1(p));
-                       p++;
-               }
+               nd_printjn(ndo, p, passwd_len);
                break;
        case PAP_AACK:
        case PAP_ANAK:
@@ -980,10 +962,7 @@ handle_pap(netdissect_options *ndo,
                if (length - (p - p0) < msg_len)
                        return;
                ND_PRINT(", Msg ");
-               for (i = 0; i< msg_len; i++) {
-                       fn_print_char(ndo, GET_U_1(p));
-                       p++;
-               }
+               nd_printjn(ndo, p, msg_len);
                break;
        }
        return;
@@ -1363,7 +1342,6 @@ ppp_hdlc(netdissect_options *ndo,
        u_char *b, *t, c;
        const u_char *s;
        u_int i, proto;
-       const void *sb, *se;
 
        if (caplen == 0)
                return;
@@ -1371,9 +1349,11 @@ ppp_hdlc(netdissect_options *ndo,
         if (length == 0)
                 return;
 
-       b = (u_char *)nd_malloc(ndo, caplen);
-       if (b == NULL)
-               return;
+       b = (u_char *)malloc(caplen);
+       if (b == NULL) {
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                       "%s: malloc", __func__);
+       }
 
        /*
         * Unescape all the data into a temporary, private, buffer.
@@ -1394,13 +1374,15 @@ ppp_hdlc(netdissect_options *ndo,
        }
 
        /*
-        * Change the end pointer, so bounds checks work.
-        * Change the pointer to packet data to help debugging.
+        * Switch to the output buffer for dissection, and save it
+        * on the buffer stack so it can be freed; our caller must
+        * pop it when done.
         */
-       sb = ndo->ndo_packetp;
-       se = ndo->ndo_snapend;
-       ndo->ndo_packetp = b;
-       ndo->ndo_snapend = t;
+       if (!nd_push_buffer(ndo, b, b, (u_int)(t - b))) {
+               free(b);
+               (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
+                       "%s: can't push buffer on buffer stack", __func__);
+       }
        length = ND_BYTES_AVAILABLE_AFTER(b);
 
         /* now lets guess about the payload codepoint format */
@@ -1442,13 +1424,11 @@ ppp_hdlc(netdissect_options *ndo,
         }
 
 cleanup:
-       ndo->ndo_packetp = sb;
-       ndo->ndo_snapend = se;
+       nd_pop_packet_info(ndo);
         return;
 
 trunc:
-       ndo->ndo_packetp = sb;
-       ndo->ndo_snapend = se;
+       nd_pop_packet_info(ndo);
        nd_print_trunc(ndo);
 }
 
@@ -1732,166 +1712,3 @@ ppp_hdlc_if_print(netdissect_options *ndo,
 
        ndo->ndo_ll_hdr_len += hdrlen;
 }
-
-#define PPP_BSDI_HDRLEN 24
-
-/* BSD/OS specific PPP printer */
-void
-ppp_bsdos_if_print(netdissect_options *ndo,
-                   const struct pcap_pkthdr *h _U_, const u_char *p _U_)
-{
-       u_int hdrlength;
-#ifdef __bsdi__
-       u_int length = h->len;
-       u_int caplen = h->caplen;
-       uint16_t ptype;
-       uint8_t llhl;
-       const u_char *q;
-       u_int i;
-
-       ndo->ndo_protocol = "ppp_bsdos";
-       if (caplen < PPP_BSDI_HDRLEN) {
-               nd_print_trunc(ndo);
-               ndo->ndo_ll_hdr_len += caplen;
-               return;
-       }
-
-       hdrlength = 0;
-
-#if 0
-       if (GET_U_1(p) == PPP_ADDRESS &&
-           GET_U_1(p + 1) == PPP_CONTROL) {
-               if (ndo->ndo_eflag)
-                       ND_PRINT("%02x %02x ", GET_U_1(p),
-                                GET_U_1(p + 1));
-               p += 2;
-               hdrlength = 2;
-       }
-
-       if (ndo->ndo_eflag)
-               ND_PRINT("%u ", length);
-       /* Retrieve the protocol type */
-       if (GET_U_1(p) & 01) {
-               /* Compressed protocol field */
-               ptype = GET_U_1(p);
-               if (ndo->ndo_eflag)
-                       ND_PRINT("%02x ", ptype);
-               p++;
-               hdrlength += 1;
-       } else {
-               /* Un-compressed protocol field */
-               ptype = GET_BE_U_2(p);
-               if (ndo->ndo_eflag)
-                       ND_PRINT("%04x ", ptype);
-               p += 2;
-               hdrlength += 2;
-       }
-#else
-       ptype = 0;      /*XXX*/
-       if (ndo->ndo_eflag)
-               ND_PRINT("%c ", GET_U_1(p + SLC_DIR) ? 'O' : 'I');
-       llhl = GET_U_1(p + SLC_LLHL);
-       if (llhl) {
-               /* link level header */
-               struct ppp_header *ph;
-
-               q = p + SLC_BPFHDRLEN;
-               ph = (struct ppp_header *)q;
-               if (ph->phdr_addr == PPP_ADDRESS
-                && ph->phdr_ctl == PPP_CONTROL) {
-                       if (ndo->ndo_eflag)
-                               ND_PRINT("%02x %02x ", GET_U_1(q),
-                                        GET_U_1(q + 1));
-                       ptype = GET_BE_U_2(&ph->phdr_type);
-                       if (ndo->ndo_eflag && (ptype == PPP_VJC || ptype == PPP_VJNC)) {
-                               ND_PRINT("%s ", tok2str(ppptype2str,
-                                               "proto-#%u", ptype));
-                       }
-               } else {
-                       if (ndo->ndo_eflag) {
-                               ND_PRINT("LLH=[");
-                               for (i = 0; i < llhl; i++)
-                                       ND_PRINT("%02x", GET_U_1(q + i));
-                               ND_PRINT("] ");
-                       }
-               }
-       }
-       if (ndo->ndo_eflag)
-               ND_PRINT("%u ", length);
-       if (GET_U_1(p + SLC_CHL)) {
-               q = p + SLC_BPFHDRLEN + llhl;
-
-               switch (ptype) {
-               case PPP_VJC:
-                       ptype = vjc_print(ndo, q, ptype);
-                       hdrlength = PPP_BSDI_HDRLEN;
-                       p += hdrlength;
-                       switch (ptype) {
-                       case PPP_IP:
-                               ip_print(ndo, p, length);
-                               break;
-                       case PPP_IPV6:
-                               ip6_print(ndo, p, length);
-                               break;
-                       case PPP_MPLS_UCAST:
-                       case PPP_MPLS_MCAST:
-                               mpls_print(ndo, p, length);
-                               break;
-                       }
-                       goto printx;
-               case PPP_VJNC:
-                       ptype = vjc_print(ndo, q, ptype);
-                       hdrlength = PPP_BSDI_HDRLEN;
-                       p += hdrlength;
-                       switch (ptype) {
-                       case PPP_IP:
-                               ip_print(ndo, p, length);
-                               break;
-                       case PPP_IPV6:
-                               ip6_print(ndo, p, length);
-                               break;
-                       case PPP_MPLS_UCAST:
-                       case PPP_MPLS_MCAST:
-                               mpls_print(ndo, p, length);
-                               break;
-                       }
-                       goto printx;
-               default:
-                       if (ndo->ndo_eflag) {
-                               ND_PRINT("CH=[");
-                               for (i = 0; i < llhl; i++)
-                                       ND_PRINT("%02x",
-                                           GET_U_1(q + i));
-                               ND_PRINT("] ");
-                       }
-                       break;
-               }
-       }
-
-       hdrlength = PPP_BSDI_HDRLEN;
-#endif
-
-       length -= hdrlength;
-       p += hdrlength;
-
-       switch (ptype) {
-       case PPP_IP:
-               ip_print(p, length);
-               break;
-       case PPP_IPV6:
-               ip6_print(ndo, p, length);
-               break;
-       case PPP_MPLS_UCAST:
-       case PPP_MPLS_MCAST:
-               mpls_print(ndo, p, length);
-               break;
-       default:
-               ND_PRINT("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype));
-       }
-
-printx:
-#else /* __bsdi */
-       hdrlength = 0;
-#endif /* __bsdi__ */
-       ndo->ndo_ll_hdr_len += hdrlength;
-}