Wireshark-dev: Re: [Wireshark-dev] More Diameter [patches]
From: Martin Mathieson <[email protected]>
Date: Fri, 14 Jul 2006 15:22:49 +0100
And with them attached.

Martin Mathieson wrote:

Hi,

These patches
- add a few more chargecontrol AVPs, and add the vendor-id where needed
- report as expert info when AVPs' lengths don't match their type

Regards,
Martin


_______________________________________________
Wireshark-dev mailing list
[email protected]
http://www.wireshark.org/mailman/listinfo/wireshark-dev

Index: epan/dissectors/packet-diameter.c
===================================================================
--- epan/dissectors/packet-diameter.c	(revision 18734)
+++ epan/dissectors/packet-diameter.c	(working copy)
@@ -1902,10 +1902,14 @@
 								proto_tree_add_item(avpi_tree, hf_diameter_avp_data_v6addr,
 								                    tvb, offset, avpDataLength, FALSE);
 							} else {
-								proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-								                            tvb, offset, avpDataLength,
-								                            tvb_get_ptr(tvb, offset, avpDataLength),
-								                            "Error! Bad Address Length (Address in RFC3588 format?)");
+								ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+								                                 tvb, offset, avpDataLength,
+								                                 tvb_get_ptr(tvb, offset, avpDataLength),
+								                                 "Error! Bad Address Length (Address in RFC3588 format?)");
+								expert_add_info_format(pinfo, ti,
+								                       PI_MALFORMED, PI_NOTE,
+								                       "Bad Address Length (%u)",
+								                       avpDataLength);
 							}
 							break;
 						case DIAMETER_RFC:
@@ -1935,10 +1939,14 @@
 						proto_tree_add_item(avpi_tree, hf_diameter_avp_data_int32,
 						                    tvb, offset, avpDataLength, FALSE);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Integer32 Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                 tvb, offset, avpDataLength,
+						                                 tvb_get_ptr(tvb, offset, avpDataLength),
+						                                "Error!  Bad Integer32 Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Integer32 Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -1951,10 +1959,14 @@
 						                           tvb, offset, avpDataLength, data,
 						                           "Value: 0x%08x (%u)", data, data);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Unsigned32 Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                 tvb, offset, avpDataLength,
+						                                 tvb_get_ptr(tvb, offset, avpDataLength),
+						                                 "Error!  Bad Unsigned32 Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Unsigned32 Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -1969,10 +1981,14 @@
 						                           "Value: 0x%08x (%u): %s", data,
 						                           data, valstr);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Enumerated Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                tvb, offset, avpDataLength,
+						                                tvb_get_ptr(tvb, offset, avpDataLength),
+						                                "Error!  Bad Enumerated Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Enumerated Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -1981,10 +1997,14 @@
 						proto_tree_add_item(avpi_tree, hf_diameter_avp_data_int64,
 						                    tvb, offset, 8, FALSE);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
 						                            tvb, offset, avpDataLength,
 						                            tvb_get_ptr(tvb, offset, avpDataLength),
 						                            "Error!  Bad Integer64 Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Integer64 Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -1993,10 +2013,14 @@
 						proto_tree_add_item(avpi_tree, hf_diameter_avp_data_uint64,
 						                    tvb, offset, 8, FALSE);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Unsigned64 Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                tvb, offset, avpDataLength,
+						                                tvb_get_ptr(tvb, offset, avpDataLength),
+						                               "Error!  Bad Unsigned64 Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Unsigned64 Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -2025,10 +2049,14 @@
 							                            "Error!  Time before 00:00:00 UTC, January 1, 1970");
 						}
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Time Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                 tvb, offset, avpDataLength,
+						                                 tvb_get_ptr(tvb, offset, avpDataLength),
+						                                 "Error!  Bad Time Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Time Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -2043,10 +2071,14 @@
 						                           "Value: 0x%08x (%u): %s", data,
 						                           data, valstr);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Enumerated Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                 tvb, offset, avpDataLength,
+						                                 tvb_get_ptr(tvb, offset, avpDataLength),
+						                                 "Error!  Bad Enumerated Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Enumerated Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -2054,10 +2086,14 @@
 					if (avpDataLength == 4) {
 						proto_tree_add_item(avpi_tree, hf_diameter_vendor_id, tvb, offset, avpDataLength, FALSE);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
 						                            tvb, offset, avpDataLength,
 						                            tvb_get_ptr(tvb, offset, avpDataLength),
 						                            "Error!  Bad Vendor ID Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Vendor ID Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -2072,10 +2108,14 @@
 						                           "Application ID: %s %d (0x%08x)",
 						                           valstr, data, data);
 					} else {
-						proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
-						                            tvb, offset, avpDataLength,
-						                            tvb_get_ptr(tvb, offset, avpDataLength),
-						                            "Error!  Bad Application ID Length");
+						ti = proto_tree_add_bytes_format(avpi_tree, hf_diameter_avp_data_bytes,
+						                                 tvb, offset, avpDataLength,
+						                                 tvb_get_ptr(tvb, offset, avpDataLength),
+						                                 "Error!  Bad Application ID Length");
+						expert_add_info_format(pinfo, ti,
+						                       PI_MALFORMED, PI_NOTE,
+						                       "Bad Application ID Length (%u)",
+						                       avpDataLength);
 					}
 					break;
 
@@ -2104,10 +2144,9 @@
 				}
 					break;
 				case DIAMETER_PRIVATE_ID:
-				{
 					proto_tree_add_item(avpi_tree, hf_diameter_avp_private_id,
 					                    tvb, offset, avpDataLength, FALSE);
-				}
+					break;
 
 				default:
 				case DIAMETER_OCTET_STRING:
Index: diameter/chargecontrol.xml
===================================================================
--- diameter/chargecontrol.xml	(revision 18734)
+++ diameter/chargecontrol.xml	(working copy)
@@ -11,15 +11,16 @@
 		<avp name="CC-Correlation-Id" code="411" mandatory="may" may-encrypt="yes" protected="may" vendor-bit="mustnot">
 			<type type-name="OctetString"/>
 		</avp>
+		<avp name="CC-Input-Octets" code="412" mandatory="must">
+			<type type-name="Unsigned64"/>
+		</avp>
 		<avp name="CC-Money" code="413" mandatory="must">
 			<grouped>
 				<gavp name="Unit-Value"/>
 				<gavp name="Currency-Code"/>
 			</grouped>
 		</avp>
-		<avp name="CC-Input-Octets" code="412" mandatory="must">
-			<type type-name="Unsigned64"/>
-		</avp>
+
 		<avp name="CC-Output-Octets" code="414" mandatory="must" may-encrypt="yes" protected="may" vendor-bit="mustnot">
 			<type type-name="Unsigned64"/>
 		</avp>
@@ -275,17 +276,17 @@
 		</avp>
 
 		<!-- Definition from SH specs -->
-		<avp name="MSISDN" code="701" mandatory="must" vendor-bit="mustnot" may-encrypt="yes">
+		<avp name="MSISDN" code="701" mandatory="must" vendor-bit="mustnot" may-encrypt="yes" vendor-id="TGPP">
 			<type type-name="OctetString"/>
 		</avp>
 
-		<avp name="Time-Quota-Threshold" code="868" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Time-Quota-Threshold" code="868" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="Unsigned32"/>
 		</avp>
-		<avp name="Volume-Quota-Threshold" code="869" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Volume-Quota-Threshold" code="869" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="Unsigned32"/>
 		</avp>
-		<avp name="Trigger-Type" code="870" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Trigger-Type" code="870" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="Enumerated"/>
 			<enum name="CHANGE_IN_SGSN_IP_ADDRESS" code="1"/>
 			<enum name="CHANGE_IN_QOS" code="2"/>
@@ -312,10 +313,10 @@
 			<enum name="CHANGEINLOCATION_CellId" code="34"/>
 			<enum name="CHANGEINPARTICIPANTS_Number" code="50"/>
 		</avp>
-		<avp name="Quota-Holding-Time" code="871" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Quota-Holding-Time" code="871" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="Unsigned32"/>
 		</avp>
-		<avp name="Reporting-Reason" code="872" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Reporting-Reason" code="872" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="Enumerated"/>
 			<enum name="THRESHOLD" code="0"/>
 			<enum name="QHT" code="1"/>
@@ -327,7 +328,7 @@
 			<enum name="FORCED_REAUTHORISATION" code="7"/>
 			<enum name="POOL_EXHAUSTED" code="8"/>
 		</avp>
-		<avp name="Service-Information" code="873" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Service-Information" code="873" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<grouped>
 				<gavp name="PS-Information"/>
 				<gavp name="WLAN-Information"/>
@@ -338,19 +339,41 @@
 				<gavp name="MBMS-Information"/>
 			</grouped>
 		</avp>
-		<avp name="PS-Information" code="874" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
-			<type type-name="UTF8String"/>
+		<avp name="PS-Information" code="874" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
+			<grouped>
+				<gavp name="3GPP-Charging-Id"/>
+				<gavp name="3GPP-PDP Type"/>
+				<gavp name="PDP-Address"/>
+				<gavp name="3GPP-GPRS-Negotiated-QoS-Profile"/>
+				<gavp name="SGSN-Address"/>
+				<gavp name="GGSN-Address"/>
+				<gavp name="CG-Address"/>
+				<gavp name="3GPP-IMSI-MCC-MNC"/>
+				<gavp name="3GPP-GGSN- MCC-MNC"/>
+				<gavp name="3GPP-NSAPI"/>
+				<gavp name="Called-Station-Id"/>
+				<gavp name="3GPP-Session-Stop-Indicator"/>
+				<gavp name="3GPP-Selection-Mode"/>
+				<gavp name="3GPP-Charging-Characteristics"/>
+				<gavp name="3GPP-SGSN-MCC-MNC"/>
+				<gavp name="3GPP-MS-TimeZone"/>
+				<gavp name="3GPP-CAMEL-Charging-Info"/>
+				<gavp name="Charging-Rule-Base-Name"/>
+				<gavp name="3GPP-User-Location-Info"/>
+				<gavp name="3GPP-RAT-Type"/>
+				<gavp name="PS-Furnish-Charging-Information"/>
+			</grouped>
 		</avp>
-		<avp name="WLAN-Information" code="875" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="WLAN-Information" code="875" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="UTF8String"/>
 		</avp>
-		<avp name="IMS-Information" code="876" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="IMS-Information" code="876" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="UTF8String"/>
 		</avp>
-		<avp name="MMS-Information" code="877" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="MMS-Information" code="877" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="UTF8String"/>
 		</avp>
-		<avp name="LCS-Information" code="878" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="LCS-Information" code="878" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<grouped>
 				<gavp name="LCS-Client-ID"/>
 				<gavp name="Location-Type"/>
@@ -360,16 +383,29 @@
 				<gavp name="MSISDN"/>
 			</grouped>
 		</avp>
-		<avp name="PoC-Information" code="879" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="PoC-Information" code="879" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="UTF8String"/>
 		</avp>
-		<avp name="MBMS-Information" code="880" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="MBMS-Information" code="880" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="UTF8String"/>
 		</avp>
-		<avp name="Quota-Consumption-Time" code="881" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
+		<avp name="Quota-Consumption-Time" code="881" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
 			<type type-name="Unsigned32"/>
 		</avp>
+		<avp name="Expires" code="888" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
+			<type type-name="Unsigned32"/>
+		</avp>
 
+		<avp name="Charging-Rule-Base-Name" code="1004" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
+			<type type-name="UTF8String"/>
+		</avp>
+
+		<avp name="PDP-Address" code="1227" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
+			<type type-name="IPAddress"/>
+		</avp>
+		<avp name="SGSN-Address" code="1228" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
+			<type type-name="IPAddress"/>
+		</avp>
 		<avp name="LCS-Client-Name" code="1231" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must">
 			<type type-name="UTF8String"/>
 		</avp>