Common subdirectories: sancp-1.6.1.patch.b/contrib and sancp-1.6.1.patch.d/contrib
diff -U3 -d sancp-1.6.1.patch.b/decode.cc sancp-1.6.1.patch.d/decode.cc
--- sancp-1.6.1.patch.b/decode.cc       2006-07-01 12:29:28.000000000 -0500
+++ sancp-1.6.1.patch.d/decode.cc       2006-07-05 22:41:46.000000000 -0500
@@ -20,12 +20,9 @@
       extern struct gvars gVars;
       u_int8_t e_hlen=14;
       u_int8_t ip_hlen=0;
-       u_int8_t done=0;
-       u_int16_t tcpoptlen=0;
       u_int8_t tcp_hlen=0;
       u_int16_t udp_len=0;
       u_int16_t ip_len=0;
-       u_int16_t bytes_processed=0;

       nc->d_total_pkts=nc->s_ip=nc->d_ip=nc->free=nc->proto=nc->s_port=nc->d_port=nc->d_total_bytes=nc->collected=0;
       nc->timeout=gVars.default_timeout;
@@ -35,6 +32,13 @@
       nc->fH=0;
       nc->start_time=nc->last_pkt=gVars.timeptr.tv_sec;
       nc->limit=gVars.default_limit;
+        //
+        // If we don't have a pkt then perhaps we should not have been called
+        //
+        if(!pkt){
+          printf("Error decode: received empty packet\n");
+          return;
+        }
       nc->s_total_pkts=1;
       nc->stats=gVars.smode?1:0;
       nc->realtime=gVars.rmode?1:0;
@@ -67,8 +71,23 @@
                               nc->os_info.len=ip_len;
                               nc->os_info.wss=ntohs(*(u_int16_t*)(pkt + e_hlen + ip_hlen + 14));
                               nc->os_info.df=((pkt[e_hlen + 6]&0x40)==0x40)?1:0;
+
+#ifdef EXPERIMENTAL_TCPOPTIONS
+                               u_int16_t tcpoptlen=0;
+                               u_int16_t bytes_processed=0;
+                               int loopctr=0;
+                               u_int8_t done=0;
+
+                               //
+                               //  THIS CODE DOES NOT PROPERLY PARSE TCPOPTIONS FOR ALL PACKETS
+                               //  INFINITE LOOPS WERE POSSIBLE IN THIS PORTION OF CODE UNTIL
+                               //  int loopctr WAS INTRODUCED TO LIMIT OPTIONS TO TCPOPTIONS_MAX
+                               //
+                               //tcpopt = *pkt + (e_hlen + ip_hlen + 20);  // this is where we should find tcp options
+
+                                int tcpoptctr=(e_hlen + ip_hlen + 20);
+
                               nc->os_info.wscale=0;
-                               int tcpoptctr=(e_hlen + ip_hlen + 20);

                               tcpoptlen=tcp_hlen>20?(tcp_hlen - 20):0;

@@ -106,7 +125,11 @@

                                                       break;
                                       }
+                                       loopctr++;
+                                       // Bail out after 8 'options' - NEEDED UNTIL THIS CODE IS FIXED TO PROPERLY PARSE TCPOPTIONS
+                                       if(loopctr>TCPOPTIONS_MAX){ done = 1; }
                               }
+#endif
                       }
               }
               else if( nc->proto==IPPROTO_UDP )
Common subdirectories: sancp-1.6.1.patch.b/docs and sancp-1.6.1.patch.d/docs
Common subdirectories: sancp-1.6.1.patch.b/etc and sancp-1.6.1.patch.d/etc
diff -U3 -d sancp-1.6.1.patch.b/help.cc sancp-1.6.1.patch.d/help.cc
--- sancp-1.6.1.patch.b/help.cc 2004-09-13 12:55:24.000000000 -0500
+++ sancp-1.6.1.patch.d/help.cc 2006-07-05 22:41:46.000000000 -0500
@@ -203,11 +203,22 @@
<< "    The next 8 fields contain p0F information gathered from initial TCP packet\n"
<< "   20:  16bit wss: window segment size (initial packet, tcp only)\n"
<< "   21:  8bit ttl: time to live (initial packet, tcp only)\n"
+#ifdef EXPERIMENTAL_TCPOPTIONS
<< "   22:  16bit mss: maximum segment size (initial packet, tcp only)\n"
+#else
+<< "   22:  16bit mss: maximum segment size (initial packet, tcp only) need to re-compile with EXPERIMENTAL_TCPOPTIONS\n"
+#endif
<< "   23:  Y/N df: don't fragment bit was set (initial packet, tcp only)\n"
+#ifdef EXPERIMENTAL_TCPOPTIONS
<< "   24:  8bit wscale: window scale (initial packet, tcp only)\n"
<< "   25:  Y/N sack_ok: sack_ok flag was set (initial packet, tcp only)\n"
<< "   26:  Y/N nop: 'no op' was seen (initial packet, tcp only)\n"
+#else
+<< "   24:  8bit wscale: window scale (initial packet, tcp only) need to re-compile with EXPERIMENTAL_TCPOPTIONS\n"
+<< "   25:  Y/N sack_ok: sack_ok flag was set (initial packet, tcp only) need to re-compile with EXPERIMENTAL_TCPOPTIONS\n"
+<< "   26:  Y/N nop: 'no op' was seen (initial packet, tcp only) need to re-compile with EXPERIMENTAL_TCPOPTIONS\n"
+#endif
+
<< "   27:  16bit len: ip length (initial packet, tcp only)\n"
<< "\n"
<< "    The next 8 fields contain p0F information gathered from second TCP packet\n"
diff -U3 -d sancp-1.6.1.patch.b/sancp.h sancp-1.6.1.patch.d/sancp.h
--- sancp-1.6.1.patch.b/sancp.h 2004-11-02 11:45:30.000000000 -0600
+++ sancp-1.6.1.patch.d/sancp.h 2006-07-05 22:43:19.000000000 -0500
@@ -13,6 +13,7 @@
 * ***********************************************************************/

#define SANCP_H
+#define EXPERIMENTAL_TCPOPTIONS


//#define DEBUG 1
@@ -128,7 +129,7 @@
/* Hash Table Protos */
#define DEFAULT_FLUSH_INTERVAL 1800
#define DEFAULT_EXPIRE_INTERVAL 10
-#define VERSION "1.6.1"
+#define VERSION "1.6.1 patch d"
#define NAME "sancp"
#define LOG_DIR "./" /* default relative to current working directory */
#define CONFIG_DIR "/etc/sancp/"
@@ -204,11 +205,14 @@
#define CNX_REREVERSED 4
#define MAX_PACK_LEN   20000  /* Sufficient for ethernet packets. */
#define ETHER_SIZE     14
+#ifdef EXPERIMENTAL_TCPOPTIONS
#define TCPOPT_EOL              0
#define TCPOPT_NOP              1
#define TCPOPT_MAXSEG           2
#define TCPOPT_SACKOK           4    /* Experimental */
#define TCPOPT_WSCALE          3
+#define TCPOPTIONS_MAX         8    /* Maximum number of tcpoptions to parse */
+#endif


#define R_FIN          0x01
@@ -233,9 +237,14 @@
        u_int8_t ttl;
        u_int16_t len;
        u_int16_t wss;
+#ifdef EXPERIMENTAL_TCPOPTIONS
+        u_int8_t df:1, nop:1, sack_ok:1;
        u_int16_t mss;
        short wscale;
-        u_int8_t df:1, nop:1, sack_ok:1;
+#else
+        u_int8_t df:1;
+#endif
+
};


diff -U3 -d sancp-1.6.1.patch.b/statefull_logging.cc sancp-1.6.1.patch.d/statefull_logging.cc
--- sancp-1.6.1.patch.b/statefull_logging.cc    2004-11-02 11:49:16.000000000 -0600
+++ sancp-1.6.1.patch.d/statefull_logging.cc    2006-07-05 22:41:46.000000000 -0500
@@ -416,6 +416,7 @@
                }
                break;
            }
+#ifdef EXPERIMENTAL_TCPOPTIONS
            case tcp_mss_s: {
                if(cn->reversed==1){
                    snprintf(LOG,MAXENTRYLEN,"%u",cn->os_info2.mss);
@@ -448,6 +449,7 @@
                }
                break;
            }
+#endif
            case ip_len_d: {
                if(cn->reversed==1){
                    snprintf(LOG,MAXENTRYLEN,"%u",cn->os_info.len);
@@ -480,6 +482,7 @@
                }
                break;
            }
+#ifdef EXPERIMENTAL_TCPOPTIONS
            case tcp_mss_d: {
                if(cn->reversed==1){
                    snprintf(LOG,MAXENTRYLEN,"%u",cn->os_info.mss);
@@ -512,6 +515,7 @@
                }
                break;
            }
+#endif
            case total_bytes: {
                    snprintf(LOG,MAXENTRYLEN,"%llu",cn->total_bytes);
                break;