diff options
-rw-r--r-- | epan/dissectors/packet-nstrace.c | 104 | ||||
-rw-r--r-- | wiretap/netscaler.c | 87 | ||||
-rw-r--r-- | wiretap/netscaler.h | 11 | ||||
-rw-r--r-- | wiretap/wtap.h | 3 |
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. */ |