aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>2009-12-04 15:21:48 +0000
committerwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>2009-12-04 15:21:48 +0000
commit45bebcf0a850ec778ee9ee1a8e9a384416839e86 (patch)
treea0baf6f01b4016c4bb0b9a9f9b39562dac62937a
parent14038dbc0faefdf6727f4f97f7fec34537bb311e (diff)
From: Ravi Kondamuru:
"... a patch to make the netscaler wiretap code independent of the host system endian-ness. I have taken care of (1) reading and writing nstrace files (netscaler.c) and (2) reading in dissector code (packet-nstrace.c) also." See: https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3540#c26 git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@31171 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r--epan/dissectors/packet-nstrace.c28
-rw-r--r--wiretap/netscaler.c128
2 files changed, 81 insertions, 75 deletions
diff --git a/epan/dissectors/packet-nstrace.c b/epan/dissectors/packet-nstrace.c
index 236f5e46fa..7ff5173aad 100644
--- a/epan/dissectors/packet-nstrace.c
+++ b/epan/dissectors/packet-nstrace.c
@@ -91,32 +91,38 @@ dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
guint8 offset;
- if ((pnstr->rec_type == NSPR_HEADER_VERSION202) || (pnstr->rec_type == NSPR_HEADER_VERSION203))
- col_add_fstr(pinfo->cinfo, COL_8021Q_VLAN_ID, "%d", BSWAP16(tvb_get_ntohs(tvb, pnstr->vlantag_offset)));
-
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);
proto_tree_add_item(ns_tree, hf_ns_dir, tvb, pnstr->dir_offset, pnstr->dir_len, TRUE);
proto_tree_add_item(ns_tree, hf_ns_nicno, tvb, pnstr->nicno_offset, pnstr->nicno_len, TRUE);
- if ((pnstr->rec_type == NSPR_HEADER_VERSION201) ||
- (pnstr->rec_type == NSPR_HEADER_VERSION202) || (pnstr->rec_type == NSPR_HEADER_VERSION203))
+ switch (pnstr->rec_type)
{
+ case NSPR_HEADER_VERSION203:
+ proto_tree_add_item(ns_tree, hf_ns_coreid, tvb, pnstr->coreid_offset, 2, TRUE);
+ /* fall through to next case */
+
+ case NSPR_HEADER_VERSION202:
+ col_add_fstr(pinfo->cinfo, COL_8021Q_VLAN_ID, "%d", tvb_get_letohs(tvb, pnstr->vlantag_offset));
+ proto_tree_add_item(ns_tree, hf_ns_vlantag, tvb, pnstr->vlantag_offset, 2, TRUE);
+ /* fall through to next case */
+
+ case NSPR_HEADER_VERSION201:
proto_tree_add_item(ns_tree, hf_ns_pcbdevno, tvb, pnstr->pcb_offset, 4, TRUE);
ti = proto_tree_add_item(ns_tree, hf_ns_devno, tvb, pnstr->pcb_offset, 4, TRUE);
PROTO_ITEM_SET_HIDDEN(ti);
+
proto_tree_add_item(ns_tree, hf_ns_l_pcbdevno, tvb, pnstr->l_pcb_offset, 4, TRUE);
ti = proto_tree_add_item(ns_tree, hf_ns_devno, tvb, pnstr->l_pcb_offset, 4, TRUE);
PROTO_ITEM_SET_HIDDEN(ti);
- if ((pnstr->rec_type != NSPR_HEADER_VERSION201) &&
- (tvb_get_ntohs(tvb, pnstr->vlantag_offset) != 0))
- proto_tree_add_item(ns_tree, hf_ns_vlantag, tvb, pnstr->vlantag_offset, 2, TRUE);
+
+ break;
+
+ default:
+ break;
}
- if (pnstr->rec_type == NSPR_HEADER_VERSION203)
- proto_tree_add_item(ns_tree, hf_ns_coreid, tvb, pnstr->coreid_offset, 2, TRUE);
-
/* Dissect as Ethernet */
offset = pnstr->eth_offset;
next_tvb_eth_client = tvb_new_subset(tvb, offset, tvb_length_remaining(tvb, offset), tvb_reported_length_remaining(tvb, offset));
diff --git a/wiretap/netscaler.c b/wiretap/netscaler.c
index ed361ece16..01d9fa1b12 100644
--- a/wiretap/netscaler.c
+++ b/wiretap/netscaler.c
@@ -120,15 +120,6 @@ typedef struct nspr_hd_v20
*/
#define NSPR_V20RECORDSIZE_2BYTES 0x80
-/* get the record size from performance record */
-#define nspr_getv20recordsize(hdp) \
- (((hdp)->phd_RecordSizeLow & NSPR_V20RECORDSIZE_2BYTES)? \
- (((hdp)->phd_RecordSizeHigh * NSPR_V20RECORDSIZE_2BYTES)+ \
- ((hdp)->phd_RecordSizeLow & ~NSPR_V20RECORDSIZE_2BYTES)) : \
- (hdp)->phd_RecordSizeLow)
-
-
-
/* Performance Data Header with device number */
typedef struct nspr_headerdev_v10
{
@@ -327,34 +318,8 @@ typedef struct nspr_pktracepart_v23
} nspr_pktracepart_v23_t;
#define nspr_pktracepart_v23_s (sizeof(nspr_pktracepart_v23_t) -4)
-#define TRACE_V10_REC_LEN_OFF(enumprefix,structprefix,structname) \
- __TNV1O(enumprefix,structprefix,structname,dir,phd.ph_RecordType)\
- __TNV1L(enumprefix,structprefix,structname,dir,phd.ph_RecordType)\
- __TNV1O(enumprefix,structprefix,structname,nicno,phd.ph_DevNo)\
- __TNV1L(enumprefix,structprefix,structname,nicno,phd.ph_DevNo)\
- __TNO(enumprefix,structprefix,structname,eth,Data)
-
-#define TRACE_V20_REC_LEN_OFF(enumprefix,structprefix,structname) \
- __TNO(enumprefix,structprefix,structname,dir,RecordType)\
- __TNL(enumprefix,structprefix,structname,dir,RecordType)\
- __TNO(enumprefix,structprefix,structname,nicno,DevNo)\
- __TNL(enumprefix,structprefix,structname,nicno,DevNo)\
- __TNO(enumprefix,structprefix,structname,eth,Data)
-
-#define TRACE_V21_REC_LEN_OFF(enumprefix,structprefix,structname) \
- TRACE_V20_REC_LEN_OFF(enumprefix,structprefix,structname)\
- __TNO(enumprefix,structprefix,structname,pcb,PcbDevNo)\
- __TNO(enumprefix,structprefix,structname,l_pcb,lPcbDevNo)
-
-#define TRACE_V22_REC_LEN_OFF(enumprefix,structprefix,structname) \
- TRACE_V21_REC_LEN_OFF(enumprefix,structprefix,structname)\
- __TNO(enumprefix,structprefix,structname,vlantag,VlanTag)\
-
-#define TRACE_V23_REC_LEN_OFF(enumprefix,structprefix,structname) \
- TRACE_V22_REC_LEN_OFF(enumprefix,structprefix,structname)\
- __TNO(enumprefix,structprefix,structname,coreid,Coreid)\
-
#define myoffsetof(type,fieldname) (&(((type*)0)->fieldname))
+
#define __TNO(enumprefix,structprefix,structname,hdrname,structfieldname) \
guint8 enumprefix##_##hdrname##_offset = (guint8)GPOINTER_TO_INT(myoffsetof(nspr_##structname##_t,structprefix##_##structfieldname));
@@ -367,6 +332,34 @@ typedef struct nspr_pktracepart_v23
#define __TNV1L(enumprefix,structprefix,structname,hdrname,structfieldname) \
guint8 enumprefix##_##hdrname##_len = (guint8)sizeof(((nspr_##structname##_t*)0)->structfieldname);
+#define TRACE_V10_REC_LEN_OFF(enumprefix,structprefix,structname) \
+ __TNV1O(enumprefix,structprefix,structname,dir,phd.ph_RecordType)\
+ __TNV1L(enumprefix,structprefix,structname,dir,phd.ph_RecordType)\
+ __TNV1O(enumprefix,structprefix,structname,nicno,phd.ph_DevNo)\
+ __TNV1L(enumprefix,structprefix,structname,nicno,phd.ph_DevNo)\
+ __TNO(enumprefix,structprefix,structname,eth,Data)
+
+#define TRACE_V20_REC_LEN_OFF(enumprefix,structprefix,structname) \
+ __TNO(enumprefix,structprefix,structname,dir,RecordType)\
+ __TNL(enumprefix,structprefix,structname,dir,RecordType)\
+ __TNO(enumprefix,structprefix,structname,nicno,DevNo)\
+ __TNL(enumprefix,structprefix,structname,nicno,DevNo)\
+ __TNO(enumprefix,structprefix,structname,eth,Data)
+
+#define TRACE_V21_REC_LEN_OFF(enumprefix,structprefix,structname) \
+ TRACE_V20_REC_LEN_OFF(enumprefix,structprefix,structname)\
+ __TNO(enumprefix,structprefix,structname,pcb,PcbDevNo)\
+ __TNO(enumprefix,structprefix,structname,l_pcb,lPcbDevNo)
+
+#define TRACE_V22_REC_LEN_OFF(enumprefix,structprefix,structname) \
+ TRACE_V21_REC_LEN_OFF(enumprefix,structprefix,structname)\
+ __TNO(enumprefix,structprefix,structname,vlantag,VlanTag)
+
+#define TRACE_V23_REC_LEN_OFF(enumprefix,structprefix,structname) \
+ TRACE_V22_REC_LEN_OFF(enumprefix,structprefix,structname)\
+ __TNO(enumprefix,structprefix,structname,coreid,Coreid)
+
+
TRACE_V10_REC_LEN_OFF(v10_part,pp,pktracepart_v10)
TRACE_V10_REC_LEN_OFF(v10_full,fp,pktracefull_v10)
TRACE_V20_REC_LEN_OFF(v20_part,pp,pktracepart_v20)
@@ -383,6 +376,7 @@ typedef struct nspr_pktracepart_v23
#undef __TNO
#undef __TNL
+
#define ns_setabstime(wth, AbsoluteTime, RelativeTimems) \
do { \
wth->capture.nstrace->nspm_curtime = AbsoluteTime; \
@@ -566,8 +560,8 @@ nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
for ( ; len > (gint32)(ns_min(sizeof(NSPR_SIGSTR_V10), sizeof(NSPR_SIGSTR_V20))); dp++, len--)
{
#define sigv10p ((nspr_signature_v10_t*)dp)
- if ((sigv10p->nsprRecordType == NSPR_SIGNATURE_V10) &&
- (sigv10p->nsprRecordSize <= len) &&
+ if ((pletohs(&sigv10p->nsprRecordType) == NSPR_SIGNATURE_V10) &&
+ (pletohs(&sigv10p->nsprRecordSize) <= len) &&
((gint32)sizeof(NSPR_SIGSTR_V10) <= len) &&
(!nspm_signature_isv10(sigv10p->sig_Signature)))
return WTAP_FILE_NETSCALER_1_0;
@@ -586,9 +580,15 @@ nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
return 0; /* no version found */
}
-#define nspr_getv10recordsize(hdp) (hdp->nsprRecordSize)
-#define nspr_getv10recordtype(hdp) (hdp->nsprRecordType)
+#define nspr_getv10recordtype(hdp) (pletohs(&hdp->nsprRecordType))
+#define nspr_getv10recordsize(hdp) (pletohs(&hdp->nsprRecordSize))
#define nspr_getv20recordtype(hdp) (hdp->phd_RecordType)
+#define nspr_getv20recordsize(hdp) \
+ (((hdp)->phd_RecordSizeLow & NSPR_V20RECORDSIZE_2BYTES)? \
+ (((hdp)->phd_RecordSizeHigh * NSPR_V20RECORDSIZE_2BYTES)+ \
+ ((hdp)->phd_RecordSizeLow & ~NSPR_V20RECORDSIZE_2BYTES)) : \
+ (hdp)->phd_RecordSizeLow)
+
#define nstrace_set_start_time_ver(ver) \
gboolean nstrace_set_start_time_v##ver(wtap *wth) \
@@ -604,7 +604,7 @@ nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
switch (nspr_getv##ver##recordtype(fp))\
{\
case NSPR_ABSTIME_V##ver:\
- ns_setabstime(wth, ((nspr_abstime_v##ver##_t *) fp)->abs_Time, ((nspr_abstime_v##ver##_t *) fp)->abs_RelTime);\
+ ns_setabstime(wth, pletohl(&((nspr_abstime_v##ver##_t *) fp)->abs_Time), pletohs(&((nspr_abstime_v##ver##_t *) fp)->abs_RelTime));\
wth->capture.nstrace->nstrace_buf_offset = nstrace_buf_offset + nspr_getv##ver##recordsize(fp);\
wth->capture.nstrace->nstrace_buflen = nstrace_buflen;\
return TRUE;\
@@ -683,17 +683,17 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
fp = (nspr_pktracefull_v10_t *) &nstrace_buf[nstrace_buf_offset];
pp = (nspr_pktracepart_v10_t *) fp;
- switch (fp->nsprRecordType)
+ switch (pletohs(&fp->nsprRecordType))
{
case NSPR_PDPKTRACEFULLTX_V10:
case NSPR_PDPKTRACEFULLTXB_V10:
case NSPR_PDPKTRACEFULLRX_V10:
- nsg_creltime += ns_hrtime2nsec(fp->fp_RelTimeHr);
+ nsg_creltime += ns_hrtime2nsec(pletohl(&fp->fp_RelTimeHr));
wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);
wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);
- wth->phdr.len = fp->nsprRecordSize;
+ wth->phdr.len = pletohs(&fp->nsprRecordSize);
wth->phdr.caplen = wth->phdr.len;
@@ -703,7 +703,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
memcpy(buffer_start_ptr(wth->frame_buffer), fp, wth->phdr.caplen);
*data_offset = wth->data_offset + nstrace_buf_offset;
- wth->capture.nstrace->nstrace_buf_offset = nstrace_buf_offset + fp->nsprRecordSize;
+ wth->capture.nstrace->nstrace_buf_offset = nstrace_buf_offset + wth->phdr.len;
wth->capture.nstrace->nstrace_buflen = nstrace_buflen;
wth->capture.nstrace->nsg_creltime = nsg_creltime;
@@ -713,12 +713,12 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
case NSPR_PDPKTRACEPARTTXB_V10:
case NSPR_PDPKTRACEPARTRX_V10:
- nsg_creltime += ns_hrtime2nsec(pp->pp_RelTimeHr);
+ nsg_creltime += ns_hrtime2nsec(pletohl(&pp->pp_RelTimeHr));
wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);
wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);
- wth->phdr.len = pp->pp_PktSizeOrg + nspr_pktracepart_v10_s;
- wth->phdr.caplen = pp->nsprRecordSize;
+ wth->phdr.len = pletohs(&pp->pp_PktSizeOrg) + nspr_pktracepart_v10_s;
+ wth->phdr.caplen = pletohs(&pp->nsprRecordSize);
TRACE_V10_REC_LEN_OFF(v10_part,pp,pktracepart_v10);
@@ -726,7 +726,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
memcpy(buffer_start_ptr(wth->frame_buffer), pp, wth->phdr.caplen);
*data_offset = wth->data_offset + nstrace_buf_offset;
- wth->capture.nstrace->nstrace_buf_offset = nstrace_buf_offset + pp->nsprRecordSize;
+ wth->capture.nstrace->nstrace_buf_offset = nstrace_buf_offset + wth->phdr.caplen;
wth->capture.nstrace->nsg_creltime = nsg_creltime;
wth->capture.nstrace->nstrace_buflen = nstrace_buflen;
@@ -734,14 +734,14 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
case NSPR_ABSTIME_V10:
- ns_setabstime(wth, ((nspr_abstime_v10_t *) fp)->abs_Time, ((nspr_abstime_v10_t *) fp)->abs_RelTime);
- nstrace_buf_offset += fp->nsprRecordSize;
+ ns_setabstime(wth, pletohl(&((nspr_abstime_v10_t *) fp)->abs_Time), pletohl(&((nspr_abstime_v10_t *) fp)->abs_RelTime));
+ nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
break;
case NSPR_RELTIME_V10:
ns_setrelativetime(wth, ((nspr_abstime_v10_t *) fp)->abs_RelTime);
- nstrace_buf_offset += fp->nsprRecordSize;
+ nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
break;
case NSPR_UNUSEDSPACE_V10:
@@ -751,7 +751,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
default:
- nstrace_buf_offset += fp->nsprRecordSize;
+ nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
break;
}
}
@@ -766,7 +766,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
#define TIMEDEFV20(fp,type) \
do {\
- nsg_creltime += ns_hrtime2nsec(fp->type##_RelTimeHr);\
+ nsg_creltime += ns_hrtime2nsec(pletohl(&fp->type##_RelTimeHr));\
wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);\
wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);\
}while(0)
@@ -784,7 +784,7 @@ gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_of
#define PPSIZEDEFV20(pp,ver) \
do {\
- wth->phdr.len = pp->pp_PktSizeOrg + nspr_pktracepart_v##ver##_s;\
+ wth->phdr.len = pletohs(&pp->pp_PktSizeOrg) + nspr_pktracepart_v##ver##_s;\
wth->phdr.caplen = nspr_getv20recordsize((nspr_hd_v20_t *)pp);\
}while(0)
@@ -865,14 +865,14 @@ gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_of
{
fp20 = (nspr_pktracefull_v20_t *) &nstrace_buf[nstrace_buf_offset];
nstrace_buf_offset += nspr_getv20recordsize((nspr_hd_v20_t *)fp20);
- ns_setabstime(wth, ((nspr_abstime_v20_t *) fp20)->abs_Time, ((nspr_abstime_v20_t *) fp20)->abs_RelTime);
+ ns_setabstime(wth, pletohl(&((nspr_abstime_v20_t *) fp20)->abs_Time), pletohs(&((nspr_abstime_v20_t *) fp20)->abs_RelTime));
break;
}
case NSPR_RELTIME_V20:
{
fp20 = (nspr_pktracefull_v20_t *) &nstrace_buf[nstrace_buf_offset];
- ns_setrelativetime(wth, ((nspr_abstime_v20_t *) fp20)->abs_RelTime);
+ ns_setrelativetime(wth, pletohs(&((nspr_abstime_v20_t *) fp20)->abs_RelTime));
nstrace_buf_offset += nspr_getv20recordsize((nspr_hd_v20_t *)fp20);
break;
}
@@ -967,7 +967,7 @@ gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
pseudo_header->nstr.rec_type = NSPR_HEADER_VERSION##acttype;\
break;\
- switch ((( nspr_header_v10_t*)pd)->ph_RecordType)
+ switch (pletohs(&(( nspr_header_v10_t*)pd)->ph_RecordType))
{
GENERATE_CASE_FULL(10,100)
GENERATE_CASE_PART(10,100)
@@ -1060,8 +1060,8 @@ gboolean nstrace_add_signature(wtap_dumper *wdh)
nspr_signature_v10_t sig10;
/* populate the record */
- sig10.phd.ph_RecordType = NSPR_SIGNATURE_V10;
- sig10.phd.ph_RecordSize = nspr_signature_v10_s;
+ sig10.phd.ph_RecordType = htoles(NSPR_SIGNATURE_V10);
+ sig10.phd.ph_RecordSize = htoles(nspr_signature_v10_s);
memcpy(sig10.sig_Signature, NSPR_SIGSTR_V10, NSPR_SIGSIZE_V10);
/* Write the record into the file */
@@ -1112,14 +1112,14 @@ gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
nspr_pktracefull_v10_t fp10;
/* populate the record */
- abs10.phd.ph_RecordType = NSPR_ABSTIME_V10;
- abs10.phd.ph_RecordSize = nspr_abstime_v10_s;
+ abs10.phd.ph_RecordType = htoles(NSPR_ABSTIME_V10);
+ abs10.phd.ph_RecordSize = htoles(nspr_abstime_v10_s);
memcpy(&fp10, pd, nspr_pktracefull_v10_s);
nsg_creltime = ns_hrtime2nsec(fp10.fp_RelTimeHr);
abs10.abs_RelTime = 0;
- abs10.abs_Time = (guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000);
+ abs10.abs_Time = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
/* Write the record into the file */
nwritten = fwrite(&abs10, 1, nspr_abstime_v10_s, wdh->fh);
@@ -1141,7 +1141,7 @@ gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
nsg_creltime = ns_hrtime2nsec(fp20.fp_RelTimeHr);
abs20.abs_RelTime = 0;
- abs20.abs_Time = (guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000);
+ abs20.abs_Time = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
/* Write the record into the file */
nwritten = fwrite(&abs20, 1, nspr_abstime_v20_s, wdh->fh);