- <?avp-proto and <?type-proto to instruct about which dissector to use for a given type or avp

- dissect timestamps
- add all the avps that were commented out in the dictionary


svn path=/trunk/; revision=22360
This commit is contained in:
Luis Ontanon 2007-07-20 00:15:17 +00:00
parent fae881dc45
commit 5e290061f2
4 changed files with 273 additions and 135 deletions

View File

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id$ -->
<?type-proto key="MIPRegistrationRequest" value="mip" ?>
<?avp-proto key="Example-AVP" value="data" ?>
<!DOCTYPE dictionary SYSTEM "dictionary.dtd" [
<!ENTITY nasreq SYSTEM "nasreq.xml">
<!ENTITY mobileipv4 SYSTEM "mobileipv4.xml">
@ -1608,18 +1612,17 @@
<gavp name="Originator"/>
</grouped>
</avp>
<!--
890 WAG-Address Address
891 WAG-PLMN-Id OctetString
892 WLAN-Radio-Container Grouped
893 WLAN-Technology Unsigned32
894 WLAN-UE-Local-IPAddress Address
895 PDG-Address Address
896 PDG-Charging-Id Unsigned32
897 Address-Data UTF8String
898 Address-Domain Grouped
899 Address-Type Enumerated
-->
<avp name="WAG-Address" code="890"><type type-name="Address"/></avp>
<avp name="WAG-PLMN-Id" code="891"><type type-name="OctetString"/></avp>
<avp name="WLAN-Radio-Container" code="892"><type type-name="Grouped"/></avp>
<avp name="WLAN-Technology" code="893"><type type-name="Unsigned32"/></avp>
<avp name="WLAN-UE-Local-IPAddress" code="894"><type type-name="Address"/></avp>
<avp name="PDG-Address" code="895"><type type-name="Address"/></avp>
<avp name="PDG-Charging-Id" code="896"><type type-name="Unsigned32"/></avp>
<avp name="Address-Data" code="897"><type type-name="UTF8String"/></avp>
<avp name="Address-Domain" code="898"><type type-name="Grouped"/></avp>
<avp name="Address-Type" code="899"><type type-name="Enumerated"/></avp>
<!-- 3GPP TS 29.061 version 6.5.0 Release 6 -->
<avp name="TMGI" code="900" mandatory="must">
@ -1676,66 +1679,65 @@
<avp name="MBMS-Session-Identity-Repetition-Number " code="912" mandatory="must">
<type type-name="Unsigned32"/>
</avp>
<avp name="MBMS-Required-QoS" code="913"><type type-name="UTF8String"/></avp>
<avp name="MBMS-Counting-Information" code="914"><type type-name="Enumerated"/></avp>
<!--
913 MBMS-Required-QoS UTF8String
914 MBMS-Counting-Information Enumerated
Note: The AVP codes from 915 to 999 are reserved for TS 29.061
29.210
1000 Bearer-Usage Enumerated
1001 Charging-Rule-Install Grouped
1002 Charging-Rule-Remove Grouped
-->
1003 Charging-Rule-Definition Grouped
<avp name="Bearer-Usage" code="1000"><type type-name="Enumerated"/></avp>
<avp name="Charging-Rule-Install" code="1001"><type type-name="Grouped"/></avp>
<avp name="Charging-Rule-Remove" code="1002"><type type-name="Grouped"/></avp>
<avp name="Charging-Rule-Definition" code="1003"><type type-name="Grouped"/></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="Charging-Rule-Name" code="1005"><type type-name="OctetString"/></avp>
<avp name="Event-Trigger" code="1006"><type type-name="Enumerated"/></avp>
<avp name="Metering-Method" code="1007"><type type-name="Enumerated"/></avp>
<avp name="Offline" code="1008"><type type-name="Enumerated"/></avp>
<avp name="Online" code="1009"><type type-name="Enumerated"/></avp>
<avp name="Precedence" code="1010"><type type-name="Unsigned32"/></avp>
<avp name="Reporting-Level" code="1011"><type type-name="Enumerated"/></avp>
<avp name="TFT-Filter" code="1012"><type type-name="IPFilterRule"/></avp>
<avp name="TFT-Packet-Filter-Information" code="1013"><type type-name="Enumerated"/></avp>
<avp name="ToS-Traffic-Class" code="1014"><type type-name="OctetString"/></avp>
<!--
1005 Charging-Rule-Name OctetString
1006 Event-Trigger Enumerated
1007 Metering-Method Enumerated
1008 Offline Enumerated
1009 Online Enumerated
1010 Precedence Unsigned32
1011 Reporting-Level Enumerated
1012 TFT-Filter IPFilterRule
1013 TFT-Packet-Filter-Information Enumerated
1014 ToS-Traffic-Class OctetString
29.210 [15]
Note: The AVP codes from 1015 to 1099 are reserved for TS 29.210
-->
<!-- Note: The AVP codes from 1015 to 1099 are reserved for TS 29.210 -->
<!--
1100 Served-User-Identity Groupe
1101 VASP-ID UTF8Str
1102 VAS-ID UTF8Str
1103 Trigger-Event Enumer
1104 Sender-Address UTF8Str
1105 Initial-Recipient-Address Groupe
1106 Result-Recipient-Address Groupe
1107 Sequence-Number Unsigne
1108 Recipient-Address UTF8Str
1109 Routeing-Address UTF8Str
1110 Originating-Interface Enumer
1111 Delivery-Report Enumer
1112 Read-Reply Enumer
1113 Sender-Visibility Enumer
1114 Service-Key UTF8Str
1115 Billing-Information UTF8Str
1116 Status Group
1117 Status-Code UTF8Str
1118 Status-Text UTF8Str
29.140 [16]
<avp name="Served-User-Identity" code="1100"><type type-name="Groupe"/></avp>
<avp name="VASP-ID" code="1101"><type type-name="UTF8Str"/></avp>
<avp name="VAS-ID" code="1102"><type type-name="UTF8Str"/></avp>
<avp name="Trigger-Event" code="1103"><type type-name="Enumer"/></avp>
<avp name="Sender-Address" code="1104"><type type-name="UTF8Str"/></avp>
<avp name="Initial-Recipient-Address" code="1105"><type type-name="Groupe"/></avp>
<avp name="Result-Recipient-Address" code="1106"><type type-name="Groupe"/></avp>
<avp name="Sequence-Number" code="1107"><type type-name="Unsigne"/></avp>
<avp name="Recipient-Address" code="1108"><type type-name="UTF8Str"/></avp>
<avp name="Routeing-Address" code="1109"><type type-name="UTF8Str"/></avp>
<avp name="Originating-Interface" code="1110"><type type-name="Enumer"/></avp>
<avp name="Delivery-Report" code="1111"><type type-name="Enumer"/></avp>
<avp name="Read-Reply" code="1112"><type type-name="Enumer"/></avp>
<avp name="Sender-Visibility" code="1113"><type type-name="Enumer"/></avp>
<avp name="Service-Key" code="1114"><type type-name="UTF8Str"/></avp>
<avp name="Billing-Information" code="1115"><type type-name="UTF8Str"/></avp>
<avp name="Status" code="1116"><type type-name="Group"/></avp>
<avp name="Status-Code" code="1117"><type type-name="UTF8Str"/></avp>
<avp name="Status-Text" code="1118"><type type-name="UTF8Str"/></avp>
<!--29.140 [16]
Note: The AVP codes from 1119 to 1199 are reserved for TS 29.140
32.299
1200 Domain-Name UTF8String
1201 Recipient-Address Grouped
1202 Submission-Time Time
1203 MM-Content-Type Grouped
1204 Type-Number Enumerated
1205 Additional-Type-Information UTF8String
1206 Content-Size Unsigned32
-->
<avp name="Domain-Name" code="1200"><type type-name="UTF8String"/></avp>
<avp name="Recipient-Address" code="1201"><type type-name="Grouped"/></avp>
<avp name="Submission-Time" code="1202"><type type-name="Time"/></avp>
<avp name="MM-Content-Type" code="1203"><type type-name="Grouped"/></avp>
<avp name="Type-Number" code="1204"><type type-name="Enumerated"/></avp>
<avp name="Additional-Type-Information" code="1205"><type type-name="UTF8String"/></avp>
<avp name="Content-Size" code="1206"><type type-name="Unsigned32"/></avp>
<avp name="Content-Size" code="1205" mandatory="must">
<type type-name="Unsigned32"/>
</avp>
@ -1745,28 +1747,26 @@ Note: The AVP codes from 1119 to 1199 are reserved for TS 29.140
<avp name="SGSN-Address" code="1228" mandatory="must" may-encrypt="no" protected="may" vendor-bit="must" vendor-id="TGPP">
<type type-name="IPAddress"/>
</avp>
<!--
1209 Priority Enumerated
1210 Message-ID UTF8String
1211 Message-Type Enumerated
1212 Message-Size Unsigned32
1213 Message-Class Grouped
1214 Class-Identifier Enumerated
1215 Token-Text UTF8String
1216 Delivery-Report-Requested Enumerated
1217 Adaptations Enumerated
1218 Applic-ID UTF8String
1219 Aux-Applic-Info UTF8String
1220 Content-Class Enumerated
1221 DRM-Content Enumerated
1222 Read-Reply-Report-Requested Enumerated
1223 Reply-Applic-ID UTF8String
1224 File-Repair-Supported Enumerated
1225 MBMS-User-Service-Type Enumerated
1226 Unit-Quota-Threshold Unsigned32
1227 PDP-Address Address
1228 SGSN-Address Address
-->
<avp name="Priority" code="1209"><type type-name="Enumerated"/></avp>
<avp name="Message-ID" code="1210"><type type-name="UTF8String"/></avp>
<avp name="Message-Type" code="1211"><type type-name="Enumerated"/></avp>
<avp name="Message-Size" code="1212"><type type-name="Unsigned32"/></avp>
<avp name="Message-Class" code="1213"><type type-name="Grouped"/></avp>
<avp name="Class-Identifier" code="1214"><type type-name="Enumerated"/></avp>
<avp name="Token-Text" code="1215"><type type-name="UTF8String"/></avp>
<avp name="Delivery-Report-Requested" code="1216"><type type-name="Enumerated"/></avp>
<avp name="Adaptations" code="1217"><type type-name="Enumerated"/></avp>
<avp name="Applic-ID" code="1218"><type type-name="UTF8String"/></avp>
<avp name="Aux-Applic-Info" code="1219"><type type-name="UTF8String"/></avp>
<avp name="Content-Class" code="1220"><type type-name="Enumerated"/></avp>
<avp name="DRM-Content" code="1221"><type type-name="Enumerated"/></avp>
<avp name="Read-Reply-Report-Requested" code="1222"><type type-name="Enumerated"/></avp>
<avp name="Reply-Applic-ID" code="1223"><type type-name="UTF8String"/></avp>
<avp name="File-Repair-Supported" code="1224"><type type-name="Enumerated"/></avp>
<avp name="MBMS-User-Service-Type" code="1225"><type type-name="Enumerated"/></avp>
<avp name="Unit-Quota-Threshold" code="1226"><type type-name="Unsigned32"/></avp>
<avp name="PDP-Address" code="1227"><type type-name="Address"/></avp>
<avp name="SGSN-Address" code="1228"><type type-name="Address"/></avp>
<avp name="PoC-Session-Id" code="1229" mandatory="must" vendor-bit="must" vendor-id="TGPP">
<type type-name="UTF8String"/>
</avp>
@ -1849,24 +1849,26 @@ Note: The AVP codes from 1119 to 1199 are reserved for TS 29.140
<avp name="Positioning-Data" code="1245" mandatory="must" may-encrypt="yes" protected="may" vendor-bit="mustnot">
<type type-name="UTF8String"/>
</avp>
<avp name="WLAN-Session-Id" code="1246"><type type-name="UTF8String"/></avp>
<avp name="PDP-Context-Type" code="1247"><type type-name="Enumerated"/></avp>
<avp name="MMBox-Storage-Requested" code="1248"><type type-name="Enumerated"/></avp>
<avp name="Number-Of-Talk-Burst" code="1249"><type type-name="Unsigned32"/></avp>
<avp name="Called-Asserted-Identity" code="1250"><type type-name="UTF8String"/></avp>
<avp name="Requested-Party-Address" code="1251"><type type-name="UTF8String"/></avp>
<!--
1246 WLAN-Session-Id UTF8String
1247 PDP-Context-Type Enumerated
1248 MMBox-Storage-Requested Enumerated
1249 Number-Of-Talk-Burst Unsigned32
1250 Called-Asserted-Identity UTF8String
1251 Requested-Party-Address UTF8String
1252 Reserved
1253 Reserved
1254 Reserved
1255 Talk-Burst-Exchange Grouped
1256 Talk-Burst-Volume Unsigned32
1257 Talk-Burst-Time Unsigned32
1258 Number-Of-Received-Talk-Bursts Enumerated
1259 Received-Talk-Burst-Volume Unsigned32
1260 Received-Talk-Burst-Time Unsigned32
1261 PoC-Change-Conditions Enumerated
1262 PoC-Change-Time Time
-->
<avp name="Talk-Burst-Exchange" code="1255"><type type-name="Grouped"/></avp>
<avp name="Talk-Burst-Volume" code="1256"><type type-name="Unsigned32"/></avp>
<avp name="Talk-Burst-Time" code="1257"><type type-name="Unsigned32"/></avp>
<avp name="Number-Of-Received-Talk-Bursts" code="1258"><type type-name="Enumerated"/></avp>
<avp name="Received-Talk-Burst-Volume" code="1259"><type type-name="Unsigned32"/></avp>
<avp name="Received-Talk-Burst-Time" code="1260"><type type-name="Unsigned32"/></avp>
<avp name="PoC-Change-Conditions" code="1261"><type type-name="Enumerated"/></avp>
<avp name="PoC-Change-Time" code="1262"><type type-name="Time"/></avp>
<!--
Note: The AVP codes from 1263 to 1299 are reserved for TS 32.299
-->

View File

@ -66,12 +66,20 @@ typedef struct _ddict_cmd_t {
struct _ddict_cmd_t* next;
} ddict_cmd_t;
typedef struct _ddict_xmlpi_t {
char* name;
char* key;
char* value;
struct _ddict_xmlpi_t* next;
} ddict_xmlpi_t;
typedef struct _ddict_t {
ddict_application_t* applications;
ddict_vendor_t* vendors;
ddict_cmd_t* cmds;
ddict_typedefn_t* typedefns;
ddict_avp_t* avps;
ddict_xmlpi_t* xmlpis;
} ddict_t;
extern void ddict_print(FILE* fh, ddict_t* d);

View File

@ -42,6 +42,7 @@
#include <errno.h>
#include <stdlib.h>
#include <stdarg.h>
#include "emem.h"
#include "diam_dict.h"
typedef struct entity_t {
@ -80,6 +81,7 @@ static ddict_gavp_t* gavp;
static ddict_typedefn_t* typedefn;
static ddict_cmd_t* cmd;
static ddict_vendor_t* vnd;
static ddict_xmlpi_t* xmlpi;
static ddict_application_t* last_appl;
static ddict_avp_t* last_avp;
@ -88,6 +90,7 @@ static ddict_gavp_t* last_gavp;
static ddict_typedefn_t* last_typedefn;
static ddict_cmd_t* last_cmd;
static ddict_vendor_t* last_vnd;
static ddict_xmlpi_t* last_xmlpi;
static char** attr_str;
static unsigned* attr_uint;
@ -101,6 +104,8 @@ static FILE* ddict_open(const char*, const char*);
xmlpi_start [[:blank:] \r\n]*<\?[[:blank:] \r\n]*
xmlpi_end [[:blank:] \r\n]*\?>[[:blank:] \r\n]*
xmlpi_key_attr [[:blank:] \r\n]*key[[:blank:] \r\n]*=[[:blank:] \r\n]*\042
xmlpi_value_attr [[:blank:] \r\n]*value[[:blank:] \r\n]*=[[:blank:] \r\n]*\042
comment_start [[:blank:] \r\n]*<!--[[:blank:] \r\n]*
comment_end [[:blank:] \r\n]*-->[[:blank:] \r\n]*
@ -117,11 +122,11 @@ doctype_end [[:blank:] \r\n]*\][[:blank:] \r\n]*>[[:blank:] \r\n]*
start_entity [[:blank:] \r\n]*<\!ENTITY[[:blank:] \r\n]*
system [[:blank:] \r\n]*SYSTEM[[:blank:] \r\n]*\042
entityname [a-z0-9]+
entityname [a-z0-9-]+
ndquot [^\042]+
end_entity \042[[:blank:] \r\n]*>[[:blank:] \r\n]*
entity \&[a-z0-9]+;
entity \&[a-z0-9-]+;
any .
@ -175,7 +180,7 @@ description_attr description=\042
%S LOADING LOADING_COMMENT LOADING_XMLPI ENTITY GET_SYSTEM GET_FILE END_ENTITY
%S GET_ATTR GET_UINT_ATTR END_ATTR OUTSIDE IN_DICT IN_APPL IN_AVP APPL_ATTRS IGNORE_ATTR
%S TYPE_ATTRS GAVP_ATTRS ENUM_ATTRS AVP_ATTRS VENDOR_ATTRS COMMAND_ATTRS TYPEDEFN_ATTRS
%S XMLPI_ATTRS XMLPI_GETKEY XMLPI_GETVAL XMLPI_ENDATTR
%%
<LOADING>{doctype} ;
<LOADING>{doctype_end} ;
@ -185,8 +190,29 @@ description_attr description=\042
<LOADING_COMMENT>{comment_end} BEGIN LOADING;
<LOADING>{xmlpi_start} BEGIN LOADING_XMLPI;
<LOADING_XMLPI>. ;
<LOADING_XMLPI>{xmlpi_end} BEGIN LOADING;
<LOADING_XMLPI>{whitespace} ;
<LOADING_XMLPI>{entityname} {
xmlpi = g_malloc(sizeof(ddict_xmlpi_t));
xmlpi->name = g_strdup(yytext);
xmlpi->key = NULL;
xmlpi->value = NULL;
xmlpi->next = NULL;
if (!dict->xmlpis) last_xmlpi = dict->xmlpis = xmlpi;
else last_xmlpi = last_xmlpi->next = xmlpi;
BEGIN XMLPI_ATTRS;
}
<XMLPI_ATTRS>{xmlpi_key_attr} BEGIN XMLPI_GETKEY;
<XMLPI_GETKEY>{ndquot} { xmlpi->key = strdup(yytext); BEGIN XMLPI_ATTRS; }
<XMLPI_ATTRS>{xmlpi_value_attr} BEGIN XMLPI_GETVAL;
<XMLPI_GETVAL>{ndquot} { xmlpi->value = strdup(yytext); BEGIN XMLPI_ATTRS; }
<XMLPI_ATTRS>.
<XMLPI_ATTRS>{xmlpi_end} BEGIN LOADING;
<LOADING>{start_entity} BEGIN ENTITY;
<ENTITY>{entityname} {
@ -307,12 +333,6 @@ description_attr description=\042
<OUTSIDE>{dictionary_start} {
D(("dictionary_start\n"));
dict = g_malloc(sizeof(ddict_t));
dict->applications = NULL;
dict->cmds = NULL;
dict->vendors = NULL;
dict->typedefns = NULL;
dict->avps = NULL;
BEGIN IN_DICT;
}
@ -604,15 +624,15 @@ ddict_t* ddict_scan(const char* system_directory, const char* filename, int dbg)
write_ptr = NULL;
read_ptr = NULL;
dict = g_malloc(sizeof(ddict_t));
dict->applications = NULL;
dict->cmds = NULL;
dict->vendors = NULL;
dict->typedefns = NULL;
dict->avps = NULL;
dict->xmlpis = NULL;
ents.next = NULL;
current_yyinput = file_input;
BEGIN LOADING;
yylex();
D(("\n---------------\n%s\n------- %d -------\n",strbuf,len_strbuf));
dict = NULL;
appl = NULL;
avp = NULL;
enumitem = NULL;
@ -620,6 +640,7 @@ ddict_t* ddict_scan(const char* system_directory, const char* filename, int dbg)
typedefn = NULL;
cmd = NULL;
vnd = NULL;
xmlpi = NULL;
last_appl = NULL;
last_avp = NULL;
@ -628,7 +649,15 @@ ddict_t* ddict_scan(const char* system_directory, const char* filename, int dbg)
last_typedefn = NULL;
last_cmd = NULL;
last_vnd = NULL;
last_xmlpi = NULL;
ents.next = NULL;
current_yyinput = file_input;
BEGIN LOADING;
yylex();
D(("\n---------------\n%s\n------- %d -------\n",strbuf,len_strbuf));
current_yyinput = string_input;
BEGIN OUTSIDE;

View File

@ -59,10 +59,9 @@
#include <epan/expert.h>
#include "packet-tcp.h"
#include "packet-sip.h"
#include "packet-ntp.h"
#include "diam_dict.h"
#define NTP_TIME_DIFF (2208988800U)
#define TCP_PORT_DIAMETER 3868
#define SCTP_PORT_DIAMETER 3868
@ -139,7 +138,7 @@ typedef struct _diam_dictionary_t {
value_string* commands;
} diam_dictionary_t;
typedef diam_avp_t* (*avp_constructor_t)(const avp_type_t*, guint32, const diam_vnd_t*, const char*, const value_string*);
typedef diam_avp_t* (*avp_constructor_t)(const avp_type_t*, guint32, const diam_vnd_t*, const char*, const value_string*, void*);
struct _avp_type_t {
char* name;
@ -166,6 +165,18 @@ typedef struct _address_avp_t {
int hf_other;
} address_avp_t;
typedef enum {
REASEMBLE_NEVER = 0,
REASEMBLE_AT_END,
REASEMBLE_BY_LENGTH
} avp_reassemble_mode_t;
typedef struct _proto_avp_t {
char* name;
dissector_handle_t handle;
avp_reassemble_mode_t reassemble_mode;
} proto_avp_t;
static const char* simple_avp(diam_ctx_t*, diam_avp_t*, tvbuff_t*);
static value_string no_vs[] = {{0, NULL} };
@ -176,6 +187,8 @@ static diam_avp_t unknown_avp = {0, &unknown_vendor, simple_avp, simple_avp, -1,
static diam_dictionary_t dictionary = { NULL, NULL, NULL, NULL };
static struct _build_dict build_dict;
static value_string* vnd_short_vs;
static dissector_handle_t data_handle;
static const true_false_string reserved_set = {
"Set",
"Unset"
@ -414,6 +427,43 @@ static const char* address_rfc_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
return label;
}
static const char* proto_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb)
{
proto_avp_t* t = a->type_data;
col_set_writable(c->pinfo->cinfo, FALSE);
if (!t->handle) {
t->handle = find_dissector(t->name);
if(!t->handle) t->handle = data_handle;
}
call_dissector(t->handle, tvb, c->pinfo, c->tree);
return "";
}
static const char* time_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) {
int len = tvb_length_remaining(tvb,0);
guint8 ntptime[8] = {0,0,0,0,0,0,0,0};
char* label;
proto_item* pi;
if ( len != 4 ) {
proto_item* 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);
return label;
}
static const char* address_v16_avp(diam_ctx_t* c, diam_avp_t* a, tvbuff_t* tvb) {
char* label = ep_alloc(ITEM_LABEL_LENGTH+1);
address_avp_t* t = a->type_data;
@ -684,7 +734,8 @@ static diam_avp_t* build_address_avp(const avp_type_t* type _U_,
guint32 code,
const diam_vnd_t* vendor,
const char* name,
const value_string* vs _U_) {
const value_string* vs _U_,
void* data _U_) {
diam_avp_t* a = g_malloc0(sizeof(diam_avp_t));
address_avp_t* t = g_malloc(sizeof(address_avp_t));
gint* ettp = &(t->ett);
@ -726,12 +777,39 @@ static diam_avp_t* build_address_avp(const avp_type_t* type _U_,
return a;
}
static diam_avp_t* build_proto_avp(const avp_type_t* type _U_,
guint32 code,
const diam_vnd_t* vendor,
const char* name _U_,
const value_string* vs _U_,
void* data) {
diam_avp_t* a = g_malloc0(sizeof(diam_avp_t));
proto_avp_t* t = g_malloc0(sizeof(proto_avp_t));
gint* ettp = &(a->ett);
a->code = code;
a->vendor = vendor;
a->dissector_v16 = proto_avp;
a->dissector_rfc = proto_avp;
a->ett = -1;
a->hf_value = -2;
a->type_data = t;
t->name = data;
t->handle = NULL;
t->reassemble_mode = 0;
g_array_append_vals(build_dict.ett,&ettp,1);
return a;
}
static diam_avp_t* build_simple_avp(const avp_type_t* type,
guint32 code,
const diam_vnd_t* vendor,
const char* name,
const value_string* vs) {
const value_string* vs,
void* data _U_) {
diam_avp_t* a = g_malloc0(sizeof(diam_avp_t));
a->code = code;
a->vendor = vendor;
@ -746,26 +824,28 @@ static diam_avp_t* build_simple_avp(const avp_type_t* type,
}
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" , simple_avp , simple_avp , FT_INT32 , BASE_DEC , build_simple_avp },
{"unsigned32" , simple_avp , simple_avp , FT_UINT32 , BASE_DEC , build_simple_avp },
{"integer64" , simple_avp , simple_avp , FT_INT64 , BASE_DEC , build_simple_avp },
{"unsigned64" , simple_avp , simple_avp , FT_UINT64 , BASE_DEC , build_simple_avp },
{"float32" , simple_avp , simple_avp , FT_FLOAT , BASE_DEC , build_simple_avp },
{"float64" , simple_avp , simple_avp , FT_DOUBLE , 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" , simple_avp , simple_avp , FT_INT32 , BASE_DEC , build_simple_avp },
{"unsigned32" , simple_avp , simple_avp , FT_UINT32 , BASE_DEC , build_simple_avp },
{"integer64" , simple_avp , simple_avp , FT_INT64 , BASE_DEC , build_simple_avp },
{"unsigned64" , simple_avp , simple_avp , FT_UINT64 , BASE_DEC , build_simple_avp },
{"float32" , simple_avp , simple_avp , FT_FLOAT , BASE_DEC , build_simple_avp },
{"float64" , simple_avp , simple_avp , FT_DOUBLE , BASE_DEC , build_simple_avp },
{"ipaddress" , NULL , NULL , FT_NONE , BASE_NONE , build_address_avp },
{"time" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp },
/* {"diameteruri" , simple_avp , simple_avp , FT_STRING , BASE_NONE , build_simple_avp },
{"diameteridentity" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp },
{"ipfilterrule" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp },
{"qosfilterrule" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_avp },
{"mipregistrationrequest" , simple_avp , simple_avp , FT_BYTES , BASE_NONE , build_simple_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 },
{NULL, NULL, NULL, FT_NONE, BASE_NONE, NULL }
};
static guint strcase_hash(gconstpointer key) {
char* k = ep_strdup(key);
g_strdown(k);
@ -895,7 +975,9 @@ extern int dictionary_load(void) {
ddict_enum_t* e;
value_string* vs = NULL;
const char* vend = a->vendor ? a->vendor : "None";
ddict_xmlpi_t* x;
void* avp_data = NULL;
if ((vnd = g_hash_table_lookup(vendors,vend))) {
value_string vndvs = {a->code,a->name};
g_array_append_val(vnd->vs_avps,vndvs);
@ -914,11 +996,26 @@ extern int dictionary_load(void) {
vs = (void*)arr->data;
}
if (! a->type || ! ( type = g_hash_table_lookup(build_dict.types,a->type) ) ) {
type = bytes;
type = NULL;
for( x = d->xmlpis; x; x = x->next ) {
if ( (strcase_equal(x->name,"avp-proto") && strcase_equal(x->key,a->name))
|| (a->type && strcase_equal(x->name,"type-proto") && strcase_equal(x->key,a->type))
) {
static avp_type_t proto_type = {"proto", proto_avp, proto_avp, FT_UINT32, BASE_NONE, build_proto_avp};
type = &proto_type;
avp_data = x->value;
break;
}
}
avp = type->build( type, a->code, vnd, a->name, vs);
if ( (!type) && a->type )
type = g_hash_table_lookup(build_dict.types,a->type);
if (!type) type = bytes;
avp = type->build( type, a->code, vnd, a->name, vs, avp_data);
g_hash_table_insert(build_dict.avps, a->name, avp);
{
@ -948,6 +1045,8 @@ proto_reg_handoff_diameter(void)
static dissector_handle_t diameter_tcp_handle;
static dissector_handle_t diameter_handle;
data_handle = find_dissector("data");
if (!Initialized) {
diameter_tcp_handle = create_dissector_handle(dissect_diameter_tcp,
proto_diameter);