Add support for 4-byte NTP times (only the seconds) in proto_tree_add_item().
Use it in packet-diameter.c . Eliminate an unnecessary local variable. svn path=/trunk/; revision=35875
This commit is contained in:
parent
7e6b4ad3a3
commit
b87a80f196
|
@ -61,7 +61,6 @@
|
|||
#include <epan/tap.h>
|
||||
#include <epan/diam_dict.h>
|
||||
#include "packet-tcp.h"
|
||||
#include "packet-ntp.h"
|
||||
#include "packet-diameter.h"
|
||||
|
||||
/* Diameter Header Flags */
|
||||
|
@ -557,22 +556,19 @@ static const char*
|
|||
time_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
|
||||
{
|
||||
int len = tvb_length(tvb);
|
||||
guint8 ntptime[8] = {0,0,0,0,0,0,0,0};
|
||||
const char* label;
|
||||
char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
|
||||
proto_item* pi;
|
||||
|
||||
if ( len != 4 ) {
|
||||
proto_item* pi_local = proto_tree_add_text(c->tree, tvb, 0, 4,
|
||||
"Error! AVP value MUST be 4 bytes");
|
||||
expert_add_info_format(c->pinfo, pi_local, PI_MALFORMED, PI_NOTE,
|
||||
pi = proto_tree_add_text(c->tree, tvb, 0, 4, "Error! AVP value MUST be 4 bytes");
|
||||
expert_add_info_format(c->pinfo, pi, PI_MALFORMED, PI_NOTE,
|
||||
"Bad Timestamp Length (%u)", len);
|
||||
return "[Malformed]";
|
||||
}
|
||||
|
||||
pi = proto_tree_add_item(c->tree, (a->hf_value), tvb, 0, 4, FALSE);
|
||||
tvb_memcpy(tvb,ntptime,0,4);
|
||||
label = ntp_fmt_ts(ntptime);
|
||||
proto_item_append_text(pi," %s",label);
|
||||
pi = proto_tree_add_item(c->tree, (a->hf_value), tvb, 0, 4, ENC_TIME_NTP|ENC_BIG_ENDIAN);
|
||||
proto_item_fill_label(PITEM_FINFO(pi), label);
|
||||
label = strstr(label,": ")+2;
|
||||
return label;
|
||||
}
|
||||
|
||||
|
@ -1294,21 +1290,21 @@ build_simple_avp(const avp_type_t* type, guint32 code, const diam_vnd_t* vendor,
|
|||
|
||||
|
||||
static const avp_type_t basic_types[] = {
|
||||
{"octetstring" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp },
|
||||
{"utf8string" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"grouped" , grouped_avp , grouped_avp , FT_BYTES , BASE_NONE , build_simple_avp },
|
||||
{"integer32" , integer32_avp , integer32_avp , FT_INT32 , BASE_DEC , build_simple_avp },
|
||||
{"unsigned32" , unsigned32_avp, unsigned32_avp, FT_UINT32 , BASE_DEC , build_simple_avp },
|
||||
{"integer64" , integer64_avp , integer64_avp , FT_INT64 , BASE_DEC , build_simple_avp },
|
||||
{"unsigned64" , unsigned64_avp, unsigned64_avp , FT_UINT64 , BASE_DEC , build_simple_avp },
|
||||
{"float32" , float32_avp , float32_avp , FT_FLOAT , BASE_NONE , build_simple_avp },
|
||||
{"float64" , float64_avp , float64_avp , FT_DOUBLE , BASE_NONE , build_simple_avp },
|
||||
{"ipaddress" , NULL , NULL , FT_NONE , BASE_NONE , build_address_avp },
|
||||
{"diameteruri" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"diameteridentity" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"ipfilterrule" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"qosfilterrule" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"time" , time_avp , time_avp , FT_UINT32 , BASE_DEC , build_simple_avp },
|
||||
{"octetstring" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp },
|
||||
{"utf8string" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"grouped" , grouped_avp , grouped_avp , FT_BYTES , BASE_NONE , build_simple_avp },
|
||||
{"integer32" , integer32_avp , integer32_avp , FT_INT32 , BASE_DEC , build_simple_avp },
|
||||
{"unsigned32" , unsigned32_avp, unsigned32_avp, FT_UINT32 , BASE_DEC , build_simple_avp },
|
||||
{"integer64" , integer64_avp , integer64_avp , FT_INT64 , BASE_DEC , build_simple_avp },
|
||||
{"unsigned64" , unsigned64_avp, unsigned64_avp, FT_UINT64 , BASE_DEC , build_simple_avp },
|
||||
{"float32" , float32_avp , float32_avp , FT_FLOAT , BASE_NONE , build_simple_avp },
|
||||
{"float64" , float64_avp , float64_avp , FT_DOUBLE , BASE_NONE , build_simple_avp },
|
||||
{"ipaddress" , NULL , NULL , FT_NONE , BASE_NONE , build_address_avp },
|
||||
{"diameteruri" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"diameteridentity" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"ipfilterrule" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"qosfilterrule" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
|
||||
{"time" , time_avp , time_avp , FT_ABSOLUTE_TIME , ABSOLUTE_TIME_UTC , build_simple_avp },
|
||||
{NULL, NULL, NULL, FT_NONE, BASE_NONE, NULL }
|
||||
};
|
||||
|
||||
|
|
45
epan/proto.c
45
epan/proto.c
|
@ -1537,6 +1537,7 @@ proto_tree_new_item(field_info *new_fi, proto_tree *tree,
|
|||
*/
|
||||
if (encoding == TRUE)
|
||||
encoding = ENC_TIME_TIMESPEC|ENC_LITTLE_ENDIAN;
|
||||
|
||||
switch (encoding) {
|
||||
|
||||
case ENC_TIME_TIMESPEC|ENC_BIG_ENDIAN:
|
||||
|
@ -1571,7 +1572,7 @@ proto_tree_new_item(field_info *new_fi, proto_tree *tree,
|
|||
/*
|
||||
* NTP time stamp, big-endian.
|
||||
*/
|
||||
DISSECTOR_ASSERT(length == 8);
|
||||
DISSECTOR_ASSERT(length == 8 || length == 4);
|
||||
|
||||
/* XXX - where should this go? */
|
||||
#define NTP_BASETIME 2208988800ul
|
||||
|
@ -1579,33 +1580,41 @@ proto_tree_new_item(field_info *new_fi, proto_tree *tree,
|
|||
if (time_stamp.secs)
|
||||
time_stamp.secs -= NTP_BASETIME;
|
||||
|
||||
/*
|
||||
* We're using nanoseconds here (and we will
|
||||
* display nanoseconds), but NTP's timestamps
|
||||
* have a precision in microseconds or greater.
|
||||
* Round to 1 microsecond.
|
||||
*/
|
||||
time_stamp.nsecs = (int)(1000000*(tvb_get_ntohl(tvb, start+4)/4294967296.0));
|
||||
time_stamp.nsecs *= 1000;
|
||||
if (length == 8) {
|
||||
/*
|
||||
* We're using nanoseconds here (and we will
|
||||
* display nanoseconds), but NTP's timestamps
|
||||
* have a precision in microseconds or greater.
|
||||
* Round to 1 microsecond.
|
||||
*/
|
||||
time_stamp.nsecs = (int)(1000000*(tvb_get_ntohl(tvb, start+4)/4294967296.0));
|
||||
time_stamp.nsecs *= 1000;
|
||||
} else {
|
||||
time_stamp.nsecs = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case ENC_TIME_NTP|ENC_LITTLE_ENDIAN:
|
||||
/*
|
||||
* NTP time stamp, big-endian.
|
||||
*/
|
||||
DISSECTOR_ASSERT(length == 8);
|
||||
DISSECTOR_ASSERT(length == 8 || length == 4);
|
||||
time_stamp.secs = tvb_get_letohl(tvb, start);
|
||||
if (time_stamp.secs)
|
||||
time_stamp.secs -= NTP_BASETIME;
|
||||
|
||||
/*
|
||||
* We're using nanoseconds here (and we will
|
||||
* display nanoseconds), but NTP's timestamps
|
||||
* have a precision in microseconds or greater.
|
||||
* Round to 1 microsecond.
|
||||
*/
|
||||
time_stamp.nsecs = (int)(1000000*(tvb_get_letohl(tvb, start+4)/4294967296.0));
|
||||
time_stamp.nsecs *= 1000;
|
||||
if (length == 8) {
|
||||
/*
|
||||
* We're using nanoseconds here (and we will
|
||||
* display nanoseconds), but NTP's timestamps
|
||||
* have a precision in microseconds or greater.
|
||||
* Round to 1 microsecond.
|
||||
*/
|
||||
time_stamp.nsecs = (int)(1000000*(tvb_get_letohl(tvb, start+4)/4294967296.0));
|
||||
time_stamp.nsecs *= 1000;
|
||||
} else {
|
||||
time_stamp.nsecs = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
Loading…
Reference in New Issue