]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ip.c
Merge pull request #372 from fxlb/print-telnet
[tcpdump] / print-ip.c
index eeaee9ae30714fdaff4035e10c8c942b9d50e4d0..6e76ecf39fb72c54d6de0bcbaa5c3bcdd4106277 100644 (file)
@@ -131,7 +131,7 @@ trunc:
  */
 int
 nextproto4_cksum(const struct ip *ip, const u_int8_t *data,
-                u_int len, u_int next_proto)
+                u_int len, u_int covlen, u_int next_proto)
 {
        struct phdr {
                u_int32_t src;
@@ -155,7 +155,7 @@ nextproto4_cksum(const struct ip *ip, const u_int8_t *data,
        vec[0].ptr = (const u_int8_t *)(void *)&ph;
        vec[0].len = sizeof(ph);
        vec[1].ptr = data;
-       vec[1].len = len;
+       vec[1].len = covlen;
        return (in_cksum(vec, 2));
 }
 
@@ -327,7 +327,7 @@ again:
 
        case IPPROTO_AH:
                ipds->nh = *ipds->cp;
-               ipds->advance = ah_print(ipds->cp);
+               ipds->advance = ah_print(gndo, ipds->cp);
                if (ipds->advance <= 0)
                        break;
                ipds->cp += ipds->advance;
@@ -351,7 +351,7 @@ again:
        case IPPROTO_IPCOMP:
        {
                int enh;
-               ipds->advance = ipcomp_print(ipds->cp, &enh);
+               ipds->advance = ipcomp_print(ndo, ipds->cp, &enh);
                if (ipds->advance <= 0)
                        break;
                ipds->cp += ipds->advance;
@@ -400,7 +400,7 @@ again:
                 * match was the current protocol number
                 * assignments say.
                 */
-               igrp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip);
+               igrp_print(ndo, ipds->cp, ipds->len);
                break;
 
        case IPPROTO_EIGRP:
@@ -449,7 +449,7 @@ again:
                break;
 
        case IPPROTO_MOBILE:
-               mobile_print(ipds->cp, ipds->len);
+               mobile_print(ndo, ipds->cp, ipds->len);
                break;
 
        case IPPROTO_PIM:
@@ -464,13 +464,14 @@ again:
                                (void)printf("carp %s > %s: ",
                                             ipaddr_string(&ipds->ip->ip_src),
                                             ipaddr_string(&ipds->ip->ip_dst));
-                       carp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl);
+                       carp_print(ndo, ipds->cp, ipds->len, ipds->ip->ip_ttl);
                } else {
                        if (vflag)
                                (void)printf("vrrp %s > %s: ",
                                             ipaddr_string(&ipds->ip->ip_src),
                                             ipaddr_string(&ipds->ip->ip_dst));
-                       vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl);
+                       vrrp_print(ipds->cp, ipds->len,
+                               (const u_char *)ipds->ip, ipds->ip->ip_ttl);
                }
                break;
 
@@ -669,14 +670,13 @@ ip_print(netdissect_options *ndo,
 void
 ipN_print(register const u_char *bp, register u_int length)
 {
-       struct ip *ip, hdr;
+       struct ip hdr;
 
-       ip = (struct ip *)bp;
        if (length < 4) {
                (void)printf("truncated-ip %d", length);
                return;
        }
-       memcpy (&hdr, (char *)ip, 4);
+       memcpy (&hdr, bp, 4);
        switch (IP_V(&hdr)) {
        case 4:
                ip_print (gndo, bp, length);