aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-nstrace.c104
-rw-r--r--wiretap/netscaler.c87
-rw-r--r--wiretap/netscaler.h11
-rw-r--r--wiretap/wtap.h3
4 files changed, 197 insertions, 8 deletions
diff --git a/epan/dissectors/packet-nstrace.c b/epan/dissectors/packet-nstrace.c
index a5d07683f8..d7800c8ebd 100644
--- a/epan/dissectors/packet-nstrace.c
+++ b/epan/dissectors/packet-nstrace.c
@@ -41,7 +41,18 @@ static int hf_ns_devno = -1;
static int hf_ns_vlantag = -1;
static int hf_ns_coreid = -1;
+static int hf_ns_snode = -1;
+static int hf_ns_dnode = -1;
+static int hf_ns_clflags = -1;
+static int hf_ns_clflags_res = -1;
+static int hf_ns_clflags_rssh = -1;
+static int hf_ns_clflags_rss = -1;
+static int hf_ns_clflags_dfd = -1;
+static int hf_ns_clflags_fr = -1;
+static int hf_ns_clflags_fp = -1;
+
static gint ett_ns = -1;
+static gint ett_ns_flags = -1;
static const value_string ns_dir_vals[] = {
{ NSPR_PDPKTRACEFULLTX_V10, "TX" },
@@ -64,31 +75,49 @@ static const value_string ns_dir_vals[] = {
{ NSPR_PDPKTRACEPARTRX_V21, "RX" },
{ NSPR_PDPKTRACEFULLTX_V22, "TX" },
{ NSPR_PDPKTRACEFULLTX_V23, "TX" },
+ { NSPR_PDPKTRACEFULLTX_V24, "TX" },
{ NSPR_PDPKTRACEFULLTXB_V22, "TXB" },
{ NSPR_PDPKTRACEFULLTXB_V23, "TXB" },
+ { NSPR_PDPKTRACEFULLTXB_V24, "TXB" },
{ NSPR_PDPKTRACEFULLRX_V22, "RX" },
{ NSPR_PDPKTRACEFULLRX_V23, "RX" },
+ { NSPR_PDPKTRACEFULLRX_V24, "RX" },
+ { NSPR_PDPKTRACEFULLNEWRX_V24, "NEW_RX" },
{ NSPR_PDPKTRACEPARTTX_V22, "TX" },
{ NSPR_PDPKTRACEPARTTX_V23, "TX" },
+ { NSPR_PDPKTRACEPARTTX_V24, "TX" },
{ NSPR_PDPKTRACEPARTTXB_V22, "TXB" },
{ NSPR_PDPKTRACEPARTTXB_V23, "TXB" },
+ { NSPR_PDPKTRACEPARTTXB_V24, "TXB" },
{ NSPR_PDPKTRACEPARTRX_V22, "RX" },
{ NSPR_PDPKTRACEPARTRX_V23, "RX" },
+ { NSPR_PDPKTRACEPARTRX_V24, "RX" },
+ { NSPR_PDPKTRACEPARTNEWRX_V24, "NEW_RX" },
{ 0, NULL }
};
static dissector_handle_t eth_withoutfcs_handle;
+#define CL_FP 0x01
+#define CL_FR 0x02
+#define CL_DFD 0x04
+#define CL_RSS 0x08
+#define CL_RSSH 0x10
+#define CL_RES 0xE0
static void
dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- proto_tree *ns_tree = NULL;
- proto_item *ti = NULL;
+ proto_tree *ns_tree = NULL, *flagtree = NULL;
+ proto_item *ti = NULL, *flagitem = NULL;
struct nstr_phdr *pnstr = &(pinfo->pseudo_header->nstr);
tvbuff_t *next_tvb_eth_client;
- guint8 offset;
-
+ guint8 offset;
+ guint i, bpos;
+ emem_strbuf_t *flags_strbuf = ep_strbuf_new_label("None");
+ const gchar *flags[] = {"FP", "FR", "DFD", "SRSS", "RSSH"};
+ gboolean first_flag = TRUE;
+ guint8 flagoffset, flagval;
ti = proto_tree_add_protocol_format(tree, proto_nstrace, tvb, 0, pnstr->eth_offset, "NetScaler Packet Trace");
ns_tree = proto_item_add_subtree(ti, ett_ns);
@@ -98,6 +127,37 @@ dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
switch (pnstr->rec_type)
{
+
+ case NSPR_HEADER_VERSION204:
+
+ flagoffset = pnstr->clflags_offset;
+ flagval = tvb_get_guint8(tvb, flagoffset);
+
+ for (i = 0; i < 5; i++) {
+ bpos = 1 << i;
+ if (flagval & bpos) {
+ if (first_flag) {
+ ep_strbuf_truncate(flags_strbuf, 0);
+ }
+ ep_strbuf_append_printf(flags_strbuf, "%s%s", first_flag ? "" : ", ", flags[i]);
+ first_flag = FALSE;
+ }
+ }
+
+ proto_tree_add_item(ns_tree, hf_ns_snode, tvb, pnstr->srcnodeid_offset, 2, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(ns_tree, hf_ns_dnode, tvb, pnstr->destnodeid_offset, 2, ENC_LITTLE_ENDIAN);
+
+ flagitem = proto_tree_add_uint_format(ns_tree, hf_ns_clflags, tvb, flagoffset, 1, flagval,
+ "Cluster Flags: 0x%02x (%s)", flagval, flags_strbuf->str);
+ flagtree = proto_item_add_subtree(flagitem, ett_ns_flags);
+
+ proto_tree_add_boolean(flagtree, hf_ns_clflags_res, tvb, flagoffset, 1, flagval);
+ proto_tree_add_boolean(flagtree, hf_ns_clflags_rssh, tvb, flagoffset, 1, flagval);
+ proto_tree_add_boolean(flagtree, hf_ns_clflags_rss, tvb, flagoffset, 1, flagval);
+ proto_tree_add_boolean(flagtree, hf_ns_clflags_dfd, tvb, flagoffset, 1, flagval);
+ proto_tree_add_boolean(flagtree, hf_ns_clflags_fr, tvb, flagoffset, 1, flagval);
+ proto_tree_add_boolean(flagtree, hf_ns_clflags_fp, tvb, flagoffset, 1, flagval);
+
case NSPR_HEADER_VERSION203:
proto_tree_add_item(ns_tree, hf_ns_coreid, tvb, pnstr->coreid_offset, 2, ENC_LITTLE_ENDIAN);
/* fall through to next case */
@@ -161,10 +221,46 @@ proto_register_ns(void)
{ "Vlan", "nstrace.vlan", FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
+ { &hf_ns_snode,
+ { "Source Node", "nstrace.snode", FT_INT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_ns_dnode,
+ { "Destination Node", "nstrace.dnode", FT_INT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_ns_clflags,
+ { "Cluster Flags", "nstrace.flags", FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_ns_clflags_res,
+ { "Reserved", "nstrace.flags.res", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_RES,
+ NULL, HFILL}},
+
+ { &hf_ns_clflags_rssh,
+ { "RSSHASH", "nstrace.flags.rssh", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_RSSH,
+ NULL, HFILL}},
+
+ { &hf_ns_clflags_rss,
+ { "SRSS", "nstrace.flags.srss", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_RSS,
+ NULL, HFILL}},
+
+ { &hf_ns_clflags_dfd,
+ { "DFD", "nstrace.flags.dfd", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_DFD,
+ NULL, HFILL}},
+
+ { &hf_ns_clflags_fr,
+ { "Flow receiver (FR)", "nstrace.flags.fr", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_FR,
+ NULL, HFILL}},
+
+ { &hf_ns_clflags_fp,
+ { "Flow processor (FP)", "nstrace.flags.fp", FT_BOOLEAN, 8, TFS(&tfs_set_notset), CL_FP,
+ NULL, HFILL}},
};
static gint *ett[] = {
&ett_ns,
+ &ett_ns_flags,
};
proto_nstrace = proto_register_protocol("NetScaler Trace", "NS Trace", "ns");
diff --git a/wiretap/netscaler.c b/wiretap/netscaler.c
index 5f07aaca94..ead6ea33eb 100644
--- a/wiretap/netscaler.c
+++ b/wiretap/netscaler.c
@@ -244,6 +244,23 @@ typedef struct nspr_pktracefull_v23
} nspr_pktracefull_v23_t;
#define nspr_pktracefull_v23_s (sizeof(nspr_pktracefull_v23_t) - 2)
+/* New full packet trace structure v24 for cluster tracing */
+typedef struct nspr_pktracefull_v24
+{
+ 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_Data[2]; /* packet data starts here */
+} nspr_pktracefull_v24_t;
+#define nspr_pktracefull_v24_s (sizeof(nspr_pktracefull_v24_t) - 4)
+
/* partial packet trace structure */
typedef struct nspr_pktracepart_v10
{
@@ -311,6 +328,25 @@ typedef struct nspr_pktracepart_v23
} nspr_pktracepart_v23_t;
#define nspr_pktracepart_v23_s (sizeof(nspr_pktracepart_v23_t) -4)
+/* New partial packet trace structure v24 for cluster tracing */
+typedef struct nspr_pktracepart_v24
+{
+ 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_Data[4]; /* packet data starts here */
+} nspr_pktracepart_v24_t;
+#define nspr_pktracepart_v24_s (sizeof(nspr_pktracepart_v24_t) -4)
+
#define myoffsetof(type,fieldname) (&(((type*)0)->fieldname))
#define __TNO(enumprefix,structprefix,structname,hdrname,structfieldname) \
@@ -352,6 +388,12 @@ typedef struct nspr_pktracepart_v23
TRACE_V22_REC_LEN_OFF(enumprefix,structprefix,structname)\
__TNO(enumprefix,structprefix,structname,coreid,Coreid)
+#define TRACE_V24_REC_LEN_OFF(enumprefix,structprefix,structname) \
+ TRACE_V23_REC_LEN_OFF(enumprefix,structprefix,structname)\
+ __TNO(enumprefix,structprefix,structname,srcnodeid,srcNodeId)\
+ __TNO(enumprefix,structprefix,structname,destnodeid,destNodeId)\
+ __TNO(enumprefix,structprefix,structname,clflags,clFlags)
+
TRACE_V10_REC_LEN_OFF(v10_part,pp,pktracepart_v10)
TRACE_V10_REC_LEN_OFF(v10_full,fp,pktracefull_v10)
@@ -363,7 +405,8 @@ typedef struct nspr_pktracepart_v23
TRACE_V22_REC_LEN_OFF(v22_full,fp,pktracefull_v22)
TRACE_V23_REC_LEN_OFF(v23_part,pp,pktracepart_v23)
TRACE_V23_REC_LEN_OFF(v23_full,fp,pktracefull_v23)
-
+ TRACE_V24_REC_LEN_OFF(v24_part,pp,pktracepart_v24)
+ TRACE_V24_REC_LEN_OFF(v24_full,fp,pktracefull_v24)
#undef __TNV1O
#undef __TNV1L
#undef __TNO
@@ -798,7 +841,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
#define TIMEDEFV21(fp,type) TIMEDEFV20(fp,type)
#define TIMEDEFV22(fp,type) TIMEDEFV20(fp,type)
-
+#define TIMEDEFV24(fp,type) TIMEDEFV23(fp,type)
#define PPSIZEDEFV20(pp,ver) \
do {\
wth->phdr.presence_flags |= WTAP_HAS_CAP_LEN;\
@@ -809,6 +852,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
#define PPSIZEDEFV21(pp,ver) PPSIZEDEFV20(pp,ver)
#define PPSIZEDEFV22(pp,ver) PPSIZEDEFV20(pp,ver)
#define PPSIZEDEFV23(pp,ver) PPSIZEDEFV20(pp,ver)
+#define PPSIZEDEFV24(pp,ver) PPSIZEDEFV20(pp,ver)
#define FPSIZEDEFV20(fp,ver)\
do {\
@@ -819,6 +863,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
#define FPSIZEDEFV21(pp,ver) FPSIZEDEFV20(fp,ver)
#define FPSIZEDEFV22(pp,ver) FPSIZEDEFV20(fp,ver)
#define FPSIZEDEFV23(pp,ver) FPSIZEDEFV20(fp,ver)
+#define FPSIZEDEFV24(pp,ver) FPSIZEDEFV20(fp,ver)
#define PACKET_DESCRIBE(FPTIMEDEF,SIZEDEF,ver,enumprefix,type,structname,TYPE)\
do {\
@@ -864,22 +909,38 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
case NSPR_PDPKTRACEFULLTXB_V##type:\
case NSPR_PDPKTRACEFULLRX_V##type:\
PACKET_DESCRIBE(TIMEDEF,FPSIZEDEFV,type,v##type##_full,fp,pktracefull_v##type,acttype);
+#define GENERATE_CASE_V24(type,acttype) \
+ case NSPR_PDPKTRACEFULLTX_V##type:\
+ case NSPR_PDPKTRACEFULLTXB_V##type:\
+ case NSPR_PDPKTRACEFULLRX_V##type:\
+ case NSPR_PDPKTRACEFULLNEWRX_V##type:\
+ PACKET_DESCRIBE(TIMEDEF,FPSIZEDEFV,type,v##type##_full,fp,pktracefull_v##type,acttype);
+ GENERATE_CASE_V24(24,204);
GENERATE_CASE(23,203);
GENERATE_CASE(22,202);
GENERATE_CASE(21,201);
GENERATE_CASE(20,200);
#undef GENERATE_CASE
+#undef GENERATE_CASE_V24
#define GENERATE_CASE(type,acttype) \
case NSPR_PDPKTRACEPARTTX_V##type:\
case NSPR_PDPKTRACEPARTTXB_V##type:\
case NSPR_PDPKTRACEPARTRX_V##type:\
PACKET_DESCRIBE(TIMEDEF,PPSIZEDEFV,type,v##type##_part,pp,pktracepart_v##type,acttype);
+#define GENERATE_CASE_V24(type,acttype) \
+ case NSPR_PDPKTRACEPARTTX_V##type:\
+ case NSPR_PDPKTRACEPARTTXB_V##type:\
+ case NSPR_PDPKTRACEPARTRX_V##type:\
+ case NSPR_PDPKTRACEPARTNEWRX_V##type:\
+ PACKET_DESCRIBE(TIMEDEF,PPSIZEDEFV,type,v##type##_part,pp,pktracepart_v##type,acttype);
+ GENERATE_CASE_V24(24,204);
GENERATE_CASE(23,203);
GENERATE_CASE(22,202);
GENERATE_CASE(21,201);
GENERATE_CASE(20,200);
#undef GENERATE_CASE
+#undef GENERATE_CASE_V24
case NSPR_ABSTIME_V20:
{
@@ -1001,6 +1062,24 @@ gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
}
} else if (wth->file_type == WTAP_FILE_NETSCALER_2_0)
{
+#define GENERATE_CASE_FULL_V24(type,acttype) \
+ case NSPR_PDPKTRACEFULLTX_V##type:\
+ case NSPR_PDPKTRACEFULLTXB_V##type:\
+ case NSPR_PDPKTRACEFULLRX_V##type:\
+ case NSPR_PDPKTRACEFULLNEWRX_V##type:\
+ TRACE_V##type##_REC_LEN_OFF(v##type##_full,fp,pktracefull_v##type);\
+ pseudo_header->nstr.rec_type = NSPR_HEADER_VERSION##acttype;\
+ break;\
+
+#define GENERATE_CASE_PART_V24(type,acttype) \
+ case NSPR_PDPKTRACEPARTTX_V##type:\
+ case NSPR_PDPKTRACEPARTTXB_V##type:\
+ case NSPR_PDPKTRACEPARTRX_V##type:\
+ case NSPR_PDPKTRACEPARTNEWRX_V##type:\
+ TRACE_V##type##_REC_LEN_OFF(v##type##_part,pp,pktracepart_v##type);\
+ pseudo_header->nstr.rec_type = NSPR_HEADER_VERSION##acttype;\
+ break;\
+
switch ((( nspr_hd_v20_t*)pd)->phd_RecordType)
{
GENERATE_CASE_FULL(20,200)
@@ -1011,6 +1090,8 @@ gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
GENERATE_CASE_PART(22,202)
GENERATE_CASE_FULL(23,203)
GENERATE_CASE_PART(23,203)
+ GENERATE_CASE_FULL_V24(24,204)
+ GENERATE_CASE_PART_V24(24,204)
}
}
@@ -1264,7 +1345,7 @@ static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
case NSPR_HEADER_VERSION201:
case NSPR_HEADER_VERSION202:
case NSPR_HEADER_VERSION203:
-
+ case NSPR_HEADER_VERSION204:
if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
{
*err = WTAP_ERR_UNSUPPORTED_FILE_TYPE;
diff --git a/wiretap/netscaler.h b/wiretap/netscaler.h
index bc32869cad..153a7d129d 100644
--- a/wiretap/netscaler.h
+++ b/wiretap/netscaler.h
@@ -67,6 +67,15 @@
#define NSPR_PDPKTRACEPARTTXB_V23 0xF5 /* In transmit buffer */
#define NSPR_PDPKTRACEPARTRX_V23 0xF6 /* Received */
+/* cluster tracing*/
+#define NSPR_PDPKTRACEFULLTX_V24 0xF8 /* Transmitted */
+#define NSPR_PDPKTRACEFULLTXB_V24 0xF9 /* In transmit buffer */
+#define NSPR_PDPKTRACEFULLRX_V24 0xFA /* Received packets before NIC pipelining */
+#define NSPR_PDPKTRACEFULLNEWRX_V24 0xfB /* Received packets after NIC pipelining */
+#define NSPR_PDPKTRACEPARTTX_V24 0xFC /* Transmitted */
+#define NSPR_PDPKTRACEPARTTXB_V24 0xFD /* In transmit buffer */
+#define NSPR_PDPKTRACEPARTRX_V24 0xFE /* Received packets before NIC pipelining */
+#define NSPR_PDPKTRACEPARTNEWRX_V24 0xFF /* Received packets after NIC pipelining */
/* Record types */
#define NSPR_HEADER_VERSION100 0x10
@@ -74,7 +83,7 @@
#define NSPR_HEADER_VERSION201 0x21
#define NSPR_HEADER_VERSION202 0x22
#define NSPR_HEADER_VERSION203 0x23
-
+#define NSPR_HEADER_VERSION204 0x24
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);
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index 2ab8b10f0e..11fadde350 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -346,6 +346,9 @@ struct nstr_phdr {
guint8 rec_type;
guint8 vlantag_offset;
guint8 coreid_offset;
+ guint8 srcnodeid_offset;
+ guint8 destnodeid_offset;
+ guint8 clflags_offset;
};
/* Packet "pseudo-header" information for Ethernet capture files. */