]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-tcp.c
From Andrew Silent: Realtek Remote Control Protocol support (see
[tcpdump] / print-tcp.c
index 39099f57dac4efe7939253ebc1905cdb53eb3f54..5b0a7969a58322b8001a589060855f8f98f36f10 100644 (file)
@@ -25,7 +25,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-"@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.130.2.1 2007-11-09 00:38:52 guy Exp $ (LBL)";
+"@(#) $Header: /tcpdump/master/tcpdump/print-tcp.c,v 1.130.2.3 2007-12-22 03:08:45 guy Exp $ (LBL)";
   #else
 __RCSID("$NetBSD: print-tcp.c,v 1.8 2007/07/24 11:53:48 drochner Exp $");
 #endif
@@ -227,23 +227,39 @@ 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) {
-                if ((u_char *)tp + 4 + sizeof(struct sunrpc_msg) <= snapend &&
-                    dport == NFS_PORT) {
-                        nfsreq_print((u_char *)tp + hlen + 4, length - hlen,
-                                     (u_char *)ip);
-                        return;
-                } else if ((u_char *)tp + 4 + sizeof(struct sunrpc_msg)
-                           <= snapend &&
-                           sport == NFS_PORT) {
-                        nfsreply_print((u_char *)tp + hlen + 4, length - hlen,
-                                       (u_char *)ip);
-                        return;
+        * 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
@@ -650,6 +666,8 @@ tcp_print(register const u_char *bp, register u_int length,
 #ifdef TCPDUMP_DO_SMB
         else if (sport == NETBIOS_SSN_PORT || dport == NETBIOS_SSN_PORT)
                 nbt_tcp_print(bp, length);
+       else if (sport == SMB_PORT || dport == SMB_PORT)
+               smb_tcp_print(bp, length);
 #endif
         else if (sport == BEEP_PORT || dport == BEEP_PORT)
                 beep_print(bp, length);