Ethereal-dev: Re: [Ethereal-dev] Small diameter patches

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: David Frascone <dave@xxxxxxxxxxxx>
Date: Tue, 10 Apr 2001 14:22:28 -0500
Woops . . attaching the context diffs this time :)

On Tue, Apr 10, 2001 at 01:57:02PM -0500, David Frascone wrote:
> This patch makes the following smallchanges to the Diameter dissector:
> 
> o	Two uint types -> time types so they are displayed properly.
> o	The identifier -> hop-by-hop and end-to-end identifiers, per the
> 	new specification.
> o	Added g_warnings on bad packets, so the reason for the packet not
> 	being displayed is shown. 
> 
> I'll understand if it's too late for this to make the release.
> 
> 
> -Dave

Index: packet-diameter-defs.h
===================================================================
RCS file: /cvsroot/ethereal/packet-diameter-defs.h,v
retrieving revision 1.3
diff -c -r1.3 packet-diameter-defs.h
*** packet-diameter-defs.h	2001/02/23 19:26:26	1.3
--- packet-diameter-defs.h	2001/04/10 19:19:57
***************
*** 535,541 ****
     { DIAMETER_ATT_ROUTING_REALM, DIAMETER_STRING },
     { DIAMETER_ATT_SESSION_ID, DIAMETER_DATA },
     { DIAMETER_ATT_SESSION_TIMEOUT, DIAMETER_INTEGER32 },
!    { DIAMETER_ATT_TIMESTAMP, DIAMETER_INTEGER32 },
     { DIAMETER_ATT_USER_NAME, DIAMETER_STRING },
     { DIAMETER_ATT_VENDOR_ID, DIAMETER_INTEGER32 },
     { DIAMETER_ATT_ACCOUNTING_AUTHENTICATION_TYPE, DIAMETER_INTEGER32 },
--- 535,541 ----
     { DIAMETER_ATT_ROUTING_REALM, DIAMETER_STRING },
     { DIAMETER_ATT_SESSION_ID, DIAMETER_DATA },
     { DIAMETER_ATT_SESSION_TIMEOUT, DIAMETER_INTEGER32 },
!    { DIAMETER_ATT_TIMESTAMP, DIAMETER_TIME },
     { DIAMETER_ATT_USER_NAME, DIAMETER_STRING },
     { DIAMETER_ATT_VENDOR_ID, DIAMETER_INTEGER32 },
     { DIAMETER_ATT_ACCOUNTING_AUTHENTICATION_TYPE, DIAMETER_INTEGER32 },
***************
*** 598,604 ****
     { DIAMETER_ATT_VOIP_CHALLENGE, DIAMETER_DATA },
     { DIAMETER_ATT_VOIP_RESPONSE, DIAMETER_DATA },
     { DIAMETER_ATT_VOIP_SESSION_LENGTH, DIAMETER_INTEGER32 },
!    { DIAMETER_ATT_SUN_PING_TIMESTAMP, DIAMETER_INTEGER32 },
     { DIAMETER_ATT_COMMENT, DIAMETER_STRING },
     { DIAMETER_ATT_XVALUE, DIAMETER_INTEGER32 },
     { DIAMETER_ATT_XSTRING, DIAMETER_STRING },
--- 598,604 ----
     { DIAMETER_ATT_VOIP_CHALLENGE, DIAMETER_DATA },
     { DIAMETER_ATT_VOIP_RESPONSE, DIAMETER_DATA },
     { DIAMETER_ATT_VOIP_SESSION_LENGTH, DIAMETER_INTEGER32 },
!    { DIAMETER_ATT_SUN_PING_TIMESTAMP, DIAMETER_TIME },
     { DIAMETER_ATT_COMMENT, DIAMETER_STRING },
     { DIAMETER_ATT_XVALUE, DIAMETER_INTEGER32 },
     { DIAMETER_ATT_XSTRING, DIAMETER_STRING },
Index: packet-diameter.c
===================================================================
RCS file: /cvsroot/ethereal/packet-diameter.c,v
retrieving revision 1.20
diff -c -r1.20 packet-diameter.c
*** packet-diameter.c	2001/02/23 19:26:26	1.20
--- packet-diameter.c	2001/04/10 19:20:00
***************
*** 77,83 ****
  static int proto_diameter = -1;
  static int hf_diameter_length = -1;
  static int hf_diameter_code = -1;
! static int hf_diameter_id =-1;
  static int hf_diameter_reserved = -1;
  static int hf_diameter_flags = -1;
  static int hf_diameter_version = -1;
--- 77,84 ----
  static int proto_diameter = -1;
  static int hf_diameter_length = -1;
  static int hf_diameter_code = -1;
! static int hf_diameter_hopbyhopid =-1;
! static int hf_diameter_endtoendid =-1;
  static int hf_diameter_reserved = -1;
  static int hf_diameter_flags = -1;
  static int hf_diameter_version = -1;
***************
*** 114,120 ****
  	guint8 reserved;
  	guint8 flagsVer;
  	guint16 pktLength;
! 	guint32 identifier;
  	guint32 commandCode;
  	guint32 vendorId;
  } e_diameterhdr;
--- 115,122 ----
  	guint8 reserved;
  	guint8 flagsVer;
  	guint16 pktLength;
! 	guint32 hopByHopId;
! 	guint32 endToEndId;
  	guint32 commandCode;
  	guint32 vendorId;
  } e_diameterhdr;
***************
*** 180,186 ****
  	
  	/* Fix byte ordering in our static structure */
  	dh.pktLength = ntohs(dh.pktLength);
! 	dh.identifier = ntohl(dh.identifier);
  	
  	dh.commandCode = ntohl(dh.commandCode);
  	dh.vendorId = ntohl(dh.vendorId);
--- 182,189 ----
  	
  	/* Fix byte ordering in our static structure */
  	dh.pktLength = ntohs(dh.pktLength);
! 	dh.hopByHopId = ntohl(dh.hopByHopId);
! 	dh.endToEndId = ntohl(dh.endToEndId);
  	
  	dh.commandCode = ntohl(dh.commandCode);
  	dh.vendorId = ntohl(dh.vendorId);
***************
*** 192,213 ****
  
  	/* Short packet.  Should have at LEAST one avp */
  	if (dh.pktLength < MIN_DIAMETER_SIZE) {
  		BadPacket = TRUE;
  	}
  
  	/* And, check our reserved flags/version */
  	if (dh.reserved || (dh.flagsVer & DIAM_FLAGS_RESERVED) ||
  		((dh.flagsVer & 0x7) != 1)) {
  		BadPacket = TRUE;
  	}
  
  	if (check_col(pinfo->fd, COL_INFO)) {
  		col_add_fstr(pinfo->fd, COL_INFO,
! 		    "%s%s: %s(%d) vendor=%d (id=%d) EIR=%d%d%d",
  		    (BadPacket)?"***** Bad Packet!: ":"",
  		    DetermineMessageType(dh.flagsVer),
  		    codestrval, dh.commandCode, dh.vendorId,
! 		    dh.identifier,
  		    (dh.flagsVer & DIAM_FLAGS_E)?1:0,
  		    (dh.flagsVer & DIAM_FLAGS_I)?1:0,
  		    (dh.flagsVer & DIAM_FLAGS_R)?1:0);
--- 195,219 ----
  
  	/* Short packet.  Should have at LEAST one avp */
  	if (dh.pktLength < MIN_DIAMETER_SIZE) {
+ 		g_warning("DIAMETER: Packet too short: %d bytes less than min size (%d bytes))",
+ 			dh.pktLength, MIN_DIAMETER_SIZE);
  		BadPacket = TRUE;
  	}
  
  	/* And, check our reserved flags/version */
  	if (dh.reserved || (dh.flagsVer & DIAM_FLAGS_RESERVED) ||
  		((dh.flagsVer & 0x7) != 1)) {
+ 		g_warning("DIAMETER: Bad packet: Bad Flags or Version");
  		BadPacket = TRUE;
  	}
  
  	if (check_col(pinfo->fd, COL_INFO)) {
  		col_add_fstr(pinfo->fd, COL_INFO,
! 		    "%s%s: %s(%d) vendor=%d (hop-id=%d) (end-id=%d) EIR=%d%d%d",
  		    (BadPacket)?"***** Bad Packet!: ":"",
  		    DetermineMessageType(dh.flagsVer),
  		    codestrval, dh.commandCode, dh.vendorId,
! 		    dh.hopByHopId, dh.endToEndId,
  		    (dh.flagsVer & DIAM_FLAGS_E)?1:0,
  		    (dh.flagsVer & DIAM_FLAGS_I)?1:0,
  		    (dh.flagsVer & DIAM_FLAGS_R)?1:0);
***************
*** 253,263 ****
  		    offset, 2, dh.pktLength);
  		offset +=2;
  
! 		/* Identifier */
! 		proto_tree_add_uint(diameter_tree, hf_diameter_id,
! 		    tvb, offset, 4, dh.identifier);
  		offset += 4;
  
  		/* Command Code */
  		proto_tree_add_uint(diameter_tree, hf_diameter_code,
  		    tvb, offset, 4, dh.commandCode);
--- 259,274 ----
  		    offset, 2, dh.pktLength);
  		offset +=2;
  
! 		/* Hop-by-hop Identifier */
! 		proto_tree_add_uint(diameter_tree, hf_diameter_hopbyhopid,
! 		    tvb, offset, 4, dh.hopByHopId);
  		offset += 4;
  
+ 		/* End-to-end Identifier */
+ 		proto_tree_add_uint(diameter_tree, hf_diameter_endtoendid,
+ 		    tvb, offset, 4, dh.endToEndId);
+ 		offset += 4;
+ 
  		/* Command Code */
  		proto_tree_add_uint(diameter_tree, hf_diameter_code,
  		    tvb, offset, 4, dh.commandCode);
***************
*** 337,342 ****
--- 348,355 ----
  		
  		/* Check for short packet */
  		if (packetLength < MIN_AVP_SIZE) {
+ 			g_warning("DIAMETER: AVP Payload too short: %d bytes less than min size (%d bytes))",
+ 				packetLength, MIN_AVP_SIZE);
  			BadPacket = TRUE;
  			/* Don't even bother trying to parse a short packet. */
  			return;
***************
*** 363,374 ****
--- 376,391 ----
  		/* Check for bad length */
  		if (avph.avp_length < MIN_AVP_SIZE || 
  		    (avph.avp_length > packetLength)) {
+ 			g_warning("DIAMETER: AVP payload size invalid: avp_length: %d bytes,  min: %d bytes,    packetLen: %d",
+ 				avph.avp_length, MIN_AVP_SIZE, packetLength);
  			BadPacket = TRUE;
  		}
  
  		/* Check for bad flags */
  		if (avph.avp_reserved || 
  		    (avph.avp_flags & AVP_FLAGS_RESERVED)) {
+ 		        g_warning("DIAMETER: Invalid AVP: avph.avp_reserved = 0x%x, avph.avp_flags = 0x%x, resFl=0x%x",
+ 			avph.avp_reserved, avph.avp_flags, AVP_FLAGS_RESERVED);
  			BadPacket = TRUE;
  		}
  		
***************
*** 383,388 ****
--- 400,407 ----
  
  		/* Check for out of bounds */
  		if (packetLength < 0) {
+ 		        g_warning("DIAMETER: Bad AVP: Bad new length (%d bytes)",
+ 				packetLength);
  			BadPacket = TRUE;
  		}
  
***************
*** 767,776 ****
  		    "" }},
  		{ &hf_diameter_length,
  		  { "Length","diameter.length", FT_UINT16, BASE_DEC, NULL, 0x0,
- 		    "" }},
- 		{ &hf_diameter_id,
- 		  { "Identifier", "diameter.id", FT_UINT32, BASE_HEX, NULL, 0x0,
  		    "" }},
  		{ &hf_diameter_code,
  		  { "Command Code","diameter.code", FT_UINT32, BASE_DEC,
  		    VALS(diameter_command_code_vals), 0x0, "" }},
--- 786,798 ----
  		    "" }},
  		{ &hf_diameter_length,
  		  { "Length","diameter.length", FT_UINT16, BASE_DEC, NULL, 0x0,
  		    "" }},
+ 		{ &hf_diameter_hopbyhopid,
+ 		  { "Hop-by-Hop Identifier", "diameter.hopbyhopid", FT_UINT32,
+ 		    BASE_HEX, NULL, 0x0, "" }},
+ 		{ &hf_diameter_endtoendid,
+ 		  { "End-to-End Identifier", "diameter.endtoendid", FT_UINT32, 
+ 		    BASE_HEX, NULL, 0x0, "" }},
  		{ &hf_diameter_code,
  		  { "Command Code","diameter.code", FT_UINT32, BASE_DEC,
  		    VALS(diameter_command_code_vals), 0x0, "" }},