#include "buffer.h"
#include "netscaler.h"
-/* Defines imported from netscaler code: nstypes.h */
-
-#define ns_min(a, b) ((a<b)?a:b)
-
/* Defines imported from netscaler code: nsperfrc.h */
#define NSPR_SIGSTR_V10 "NetScaler Performance Data"
typedef struct nspr_header_v10
{
- guint16 ph_RecordType; /* Record Type */
- guint16 ph_RecordSize; /* Record Size including header */
+ guint8 ph_RecordType[2]; /* Record Type */
+ guint8 ph_RecordSize[2]; /* Record Size including header */
} nspr_header_v10_t;
#define nspr_header_v10_s sizeof(nspr_header_v10_t)
/* This is V20 short header (2 bytes long) to be included where needed */
#define NSPR_HEADER_V20(prefix) \
- guint8 prefix##_RecordType; /* Record Type */ \
- guint8 prefix##_RecordSize /* Record Size including header */ \
+ guint8 prefix##_RecordType; /* Record Type */ \
+ guint8 prefix##_RecordSize /* Record Size including header */ \
/* end of declaration */
/* This is new long header (3 bytes long) to be included where needed */
*/
#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
{
- guint16 ph_RecordType; /* Record Type */
- guint16 ph_RecordSize; /* Record Size including header */
- guint32 ph_DevNo; /* Network Device (NIC/CONN) number */
+ guint8 ph_RecordType[2]; /* Record Type */
+ guint8 ph_RecordSize[2]; /* Record Size including header */
+ guint8 ph_DevNo[4]; /* Network Device (NIC/CONN) number */
} nspr_headerdev_v10_t;
#define nspr_headerdev_v10_s sizeof(nspr_headerdev_v10_t)
nspr_header_v10_t phd; /* performance header */
guint8 sig_EndianType; /* Endian Type for the data */
guint8 sig_Reserved0;
- guint16 sig_Reserved1;
+ guint8 sig_Reserved1[2];
gchar sig_Signature[NSPR_SIGSIZE_V10]; /* Signature value */
} nspr_signature_v10_t;
#define nspr_signature_v10_s sizeof(nspr_signature_v10_t)
typedef struct nspr_abstime_v10
{
nspr_header_v10_t phd; /* performance header */
- guint32 abs_RelTime; /* relative time is ms from last time */
- guint32 abs_Time; /* absolute time in seconds from 1970 */
+ guint8 abs_RelTime[4]; /* relative time is ms from last time */
+ guint8 abs_Time[4]; /* absolute time in seconds from 1970 */
} nspr_abstime_v10_t;
#define nspr_abstime_v10_s sizeof(nspr_abstime_v10_t)
typedef struct nspr_abstime_v20
{
NSPR_HEADER_V20(abs); /* short performance header */
- guint16 abs_RelTime; /* relative time is ms from last time */
- guint32 abs_Time; /* absolute time in seconds from 1970 */
+ guint8 abs_RelTime[2]; /* relative time is ms from last time */
+ guint8 abs_Time[4]; /* absolute time in seconds from 1970 */
} nspr_abstime_v20_t;
#define nspr_abstime_v20_s sizeof(nspr_abstime_v20_t)
typedef struct nspr_pktracefull_v10
{
nspr_headerdev_v10_t phd; /* performance header */
- guint32 fp_RelTimeHr; /* High resolution relative time */
- guint8 fp_Data[1]; /* packet data starts here */
+ guint8 fp_RelTimeHr[4]; /* High resolution relative time */
+ guint8 fp_Data[1]; /* packet data starts here */
} nspr_pktracefull_v10_t;
#define nspr_pktracefull_v10_s (nspr_hdev_v10_s + 4)
/* new full packet trace structure v20 */
typedef struct nspr_pktracefull_v20
{
- NSPR_HEADER3B_V20(fp); /* long performance header */
- guint8 fp_DevNo; /* Network Device (NIC) number */
- guint32 fp_RelTimeHr; /* High resolution relative time */
- guint8 fp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V20(fp); /* long performance header */
+ guint8 fp_DevNo; /* Network Device (NIC) number */
+ guint8 fp_RelTimeHr[4]; /* High resolution relative time */
+ guint8 fp_Data[4]; /* packet data starts here */
} nspr_pktracefull_v20_t;
#define nspr_pktracefull_v20_s (sizeof(nspr_pktracefull_v20_t) - 4)
/* new full packet trace structure v21 */
typedef struct nspr_pktracefull_v21
{
- NSPR_HEADER3B_V21(fp); /* long performance header */
- guint8 fp_DevNo; /* Network Device (NIC) number */
- guint32 fp_RelTimeHr; /* High resolution relative time */
- guint32 fp_PcbDevNo; /* PCB devno */
- guint32 fp_lPcbDevNo; /* link PCB devno */
- guint8 fp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V21(fp); /* long performance header */
+ guint8 fp_DevNo; /* Network Device (NIC) number */
+ guint8 fp_RelTimeHr[4]; /* High resolution relative time */
+ guint8 fp_PcbDevNo[4]; /* PCB devno */
+ guint8 fp_lPcbDevNo[4]; /* link PCB devno */
+ guint8 fp_Data[4]; /* packet data starts here */
} nspr_pktracefull_v21_t;
#define nspr_pktracefull_v21_s (sizeof(nspr_pktracefull_v21_t) - 4)
/* new full packet trace structure v22 */
typedef struct nspr_pktracefull_v22
{
- NSPR_HEADER3B_V22(fp); /* long performance header */
- guint8 fp_DevNo; /* Network Device (NIC) number */
- guint32 fp_RelTimeHr; /* High resolution relative time */
- guint32 fp_PcbDevNo; /* PCB devno */
- guint32 fp_lPcbDevNo; /* link PCB devno */
- guint16 fp_VlanTag;
- guint8 fp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V22(fp); /* long performance header */
+ guint8 fp_DevNo; /* Network Device (NIC) number */
+ guint8 fp_RelTimeHr[4]; /* High resolution relative time */
+ guint8 fp_PcbDevNo[4]; /* PCB devno */
+ guint8 fp_lPcbDevNo[4]; /* link PCB devno */
+ guint8 fp_VlanTag[2]; /* vlan tag */
+ guint8 fp_Data[2]; /* packet data starts here */
} nspr_pktracefull_v22_t;
-#define nspr_pktracefull_v22_s (sizeof(nspr_pktracefull_v22_t) - 4)
+#define nspr_pktracefull_v22_s (sizeof(nspr_pktracefull_v22_t) - 2)
typedef struct nspr_pktracefull_v23
{
- NSPR_HEADER3B_V22(fp); /* long performance header */
- guint8 fp_DevNo; /* Network Device (NIC) number */
- guint32 fp_AbsTimeHighHdr; /* Higher value of the absolute time */
- guint32 fp_AbsTimeLowHdr; /* High resolution low time */
- guint32 fp_PcbDevNo; /* PCB devno */
- guint32 fp_lPcbDevNo; /* link PCB devno */
- guint16 fp_VlanTag; /* vlan tag */
- guint16 fp_Coreid; /* coreid of the packet */
- guint8 fp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V22(fp); /* long performance header */
+ guint8 fp_DevNo; /* Network Device (NIC) number */
+ guint8 fp_AbsTimeHr[8]; /* High resolution absolute time */
+ 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_Data[2]; /* packet data starts here */
} nspr_pktracefull_v23_t;
-#define nspr_pktracefull_v23_s (sizeof(nspr_pktracefull_v23_t) - 4)
+#define nspr_pktracefull_v23_s (sizeof(nspr_pktracefull_v23_t) - 2)
/* partial packet trace structure */
typedef struct nspr_pktracepart_v10
{
nspr_headerdev_v10_t phd; /* performance header */
- guint32 pp_RelTimeHr; /* High resolution relative time */
- guint16 pp_PktSizeOrg; /* Original packet size */
- guint16 pp_PktOffset; /* starting offset in packet */
- guint8 pp_Data[1]; /* packet data starts here */
+ guint8 pp_RelTimeHr[4]; /* High resolution relative time */
+ guint8 pp_PktSizeOrg[2]; /* Original packet size */
+ guint8 pp_PktOffset[2]; /* starting offset in packet */
+ guint8 pp_Data[1]; /* packet data starts here */
} nspr_pktracepart_v10_t;
#define nspr_pktracepart_v10_s (nspr_pktracefull_v10_s + 4)
/* new partial packet trace structure */
typedef struct nspr_pktracepart_v20
{
- NSPR_HEADER3B_V20(pp); /* long performance header */
- guint8 pp_DevNo; /* Network Device (NIC) number */
- guint32 pp_RelTimeHr; /* High resolution relative time */
- guint16 pp_PktSizeOrg; /* Original packet size */
- guint16 pp_PktOffset; /* starting offset in packet */
- guint8 pp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V20(pp); /* long performance header */
+ guint8 pp_DevNo; /* Network Device (NIC) number */
+ guint8 pp_RelTimeHr[4]; /* High resolution relative time */
+ guint8 pp_PktSizeOrg[2]; /* Original packet size */
+ guint8 pp_PktOffset[2]; /* starting offset in packet */
+ guint8 pp_Data[4]; /* packet data starts here */
} nspr_pktracepart_v20_t;
#define nspr_pktracepart_v20_s (sizeof(nspr_pktracepart_v20_t) -4)
/* new partial packet trace structure */
typedef struct nspr_pktracepart_v21
{
- NSPR_HEADER3B_V21(pp); /* long performance header */
- guint8 pp_DevNo; /* Network Device (NIC) number */
- guint32 pp_RelTimeHr; /* High resolution relative time */
- guint16 pp_PktSizeOrg; /* Original packet size */
- guint16 pp_PktOffset; /* starting offset in packet */
- guint32 pp_PcbDevNo; /* PCB devno */
- guint32 pp_lPcbDevNo; /* link PCB devno */
- guint8 pp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V21(pp); /* long performance header */
+ guint8 pp_DevNo; /* Network Device (NIC) number */
+ guint8 pp_RelTimeHr[4]; /* High resolution relative time */
+ 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_Data[4]; /* packet data starts here */
} nspr_pktracepart_v21_t;
#define nspr_pktracepart_v21_s (sizeof(nspr_pktracepart_v21_t) -4)
/* new partial packet trace structure v22 */
typedef struct nspr_pktracepart_v22
{
- NSPR_HEADER3B_V22(pp); /* long performance header */
- guint8 pp_DevNo; /* Network Device (NIC) number */
- guint32 pp_RelTimeHr; /* High resolution relative time */
- guint16 pp_PktSizeOrg; /* Original packet size */
- guint16 pp_PktOffset; /* starting offset in packet */
- guint32 pp_PcbDevNo; /* PCB devno */
- guint32 pp_lPcbDevNo; /* link PCB devno */
- guint16 pp_VlanTag; /* Vlan Tag */
- guint8 pp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V22(pp); /* long performance header */
+ guint8 pp_DevNo; /* Network Device (NIC) number */
+ guint8 pp_RelTimeHr[4]; /* High resolution relative time */
+ 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_Data[2]; /* packet data starts here */
} nspr_pktracepart_v22_t;
-#define nspr_pktracepart_v22_s (sizeof(nspr_pktracepart_v22_t) -4)
+#define nspr_pktracepart_v22_s (sizeof(nspr_pktracepart_v22_t) -2)
typedef struct nspr_pktracepart_v23
{
- NSPR_HEADER3B_V22(pp); /* long performance header */
- guint8 pp_DevNo; /* Network Device (NIC) number */
- guint32 pp_AbsTimeHighHdr; /* Higher value of the absolute time */
- guint32 pp_AbsTimeLowHdr; /* High resolution low time */
- guint16 pp_PktSizeOrg; /* Original packet size */
- guint16 pp_PktOffset; /* starting offset in packet */
- guint32 pp_PcbDevNo; /* PCB devno */
- guint32 pp_lPcbDevNo; /* link PCB devno */
- guint16 pp_VlanTag; /* vlan tag */
- guint16 pp_Coreid; /* Coreid of the packet */
- guint8 pp_Data[4]; /* packet data starts here */
+ NSPR_HEADER3B_V22(pp); /* long performance header */
+ guint8 pp_DevNo; /* Network Device (NIC) number */
+ guint8 pp_AbsTimeHr[8]; /* High resolution absolute time */
+ 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_Data[4]; /* packet data starts here */
} 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));
#define __TNL(enumprefix,structprefix,structname,hdrname,structfieldname) \
guint8 enumprefix##_##hdrname##_len = (guint8)sizeof(((nspr_##structname##_t*)0)->structprefix##_##structfieldname);
-
+
#define __TNV1O(enumprefix,structprefix,structname,hdrname,structfieldname) \
guint8 enumprefix##_##hdrname##_offset = (guint8)GPOINTER_TO_INT(myoffsetof(nspr_##structname##_t,structfieldname));
#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)
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)
-
+
#undef __TNV1O
#undef __TNV1L
#undef __TNO
#undef __TNL
-#define ns_setabstime(wth, AbsoluteTime, RelativeTimems) \
+
+#define ns_setabstime(nstrace, AbsoluteTime, RelativeTimems) \
do { \
- wth->capture.nstrace->nspm_curtime = AbsoluteTime; \
- wth->capture.nstrace->nspm_curtimemsec += RelativeTimems; \
- wth->capture.nstrace->nspm_curtimelastmsec = wth->capture.nstrace->nspm_curtimemsec; \
+ (nstrace)->nspm_curtime = AbsoluteTime; \
+ (nstrace)->nspm_curtimemsec += RelativeTimems; \
+ (nstrace)->nspm_curtimelastmsec = nstrace->nspm_curtimemsec; \
} while(0)
-#define ns_setrelativetime(wth, RelativeTimems) \
+#define ns_setrelativetime(nstrace, RelativeTimems) \
do { \
guint32 rsec; \
- wth->capture.nstrace->nspm_curtimemsec += RelativeTimems; \
- rsec = (guint32)(wth->capture.nstrace->nspm_curtimemsec - wth->capture.nstrace->nspm_curtimelastmsec)/1000; \
- wth->capture.nstrace->nspm_curtime += rsec; \
- wth->capture.nstrace->nspm_curtimelastmsec += rsec * 1000; \
+ (nstrace)->nspm_curtimemsec += RelativeTimems; \
+ rsec = (guint32)((nstrace)->nspm_curtimemsec - (nstrace)->nspm_curtimelastmsec)/1000; \
+ (nstrace)->nspm_curtime += rsec; \
+ (nstrace)->nspm_curtimelastmsec += rsec * 1000; \
} while (0)
+typedef struct {
+ gchar *pnstrace_buf;
+ gint32 nstrace_buf_offset;
+ gint32 nstrace_buflen;
+ /* Performance Monitor Time variables */
+ guint32 nspm_curtime; /* current time since 1970 */
+ guint64 nspm_curtimemsec; /* current time in mili second */
+ guint64 nspm_curtimelastmsec; /* nspm_curtime last update time in milisec */
+ guint64 nsg_creltime;
+ guint64 file_size;
+} nstrace_t;
+
guint32 nspm_signature_isv10(gchar *sigp);
guint32 nspm_signature_isv20(gchar *sigp);
-guint32 nspm_signature_version(wtap*, gchar*, gint32, gint64);
+guint32 nspm_signature_version(wtap*, gchar*, gint32);
gboolean nstrace_read(wtap *wth, int *err, gchar **err_info,
gint64 *data_offset);
gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info,
gint64 *data_offset);
gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info,
gint64 *data_offset);
-gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
- union wtap_pseudo_header *pseudo_header,
+gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
+ union wtap_pseudo_header *pseudo_header,
guchar *pd, int length,
- int *err, gchar **err_info _U_);
+ int *err, gchar **err_info);
void nstrace_close(wtap *wth);
void nstrace_sequential_close(wtap *wth);
gboolean nstrace_set_start_time(wtap *wth);
guint64 ns_hrtime2nsec(guint32 tm);
-static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
+static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
const union wtap_pseudo_header *pseudo_header, const guchar *pd, int *err);
-gboolean nstrace_add_signature(wtap_dumper *wdh);
-gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, const guchar *pd);
#define GET_READ_PAGE_SIZE(remaining_file_size) ((gint32)((remaining_file_size>NSPR_PAGESIZE)?NSPR_PAGESIZE:remaining_file_size))
gchar *nstrace_buf;
gint64 file_size;
gint32 page_size;
+ nstrace_t *nstrace;
+ int bytes_read;
errno = WTAP_ERR_CANT_READ;
- if ((file_size = wtap_file_size(wth, err)) == -1)
+ if ((file_size = wtap_file_size(wth, err)) == -1)
return 0;
-
+
nstrace_buf = g_malloc(NSPR_PAGESIZE);
page_size = GET_READ_PAGE_SIZE(file_size);
- switch ((wth->file_type = nspm_signature_version(wth, nstrace_buf, page_size, file_size)))
+ switch ((wth->file_type = nspm_signature_version(wth, nstrace_buf, page_size)))
{
case WTAP_FILE_NETSCALER_1_0:
wth->file_encap = WTAP_ENCAP_NSTRACE_1_0;
break;
-
+
case WTAP_FILE_NETSCALER_2_0:
wth->file_encap = WTAP_ENCAP_NSTRACE_2_0;
break;
if ((file_seek(wth->fh, 0, SEEK_SET, err)) == -1)
{
- *err = file_error(wth->fh);
+ *err = file_error(wth->fh, err_info);
g_free(nstrace_buf);
return 0;
}
- if (page_size != file_read(nstrace_buf, 1, page_size, wth->fh))
+ bytes_read = file_read(nstrace_buf, page_size, wth->fh);
+ if (bytes_read != page_size)
{
- *err = file_error(wth->fh);
+ *err = file_error(wth->fh, err_info);
g_free(nstrace_buf);
return 0;
}
-
+
wth->subtype_read = nstrace_read;
wth->subtype_seek_read = nstrace_seek_read;
- wth->subtype_close = nstrace_close;
-
- wth->capture.nstrace = g_malloc(sizeof(nstrace_t));
- wth->capture.nstrace->pnstrace_buf = nstrace_buf;
- wth->capture.nstrace->nstrace_buflen = page_size;
- wth->capture.nstrace->nstrace_buf_offset = 0;
- wth->capture.nstrace->nspm_curtime = 0;
- wth->capture.nstrace->nspm_curtimemsec = 0;
- wth->capture.nstrace->nspm_curtimelastmsec = 0;
- wth->capture.nstrace->nsg_creltime = 0;
- wth->capture.nstrace->file_size = file_size;
-
-
+ wth->subtype_close = nstrace_close;
+
+ nstrace = (nstrace_t *)g_malloc(sizeof(nstrace_t));
+ wth->priv = (void *)nstrace;
+ nstrace->pnstrace_buf = nstrace_buf;
+ nstrace->nstrace_buflen = page_size;
+ nstrace->nstrace_buf_offset = 0;
+ nstrace->nspm_curtime = 0;
+ nstrace->nspm_curtimemsec = 0;
+ nstrace->nspm_curtimelastmsec = 0;
+ nstrace->nsg_creltime = 0;
+ nstrace->file_size = file_size;
+
+
/* Set the start time by looking for the abstime record */
if ((nstrace_set_start_time(wth)) == FALSE)
{
/* Reset the read pointer to start of the file. */
if ((file_seek(wth->fh, 0, SEEK_SET, err)) == -1)
{
- *err = file_error(wth->fh);
- g_free(wth->capture.nstrace->pnstrace_buf);
- g_free(wth->capture.nstrace);
+ *err = file_error(wth->fh, err_info);
+ g_free(nstrace->pnstrace_buf);
+ g_free(nstrace);
return 0;
}
/* Read the first page of data */
- if (page_size != file_read(nstrace_buf, 1, page_size, wth->fh))
+ bytes_read = file_read(nstrace_buf, page_size, wth->fh);
+ if (bytes_read != page_size)
{
- *err = file_error(wth->fh);
- g_free(wth->capture.nstrace->pnstrace_buf);
- g_free(wth->capture.nstrace);
+ *err = file_error(wth->fh, err_info);
+ g_free(nstrace->pnstrace_buf);
+ g_free(nstrace);
return 0;
}
-
+
/* reset the buffer offset */
- wth->capture.nstrace->nstrace_buf_offset = 0;
+ nstrace->nstrace_buf_offset = 0;
}
wth->tsprecision = WTAP_FILE_TSPREC_NSEC;
- wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime;
+ wth->phdr.ts.secs = nstrace->nspm_curtime;
wth->phdr.ts.nsecs = 0;
*err = 0;
/*
** Check signature and return the version number of the signature.
** If not found, it returns 0. At the time of return from this function
-** we might not be at the first page. So after a call to this function, there
+** we might not be at the first page. So after a call to this function, there
** has to be a file seek to return to the start of the first page.
*/
guint32
-nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len, gint64 file_size)
+nspm_signature_version(wtap *wth, gchar *nstrace_buf, gint32 len)
{
gchar *dp = nstrace_buf;
- gint64 data_offset = 0;
+ int bytes_read;
- while (len > 0 && len == file_read(dp, 1, len, wth->fh)) {
+ bytes_read = file_read(dp, len, wth->fh);
+ if (bytes_read == len) {
- data_offset += len;
-
- for ( ; len > (gint32)(ns_min(sizeof(NSPR_SIGSTR_V10), sizeof(NSPR_SIGSTR_V20))); dp++, len--)
+ for ( ; len > (gint32)(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;
#undef sigv10p
-
+
#define sigv20p ((nspr_signature_v20_t*)dp)
if ((sigv20p->sig_RecordType == NSPR_SIGNATURE_V20) &&
(sigv20p->sig_RecordSize <= len) &&
return WTAP_FILE_NETSCALER_2_0;
#undef sigv20p
}
-
- dp = nstrace_buf;
- len = GET_READ_PAGE_SIZE((file_size-data_offset));
}
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) \
{\
- gchar* nstrace_buf = wth->capture.nstrace->pnstrace_buf;\
- gint32 nstrace_buf_offset = wth->capture.nstrace->nstrace_buf_offset;\
- gint32 nstrace_buflen = wth->capture.nstrace->nstrace_buflen;\
+ nstrace_t *nstrace = (nstrace_t *)wth->priv;\
+ gchar* nstrace_buf = nstrace->pnstrace_buf;\
+ gint32 nstrace_buf_offset = nstrace->nstrace_buf_offset;\
+ gint32 nstrace_buflen = nstrace->nstrace_buflen;\
+ int bytes_read;\
do\
{\
while (nstrace_buf_offset < nstrace_buflen)\
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);\
- wth->capture.nstrace->nstrace_buf_offset = nstrace_buf_offset + nspr_getv##ver##recordsize(fp);\
- wth->capture.nstrace->nstrace_buflen = nstrace_buflen;\
+ ns_setabstime(nstrace, pletohl(&((nspr_abstime_v##ver##_t *) fp)->abs_Time), pletohs(&((nspr_abstime_v##ver##_t *) fp)->abs_RelTime));\
+ nstrace->nstrace_buf_offset = nstrace_buf_offset + nspr_getv##ver##recordsize(fp);\
+ nstrace->nstrace_buflen = nstrace_buflen;\
return TRUE;\
case NSPR_UNUSEDSPACE_V10:\
nstrace_buf_offset = nstrace_buflen;\
}\
nstrace_buf_offset = 0;\
wth->data_offset += nstrace_buflen;\
- nstrace_buflen = GET_READ_PAGE_SIZE((wth->capture.nstrace->file_size - wth->data_offset));\
- }while((nstrace_buflen > 0) && (nstrace_buflen == (file_read(nstrace_buf, 1, nstrace_buflen, wth->fh))));\
+ nstrace_buflen = GET_READ_PAGE_SIZE((nstrace->file_size - wth->data_offset));\
+ }while((nstrace_buflen > 0) && (bytes_read = file_read(nstrace_buf, nstrace_buflen, wth->fh)) && bytes_read == nstrace_buflen); \
return FALSE;\
}
** Set the start time of the trace file. We look for the first ABSTIME record. We use that
** to set the start time. Apart from that we also make sure that we remember the position of
** the next record after the ABSTIME record. Inorder to report correct time values, all trace
-** records before the ABSTIME record are ignored.
+** records before the ABSTIME record are ignored.
*/
gboolean nstrace_set_start_time(wtap *wth)
{
*/
gboolean nstrace_read_v10(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
{
-
- guint64 nsg_creltime = wth->capture.nstrace->nsg_creltime;
- gchar *nstrace_buf = wth->capture.nstrace->pnstrace_buf;
- gint32 nstrace_buf_offset = wth->capture.nstrace->nstrace_buf_offset;
- gint32 nstrace_buflen = wth->capture.nstrace->nstrace_buflen;
+ nstrace_t *nstrace = (nstrace_t *)wth->priv;
+ guint64 nsg_creltime = nstrace->nsg_creltime;
+ gchar *nstrace_buf = nstrace->pnstrace_buf;
+ gint32 nstrace_buf_offset = nstrace->nstrace_buf_offset;
+ gint32 nstrace_buflen = nstrace->nstrace_buflen;
nspr_pktracefull_v10_t *fp;
nspr_pktracepart_v10_t *pp;
-
+ int bytes_read;
+
*err = 0;
- *err_info = g_strdup_printf("nstrace: no error");
+ *err_info = NULL;
do
{
while ((nstrace_buf_offset < nstrace_buflen) &&
((nstrace_buflen - nstrace_buf_offset) >= ((gint32)sizeof(fp->nsprRecordType))))
{
-
+
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);
- wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);
+
+ nsg_creltime += ns_hrtime2nsec(pletohl(&fp->fp_RelTimeHr));
+ wth->phdr.ts.secs = 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;
-
-
+
+
TRACE_V10_REC_LEN_OFF(v10_full,fp,pktracefull_v10);
-
+
buffer_assure_space(wth->frame_buffer, wth->phdr.caplen);
- memcpy(buffer_start_ptr(wth->frame_buffer), fp, wth->phdr.caplen);
+ 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_buflen = nstrace_buflen;
- wth->capture.nstrace->nsg_creltime = nsg_creltime;
+
+ nstrace->nstrace_buf_offset = nstrace_buf_offset + wth->phdr.len;
+ nstrace->nstrace_buflen = nstrace_buflen;
+ nstrace->nsg_creltime = nsg_creltime;
return TRUE;
-
+
case NSPR_PDPKTRACEPARTTX_V10:
case NSPR_PDPKTRACEPARTTXB_V10:
case NSPR_PDPKTRACEPARTRX_V10:
-
- nsg_creltime += ns_hrtime2nsec(pp->pp_RelTimeHr);
- wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);
+
+ nsg_creltime += ns_hrtime2nsec(pletohl(&pp->pp_RelTimeHr));
+ wth->phdr.ts.secs = 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);
-
+
buffer_assure_space(wth->frame_buffer, wth->phdr.caplen);
- memcpy(buffer_start_ptr(wth->frame_buffer), pp, wth->phdr.caplen);
+ 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->nsg_creltime = nsg_creltime;
- wth->capture.nstrace->nstrace_buflen = nstrace_buflen;
+
+ nstrace->nstrace_buf_offset = nstrace_buf_offset + wth->phdr.caplen;
+ nstrace->nsg_creltime = nsg_creltime;
+ nstrace->nstrace_buflen = nstrace_buflen;
return TRUE;
-
+
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(nstrace, 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;
+ ns_setrelativetime(nstrace, pletohl(((nspr_abstime_v10_t *) fp)->abs_RelTime));
+ nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
break;
-
+
case NSPR_UNUSEDSPACE_V10:
nstrace_buf_offset = nstrace_buflen;
break;
-
+
default:
- nstrace_buf_offset += fp->nsprRecordSize;
+ nstrace_buf_offset += pletohs(&fp->nsprRecordSize);
break;
}
}
-
+
nstrace_buf_offset = 0;
wth->data_offset += nstrace_buflen;
- nstrace_buflen = GET_READ_PAGE_SIZE((wth->capture.nstrace->file_size - wth->data_offset));
- }while((nstrace_buflen > 0) && (nstrace_buflen == (file_read(nstrace_buf, 1, nstrace_buflen, wth->fh))));
-
+ nstrace_buflen = GET_READ_PAGE_SIZE((nstrace->file_size - wth->data_offset));
+ }while((nstrace_buflen > 0) && (bytes_read = file_read(nstrace_buf, nstrace_buflen, wth->fh)) && (bytes_read == nstrace_buflen));
+
return FALSE;
}
#define TIMEDEFV20(fp,type) \
do {\
- nsg_creltime += ns_hrtime2nsec(fp->type##_RelTimeHr);\
- wth->phdr.ts.secs = wth->capture.nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);\
+ nsg_creltime += ns_hrtime2nsec(pletohl(fp->type##_RelTimeHr));\
+ wth->phdr.ts.secs = nstrace->nspm_curtime + (guint32) (nsg_creltime / 1000000000);\
wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);\
}while(0)
#define TIMEDEFV23(fp,type) \
do {\
- nsg_creltime = (guint64) fp->type##_AbsTimeHighHdr * 1000000;\
+ /* access _AbsTimeHr as a 64bit value */\
+ nsg_creltime = pletohll(fp->type##_AbsTimeHr);\
wth->phdr.ts.secs = (guint32) (nsg_creltime / 1000000000);\
wth->phdr.ts.nsecs = (guint32) (nsg_creltime % 1000000000);\
}while(0)
#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)
#define PPSIZEDEFV21(pp,ver) PPSIZEDEFV20(pp,ver)
#define PPSIZEDEFV22(pp,ver) PPSIZEDEFV20(pp,ver)
#define PPSIZEDEFV23(pp,ver) PPSIZEDEFV20(pp,ver)
-
+
#define FPSIZEDEFV20(fp,ver)\
do {\
wth->phdr.len = nspr_getv20recordsize((nspr_hd_v20_t *)fp);\
buffer_assure_space(wth->frame_buffer, wth->phdr.caplen);\
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 + nspr_getv20recordsize((nspr_hd_v20_t *)fp);\
- wth->capture.nstrace->nstrace_buflen = nstrace_buflen;\
- wth->capture.nstrace->nsg_creltime = nsg_creltime;\
+ nstrace->nstrace_buf_offset = nstrace_buf_offset + nspr_getv20recordsize((nspr_hd_v20_t *)fp);\
+ nstrace->nstrace_buflen = nstrace_buflen;\
+ nstrace->nsg_creltime = nsg_creltime;\
wth->pseudo_header.nstr.rec_type = NSPR_HEADER_VERSION##TYPE;\
return TRUE;\
}while(0)
gboolean nstrace_read_v20(wtap *wth, int *err, gchar **err_info, gint64 *data_offset)
{
- guint64 nsg_creltime = wth->capture.nstrace->nsg_creltime;
- gchar *nstrace_buf = wth->capture.nstrace->pnstrace_buf;
- gint32 nstrace_buf_offset = wth->capture.nstrace->nstrace_buf_offset;
- gint32 nstrace_buflen = wth->capture.nstrace->nstrace_buflen;
+ nstrace_t *nstrace = (nstrace_t *)wth->priv;
+ guint64 nsg_creltime = nstrace->nsg_creltime;
+ gchar *nstrace_buf = nstrace->pnstrace_buf;
+ gint32 nstrace_buf_offset = nstrace->nstrace_buf_offset;
+ gint32 nstrace_buflen = nstrace->nstrace_buflen;
nspr_pktracefull_v20_t *fp20;
nspr_pktracefull_v21_t *fp21;
-
+ int bytes_read;
+
*err = 0;
- *err_info = g_strdup_printf("nstrace: no error");
+ *err_info = NULL;
do
{
while ((nstrace_buf_offset < nstrace_buflen) &&
((nstrace_buflen - nstrace_buf_offset) >= ((gint32)sizeof(fp21->fp_RecordType))))
{
fp21 = (nspr_pktracefull_v21_t *) &nstrace_buf[nstrace_buf_offset];
-
+
switch (fp21->fp_RecordType)
{
{
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(nstrace, 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(nstrace, pletohs(&((nspr_abstime_v20_t *) fp20)->abs_RelTime));
nstrace_buf_offset += nspr_getv20recordsize((nspr_hd_v20_t *)fp20);
break;
}
-
+
case NSPR_UNUSEDSPACE_V20:
{
if (nstrace_buf_offset >= NSPR_PAGESIZE/2)
nstrace_buf_offset = NSPR_PAGESIZE/2;
break;
}
-
+
default:
{
fp20 = (nspr_pktracefull_v20_t *) &nstrace_buf[nstrace_buf_offset];
break;
}
}
- }
-
+ }
+
nstrace_buf_offset = 0;
wth->data_offset += nstrace_buflen;
- nstrace_buflen = GET_READ_PAGE_SIZE((wth->capture.nstrace->file_size - wth->data_offset));
- }while((nstrace_buflen > 0) && (nstrace_buflen == (file_read(nstrace_buf, 1, nstrace_buflen, wth->fh))));
-
+ nstrace_buflen = GET_READ_PAGE_SIZE((nstrace->file_size - wth->data_offset));
+ }while((nstrace_buflen > 0) && (bytes_read = file_read(nstrace_buf, nstrace_buflen, wth->fh)) && (bytes_read == nstrace_buflen));
+
return FALSE;
}
gboolean nstrace_seek_read(wtap *wth, gint64 seek_off,
union wtap_pseudo_header *pseudo_header, guchar *pd, int length,
- int *err, gchar **err_info _U_)
+ int *err, gchar **err_info)
{
+ int bytes_read;
+
*err = 0;
if (file_seek(wth->random_fh, seek_off, SEEK_SET, err) == -1)
/*
** Read the packet data.
*/
- if ((file_read(pd, 1, length, wth->random_fh)) != length)
+ bytes_read = file_read(pd, length, wth->random_fh);
+ if (bytes_read != length) {
+ *err = file_error(wth->random_fh, err_info);
+ if (*err == 0)
+ *err = WTAP_ERR_SHORT_READ;
return FALSE;
+ }
if (wth->file_type == WTAP_FILE_NETSCALER_1_0)
{
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)
*/
void nstrace_close(wtap *wth)
{
+ nstrace_t *nstrace = (nstrace_t *)wth->priv;
- g_free(wth->capture.nstrace->pnstrace_buf);
- g_free(wth->capture.nstrace);
- return;
+ g_free(nstrace->pnstrace_buf);
}
+typedef struct {
+ guint16 page_offset;
+ guint16 page_len;
+ guint32 absrec_time;
+} nstrace_dump_t;
+
/* Returns 0 if we could write the specified encapsulation type,
** an error indication otherwise. */
int nstrace_10_dump_can_write_encap(int encap)
/* Returns TRUE on success, FALSE on failure; sets "*err" to an error code on
** failure */
-gboolean nstrace_dump_open(wtap_dumper *wdh, gboolean cant_seek, int *err)
+gboolean nstrace_dump_open(wtap_dumper *wdh, int *err _U_)
{
- if (cant_seek)
- {
- *err = WTAP_ERR_CANT_WRITE_TO_PIPE;
- return FALSE;
- }
+ nstrace_dump_t *nstrace;
wdh->subtype_write = nstrace_dump;
- wdh->dump.nstr = g_malloc(sizeof(nstrace_dump_t));
- wdh->dump.nstr->page_offset = 0;
- wdh->dump.nstr->page_len = NSPR_PAGESIZE;
- wdh->dump.nstr->absrec_time = 0;
+ nstrace = (nstrace_dump_t *)g_malloc(sizeof(nstrace_dump_t));
+ wdh->priv = (void *)nstrace;
+ nstrace->page_offset = 0;
+ nstrace->page_len = NSPR_PAGESIZE;
+ nstrace->absrec_time = 0;
return TRUE;
}
-gboolean nstrace_add_signature(wtap_dumper *wdh)
+static gboolean nstrace_add_signature(wtap_dumper *wdh, int *err)
{
- size_t nwritten;
+ nstrace_dump_t *nstrace = (nstrace_dump_t *)wdh->priv;
if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
{
+ guint16 val16b;
nspr_signature_v10_t sig10;
/* populate the record */
- sig10.phd.ph_RecordType = NSPR_SIGNATURE_V10;
- sig10.phd.ph_RecordSize = nspr_signature_v10_s;
- memcpy(sig10.sig_Signature, NSPR_SIGSTR_V10, NSPR_SIGSIZE_V10);
+ val16b = htoles(NSPR_SIGNATURE_V10);
+ memcpy(sig10.phd.ph_RecordType, &val16b, sizeof sig10.phd.ph_RecordType);
+ val16b = htoles(nspr_signature_v10_s);
+ memcpy(sig10.phd.ph_RecordSize, &val16b, sizeof sig10.phd.ph_RecordSize);
+ memset(sig10.sig_Signature, 0, NSPR_SIGSIZE_V10);
+ g_strlcpy(sig10.sig_Signature, NSPR_SIGSTR_V10, NSPR_SIGSIZE_V10);
/* Write the record into the file */
- nwritten = fwrite(&sig10, 1, nspr_signature_v10_s, wdh->fh);
- if (nwritten != nspr_signature_v10_s)
- return FALSE;
+ if (!wtap_dump_file_write(wdh, &sig10, nspr_signature_v10_s,
+ err))
+ return FALSE;
/* Move forward the page offset */
- wdh->dump.nstr->page_offset += (guint16) nwritten;
-
+ nstrace->page_offset += (guint16) nspr_signature_v10_s;
+
} else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
{
gchar sig[nspr_signature_v20_s + sizeof(NSPR_SIGSTR_V20)];
memcpy(sig20->sig_Signature, NSPR_SIGSTR_V20, sizeof(NSPR_SIGSTR_V20));
/* Write the record into the file */
- nwritten = fwrite(sig20, 1, sig20->sig_RecordSize, wdh->fh);
- if (nwritten != sig20->sig_RecordSize)
- return FALSE;
+ if (!wtap_dump_file_write(wdh, sig20, sig20->sig_RecordSize,
+ err))
+ return FALSE;
/* Move forward the page offset */
- wdh->dump.nstr->page_offset += (guint16) nwritten;
-
- } else
+ nstrace->page_offset += (guint16) sig20->sig_RecordSize;
+
+ } else
{
g_assert_not_reached();
return FALSE;
}
-gboolean nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
- const guchar *pd)
+static gboolean
+nstrace_add_abstime(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
+ const guchar *pd, int *err)
{
- size_t nwritten;
+ nstrace_dump_t *nstrace = (nstrace_dump_t *)wdh->priv;
guint64 nsg_creltime;
if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
{
+ guint16 val16;
+ guint32 reltime;
+ guint64 abstime;
nspr_abstime_v10_t abs10;
- nspr_pktracefull_v10_t fp10;
/* populate the record */
- abs10.phd.ph_RecordType = NSPR_ABSTIME_V10;
- abs10.phd.ph_RecordSize = nspr_abstime_v10_s;
+ val16 = htoles(NSPR_ABSTIME_V10);
+ memcpy(abs10.phd.ph_RecordType, &val16, sizeof abs10.phd.ph_RecordType);
+ val16 = htoles(nspr_abstime_v10_s);
+ memcpy(abs10.phd.ph_RecordSize, &val16, sizeof abs10.phd.ph_RecordSize);
+
+ memcpy(&reltime, ((nspr_pktracefull_v10_t *)pd)->fp_RelTimeHr, sizeof reltime);
+ nsg_creltime = ns_hrtime2nsec(reltime);
- 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);
+ memset(abs10.abs_RelTime, 0, sizeof abs10.abs_RelTime);
+ abstime = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
+ memcpy(abs10.abs_Time, &abstime, sizeof abs10.abs_Time);
/* Write the record into the file */
- nwritten = fwrite(&abs10, 1, nspr_abstime_v10_s, wdh->fh);
- if (nwritten != nspr_abstime_v10_s)
+ if (!wtap_dump_file_write(wdh, &abs10, nspr_abstime_v10_s, err))
return FALSE;
/* Move forward the page offset */
- wdh->dump.nstr->page_offset += nspr_abstime_v10_s;
+ nstrace->page_offset += nspr_abstime_v10_s;
} else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
{
+ guint32 reltime;
+ guint64 abstime;
nspr_abstime_v20_t abs20;
- nspr_pktracefull_v20_t fp20;
abs20.abs_RecordType = NSPR_ABSTIME_V20;
abs20.abs_RecordSize = nspr_abstime_v20_s;
- memcpy(&fp20, pd, nspr_pktracefull_v20_s);
- nsg_creltime = ns_hrtime2nsec(fp20.fp_RelTimeHr);
+ memcpy(&reltime, ((nspr_pktracefull_v20_t *)pd)->fp_RelTimeHr, sizeof reltime);
+ nsg_creltime = ns_hrtime2nsec(reltime);
- abs20.abs_RelTime = 0;
- abs20.abs_Time = (guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000);
+ memset(abs20.abs_RelTime, 0, sizeof abs20.abs_RelTime);
+ abstime = htolel((guint32)phdr->ts.secs - (guint32)(nsg_creltime/1000000000));
+ memcpy(abs20.abs_RelTime, &abstime, sizeof abs20.abs_RelTime);
/* Write the record into the file */
- nwritten = fwrite(&abs20, 1, nspr_abstime_v20_s, wdh->fh);
- if (nwritten != nspr_abstime_v20_s)
+ if (!wtap_dump_file_write(wdh, &abs20, nspr_abstime_v20_s, err))
return FALSE;
/* Move forward the page offset */
- wdh->dump.nstr->page_offset += nspr_abstime_v20_s;
+ nstrace->page_offset += nspr_abstime_v20_s;
} else
{
Returns TRUE on success, FALSE on failure. */
static gboolean nstrace_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr,
const union wtap_pseudo_header *pseudo_header, const guchar *pd, int *err)
-{
- size_t nwritten;
+{
+ nstrace_dump_t *nstrace = (nstrace_dump_t *)wdh->priv;
- if (wdh->dump.nstr->page_offset == 0)
+ if (nstrace->page_offset == 0)
{
/* Add the signature record and abs time record */
if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
{
- if ((nstrace_add_signature(wdh) == FALSE) || (nstrace_add_abstime(wdh, phdr, pd) == FALSE))
+ if (!nstrace_add_signature(wdh, err) ||
+ !nstrace_add_abstime(wdh, phdr, pd, err))
return FALSE;
} else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
{
- if ((nstrace_add_signature(wdh) == FALSE) || (nstrace_add_abstime(wdh, phdr, pd) == FALSE))
+ if (!nstrace_add_signature(wdh, err) ||
+ !nstrace_add_abstime(wdh, phdr, pd, err))
return FALSE;
} else
{
if (wdh->file_type == WTAP_FILE_NETSCALER_1_0)
{
- if (wdh->dump.nstr->page_offset + phdr->caplen >= wdh->dump.nstr->page_len)
+ if (nstrace->page_offset + phdr->caplen >= nstrace->page_len)
{
/* Start on the next page */
- if (fseek(wdh->fh, (wdh->dump.nstr->page_len - wdh->dump.nstr->page_offset), SEEK_CUR) == -1)
+ if (fseek(wdh->fh, (nstrace->page_len - nstrace->page_offset), SEEK_CUR) == -1)
{
*err = errno;
return FALSE;
}
- wdh->dump.nstr->page_offset = 0;
+ nstrace->page_offset = 0;
/* Possibly add signature and abstime records and increment offset */
- if (nstrace_add_signature(wdh) == FALSE)
+ if (!nstrace_add_signature(wdh, err))
return FALSE;
}
/* Write the actual record as is */
- nwritten = fwrite(pd, 1, phdr->caplen, wdh->fh);
- if (nwritten != phdr->caplen)
- {
- if (nwritten == 0 && ferror(wdh->fh))
- *err = errno;
- else
- *err = WTAP_ERR_SHORT_WRITE;
-
+ if (!wtap_dump_file_write(wdh, pd, phdr->caplen, err))
return FALSE;
- }
- wdh->dump.nstr->page_offset += (guint16) nwritten;
+ nstrace->page_offset += (guint16) phdr->caplen;
} else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
{
*err = WTAP_ERR_UNSUPPORTED_FILE_TYPE;
- return FALSE;
+ return FALSE;
}
break;
return FALSE;
} else if (wdh->file_type == WTAP_FILE_NETSCALER_2_0)
{
- if (wdh->dump.nstr->page_offset + phdr->caplen >= wdh->dump.nstr->page_len)
+ if (nstrace->page_offset + phdr->caplen >= nstrace->page_len)
{
/* Start on the next page */
- if (fseek(wdh->fh, (wdh->dump.nstr->page_len - wdh->dump.nstr->page_offset), SEEK_CUR) == -1)
+ if (fseek(wdh->fh, (nstrace->page_len - nstrace->page_offset), SEEK_CUR) == -1)
{
*err = errno;
return FALSE;
}
- wdh->dump.nstr->page_offset = 0;
+ nstrace->page_offset = 0;
/* Possibly add signature and abstime records and increment offset */
- if (nstrace_add_signature(wdh) == FALSE)
- return FALSE;
+ if (!nstrace_add_signature(wdh, err))
+ return FALSE;
}
/* Write the actual record as is */
- nwritten = fwrite(pd, 1, phdr->caplen, wdh->fh);
-
- if (nwritten != phdr->caplen)
- {
- if (nwritten == 0 && ferror(wdh->fh))
- *err = errno;
- else
- *err = WTAP_ERR_SHORT_WRITE;
-
+ if (!wtap_dump_file_write(wdh, pd, phdr->caplen, err))
return FALSE;
- }
- wdh->dump.nstr->page_offset += (guint16) nwritten;
+ nstrace->page_offset += (guint16) phdr->caplen;
}
break;
default:
g_assert_not_reached();
return FALSE;
- }
+ }
return TRUE;
}