]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ip.c
Default to first interface from pcap_findalldevs()
[tcpdump] / print-ip.c
index f18c7e57c51ebeabb9267d98fa531c3f6d499a7b..32304aedf80b76e2624ad23d13032f4d76cbf48f 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
 
 #include <string.h>
 
-#include "interface.h"
+#include "netdissect.h"
 #include "addrtoname.h"
-#include "extract.h"                   /* must come after interface.h */
+#include "extract.h"
 
 #include "ip.h"
 #include "ipproto.h"
@@ -84,14 +83,14 @@ ip_printroute(netdissect_options *ndo,
  * This is used for UDP and TCP pseudo-header in the checksum
  * calculation.
  */
-static u_int32_t
+static uint32_t
 ip_finddst(netdissect_options *ndo,
            const struct ip *ip)
 {
        int length;
        int len;
        const u_char *cp;
-       u_int32_t retval;
+       uint32_t retval;
 
        cp = (const u_char *)(ip + 1);
        length = (IP_HL(ip) << 2) - sizeof(struct ip);
@@ -123,7 +122,7 @@ ip_finddst(netdissect_options *ndo,
                }
        }
 trunc:
-       UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+       UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(uint32_t));
        return retval;
 }
 
@@ -132,29 +131,29 @@ trunc:
  */
 int
 nextproto4_cksum(netdissect_options *ndo,
-                 const struct ip *ip, const u_int8_t *data,
+                 const struct ip *ip, const uint8_t *data,
                  u_int len, u_int covlen, u_int next_proto)
 {
        struct phdr {
-               u_int32_t src;
-               u_int32_t dst;
+               uint32_t src;
+               uint32_t dst;
                u_char mbz;
                u_char proto;
-               u_int16_t len;
+               uint16_t len;
        } ph;
        struct cksum_vec vec[2];
 
        /* pseudo-header.. */
-       ph.len = htons((u_int16_t)len);
+       ph.len = htons((uint16_t)len);
        ph.mbz = 0;
        ph.proto = next_proto;
-       UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
+       UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(uint32_t));
        if (IP_HL(ip) == 5)
-               UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+               UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(uint32_t));
        else
                ph.dst = ip_finddst(ndo, ip);
 
-       vec[0].ptr = (const u_int8_t *)(void *)&ph;
+       vec[0].ptr = (const uint8_t *)(void *)&ph;
        vec[0].len = sizeof(ph);
        vec[1].ptr = data;
        vec[1].len = covlen;
@@ -324,7 +323,6 @@ ip_print_demux(netdissect_options *ndo,
               struct ip_print_demux_state *ipds)
 {
        struct protoent *proto;
-       struct cksum_vec vec[1];
 
 again:
        switch (ipds->nh) {
@@ -436,12 +434,10 @@ again:
                }
                break;
 
-#ifdef INET6
        case IPPROTO_IPV6:
                /* ip6-in-ip encapsulation */
                ip6_print(ndo, ipds->cp, ipds->len);
                break;
-#endif /*INET6*/
 
        case IPPROTO_RSVP:
                rsvp_print(ndo, ipds->cp, ipds->len);
@@ -457,9 +453,7 @@ again:
                break;
 
        case IPPROTO_PIM:
-               vec[0].ptr = ipds->cp;
-               vec[0].len = ipds->len;
-               pim_print(ndo, ipds->cp, ipds->len, in_cksum(vec, 1));
+               pim_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip);
                break;
 
        case IPPROTO_VRRP:
@@ -525,22 +519,21 @@ ip_print(netdissect_options *ndo,
        const u_char *ipend;
        u_int hlen;
        struct cksum_vec vec[1];
-       u_int16_t sum, ip_sum;
+       uint16_t sum, ip_sum;
        struct protoent *proto;
 
        ipds->ip = (const struct ip *)bp;
+       ND_TCHECK(ipds->ip->ip_vhl);
        if (IP_V(ipds->ip) != 4) { /* print version if != 4 */
-           ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip)));
            if (IP_V(ipds->ip) == 6)
-             ND_PRINT((ndo, ", wrong link-layer encapsulation"));
+             ND_PRINT((ndo, "IP6, wrong link-layer encapsulation "));
+           else
+             ND_PRINT((ndo, "IP%u ", IP_V(ipds->ip)));
        }
        else if (!ndo->ndo_eflag)
                ND_PRINT((ndo, "IP "));
 
-       if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) {
-               ND_PRINT((ndo, "%s", tstr));
-               return;
-       }
+       ND_TCHECK(*ipds->ip);
        if (length < sizeof (struct ip)) {
                ND_PRINT((ndo, "truncated-ip %u", length));
                return;
@@ -618,12 +611,12 @@ ip_print(netdissect_options *ndo,
 
             if ((hlen - sizeof(struct ip)) > 0) {
                 ND_PRINT((ndo, ", options ("));
-                ip_optprint(ndo, (u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
+                ip_optprint(ndo, (const u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
                 ND_PRINT((ndo, ")"));
             }
 
-           if (!ndo->ndo_Kflag && (u_char *)ipds->ip + hlen <= ndo->ndo_snapend) {
-               vec[0].ptr = (const u_int8_t *)(void *)ipds->ip;
+           if (!ndo->ndo_Kflag && (const u_char *)ipds->ip + hlen <= ndo->ndo_snapend) {
+               vec[0].ptr = (const uint8_t *)(const void *)ipds->ip;
                vec[0].len = hlen;
                sum = in_cksum(vec, 1);
                if (sum != 0) {
@@ -669,6 +662,11 @@ ip_print(netdissect_options *ndo,
                                ND_PRINT((ndo, " ip-proto-%d", ipds->ip->ip_p));
                }
        }
+       return;
+
+trunc:
+       ND_PRINT((ndo, "%s", tstr));
+       return;
 }
 
 void
@@ -685,11 +683,9 @@ ipN_print(netdissect_options *ndo, register const u_char *bp, register u_int len
        case 4:
                ip_print (ndo, bp, length);
                return;
-#ifdef INET6
        case 6:
                ip6_print (ndo, bp, length);
                return;
-#endif
        default:
                ND_PRINT((ndo, "unknown ip %d", IP_V(&hdr)));
                return;