]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-tcp.c
NDOize safeputs() and safeputchar()
[tcpdump] / print-tcp.c
index aedc666115a4af1b9012cbe3a83b42b4e9fb8138..4e970038bb86c4460944cae87959fd558e8a4a48 100644 (file)
@@ -24,8 +24,6 @@
  */
 
 #ifndef lint
-static const char rcsid[] _U_ =
-"@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.135 2008-11-09 23:35:03 mcr Exp $ (LBL)";
 #else
 __RCSID("$NetBSD: print-tcp.c,v 1.8 2007/07/24 11:53:48 drochner Exp $");
 #endif
@@ -144,8 +142,8 @@ static int tcp_cksum(register const struct ip *ip,
                     register const struct tcphdr *tp,
                     register u_int len)
 {
-       return (nextproto4_cksum(ip, (const u_int8_t *)tp, len,
-           IPPROTO_TCP));
+       return nextproto4_cksum(gndo, ip, (const u_int8_t *)tp, len, len,
+                               IPPROTO_TCP);
 }
 
 void
@@ -187,42 +185,6 @@ tcp_print(register const u_char *bp, register u_int length,
 
         hlen = TH_OFF(tp) * 4;
 
-        /*
-        * If data present, header length valid, and NFS port used,
-        * assume NFS.
-        * Pass offset of data plus 4 bytes for RPC TCP msg length
-        * to NFS print routines.
-        */
-       if (!qflag && hlen >= sizeof(*tp) && hlen <= length &&
-           (length - hlen) >= 4) {
-               u_char *fraglenp;
-               u_int32_t fraglen;
-               register struct sunrpc_msg *rp;
-               enum sunrpc_msg_type direction;
-
-               fraglenp = (u_char *)tp + hlen;
-               if (TTEST2(*fraglenp, 4)) {
-                       fraglen = EXTRACT_32BITS(fraglenp) & 0x7FFFFFFF;
-                       if (fraglen > (length - hlen) - 4)
-                               fraglen = (length - hlen) - 4;
-                       rp = (struct sunrpc_msg *)(fraglenp + 4);
-                       if (TTEST(rp->rm_direction)) {
-                               direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
-                               if (dport == NFS_PORT &&
-                                   direction == SUNRPC_CALL) {
-                                       nfsreq_print((u_char *)rp, fraglen,
-                                           (u_char *)ip);
-                                       return;
-                               }
-                               if (sport == NFS_PORT &&
-                                   direction == SUNRPC_REPLY) {
-                                       nfsreply_print((u_char *)rp, fraglen,
-                                           (u_char *)ip);
-                                       return;
-                               }
-                       }
-                }
-        }
 #ifdef INET6
         if (ip6) {
                 if (ip6->ip6_nxt == IPPROTO_TCP) {
@@ -296,16 +258,16 @@ tcp_print(register const u_char *bp, register u_int length,
                         if (sport > dport)
                                 rev = 1;
                         else if (sport == dport) {
-                                if (memcmp(src, dst, sizeof ip6->ip6_dst) > 0)
+                                if (UNALIGNED_MEMCMP(src, dst, sizeof ip6->ip6_dst) > 0)
                                         rev = 1;
                         }
                         if (rev) {
-                                memcpy(&tha.src, dst, sizeof ip6->ip6_dst);
-                                memcpy(&tha.dst, src, sizeof ip6->ip6_src);
+                                UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip6->ip6_dst);
+                                UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip6->ip6_src);
                                 tha.port = dport << 16 | sport;
                         } else {
-                                memcpy(&tha.dst, dst, sizeof ip6->ip6_dst);
-                                memcpy(&tha.src, src, sizeof ip6->ip6_src);
+                                UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip6->ip6_dst);
+                                UNALIGNED_MEMCPY(&tha.src, src, sizeof ip6->ip6_src);
                                 tha.port = sport << 16 | dport;
                         }
 
@@ -352,16 +314,16 @@ tcp_print(register const u_char *bp, register u_int length,
                         if (sport > dport)
                                 rev = 1;
                         else if (sport == dport) {
-                                if (memcmp(src, dst, sizeof ip->ip_dst) > 0)
+                                if (UNALIGNED_MEMCMP(src, dst, sizeof ip->ip_dst) > 0)
                                         rev = 1;
                         }
                         if (rev) {
-                                memcpy(&tha.src, dst, sizeof ip->ip_dst);
-                                memcpy(&tha.dst, src, sizeof ip->ip_src);
+                                UNALIGNED_MEMCPY(&tha.src, dst, sizeof ip->ip_dst);
+                                UNALIGNED_MEMCPY(&tha.dst, src, sizeof ip->ip_src);
                                 tha.port = dport << 16 | sport;
                         } else {
-                                memcpy(&tha.dst, dst, sizeof ip->ip_dst);
-                                memcpy(&tha.src, src, sizeof ip->ip_src);
+                                UNALIGNED_MEMCPY(&tha.dst, dst, sizeof ip->ip_dst);
+                                UNALIGNED_MEMCPY(&tha.src, src, sizeof ip->ip_src);
                                 tha.port = sport << 16 | dport;
                         }
 
@@ -424,7 +386,8 @@ tcp_print(register const u_char *bp, register u_int length,
 #ifdef INET6
                 else if (IP_V(ip) == 6 && ip6->ip6_plen) {
                         if (TTEST2(tp->th_sport, length)) {
-                                sum = nextproto6_cksum(ip6, (const u_int8_t *)tp, length, IPPROTO_TCP);
+                                sum = nextproto6_cksum(ip6, (const u_int8_t *)tp,
+                                                       length, length, IPPROTO_TCP);
                                 tcp_sum = EXTRACT_16BITS(&tp->th_sum);
 
                                 (void)printf(", cksum 0x%04x", tcp_sum);
@@ -488,7 +451,7 @@ tcp_print(register const u_char *bp, register u_int length,
 #define LENCHECK(l) { if ((l) > hlen) goto bad; TCHECK2(*cp, l); }
 
 
-                        printf("%s", tok2str(tcp_option_values, "Unknown Option %u", opt));
+                        printf("%s", tok2str(tcp_option_values, "unknown-%u", opt));
 
                         switch (opt) {
 
@@ -613,7 +576,7 @@ tcp_print(register const u_char *bp, register u_int length,
                         case TCPOPT_MPTCP:
                                 datalen = len - 2;
                                 LENCHECK(datalen);
-                                if (!mptcp_print(cp-2, len, flags))
+                                if (!mptcp_print(gndo, cp-2, len, flags))
                                         goto bad;
                                 break;
 
@@ -654,6 +617,8 @@ tcp_print(register const u_char *bp, register u_int length,
 
                         default:
                                 datalen = len - 2;
+                                if (datalen)
+                                        printf(" 0x");
                                 for (i = 0; i < datalen; ++i) {
                                         LENCHECK(i);
                                         (void)printf("%02x", cp[i]);
@@ -693,12 +658,12 @@ tcp_print(register const u_char *bp, register u_int length,
         if ((flags & TH_RST) && vflag) {
                 print_tcp_rst_data(bp, length);
                 return;
-        } 
+        }
 
         if (packettype) {
                 switch (packettype) {
                 case PT_ZMTP1:
-                        zmtp1_print(bp, length);
+                        zmtp1_print(gndo, bp, length);
                         break;
                 }
                 return;
@@ -706,11 +671,11 @@ tcp_print(register const u_char *bp, register u_int length,
 
         if (sport == TELNET_PORT || dport == TELNET_PORT) {
                 if (!qflag && vflag)
-                        telnet_print(bp, length);
+                        telnet_print(gndo, bp, length);
         } else if (sport == BGP_PORT || dport == BGP_PORT)
-                bgp_print(bp, length);
+                bgp_print(gndo, bp, length);
         else if (sport == PPTP_PORT || dport == PPTP_PORT)
-                pptp_print(bp);
+                pptp_print(gndo, bp);
 #ifdef TCPDUMP_DO_SMB
         else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT)
                 nbt_tcp_print(bp, length);
@@ -718,9 +683,10 @@ tcp_print(register const u_char *bp, register u_int length,
                smb_tcp_print(bp, length);
 #endif
         else if (sport == BEEP_PORT || dport == BEEP_PORT)
-                beep_print(bp, length);
-        else if (sport == OPENFLOW_PORT || dport == OPENFLOW_PORT)
-                openflow_print(bp, length);
+                beep_print(gndo, bp, length);
+        else if (sport == OPENFLOW_PORT_OLD || dport == OPENFLOW_PORT_OLD ||
+                 sport == OPENFLOW_PORT_IANA || dport == OPENFLOW_PORT_IANA)
+                openflow_print(gndo, bp, length);
         else if (length > 2 &&
                  (sport == NAMESERVER_PORT || dport == NAMESERVER_PORT ||
                   sport == MULTICASTDNS_PORT || dport == MULTICASTDNS_PORT)) {
@@ -728,14 +694,44 @@ tcp_print(register const u_char *bp, register u_int length,
                  * TCP DNS query has 2byte length at the head.
                  * XXX packet could be unaligned, it can go strange
                  */
-                ns_print(bp + 2, length - 2, 0);
+                ns_print(gndo, bp + 2, length - 2, 0);
         } else if (sport == MSDP_PORT || dport == MSDP_PORT) {
-                msdp_print(bp, length);
+                msdp_print(gndo, bp, length);
         } else if (sport == RPKI_RTR_PORT || dport == RPKI_RTR_PORT) {
-                rpki_rtr_print(bp, length);
+                rpki_rtr_print(gndo, bp, length);
         }
         else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) {
-                ldp_print(bp, length);
+                ldp_print(gndo, bp, length);
+        }
+        else if ((sport == NFS_PORT || dport == NFS_PORT) &&
+                 length >= 4 && TTEST2(*bp, 4)) {
+                /*
+                 * If data present, header length valid, and NFS port used,
+                 * assume NFS.
+                 * Pass offset of data plus 4 bytes for RPC TCP msg length
+                 * to NFS print routines.
+                 */
+                u_int32_t fraglen;
+                register struct sunrpc_msg *rp;
+                enum sunrpc_msg_type direction;
+
+                fraglen = EXTRACT_32BITS(bp) & 0x7FFFFFFF;
+                if (fraglen > (length) - 4)
+                        fraglen = (length) - 4;
+                rp = (struct sunrpc_msg *)(bp + 4);
+                if (TTEST(rp->rm_direction)) {
+                        direction = (enum sunrpc_msg_type)EXTRACT_32BITS(&rp->rm_direction);
+                        if (dport == NFS_PORT && direction == SUNRPC_CALL) {
+                                (void)printf(": NFS request xid %u ", EXTRACT_32BITS(&rp->rm_xid));
+                                nfsreq_print_noaddr(gndo, (u_char *)rp, fraglen, (u_char *)ip);
+                                return;
+                        }
+                        if (sport == NFS_PORT && direction == SUNRPC_REPLY) {
+                                (void)printf(": NFS reply xid %u ", EXTRACT_32BITS(&rp->rm_xid));
+                                nfsreply_print_noaddr(gndo, (u_char *)rp, fraglen, (u_char *)ip);
+                                return;
+                        }
+                }
         }
 
         return;
@@ -781,7 +777,7 @@ print_tcp_rst_data(register const u_char *sp, u_int length)
         putchar(' ');
         while (length-- && sp <= snapend) {
                 c = *sp++;
-                safeputchar(c);
+                safeputchar(gndo, c);
         }
         putchar(']');
 }