]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-ip.c
NDOize OpenFlow, IEEE slow and telnet decoders
[tcpdump] / print-ip.c
index 128834c40a5a97ab3434e233ba73ab3d9c98848f..540e0b7c1ef1c51a454314a0e3d01b3aea127770 100644 (file)
@@ -117,12 +117,12 @@ ip_finddst(const struct ip *ip)
                case IPOPT_LSRR:
                        if (len < 7)
                                break;
-                       memcpy(&retval, cp + len - 4, 4);
+                       UNALIGNED_MEMCPY(&retval, cp + len - 4, 4);
                        return retval;
                }
        }
 trunc:
-       memcpy(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+       UNALIGNED_MEMCPY(&retval, &ip->ip_dst.s_addr, sizeof(u_int32_t));
        return retval;
 }
 
@@ -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;
@@ -146,16 +146,16 @@ nextproto4_cksum(const struct ip *ip, const u_int8_t *data,
        ph.len = htons((u_int16_t)len);
        ph.mbz = 0;
        ph.proto = next_proto;
-       memcpy(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
+       UNALIGNED_MEMCPY(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
        if (IP_HL(ip) == 5)
-               memcpy(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
+               UNALIGNED_MEMCPY(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
        else
                ph.dst = ip_finddst(ip);
 
        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;
@@ -365,7 +365,7 @@ again:
                break;
 
        case IPPROTO_DCCP:
-               dccp_print(ipds->cp, (const u_char *)ipds->ip, ipds->len);
+               dccp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len);
                break;
 
        case IPPROTO_TCP:
@@ -376,13 +376,13 @@ again:
 
        case IPPROTO_UDP:
                /* pass on the MF bit plus the offset to detect fragments */
-               udp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
+               udp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
                          ipds->off & (IP_MF|IP_OFFMASK));
                break;
 
        case IPPROTO_ICMP:
                /* pass on the MF bit plus the offset to detect fragments */
-               icmp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
+               icmp_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip,
                           ipds->off & (IP_MF|IP_OFFMASK));
                break;
 
@@ -400,11 +400,11 @@ 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:
-               eigrp_print(ipds->cp, ipds->len);
+               eigrp_print(ndo, ipds->cp, ipds->len);
                break;
 
        case IPPROTO_ND:
@@ -445,11 +445,11 @@ again:
 
        case IPPROTO_GRE:
                /* do it */
-               gre_print(ipds->cp, ipds->len);
+               gre_print(ndo, ipds->cp, ipds->len);
                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;
 
@@ -667,23 +668,22 @@ ip_print(netdissect_options *ndo,
 }
 
 void
-ipN_print(register const u_char *bp, register u_int length)
+ipN_print(netdissect_options *ndo, 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);
+               ip_print (ndo, bp, length);
                return;
 #ifdef INET6
        case 6:
-               ip6_print (gndo, bp, length);
+               ip6_print (ndo, bp, length);
                return;
 #endif
        default: