From Ravi Kondamuru via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8637
authorEvan Huus <eapache@gmail.com>
Sat, 11 May 2013 18:43:53 +0000 (18:43 -0000)
committerEvan Huus <eapache@gmail.com>
Sat, 11 May 2013 18:43:53 +0000 (18:43 -0000)
Add support for version 2.6 of netscaler capture format.

svn path=/trunk/; revision=49250

epan/dissectors/packet-nstrace.c
wiretap/netscaler.c
wiretap/netscaler.h
wiretap/wtap.h

index 0acff2b558e749ed361338e37dcc8c20ab190776..df4ce886ab791188f3f1962f71c0acb3bf7a63c7 100644 (file)
@@ -51,8 +51,17 @@ static int hf_ns_clflags_dfd = -1;
 static int hf_ns_clflags_fr = -1;
 static int hf_ns_clflags_fp = -1;
 
+static int hf_ns_activity = -1;
+static int hf_ns_activity_perf_collection = -1;
+static int hf_ns_activity_pcb_zombie  = -1;
+static int hf_ns_activity_natpcb_zombie  = -1;
+static int hf_ns_activity_lbstats_sync  = -1;
+static int hf_ns_activity_stats_req  = -1;
+
 static gint ett_ns = -1;
 static gint ett_ns_flags = -1;
+static gint ett_ns_activity_flags = -1;
 
 static const value_string ns_dir_vals[] = {
        { NSPR_PDPKTRACEFULLTX_V10, "TX" },
@@ -77,30 +86,38 @@ static const value_string ns_dir_vals[] = {
        { NSPR_PDPKTRACEFULLTX_V23, "TX" },
        { NSPR_PDPKTRACEFULLTX_V24, "TX" },
        { NSPR_PDPKTRACEFULLTX_V25, "TX" },
+       { NSPR_PDPKTRACEFULLTX_V26, "TX" },
        { NSPR_PDPKTRACEFULLTXB_V22, "TXB" },
        { NSPR_PDPKTRACEFULLTXB_V23, "TXB" },
        { NSPR_PDPKTRACEFULLTXB_V24, "TXB" },
        { NSPR_PDPKTRACEFULLTXB_V25, "TXB" },
+       { NSPR_PDPKTRACEFULLTXB_V26, "TXB" },
        { NSPR_PDPKTRACEFULLRX_V22, "RX" },
        { NSPR_PDPKTRACEFULLRX_V23, "RX" },
        { NSPR_PDPKTRACEFULLRX_V24, "RX" },
        { NSPR_PDPKTRACEFULLRX_V25, "RX" },
+       { NSPR_PDPKTRACEFULLRX_V26, "RX" },
        { NSPR_PDPKTRACEFULLNEWRX_V24, "NEW_RX" },
        { NSPR_PDPKTRACEFULLNEWRX_V25, "NEW_RX" },
+       { NSPR_PDPKTRACEFULLNEWRX_V26, "NEW_RX" },
        { NSPR_PDPKTRACEPARTTX_V22, "TX" },
        { NSPR_PDPKTRACEPARTTX_V23, "TX" },
        { NSPR_PDPKTRACEPARTTX_V24, "TX" },
        { NSPR_PDPKTRACEPARTTX_V25, "TX" },
+       { NSPR_PDPKTRACEPARTTX_V26, "TX" },
        { NSPR_PDPKTRACEPARTTXB_V22, "TXB" },
        { NSPR_PDPKTRACEPARTTXB_V23, "TXB" },
        { NSPR_PDPKTRACEPARTTXB_V24, "TXB" },
        { NSPR_PDPKTRACEPARTTXB_V25, "TXB" },
+       { NSPR_PDPKTRACEPARTTXB_V26, "TXB" },
        { NSPR_PDPKTRACEPARTRX_V22, "RX" },
        { NSPR_PDPKTRACEPARTRX_V23, "RX" },
        { NSPR_PDPKTRACEPARTRX_V24, "RX" },
        { NSPR_PDPKTRACEPARTRX_V25, "RX" },
+       { NSPR_PDPKTRACEPARTRX_V26, "RX" },
        { NSPR_PDPKTRACEPARTNEWRX_V24, "NEW_RX" },
        { NSPR_PDPKTRACEPARTNEWRX_V25, "NEW_RX" },
+       { NSPR_PDPKTRACEPARTNEWRX_V26, "NEW_RX" },
        { 0,              NULL }
 };
 
@@ -113,6 +130,12 @@ static dissector_handle_t eth_withoutfcs_handle;
 #define CL_RSSH        0x10
 #define CL_RES 0xE0
 
+#define NS_PE_STATE_PERF_COLLECTION_IN_PROG     0x00000001
+#define NS_PE_STATE_PCB_ZOMBIE_IN_PROG          0x00000002
+#define NS_PE_STATE_NATPCB_ZOMBIE_IN_PROG       0x00000004
+#define NS_PE_STATE_LBSTATS_SYNC_IN_PROG        0x00000008
+#define NS_PE_STATE_STATS_REQ_IN_PROG           0x00000010
+
 static void
 dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
@@ -128,6 +151,7 @@ dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        guint8          flagoffset, flagval;
        guint8      src_vmname_len = 0, dst_vmname_len = 0;
        guint8      variable_ns_len = 0;
+       guint           flagval32;
 
        if (pnstr->rec_type == NSPR_HEADER_VERSION205)
                {
@@ -145,6 +169,18 @@ dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
        switch (pnstr->rec_type)
        {
+       case NSPR_HEADER_VERSION206:
+               flagoffset = pnstr->ns_activity_offset;
+               flagval32 = tvb_get_letohl(tvb, flagoffset);    
+               flagitem = proto_tree_add_uint_format(ns_tree, hf_ns_activity, tvb, flagoffset, 4, flagval32,
+                                               "Activity Flags: 0x%04x", flagval32);
+               flagtree = proto_item_add_subtree(flagitem, ett_ns_activity_flags);
+               proto_tree_add_item(flagtree, hf_ns_activity_perf_collection, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN);
+               proto_tree_add_item(flagtree, hf_ns_activity_pcb_zombie, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN);
+               proto_tree_add_item(flagtree, hf_ns_activity_natpcb_zombie, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN);
+               proto_tree_add_item(flagtree, hf_ns_activity_lbstats_sync, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN);
+               proto_tree_add_item(flagtree, hf_ns_activity_stats_req, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN);
+
        case NSPR_HEADER_VERSION205:
 
                if(src_vmname_len){
@@ -293,11 +329,36 @@ proto_register_ns(void)
                  { "Flow processor (FP)",      "nstrace.flags.fp", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_FP,
                          NULL, HFILL}},
 
+               { &hf_ns_activity,
+                 { "NetScaler Activity",       "nstrace.activity", FT_UINT32, BASE_HEX, NULL, 0x0,
+                         NULL, HFILL}},
+
+               { &hf_ns_activity_perf_collection,
+                 { "Perf Collection",  "nstrace.activity.perfcollection", FT_BOOLEAN, 32, NULL, NS_PE_STATE_PERF_COLLECTION_IN_PROG,
+                         NULL, HFILL}},
+
+               { &hf_ns_activity_pcb_zombie,
+                 { "PCB Zombie",       "nstrace.activity.pcbzombie", FT_BOOLEAN, 32, NULL, NS_PE_STATE_PCB_ZOMBIE_IN_PROG,
+                         NULL, HFILL}},
+
+               { &hf_ns_activity_natpcb_zombie,
+                 { "NATPCB Zombie",    "nstrace.activity.natpcbzombie", FT_BOOLEAN, 32, NULL, NS_PE_STATE_NATPCB_ZOMBIE_IN_PROG,
+                         NULL, HFILL}},
+
+               { &hf_ns_activity_lbstats_sync,
+                 { "LB Stats Sync",    "nstrace.activity.lbstatssync", FT_BOOLEAN, 32, NULL, NS_PE_STATE_LBSTATS_SYNC_IN_PROG,
+                         NULL, HFILL}},
+
+               { &hf_ns_activity_stats_req,
+                 { "Stats Req",        "nstrace.activity.statsreq", FT_BOOLEAN, 32, NULL, NS_PE_STATE_STATS_REQ_IN_PROG,
+                         NULL, HFILL}},
+
        };
 
        static gint *ett[] = {
                &ett_ns,
                &ett_ns_flags,
+               &ett_ns_activity_flags,
        };
 
        proto_nstrace = proto_register_protocol("NetScaler Trace", "NS Trace", "ns");
index d2b85bad7b5c5f4e4ed57023b09ba8e1ab0d882e..1f0a3696c589b26b300befdd17157bb475716313 100644 (file)
@@ -280,6 +280,27 @@ typedef struct nspr_pktracefull_v25
 #define fp_src_vmname    fp_Data
 #define fp_src_vmname    fp_Data
 
+/* New full packet trace structure v26 for vm info tracing */
+typedef struct nspr_pktracefull_v26
+{
+    NSPR_HEADER3B_V22(fp);    /* long performance header */
+    guint8 fp_DevNo;          /* Network Device (NIC) number */
+    guint8 fp_AbsTimeHr[8];   /* High resolution absolute time in nanosec */
+    guint8 fp_PcbDevNo[4];    /* PCB devno */
+    guint8 fp_lPcbDevNo[4];   /* link PCB devno */
+    guint8 fp_VlanTag[2];     /* vlan tag */
+    guint8 fp_Coreid[2];      /* coreid of the packet */
+    guint8 fp_srcNodeId[2];   /* source node # */
+    guint8 fp_destNodeId[2];  /* destination node # */
+    guint8 fp_clFlags;        /* cluster flags */
+    guint8 fp_src_vmname_len; /* vm src info */
+    guint8 fp_dst_vmname_len; /* vm src info */
+    guint8 fp_reserved;
+    guint8 fp_ns_activity[4];
+    guint8 fp_reserved_32[12]; /* Adding more field to reduce wireshark changes every time */
+       guint8 fp_Data[4];     /* packet data starts here */
+} nspr_pktracefull_v26_t;
+#define nspr_pktracefull_v26_s    ((guint32)(sizeof(nspr_pktracefull_v26_t) - 4))
 
 /* partial packet trace structure */
 typedef struct nspr_pktracepart_v10
@@ -390,6 +411,30 @@ typedef struct nspr_pktracepart_v25
 #define pp_src_vmname    pp_Data
 #define pp_dst_vmname    pp_Data
 
+/* New partial packet trace structure v26 for vm info tracing */
+typedef struct nspr_pktracepart_v26
+{
+    NSPR_HEADER3B_V22(pp);    /* long performance header */
+    guint8 pp_DevNo;          /* Network Device (NIC) number */
+    guint8 pp_AbsTimeHr[8];   /*High resolution absolute time in nanosec*/
+    guint8 pp_PktSizeOrg[2];  /* Original packet size */
+    guint8 pp_PktOffset[2];   /* starting offset in packet */
+    guint8 pp_PcbDevNo[4];    /* PCB devno */
+    guint8 pp_lPcbDevNo[4];   /* link PCB devno */
+    guint8 pp_VlanTag[2];     /* vlan tag */
+    guint8 pp_Coreid[2];      /* Coreid of the packet */
+    guint8 pp_srcNodeId[2];   /* source node # */
+    guint8 pp_destNodeId[2];  /* destination node # */
+    guint8 pp_clFlags;        /* cluster flags */
+    guint8 pp_src_vmname_len; /* vm info */
+    guint8 pp_dst_vmname_len; /* vm info */
+    guint8 pp_reserved;
+    guint8 pp_ns_activity[4];
+    guint8 pp_reserved_32[12]; /* Adding more field to reduce wireshark changes every time */
+    guint8 pp_Data[4];        /* packet data starts here */
+} nspr_pktracepart_v26_t;
+#define nspr_pktracepart_v26_s    ((guint32)(sizeof(nspr_pktracepart_v26_t) -4))
+
 #define myoffsetof(type,fieldname) (&(((type*)0)->fieldname))
 
 #define __TNO(phdr,enumprefix,structprefix,structname,hdrname,structfieldname) \
@@ -454,6 +499,10 @@ typedef struct nspr_pktracepart_v25
     __TNO(phdr,enumprefix,structprefix,structname,dst_vmname_len,dst_vmname_len)\
     __TNO(phdr,enumprefix,structprefix,structname,data,Data)
     
+#define TRACE_V26_REC_LEN_OFF(phdr,enumprefix,structprefix,structname) \
+    TRACE_V25_REC_LEN_OFF(phdr,enumprefix,structprefix,structname)\
+    __TNO(phdr,enumprefix,structprefix,structname,ns_activity,ns_activity)\
+    
     TRACE_V10_REC_LEN_OFF(NULL,v10_part,pp,pktracepart_v10)
     TRACE_V10_REC_LEN_OFF(NULL,v10_full,fp,pktracefull_v10)
     TRACE_V20_REC_LEN_OFF(NULL,v20_part,pp,pktracepart_v20)
@@ -468,6 +517,8 @@ typedef struct nspr_pktracepart_v25
     TRACE_V24_REC_LEN_OFF(NULL,v24_full,fp,pktracefull_v24)
     TRACE_V25_REC_LEN_OFF(NULL,v25_part,pp,pktracepart_v25)
     TRACE_V25_REC_LEN_OFF(NULL,v25_full,fp,pktracefull_v25)
+    TRACE_V26_REC_LEN_OFF(NULL,v26_part,pp,pktracepart_v26)
+    TRACE_V26_REC_LEN_OFF(NULL,v26_full,fp,pktracefull_v26)
 
 #undef __TNV1O
 #undef __TNV1L
@@ -921,6 +972,7 @@ static gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *
 #define TIMEDEFV22(fp,type) TIMEDEFV20(fp,type)
 #define TIMEDEFV24(fp,type) TIMEDEFV23(fp,type)
 #define TIMEDEFV25(fp,type) TIMEDEFV24(fp,type)
+#define TIMEDEFV26(fp,type) TIMEDEFV24(fp,type)
 #define PPSIZEDEFV20(phdr,pp,ver) \
     do {\
         (phdr)->presence_flags |= WTAP_HAS_CAP_LEN;\
@@ -933,6 +985,7 @@ static gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *
 #define PPSIZEDEFV23(phdr,pp,ver) PPSIZEDEFV20(phdr,pp,ver)
 #define PPSIZEDEFV24(phdr,pp,ver) PPSIZEDEFV20(phdr,pp,ver)
 #define PPSIZEDEFV25(phdr,pp,ver) PPSIZEDEFV20(phdr,pp,ver)
+#define PPSIZEDEFV26(phdr,pp,ver) PPSIZEDEFV20(phdr,pp,ver)
 
 #define FPSIZEDEFV20(phdr,fp,ver)\
     do {\
@@ -945,6 +998,7 @@ static gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *
 #define FPSIZEDEFV23(phdr,fp,ver) FPSIZEDEFV20(phdr,fp,ver)
 #define FPSIZEDEFV24(phdr,fp,ver) FPSIZEDEFV20(phdr,fp,ver)
 #define FPSIZEDEFV25(phdr,fp,ver) FPSIZEDEFV20(phdr,fp,ver)
+#define FPSIZEDEFV26(phdr,fp,ver) FPSIZEDEFV20(phdr,fp,ver)
 
 #define PACKET_DESCRIBE(phdr,FPTIMEDEF,SIZEDEF,ver,enumprefix,type,structname,TYPE)\
     do {\
@@ -1019,6 +1073,8 @@ static gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *
                 GENERATE_CASE_PART_V25(&wth->phdr,24,204);
                 GENERATE_CASE_FULL_V25(&wth->phdr,25,205);
                 GENERATE_CASE_PART_V25(&wth->phdr,25,205);
+                GENERATE_CASE_FULL_V25(&wth->phdr,26,206);
+                GENERATE_CASE_PART_V25(&wth->phdr,26,206);
 
 #undef GENERATE_CASE_FULL
 #undef GENERATE_CASE_FULL_V25
@@ -1194,6 +1250,8 @@ static gboolean nstrace_seek_read_v20(wtap *wth, gint64 seek_off,
         GENERATE_CASE_PART_V25(phdr,24,204)
         GENERATE_CASE_FULL_V25(phdr,25,205)
         GENERATE_CASE_PART_V25(phdr,25,205)
+        GENERATE_CASE_FULL_V25(phdr,26,206)
+        GENERATE_CASE_PART_V25(phdr,26,206)
     }
 
 #undef GENERATE_CASE_FULL
@@ -1444,6 +1502,7 @@ static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
     case NSPR_HEADER_VERSION203:
     case NSPR_HEADER_VERSION204:
     case NSPR_HEADER_VERSION205:
+    case NSPR_HEADER_VERSION206:
         if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
         {
             *err = WTAP_ERR_UNSUPPORTED_FILE_TYPE;
index 04eddb339702c56e194adfa7a03e62d435199caa..6ca9e608a0b6a4b73ee4eff7d63b84d2ca0cfc4b 100644 (file)
 #define NSPR_PDPKTRACEPARTRX_V25    0xB6    /* Received packets before NIC pipelining */
 #define NSPR_PDPKTRACEPARTNEWRX_V25    0xB7    /* Received packets after NIC pipelining */
 
+/* NS DEBUG INFO PER PACKET */
+#define NSPR_PDPKTRACEFULLTX_V26    0xA0    /* Transmitted */
+#define NSPR_PDPKTRACEFULLTXB_V26  0xA1    /* In transmit buffer */
+#define NSPR_PDPKTRACEFULLRX_V26    0xA2    /* Received packets before NIC pipelining */
+#define NSPR_PDPKTRACEFULLNEWRX_V26     0xA3    /* Received packets after NIC pipelining */
+#define NSPR_PDPKTRACEPARTTX_V26    0xA4    /* Transmitted */
+#define NSPR_PDPKTRACEPARTTXB_V26   0xA5    /* In transmit buffer */
+#define NSPR_PDPKTRACEPARTRX_V26    0xA6    /* Received packets before NIC pipelining */
+#define NSPR_PDPKTRACEPARTNEWRX_V26     0xA7    /* Received packets after NIC pipelining */
+
 /* Record types */
 #define        NSPR_HEADER_VERSION100 0x10
 #define        NSPR_HEADER_VERSION200 0x20
 #define NSPR_HEADER_VERSION203 0x23
 #define NSPR_HEADER_VERSION204 0x24
 #define NSPR_HEADER_VERSION205 0x25
+#define NSPR_HEADER_VERSION206 0x26
 int nstrace_open(wtap *wth, int *err, gchar **err_info);
 int nstrace_10_dump_can_write_encap(int encap);
 int nstrace_20_dump_can_write_encap(int encap);
index 8baf366026b8bd27efcb38a5f5ce876ae6da3e3e..2f855c72e282bce4f8969231ad25a5db9a880310 100644 (file)
@@ -368,6 +368,7 @@ struct nstr_phdr {
     guint8 clflags_offset;
     guint8 src_vmname_len_offset;
     guint8 dst_vmname_len_offset;
+    guint8 ns_activity_offset;
     guint8 data_offset;
 };