diff options
author | Guy Harris <guy@alum.mit.edu> | 2000-07-30 07:16:11 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2000-07-30 07:16:11 +0000 |
commit | 888b5a1cdb8172c5d059c7b0aa7ff6b9f3f77088 (patch) | |
tree | 8cab84dcbd9fbc88687cacea37efb333fcbbbf6f | |
parent | 838b254defdc57a7a57d47875196d1f6531253e9 (diff) | |
download | wireshark-888b5a1cdb8172c5d059c7b0aa7ff6b9f3f77088.tar.gz wireshark-888b5a1cdb8172c5d059c7b0aa7ff6b9f3f77088.tar.bz2 wireshark-888b5a1cdb8172c5d059c7b0aa7ff6b9f3f77088.zip |
David Frascone's DIAMETER dissector.
svn path=/trunk/; revision=2176
-rw-r--r-- | AUTHORS | 5 | ||||
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | Makefile.nmake | 3 | ||||
-rw-r--r-- | doc/ethereal.pod.template | 1 | ||||
-rw-r--r-- | packet-diameter-defs.h | 837 | ||||
-rw-r--r-- | packet-diameter.c | 752 | ||||
-rw-r--r-- | packet-diameter.h | 27 | ||||
-rw-r--r-- | packet-radius.c | 9 |
8 files changed, 1635 insertions, 4 deletions
@@ -355,6 +355,10 @@ Jose Pedro Oliveira <jpo@di.uminho.pt> { DHCP enhancements } +David Frascone <dave@frascone.com> { + DIAMETER +} + Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to give his permission to use his version of snprintf.c. @@ -368,4 +372,3 @@ We use the exception module from Kazlib, a C library written by Kaz Kylheku <kaz@ashi.footprints.net>. Thanks goes to him for his well-written library. The Kazlib home page can be found at http://users.footprint.net/~kaz/kazlib.html - diff --git a/Makefile.am b/Makefile.am index 88ff068c06..cbabfb0f5a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ # Makefile.am # Automake file for Ethereal # -# $Id: Makefile.am,v 1.217 2000/07/28 20:03:39 gram Exp $ +# $Id: Makefile.am,v 1.218 2000/07/30 07:16:01 guy Exp $ # # Ethereal - Network traffic analyzer # By Gerald Combs <gerald@zing.org> @@ -116,6 +116,7 @@ DISSECTOR_SOURCES = \ packet-q931.c \ packet-quake.c \ packet-radius.c\ + packet-diameter.c \ packet-raw.c \ packet-rip.c \ packet-ripng.c \ @@ -179,6 +180,8 @@ noinst_HEADERS = \ packet-clip.h \ packet-clnp.h \ packet-ddtp.h \ + packet-diameter.h \ + packet-diameter-defs.h \ packet-dns.h \ packet-esis.h \ packet-eth.h \ diff --git a/Makefile.nmake b/Makefile.nmake index fc7d4004b7..06d623f04d 100644 --- a/Makefile.nmake +++ b/Makefile.nmake @@ -1,7 +1,7 @@ ## Makefile for building ethereal.exe with Microsoft C and nmake ## Use: nmake -f makefile.nmake # -# $Id: Makefile.nmake,v 1.48 2000/07/28 20:03:40 gram Exp $ +# $Id: Makefile.nmake,v 1.49 2000/07/30 07:16:02 guy Exp $ include config.nmake @@ -101,6 +101,7 @@ DISSECTOR_SOURCES = \ packet-q931.c \ packet-quake.c \ packet-radius.c\ + packet-diameter.c \ packet-raw.c \ packet-rip.c \ packet-ripng.c \ diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template index 77c9050eae..5b5fef077d 100644 --- a/doc/ethereal.pod.template +++ b/doc/ethereal.pod.template @@ -907,6 +907,7 @@ B<http://ethereal.zing.org>. Michael Tuexen <Michael.Tuexen@icn.siemens.de> Bruce Korb <bkorb@sco.com> Jose Pedro Oliveira <jpo@di.uminho.pt> + David Frascone <dave@frascone.com> Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to give his permission to use his version of snprintf.c. diff --git a/packet-diameter-defs.h b/packet-diameter-defs.h new file mode 100644 index 0000000000..43f6d38814 --- /dev/null +++ b/packet-diameter-defs.h @@ -0,0 +1,837 @@ +/* + * Filename: packet-diameter-defs.h + * WARNING: This file was automatically generated by dict2h.pl. Modifications + * will be erased by next invocation of dictionary parser. + */ + +#ifndef _PACKET_DIAMETER_DEFS_H +#define _PACKET_DIAMETER_DEFS_H + +/* Attributes */ +#define DIAMETER_ATT_USER_NAME 1 +#define DIAMETER_ATT_USER_PASSWORD 2 +#define DIAMETER_ATT_CHAP_PASSWORD 3 +#define DIAMETER_ATT_NAS_IP_ADDRESS 4 +#define DIAMETER_ATT_NAS_PORT 5 +#define DIAMETER_ATT_SERVICE_TYPE 6 +#define DIAMETER_ATT_FRAMED_PROTOCOL 7 +#define DIAMETER_ATT_FRAMED_IP_ADDRESS 8 +#define DIAMETER_ATT_FRAMED_IP_NETMASK 9 +#define DIAMETER_ATT_FRAMED_ROUTING 10 +#define DIAMETER_ATT_FILTER_ID 11 +#define DIAMETER_ATT_FRAMED_MTU 12 +#define DIAMETER_ATT_FRAMED_COMPRESSION 13 +#define DIAMETER_ATT_LOGIN_IP_HOST 14 +#define DIAMETER_ATT_LOGIN_SERVICE 15 +#define DIAMETER_ATT_LOGIN_TCP_PORT 16 +#define DIAMETER_ATT_OLD_PASSWORD 17 +#define DIAMETER_ATT_REPLY_MESSAGE 18 +#define DIAMETER_ATT_CALLBACK_NUMBER 19 +#define DIAMETER_ATT_CALLBACK_ID 20 +#define DIAMETER_ATT_FRAMED_ROUTE 22 +#define DIAMETER_ATT_FRAMED_IPX_NETWORK 23 +#define DIAMETER_ATT_STATE 24 +#define DIAMETER_ATT_CLASS 25 +#define DIAMETER_ATT_SESSION_TIMEOUT 27 +#define DIAMETER_ATT_IDLE_TIMEOUT 28 +#define DIAMETER_ATT_TERMINATION_ACTION 29 +#define DIAMETER_ATT_CALLED_STATION_ID 30 +#define DIAMETER_ATT_CALLING_STATION_ID 31 +#define DIAMETER_ATT_NAS_IDENTIFIER 32 +#define DIAMETER_ATT_PROXY_STATE 33 +#define DIAMETER_ATT_LOGIN_LAT_SERVICE 34 +#define DIAMETER_ATT_LOGIN_LAT_NODE 35 +#define DIAMETER_ATT_LOGIN_LAT_GROUP 36 +#define DIAMETER_ATT_FRAMED_APPLETALK_LINK 37 +#define DIAMETER_ATT_FRAMED_APPLETALK_NETWORK 38 +#define DIAMETER_ATT_FRAMED_APPLETALK_ZONE 39 +#define DIAMETER_ATT_CHAP_CHALLENGE 60 +#define DIAMETER_ATT_NAS_PORT_TYPE 61 +#define DIAMETER_ATT_PORT_LIMIT 62 +#define DIAMETER_ATT_LOGIN_LAT_PORT 63 +#define DIAMETER_ATT_TUNNEL_TYPE 64 +#define DIAMETER_ATT_TUNNEL_MEDIUM_TYPE 65 +#define DIAMETER_ATT_ACCT_TUNNEL_CLIENT_ENDPOINT 66 +#define DIAMETER_ATT_TUNNEL_SERVER_ENDPOINT 67 +#define DIAMETER_ATT_ACCT_TUNNEL_CONNECTION_ID 68 +#define DIAMETER_ATT_TUNNEL_PASSWORD 69 +#define DIAMETER_ATT_ARAP_PASSWORD 70 +#define DIAMETER_ATT_ARAP_FEATURES 71 +#define DIAMETER_ATT_ARAP_ZONE_ACCESS 72 +#define DIAMETER_ATT_ARAP_SECURITY 73 +#define DIAMETER_ATT_ARAP_SECURITY_DATA 74 +#define DIAMETER_ATT_PASSWORD_RETRY 75 +#define DIAMETER_ATT_PROMPT 76 +#define DIAMETER_ATT_CONNECT_INFO 77 +#define DIAMETER_ATT_CONFIGURATION_TOKEN 78 +#define DIAMETER_ATT_EAP_MESSAGE 79 +#define DIAMETER_ATT_SIGNATURE 80 +#define DIAMETER_ATT_ACCT_STATUS_TYPE 40 +#define DIAMETER_ATT_ACCT_DELAY_TIME 41 +#define DIAMETER_ATT_ACCT_INPUT_OCTETS 42 +#define DIAMETER_ATT_ACCT_OUTPUT_OCTETS 43 +#define DIAMETER_ATT_ACCT_SESSION_ID 44 +#define DIAMETER_ATT_ACCT_AUTHENTIC 45 +#define DIAMETER_ATT_ACCT_SESSION_TIME 46 +#define DIAMETER_ATT_ACCT_INPUT_PACKETS 47 +#define DIAMETER_ATT_ACCT_OUTPUT_PACKETS 48 +#define DIAMETER_ATT_ACCT_TERMINATE_CAUSE 49 +#define DIAMETER_ATT_ACCT_MULTI_SESSION_ID 50 +#define DIAMETER_ATT_ACCT_LINK_COUNT 51 +#define DIAMETER_ATT_MERIT_ENCAPSULATED 141 +#define DIAMETER_ATT_MERIT_REPLY_IF_ACK_MESSAGE 144 +#define DIAMETER_ATT_MERIT_LAS_START_TIME 145 +#define DIAMETER_ATT_MERIT_LAS_CODE 146 +#define DIAMETER_ATT_MERIT_LAS_DURATION 147 +#define DIAMETER_ATT_MERIT_LOCAL_DURATION 148 +#define DIAMETER_ATT_MERIT_HUNTGROUP_SERVICE 149 +#define DIAMETER_ATT_MERIT_PORT_ENTRY 150 +#define DIAMETER_ATT_MERIT_PROXY_ACTION 211 +#define DIAMETER_ATT_MERIT_TOKEN 213 +#define DIAMETER_ATT_MERIT_OWNERSHIP 219 +#define DIAMETER_ATT_MERIT_SUBGROUP 220 +#define DIAMETER_ATT_MERIT_HUNTGROUP_NAME 221 +#define DIAMETER_ATT_MERIT_USER_ID 222 +#define DIAMETER_ATT_MERIT_USER_REALM 223 +#define DIAMETER_ATT_COMMAND_CODE 256 +#define DIAMETER_ATT_EXTENSION_ID 258 +#define DIAMETER_ATT_INTEGRITY_CHECK_VALUE 259 +#define DIAMETER_ATT_ENCRYPTED_PAYLOAD 260 +#define DIAMETER_ATT_NONCE 261 +#define DIAMETER_ATT_TIMESTAMP 262 +#define DIAMETER_ATT_SESSION_ID 263 +#define DIAMETER_ATT_VENDOR_NAME 266 +#define DIAMETER_ATT_FIRMWARE_REVISION 267 +#define DIAMETER_ATT_RESULT_CODE 268 +#define DIAMETER_ATT_DESTINATION_NAI 269 +#define DIAMETER_ATT_REBOOT_TYPE 271 +#define DIAMETER_ATT_REBOOT_TIME 272 +#define DIAMETER_ATT_FAILED_AVP 279 +#define DIAMETER_ATT_RECEIVE_WINDOW 277 +#define DIAMETER_ATT_REDIRECT_HOST 278 +#define DIAMETER_ATT_IP_PORT 281 +#define DIAMETER_ATT_ACCOUNTING_RECORD_TYPE 480 +#define DIAMETER_ATT_ADIF_RECORD 481 +#define DIAMETER_ATT_ACCOUNTING_INTERIM_INTERVAL 482 +#define DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_BATCH 483 +#define DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_DELAY 484 +#define DIAMETER_ATT_ACCOUNTING_RECORD_NUMBER 485 +#define DIAMETER_ATT_MIP_REGISTRATION_REQUEST 320 +#define DIAMETER_ATT_MIP_REGISTRATION_REPLY 321 +#define DIAMETER_ATT_MN_FA_CHALLENGE_LENGTH 322 +#define DIAMETER_ATT_MN_FA_RESPONSE 323 +#define DIAMETER_ATT_MOBILE_NODE_ADDRESS 333 +#define DIAMETER_ATT_HOME_AGENT_ADDRESS 334 +#define DIAMETER_ATT_PREVIOUS_FA_NAI 335 +#define DIAMETER_ATT_MN_AAA_SPI 336 +#define DIAMETER_ATT_FOREIGN_HA_AVAIL 337 +#define DIAMETER_ATT_MN_TO_FA_KEY 325 +#define DIAMETER_ATT_MN_TO_HA_KEY 331 +#define DIAMETER_ATT_FA_TO_MN_KEY 326 +#define DIAMETER_ATT_FA_TO_HA_KEY 328 +#define DIAMETER_ATT_HA_TO_MN_KEY 332 +#define DIAMETER_ATT_HA_TO_FA_KEY 329 +#define DIAMETER_ATT_FA_MN_PREFERRED_SPI 324 +#define DIAMETER_ATT_FA_HA_PREFERRED_SPI 327 +#define DIAMETER_ATT_FILTER_RULE 400 +#define DIAMETER_ATT_REQUEST_TYPE 401 +#define DIAMETER_ATT_EAP_PAYLOAD 402 +#define DIAMETER_ATT_CMS_DATA 310 +#define DIAMETER_ATT_RES_MGMT_INDEX 573 +#define DIAMETER_ATT_RES_MGMT_TOKEN 574 +#define DIAMETER_ATT_SOURCE_HOST 600 +#define DIAMETER_ATT_DESTINATION_HOST 601 +#define DIAMETER_ATT_SOURCE_PORT 602 +#define DIAMETER_ATT_DESTINATION_PORT 603 +#define DIAMETER_ATT_PROTOCOL 604 +#define DIAMETER_ATT_RSVP_SERVICE_TYPE 605 +#define DIAMETER_ATT_TOKEN_BUCKET_RATE 606 +#define DIAMETER_ATT_TOKEN_BUCKET_SIZE 607 +#define DIAMETER_ATT_PEAK_DATA_RATE 608 +#define DIAMETER_ATT_MINIMUM_POLICED_UNIT 609 +#define DIAMETER_ATT_MAXIMUM_PACKET_SIZE 610 +#define DIAMETER_ATT_QOS_RATE 611 +#define DIAMETER_ATT_SLACK_TERM 612 +#define DIAMETER_ATT_TOS_DS_VALUE 613 +#define DIAMETER_ATT_INTERFACE_ADDRESS 614 +#define DIAMETER_ATT_QOS_SERVICE_TYPE 615 +#define DIAMETER_ATT_VOIP_CALLER 686 +#define DIAMETER_ATT_VOIP_CALLEE 687 +#define DIAMETER_ATT_VOIP_CHALLENGE 688 +#define DIAMETER_ATT_VOIP_RESPONSE 689 +#define DIAMETER_ATT_VOIP_SESSION_LENGTH 690 +#define DIAMETER_ATT_COMMENT 1024 +#define DIAMETER_ATT_XVALUE 1025 +#define DIAMETER_ATT_XSTRING 1026 +#define DIAMETER_ATT_AUTHENTICATION_TYPE 1027 +#define DIAMETER_ATT_PROHIBIT 1028 +#define DIAMETER_ATT_USER_CATEGORY 1029 +#define DIAMETER_ATT_GROUP_NAME 1030 +#define DIAMETER_ATT_ENCRYPTED_PASSWORD 1031 +#define DIAMETER_ATT_EXPIRATION 1032 +#define DIAMETER_ATT_PASSWORD 1033 +#define DIAMETER_ATT_SIMULTANEOUS_USE 1034 +#define DIAMETER_ATT_SESSION_LIMIT 1034 +#define DIAMETER_ATT_SERVER_NAME 1035 +#define DIAMETER_ATT_FRAMED_IP_ADDRESS_POOL_NAME 1036 +#define DIAMETER_ATT_SERVICE_CLASS 1037 +#define DIAMETER_ATT_DENY_MESSAGE 1038 +#define DIAMETER_ATT_SOURCE_SUBNET 1039 +#define DIAMETER_ATT_DESTINATION_SUBNET 1040 +#define DIAMETER_ATT_MAX_QOS_RATE 1041 +#define DIAMETER_ATT_ACCOUNTING_ADIF_RECORD 2000 + + + /* Attribute to String table */ + +static value_string diameter_attrib_type_vals[] = { + {DIAMETER_ATT_USER_NAME, "User-Name"}, + {DIAMETER_ATT_USER_PASSWORD, "User-Password"}, + {DIAMETER_ATT_CHAP_PASSWORD, "CHAP-Password"}, + {DIAMETER_ATT_NAS_IP_ADDRESS, "NAS-IP-Address"}, + {DIAMETER_ATT_NAS_PORT, "NAS-Port"}, + {DIAMETER_ATT_SERVICE_TYPE, "Service-Type"}, + {DIAMETER_ATT_FRAMED_PROTOCOL, "Framed-Protocol"}, + {DIAMETER_ATT_FRAMED_IP_ADDRESS, "Framed-IP-Address"}, + {DIAMETER_ATT_FRAMED_IP_NETMASK, "Framed-IP-Netmask"}, + {DIAMETER_ATT_FRAMED_ROUTING, "Framed-Routing"}, + {DIAMETER_ATT_FILTER_ID, "Filter-Id"}, + {DIAMETER_ATT_FRAMED_MTU, "Framed-MTU"}, + {DIAMETER_ATT_FRAMED_COMPRESSION, "Framed-Compression"}, + {DIAMETER_ATT_LOGIN_IP_HOST, "Login-IP-Host"}, + {DIAMETER_ATT_LOGIN_SERVICE, "Login-Service"}, + {DIAMETER_ATT_LOGIN_TCP_PORT, "Login-TCP-Port"}, + {DIAMETER_ATT_OLD_PASSWORD, "Old-Password"}, + {DIAMETER_ATT_REPLY_MESSAGE, "Reply-Message"}, + {DIAMETER_ATT_CALLBACK_NUMBER, "Callback-Number"}, + {DIAMETER_ATT_CALLBACK_ID, "Callback-Id"}, + {DIAMETER_ATT_FRAMED_ROUTE, "Framed-Route"}, + {DIAMETER_ATT_FRAMED_IPX_NETWORK, "Framed-IPX-Network"}, + {DIAMETER_ATT_STATE, "State"}, + {DIAMETER_ATT_CLASS, "Class"}, + {DIAMETER_ATT_SESSION_TIMEOUT, "Session-Timeout"}, + {DIAMETER_ATT_IDLE_TIMEOUT, "Idle-Timeout"}, + {DIAMETER_ATT_TERMINATION_ACTION, "Termination-Action"}, + {DIAMETER_ATT_CALLED_STATION_ID, "Called-Station-Id"}, + {DIAMETER_ATT_CALLING_STATION_ID, "Calling-Station-Id"}, + {DIAMETER_ATT_NAS_IDENTIFIER, "NAS-Identifier"}, + {DIAMETER_ATT_PROXY_STATE, "Proxy-State"}, + {DIAMETER_ATT_LOGIN_LAT_SERVICE, "Login-LAT-Service"}, + {DIAMETER_ATT_LOGIN_LAT_NODE, "Login-LAT-Node"}, + {DIAMETER_ATT_LOGIN_LAT_GROUP, "Login-LAT-Group"}, + {DIAMETER_ATT_FRAMED_APPLETALK_LINK, "Framed-AppleTalk-Link"}, + {DIAMETER_ATT_FRAMED_APPLETALK_NETWORK, "Framed-AppleTalk-Network"}, + {DIAMETER_ATT_FRAMED_APPLETALK_ZONE, "Framed-AppleTalk-Zone"}, + {DIAMETER_ATT_CHAP_CHALLENGE, "CHAP-Challenge"}, + {DIAMETER_ATT_NAS_PORT_TYPE, "NAS-Port-Type"}, + {DIAMETER_ATT_PORT_LIMIT, "Port-Limit"}, + {DIAMETER_ATT_LOGIN_LAT_PORT, "Login-LAT-Port"}, + {DIAMETER_ATT_TUNNEL_TYPE, "Tunnel-Type"}, + {DIAMETER_ATT_TUNNEL_MEDIUM_TYPE, "Tunnel-Medium-Type"}, + {DIAMETER_ATT_ACCT_TUNNEL_CLIENT_ENDPOINT, "Acct-Tunnel-Client-Endpoint"}, + {DIAMETER_ATT_TUNNEL_SERVER_ENDPOINT, "Tunnel-Server-Endpoint"}, + {DIAMETER_ATT_ACCT_TUNNEL_CONNECTION_ID, "Acct-Tunnel-Connection-ID"}, + {DIAMETER_ATT_TUNNEL_PASSWORD, "Tunnel-Password"}, + {DIAMETER_ATT_ARAP_PASSWORD, "ARAP-Password"}, + {DIAMETER_ATT_ARAP_FEATURES, "ARAP-Features"}, + {DIAMETER_ATT_ARAP_ZONE_ACCESS, "ARAP-Zone-Access"}, + {DIAMETER_ATT_ARAP_SECURITY, "ARAP-Security"}, + {DIAMETER_ATT_ARAP_SECURITY_DATA, "ARAP-Security-Data"}, + {DIAMETER_ATT_PASSWORD_RETRY, "Password-Retry"}, + {DIAMETER_ATT_PROMPT, "Prompt"}, + {DIAMETER_ATT_CONNECT_INFO, "Connect-Info"}, + {DIAMETER_ATT_CONFIGURATION_TOKEN, "Configuration-Token"}, + {DIAMETER_ATT_EAP_MESSAGE, "EAP-Message"}, + {DIAMETER_ATT_SIGNATURE, "Signature"}, + {DIAMETER_ATT_ACCT_STATUS_TYPE, "Acct-Status-Type"}, + {DIAMETER_ATT_ACCT_DELAY_TIME, "Acct-Delay-Time"}, + {DIAMETER_ATT_ACCT_INPUT_OCTETS, "Acct-Input-Octets"}, + {DIAMETER_ATT_ACCT_OUTPUT_OCTETS, "Acct-Output-Octets"}, + {DIAMETER_ATT_ACCT_SESSION_ID, "Acct-Session-Id"}, + {DIAMETER_ATT_ACCT_AUTHENTIC, "Acct-Authentic"}, + {DIAMETER_ATT_ACCT_SESSION_TIME, "Acct-Session-Time"}, + {DIAMETER_ATT_ACCT_INPUT_PACKETS, "Acct-Input-Packets"}, + {DIAMETER_ATT_ACCT_OUTPUT_PACKETS, "Acct-Output-Packets"}, + {DIAMETER_ATT_ACCT_TERMINATE_CAUSE, "Acct-Terminate-Cause"}, + {DIAMETER_ATT_ACCT_MULTI_SESSION_ID, "Acct-Multi-Session-Id"}, + {DIAMETER_ATT_ACCT_LINK_COUNT, "Acct-Link-Count"}, + {DIAMETER_ATT_MERIT_ENCAPSULATED, "Merit.Encapsulated"}, + {DIAMETER_ATT_MERIT_REPLY_IF_ACK_MESSAGE, "Merit.Reply-If-Ack-Message"}, + {DIAMETER_ATT_MERIT_LAS_START_TIME, "Merit.LAS-Start-Time"}, + {DIAMETER_ATT_MERIT_LAS_CODE, "Merit.LAS-Code"}, + {DIAMETER_ATT_MERIT_LAS_DURATION, "Merit.LAS-Duration"}, + {DIAMETER_ATT_MERIT_LOCAL_DURATION, "Merit.Local-Duration"}, + {DIAMETER_ATT_MERIT_HUNTGROUP_SERVICE, "Merit.Huntgroup-Service"}, + {DIAMETER_ATT_MERIT_PORT_ENTRY, "Merit.Port-Entry"}, + {DIAMETER_ATT_MERIT_PROXY_ACTION, "Merit.Proxy-Action"}, + {DIAMETER_ATT_MERIT_TOKEN, "Merit.Token"}, + {DIAMETER_ATT_MERIT_OWNERSHIP, "Merit.Ownership"}, + {DIAMETER_ATT_MERIT_SUBGROUP, "Merit.Subgroup"}, + {DIAMETER_ATT_MERIT_HUNTGROUP_NAME, "Merit.Huntgroup-Name"}, + {DIAMETER_ATT_MERIT_USER_ID, "Merit.User-Id"}, + {DIAMETER_ATT_MERIT_USER_REALM, "Merit.User-Realm"}, + {DIAMETER_ATT_COMMAND_CODE, "Command-Code"}, + {DIAMETER_ATT_EXTENSION_ID, "Extension-Id"}, + {DIAMETER_ATT_INTEGRITY_CHECK_VALUE, "Integrity-Check-Value"}, + {DIAMETER_ATT_ENCRYPTED_PAYLOAD, "Encrypted-Payload"}, + {DIAMETER_ATT_NONCE, "Nonce"}, + {DIAMETER_ATT_TIMESTAMP, "Timestamp"}, + {DIAMETER_ATT_SESSION_ID, "Session-Id"}, + {DIAMETER_ATT_VENDOR_NAME, "Vendor-Name"}, + {DIAMETER_ATT_FIRMWARE_REVISION, "Firmware-Revision"}, + {DIAMETER_ATT_RESULT_CODE, "Result-Code"}, + {DIAMETER_ATT_DESTINATION_NAI, "Destination-NAI"}, + {DIAMETER_ATT_REBOOT_TYPE, "Reboot-Type"}, + {DIAMETER_ATT_REBOOT_TIME, "Reboot-Time"}, + {DIAMETER_ATT_FAILED_AVP, "Failed-AVP"}, + {DIAMETER_ATT_RECEIVE_WINDOW, "Receive-Window"}, + {DIAMETER_ATT_REDIRECT_HOST, "Redirect-Host"}, + {DIAMETER_ATT_IP_PORT, "IP-Port"}, + {DIAMETER_ATT_ACCOUNTING_RECORD_TYPE, "Accounting-Record-Type"}, + {DIAMETER_ATT_ADIF_RECORD, "ADIF-Record"}, + {DIAMETER_ATT_ACCOUNTING_INTERIM_INTERVAL, "Accounting-Interim-Interval"}, + {DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_BATCH, "Accounting-Delivery-Max-Batch"}, + {DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_DELAY, "Accounting-Delivery-Max-Delay"}, + {DIAMETER_ATT_ACCOUNTING_RECORD_NUMBER, "Accounting-Record-Number"}, + {DIAMETER_ATT_MIP_REGISTRATION_REQUEST, "MIP-Registration-Request"}, + {DIAMETER_ATT_MIP_REGISTRATION_REPLY, "MIP-Registration-Reply"}, + {DIAMETER_ATT_MN_FA_CHALLENGE_LENGTH, "MN-FA-Challenge-Length"}, + {DIAMETER_ATT_MN_FA_RESPONSE, "MN-FA-Response"}, + {DIAMETER_ATT_MOBILE_NODE_ADDRESS, "Mobile-Node-Address"}, + {DIAMETER_ATT_HOME_AGENT_ADDRESS, "Home-Agent-Address"}, + {DIAMETER_ATT_PREVIOUS_FA_NAI, "Previous-FA-NAI"}, + {DIAMETER_ATT_MN_AAA_SPI, "MN-AAA-SPI"}, + {DIAMETER_ATT_FOREIGN_HA_AVAIL, "Foreign-HA-Avail"}, + {DIAMETER_ATT_MN_TO_FA_KEY, "MN-to-FA-Key"}, + {DIAMETER_ATT_MN_TO_HA_KEY, "MN-to-HA-Key"}, + {DIAMETER_ATT_FA_TO_MN_KEY, "FA-to-MN-Key"}, + {DIAMETER_ATT_FA_TO_HA_KEY, "FA-to-HA-Key"}, + {DIAMETER_ATT_HA_TO_MN_KEY, "HA-to-MN-Key"}, + {DIAMETER_ATT_HA_TO_FA_KEY, "HA-to-FA-Key"}, + {DIAMETER_ATT_FA_MN_PREFERRED_SPI, "FA-MN-Preferred-SPI"}, + {DIAMETER_ATT_FA_HA_PREFERRED_SPI, "FA-HA-Preferred-SPI"}, + {DIAMETER_ATT_FILTER_RULE, "Filter-Rule"}, + {DIAMETER_ATT_REQUEST_TYPE, "Request-Type"}, + {DIAMETER_ATT_EAP_PAYLOAD, "EAP-Payload"}, + {DIAMETER_ATT_CMS_DATA, "CMS-Data"}, + {DIAMETER_ATT_RES_MGMT_INDEX, "Res-Mgmt-Index"}, + {DIAMETER_ATT_RES_MGMT_TOKEN, "Res-Mgmt-Token"}, + {DIAMETER_ATT_SOURCE_HOST, "Source-Host"}, + {DIAMETER_ATT_DESTINATION_HOST, "Destination-Host"}, + {DIAMETER_ATT_SOURCE_PORT, "Source-Port"}, + {DIAMETER_ATT_DESTINATION_PORT, "Destination-Port"}, + {DIAMETER_ATT_PROTOCOL, "Protocol"}, + {DIAMETER_ATT_RSVP_SERVICE_TYPE, "RSVP-Service-Type"}, + {DIAMETER_ATT_TOKEN_BUCKET_RATE, "Token-Bucket-Rate"}, + {DIAMETER_ATT_TOKEN_BUCKET_SIZE, "Token-Bucket-Size"}, + {DIAMETER_ATT_PEAK_DATA_RATE, "Peak-Data-Rate"}, + {DIAMETER_ATT_MINIMUM_POLICED_UNIT, "Minimum-Policed-Unit"}, + {DIAMETER_ATT_MAXIMUM_PACKET_SIZE, "Maximum-Packet-Size"}, + {DIAMETER_ATT_QOS_RATE, "QOS-Rate"}, + {DIAMETER_ATT_SLACK_TERM, "Slack-Term"}, + {DIAMETER_ATT_TOS_DS_VALUE, "TOS-DS-Value"}, + {DIAMETER_ATT_INTERFACE_ADDRESS, "Interface-Address"}, + {DIAMETER_ATT_QOS_SERVICE_TYPE, "QOS-Service-Type"}, + {DIAMETER_ATT_VOIP_CALLER, "Voip-Caller"}, + {DIAMETER_ATT_VOIP_CALLEE, "Voip-Callee"}, + {DIAMETER_ATT_VOIP_CHALLENGE, "Voip-Challenge"}, + {DIAMETER_ATT_VOIP_RESPONSE, "Voip-Response"}, + {DIAMETER_ATT_VOIP_SESSION_LENGTH, "Voip-Session-Length"}, + {DIAMETER_ATT_COMMENT, "Comment"}, + {DIAMETER_ATT_XVALUE, "Xvalue"}, + {DIAMETER_ATT_XSTRING, "Xstring"}, + {DIAMETER_ATT_AUTHENTICATION_TYPE, "Authentication-Type"}, + {DIAMETER_ATT_PROHIBIT, "Prohibit"}, + {DIAMETER_ATT_USER_CATEGORY, "User-Category"}, + {DIAMETER_ATT_GROUP_NAME, "Group-Name"}, + {DIAMETER_ATT_ENCRYPTED_PASSWORD, "Encrypted-Password"}, + {DIAMETER_ATT_EXPIRATION, "Expiration"}, + {DIAMETER_ATT_PASSWORD, "Password"}, + {DIAMETER_ATT_SIMULTANEOUS_USE, "Simultaneous-Use"}, + {DIAMETER_ATT_SESSION_LIMIT, "Session-Limit"}, + {DIAMETER_ATT_SERVER_NAME, "Server-Name"}, + {DIAMETER_ATT_FRAMED_IP_ADDRESS_POOL_NAME, "Framed-IP-Address-Pool-Name"}, + {DIAMETER_ATT_SERVICE_CLASS, "Service-Class"}, + {DIAMETER_ATT_DENY_MESSAGE, "Deny-Message"}, + {DIAMETER_ATT_SOURCE_SUBNET, "Source-Subnet"}, + {DIAMETER_ATT_DESTINATION_SUBNET, "Destination-Subnet"}, + {DIAMETER_ATT_MAX_QOS_RATE, "Max-QOS-Rate"}, + {DIAMETER_ATT_ACCOUNTING_ADIF_RECORD, "Accounting-Adif-Record"}, + {0, (char *)NULL} +}; + + + /* Attribute to Type Table */ + +static value_value_pair diameter_printinfo[] = { + { DIAMETER_ATT_USER_NAME, DIAMETER_STRING }, + { DIAMETER_ATT_USER_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_CHAP_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_NAS_IP_ADDRESS, DIAMETER_ADDRESS }, + { DIAMETER_ATT_NAS_PORT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_SERVICE_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FRAMED_PROTOCOL, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FRAMED_IP_ADDRESS, DIAMETER_ADDRESS }, + { DIAMETER_ATT_FRAMED_IP_NETMASK, DIAMETER_ADDRESS }, + { DIAMETER_ATT_FRAMED_ROUTING, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FILTER_ID, DIAMETER_STRING }, + { DIAMETER_ATT_FRAMED_MTU, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FRAMED_COMPRESSION, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_LOGIN_IP_HOST, DIAMETER_ADDRESS }, + { DIAMETER_ATT_LOGIN_SERVICE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_LOGIN_TCP_PORT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_OLD_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_REPLY_MESSAGE, DIAMETER_STRING }, + { DIAMETER_ATT_CALLBACK_NUMBER, DIAMETER_STRING }, + { DIAMETER_ATT_CALLBACK_ID, DIAMETER_STRING }, + { DIAMETER_ATT_FRAMED_ROUTE, DIAMETER_STRING }, + { DIAMETER_ATT_FRAMED_IPX_NETWORK, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_STATE, DIAMETER_STRING }, + { DIAMETER_ATT_CLASS, DIAMETER_STRING }, + { DIAMETER_ATT_SESSION_TIMEOUT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_IDLE_TIMEOUT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_TERMINATION_ACTION, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_CALLED_STATION_ID, DIAMETER_STRING }, + { DIAMETER_ATT_CALLING_STATION_ID, DIAMETER_STRING }, + { DIAMETER_ATT_NAS_IDENTIFIER, DIAMETER_STRING }, + { DIAMETER_ATT_PROXY_STATE, DIAMETER_DATA }, + { DIAMETER_ATT_LOGIN_LAT_SERVICE, DIAMETER_STRING }, + { DIAMETER_ATT_LOGIN_LAT_NODE, DIAMETER_STRING }, + { DIAMETER_ATT_LOGIN_LAT_GROUP, DIAMETER_STRING }, + { DIAMETER_ATT_FRAMED_APPLETALK_LINK, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FRAMED_APPLETALK_NETWORK, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FRAMED_APPLETALK_ZONE, DIAMETER_STRING }, + { DIAMETER_ATT_CHAP_CHALLENGE, DIAMETER_STRING }, + { DIAMETER_ATT_NAS_PORT_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_PORT_LIMIT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_LOGIN_LAT_PORT, DIAMETER_STRING }, + { DIAMETER_ATT_TUNNEL_TYPE, DIAMETER_STRING }, + { DIAMETER_ATT_TUNNEL_MEDIUM_TYPE, DIAMETER_STRING }, + { DIAMETER_ATT_ACCT_TUNNEL_CLIENT_ENDPOINT, DIAMETER_STRING }, + { DIAMETER_ATT_TUNNEL_SERVER_ENDPOINT, DIAMETER_STRING }, + { DIAMETER_ATT_ACCT_TUNNEL_CONNECTION_ID, DIAMETER_STRING }, + { DIAMETER_ATT_TUNNEL_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_ARAP_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_ARAP_FEATURES, DIAMETER_STRING }, + { DIAMETER_ATT_ARAP_ZONE_ACCESS, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ARAP_SECURITY, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ARAP_SECURITY_DATA, DIAMETER_STRING }, + { DIAMETER_ATT_PASSWORD_RETRY, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_PROMPT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_CONNECT_INFO, DIAMETER_STRING }, + { DIAMETER_ATT_CONFIGURATION_TOKEN, DIAMETER_STRING }, + { DIAMETER_ATT_EAP_MESSAGE, DIAMETER_STRING }, + { DIAMETER_ATT_SIGNATURE, DIAMETER_STRING }, + { DIAMETER_ATT_ACCT_STATUS_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_DELAY_TIME, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_INPUT_OCTETS, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_OUTPUT_OCTETS, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_SESSION_ID, DIAMETER_STRING }, + { DIAMETER_ATT_ACCT_AUTHENTIC, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_SESSION_TIME, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_INPUT_PACKETS, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_OUTPUT_PACKETS, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_TERMINATE_CAUSE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCT_MULTI_SESSION_ID, DIAMETER_STRING }, + { DIAMETER_ATT_ACCT_LINK_COUNT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MERIT_ENCAPSULATED, DIAMETER_DATA }, + { DIAMETER_ATT_MERIT_REPLY_IF_ACK_MESSAGE, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_LAS_START_TIME, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MERIT_LAS_CODE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MERIT_LAS_DURATION, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MERIT_LOCAL_DURATION, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MERIT_HUNTGROUP_SERVICE, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_PORT_ENTRY, DIAMETER_DATA }, + { DIAMETER_ATT_MERIT_PROXY_ACTION, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_TOKEN, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_OWNERSHIP, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MERIT_SUBGROUP, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_HUNTGROUP_NAME, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_USER_ID, DIAMETER_STRING }, + { DIAMETER_ATT_MERIT_USER_REALM, DIAMETER_STRING }, + { DIAMETER_ATT_COMMAND_CODE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_EXTENSION_ID, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_INTEGRITY_CHECK_VALUE, DIAMETER_COMPLEX }, + { DIAMETER_ATT_ENCRYPTED_PAYLOAD, DIAMETER_DATA }, + { DIAMETER_ATT_NONCE, DIAMETER_DATA }, + { DIAMETER_ATT_TIMESTAMP, DIAMETER_TIME }, + { DIAMETER_ATT_SESSION_ID, DIAMETER_DATA }, + { DIAMETER_ATT_VENDOR_NAME, DIAMETER_STRING }, + { DIAMETER_ATT_FIRMWARE_REVISION, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_RESULT_CODE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_DESTINATION_NAI, DIAMETER_STRING }, + { DIAMETER_ATT_REBOOT_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_REBOOT_TIME, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FAILED_AVP, DIAMETER_DATA }, + { DIAMETER_ATT_RECEIVE_WINDOW, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_REDIRECT_HOST, DIAMETER_ADDRESS }, + { DIAMETER_ATT_IP_PORT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCOUNTING_RECORD_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ADIF_RECORD, DIAMETER_DATA }, + { DIAMETER_ATT_ACCOUNTING_INTERIM_INTERVAL, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_BATCH, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCOUNTING_DELIVERY_MAX_DELAY, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCOUNTING_RECORD_NUMBER, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MIP_REGISTRATION_REQUEST, DIAMETER_DATA }, + { DIAMETER_ATT_MIP_REGISTRATION_REPLY, DIAMETER_DATA }, + { DIAMETER_ATT_MN_FA_CHALLENGE_LENGTH, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MN_FA_RESPONSE, DIAMETER_DATA }, + { DIAMETER_ATT_MOBILE_NODE_ADDRESS, DIAMETER_ADDRESS }, + { DIAMETER_ATT_HOME_AGENT_ADDRESS, DIAMETER_ADDRESS }, + { DIAMETER_ATT_PREVIOUS_FA_NAI, DIAMETER_STRING }, + { DIAMETER_ATT_MN_AAA_SPI, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FOREIGN_HA_AVAIL, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MN_TO_FA_KEY, DIAMETER_DATA }, + { DIAMETER_ATT_MN_TO_HA_KEY, DIAMETER_DATA }, + { DIAMETER_ATT_FA_TO_MN_KEY, DIAMETER_DATA }, + { DIAMETER_ATT_FA_TO_HA_KEY, DIAMETER_DATA }, + { DIAMETER_ATT_HA_TO_MN_KEY, DIAMETER_DATA }, + { DIAMETER_ATT_HA_TO_FA_KEY, DIAMETER_DATA }, + { DIAMETER_ATT_FA_MN_PREFERRED_SPI, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FA_HA_PREFERRED_SPI, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_FILTER_RULE, DIAMETER_STRING }, + { DIAMETER_ATT_REQUEST_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_EAP_PAYLOAD, DIAMETER_DATA }, + { DIAMETER_ATT_CMS_DATA, DIAMETER_DATA }, + { DIAMETER_ATT_RES_MGMT_INDEX, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_RES_MGMT_TOKEN, DIAMETER_DATA }, + { DIAMETER_ATT_SOURCE_HOST, DIAMETER_ADDRESS }, + { DIAMETER_ATT_DESTINATION_HOST, DIAMETER_ADDRESS }, + { DIAMETER_ATT_SOURCE_PORT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_DESTINATION_PORT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_PROTOCOL, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_RSVP_SERVICE_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_TOKEN_BUCKET_RATE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_TOKEN_BUCKET_SIZE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_PEAK_DATA_RATE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MINIMUM_POLICED_UNIT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_MAXIMUM_PACKET_SIZE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_QOS_RATE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_SLACK_TERM, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_TOS_DS_VALUE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_INTERFACE_ADDRESS, DIAMETER_ADDRESS }, + { DIAMETER_ATT_QOS_SERVICE_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_VOIP_CALLER, DIAMETER_STRING }, + { DIAMETER_ATT_VOIP_CALLEE, DIAMETER_STRING }, + { DIAMETER_ATT_VOIP_CHALLENGE, DIAMETER_DATA }, + { DIAMETER_ATT_VOIP_RESPONSE, DIAMETER_DATA }, + { DIAMETER_ATT_VOIP_SESSION_LENGTH, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_COMMENT, DIAMETER_STRING }, + { DIAMETER_ATT_XVALUE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_XSTRING, DIAMETER_STRING }, + { DIAMETER_ATT_AUTHENTICATION_TYPE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_PROHIBIT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_USER_CATEGORY, DIAMETER_STRING }, + { DIAMETER_ATT_GROUP_NAME, DIAMETER_STRING }, + { DIAMETER_ATT_ENCRYPTED_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_EXPIRATION, DIAMETER_TIME }, + { DIAMETER_ATT_PASSWORD, DIAMETER_STRING }, + { DIAMETER_ATT_SIMULTANEOUS_USE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_SESSION_LIMIT, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_SERVER_NAME, DIAMETER_STRING }, + { DIAMETER_ATT_FRAMED_IP_ADDRESS_POOL_NAME, DIAMETER_STRING }, + { DIAMETER_ATT_SERVICE_CLASS, DIAMETER_STRING }, + { DIAMETER_ATT_DENY_MESSAGE, DIAMETER_STRING }, + { DIAMETER_ATT_SOURCE_SUBNET, DIAMETER_ADDRESS }, + { DIAMETER_ATT_DESTINATION_SUBNET, DIAMETER_ADDRESS }, + { DIAMETER_ATT_MAX_QOS_RATE, DIAMETER_INTEGER32 }, + { DIAMETER_ATT_ACCOUNTING_ADIF_RECORD, DIAMETER_DATA }, + {0, 0} +}; + + + + + /* Values Structures */ + +static value_string diameter_qos_service_type_vals[]={ + {3, "Labels"}, + {1, "RSVP"}, + {2, "TOS"}, + {0, (char *)NULL} +}; + +static value_string diameter_service_type_vals[]={ + {5, "Outbound"}, + {7, "NAS-Prompt"}, + {3, "Callback-Login"}, + {6, "Administrative"}, + {1, "Login"}, + {4, "Callback-Framed"}, + {9, "Callback-NAS-Prompt"}, + {8, "Authenticate-Only"}, + {2, "Framed"}, + {0, (char *)NULL} +}; + +static value_string diameter_prohibit_vals[]={ + {0, "Dumb"}, + {2, "SLIP"}, + {1, "PPP"}, + {3, "Auth-Only"}, + {255, "All"}, + {0, (char *)NULL} +}; + +static value_string diameter_prompt_vals[]={ + {0, "No-Echo"}, + {1, "Echo"}, + {0, (char *)NULL} +}; + +static value_string diameter_source_port_vals[]={ + {23, "ftp"}, + {0, "*"}, + {21, "telnet"}, + {0, (char *)NULL} +}; + +static value_string diameter_nas_port_type_vals[]={ + {6, "PIAFS"}, + {9, "X75"}, + {7, "HDLC-Clear-Channel"}, + {5, "Virtual"}, + {2, "ISDN-Sync"}, + {1, "Sync"}, + {0, "Async"}, + {4, "ISDN-Async-v110"}, + {3, "ISDN-Async-v120"}, + {8, "X25"}, + {0, (char *)NULL} +}; + +static value_string diameter_interface_address_vals[]={ + {0, "Any-Interface"}, + {0, (char *)NULL} +}; + +static value_string diameter_framed_routing_vals[]={ + {0, "None"}, + {1, "Broadcast"}, + {3, "Broadcast-Listen"}, + {2, "Listen"}, + {0, (char *)NULL} +}; + +static value_string diameter_command_code_vals[]={ + {257, "Device-Reboot-Ind"}, + {258, "Device-Watchdog-Ind"}, + {259, "Message-Reject-Ind"}, + {260, "AA-Mobile-Node-Request"}, + {261, "AA-Mobile-Node-Answer"}, + {262, "Home-Agent-MIP-Request"}, + {263, "Home-Agent-MIP-Answer"}, + {264, "Mobile-Node-Terminate-Ind"}, + {265, "AA-Request"}, + {266, "AA-Answer"}, + {267, "AA-Challenge-Ind"}, + {268, "DIAMETER-EAP-Request"}, + {269, "DIAMETER-EAP-Answer"}, + {270, "DIAMETER-EAP-Ind"}, + {271, "Accounting-Request"}, + {272, "Accounting-Answer"}, + {273, "Accounting-Poll"}, + {483, "Accounting-Start-Answer"}, + {511, "Ping-Req"}, + {484, "Accounting-Interim-Req"}, + {480, "Voip-Stop-Req"}, + {512, "Ping-Answer"}, + {513, "EAP-Req"}, + {485, "Accounting-Interim-Answer"}, + {481, "Voip-Stop-Answer"}, + {478, "Voip-Start-Req"}, + {486, "Accounting-Stop-Req"}, + {514, "EAP-Answer"}, + {515, "Domain-Discovery-Request"}, + {479, "Voip-Start-Answer"}, + {516, "Domain-Discovery-Answer"}, + {487, "Accounting-Stop-Answer"}, + {482, "Accounting-Start-Req"}, + {0, (char *)NULL} +}; + +static value_string diameter_framed_ip_address_vals[]={ + {-1, "Assigned"}, + {0, (char *)NULL} +}; + +static value_string diameter_arap_zone_access_vals[]={ + {4, "Exclusive-Filter"}, + {2, "Inclusive-Filter"}, + {1, "Default-Zone"}, + {0, (char *)NULL} +}; + +static value_string diameter_acct_authentic_vals[]={ + {1, "RADIUS"}, + {0, "None"}, + {2, "Local"}, + {0, (char *)NULL} +}; + +static value_string diameter_framed_protocol_vals[]={ + {1, "PPP"}, + {260, "COMB"}, + {5, "Xylogics"}, + {257, "EURAW"}, + {3, "ARA"}, + {261, "FR"}, + {2, "SLIP"}, + {258, "EUUI"}, + {4, "Gandalf"}, + {256, "MPP"}, + {255, "Ascend-ARA"}, + {259, "X25"}, + {0, (char *)NULL} +}; + +static value_string diameter_framed_compression_vals[]={ + {0, "None"}, + {1, "Van-Jacobson-TCP-IP"}, + {2, "IPX-Header-Compression"}, + {0, (char *)NULL} +}; + +static value_string diameter_authentication_type_vals[]={ + {10, "File"}, + {22, "LDAP"}, + {21, "Slow"}, + {20, "Blackhole"}, + {2, "AFS-Krb"}, + {6, "KCHAP"}, + {4, "RADIUS"}, + {13, "ACE"}, + {9, "Local"}, + {7, "TACACS"}, + {0, "None"}, + {19, "Deny"}, + {23, "Unassigned"}, + {8, "Realm"}, + {1, "Passwd"}, + {5, "MNET"}, + {3, "MIT-Krb"}, + {17, "Oracle"}, + {1, "Unix-PW"}, + {16, "ODBC"}, + {11, "TACPLUS"}, + {15, "SKEY"}, + {12, "ARA-DES"}, + {14, "DEFENDER"}, + {18, "Allow"}, + {0, (char *)NULL} +}; + +static value_string diameter_acct_terminate_cause_vals[]={ + {1, "User-Request"}, + {2, "Lost-Carrier"}, + {3, "Lost-Service"}, + {4, "Idle-Timeout"}, + {5, "Session-Timeout"}, + {6, "Admin-Reset"}, + {7, "Admin-Reboot"}, + {8, "Port-Error"}, + {9, "NAS-Error"}, + {10, "NAS-Request"}, + {11, "NAS-Reboot"}, + {12, "Port-Unneeded"}, + {13, "Port-Preempted"}, + {14, "Port-Suspended"}, + {15, "Service-Unavailable"}, + {16, "Callback"}, + {17, "User-Error"}, + {18, "Host-Request"}, + {0, (char *)NULL} +}; + +static value_string diameter_protocol_vals[]={ + {65535, "Any"}, + {17, "UDP"}, + {1, "ICMP"}, + {0, "IP"}, + {6, "TCP"}, + {0, (char *)NULL} +}; + +static value_string diameter_destination_port_vals[]={ + {10000, "vic-rsvp"}, + {23, "ftp"}, + {0, "*"}, + {21, "telnet"}, + {0, (char *)NULL} +}; + +static value_string diameter_termination_action_vals[]={ + {0, "Default"}, + {1, "RADIUS-Request"}, + {0, (char *)NULL} +}; + +static value_string diameter_extension_id_vals[]={ + {1, "NASREQ"}, + {2, "Strong-Security"}, + {4, "Mobile-IP"}, + {5, "Accounting"}, + {7, "VOIP"}, + {8, "EAP"}, + {555, "Test"}, + {556, "AccountingV3"}, + {0, (char *)NULL} +}; + +static value_string diameter_merit_las_code_vals[]={ + {0, "LAS-Normal"}, + {1, "LAS-Reject"}, + {2, "LAS-Cancel"}, + {3, "LAS-Noconfirm"}, + {4, "LAS-Overtime"}, + {5, "LAS-Unknown"}, + {6, "LAS-Notoken"}, + {7, "LAS-Notlocal"}, + {8, "LAS-Suspend"}, + {9, "LAS-Failed"}, + {10, "LAS-Authorized"}, + {11, "LAS-NASreboot"}, + {12, "LAS-Remote"}, + {13, "LAS-Duplicate"}, + {14, "LAS-Collision"}, + {15, "LAS-Stop"}, + {0, (char *)NULL} +}; + +static value_string diameter_login_service_vals[]={ + {0, "Telnet"}, + {1, "Rlogin"}, + {2, "TCP-Clear"}, + {3, "PortMaster"}, + {4, "LAT"}, + {5, "X25-PAD"}, + {6, "X25-T3POS"}, + {0, (char *)NULL} +}; + +static value_string diameter_rsvp_service_type_vals[]={ + {1, "RSVP-Controlled-Load"}, + {2, "RSVP-Guaranteed"}, + {0, (char *)NULL} +}; + +static value_string diameter_reboot_type_vals[]={ + {1, "Reboot-Imminent"}, + {2, "Reboot-Complete"}, + {0, (char *)NULL} +}; + +static value_string diameter_acct_status_type_vals[]={ + {1, "Start"}, + {2, "Stop"}, + {3, "Alive"}, + {4, "Modem-Start"}, + {5, "Modem-Stop"}, + {6, "Cancel"}, + {7, "Accounting-On"}, + {8, "Accounting-Off"}, + {0, (char *)NULL} +}; + + +#endif /* _PACKET_DIAMETER_DEFS_H */ diff --git a/packet-diameter.c b/packet-diameter.c new file mode 100644 index 0000000000..20cf4f07a7 --- /dev/null +++ b/packet-diameter.c @@ -0,0 +1,752 @@ +/* packet-diameter.c + * Routines for DIAMETER packet disassembly + * + * $Id: packet-diameter.c,v 1.1 2000/07/30 07:16:03 guy Exp $ + * + * Copyright (c) 2000 by David Frascone <chaos@mindspring.com> + * + * Ethereal - Network traffic analyzer + * By Johan Feyaerts + * Copyright 1999 Johan Feyaerts + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif + +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <glib.h> +#include "packet.h" +#include "resolv.h" +#include "prefs.h" + +/* This must be defined before we include our dictionary defs */ + +typedef struct _value_value_pair { + guint16 val1; + guint16 val2; +} value_value_pair; + +typedef enum { + DIAMETER_DATA=1, + DIAMETER_STRING, + DIAMETER_ADDRESS, + DIAMETER_INTEGER32, + DIAMETER_INTEGER64, + DIAMETER_TIME, + DIAMETER_COMPLEX +} diameterDataTypes; + +#include "packet-diameter.h" +#include "packet-diameter-defs.h" + +#define COMMAND_CODE_OFFSET 20 +#define NTP_TIME_DIFF (2208988800UL) + +#undef SCTP_DISSECTORS_ENABLED + +#define UDP_PORT_DIAMETER 2645 +#define TCP_PORT_DIAMETER 2645 +#ifdef SCTP_DISSECTORS_ENABLED +#define SCTP_PORT_DIAMETER 2645 +#endif +/* #define UDP_PORT_DIAMETER 1812 -- Compiling this in breaks RADIUS */ + +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_flags = -1; +static int hf_diameter_ns = -1; +static int hf_diameter_nr = -1; + +static gint ett_diameter = -1; +static gint ett_diameter_avp = -1; +static gint ett_diameter_avpinfo = -1; + +static char gbl_diameterString[200]; +static int gbl_diameterUdpPort=UDP_PORT_DIAMETER; +static int gbl_diameterTcpPort=TCP_PORT_DIAMETER; +#ifdef SCTP_DISSECTORS_ENABLED +static int gbl_diameterSctpPort=SCTP_PORT_DIAMETER; +#endif +gboolean gbl_commandCodeInHeader = FALSE; + +typedef struct _e_diameterhdr { + guint8 code; /* Must be 254 for diameter */ + guint8 flagsVer; + guint16 pktLength; + guint32 identifier; + union { + struct { + guint16 nextSend; + guint16 nextReceived; + } old; + struct { + guint32 commandCode; + guint32 vendorId; + guint16 nextSend; + guint16 nextReceived; + } new; + } u; +} e_diameterhdr; + +typedef struct _e_avphdr { + guint32 avp_type; + guint16 avp_length; + guint16 avp_flags; + guint32 avp_vendorId; /* optional */ + guint32 avp_tag; /* optional */ + +} e_avphdr; + +#define AUTHENTICATOR_LENGTH 12 + +#define DIAM_FLAGS_A 0x10 +#define DIAM_FLAGS_W 0x08 +#define AVP_FLAGS_P 0x0010 +#define AVP_FLAGS_T 0x0008 +#define AVP_FLAGS_V 0x0004 +#define AVP_FLAGS_R 0x0002 +#define AVP_FLAGS_M 0x0001 + +void proto_reg_handoff_diameter(void); + +static guint32 match_numval(guint32 val, const value_value_pair *vs) +{ + guint32 i = 0; + + while (vs[i].val1) { + if (vs[i].val1 == val) + return(vs[i].val2); + i++; + } + + return(0); +} + +static gchar *rdconvertbufftostr(gchar *dest,guint8 length,const guint8 *pd) +{ +/*converts the raw buffer into printable text */ +guint32 i; +guint32 totlen=0; + + dest[0]='"'; + dest[1]=0; + totlen=1; + for (i=0; i < (guint32)length; i++) + { + if( isalnum((int)pd[i])||ispunct((int)pd[i]) + ||((int)pd[i]==' ')) { + dest[totlen]=(gchar)pd[i]; + totlen++; + } + else + { + sprintf(&(dest[totlen]), "\\%03u", pd[i]); + totlen=totlen+strlen(&(dest[totlen])); + } + } + dest[totlen]='"'; + dest[totlen+1]=0; + return dest; +} + +static gchar *rd_match_strval(guint32 val, const value_string *vs) { + gchar *result; + result=match_strval(val,vs); + if (result == NULL ) { + result="Undefined"; + } + return result; +} +static char *complexValCheck(e_avphdr *avp, const char *data, size_t dataLen) +{ + const char *rawData; + static char returnStr[1024]; + + switch (avp->avp_type) { + case DIAMETER_ATT_INTEGRITY_CHECK_VALUE: + { + struct { + guint32 transform; + guint32 keyid; + } icv; + + memcpy(&icv, data, 8); + icv.transform=ntohl(icv.transform); + icv.keyid=ntohl(icv.keyid); + rawData = &data[8]; + + sprintf(returnStr, + "transform: 0x%08x (%d) keyid: 0x%08x (%d) Hash: ", + icv.transform, icv.transform, icv.keyid, icv.keyid); + + rdconvertbufftostr(&returnStr[strlen(returnStr)], + dataLen-8, + rawData); + return returnStr; + } + } + + return NULL;; +} /* complexValCheck */ +static char *customValCheck(int code, int value) +{ + switch (code) { + case DIAMETER_ATT_QOS_SERVICE_TYPE: + return rd_match_strval(value, diameter_qos_service_type_vals); + break; + case DIAMETER_ATT_SERVICE_TYPE: + return rd_match_strval(value, diameter_service_type_vals); + break; + case DIAMETER_ATT_PROHIBIT: + return rd_match_strval(value, diameter_prohibit_vals); + break; + case DIAMETER_ATT_PROMPT: + return rd_match_strval(value, diameter_prompt_vals); + break; + case DIAMETER_ATT_SOURCE_PORT: + return rd_match_strval(value, diameter_source_port_vals); + break; + case DIAMETER_ATT_NAS_PORT_TYPE: + return rd_match_strval(value, diameter_nas_port_type_vals); + break; + case DIAMETER_ATT_INTERFACE_ADDRESS: + return rd_match_strval(value, diameter_interface_address_vals); + break; + case DIAMETER_ATT_FRAMED_ROUTING: + return rd_match_strval(value, diameter_framed_routing_vals); + break; + case DIAMETER_ATT_COMMAND_CODE: + return rd_match_strval(value, diameter_command_code_vals); + break; + case DIAMETER_ATT_FRAMED_IP_ADDRESS: + return rd_match_strval(value, diameter_framed_ip_address_vals); + break; + case DIAMETER_ATT_ARAP_ZONE_ACCESS: + return rd_match_strval(value, diameter_arap_zone_access_vals); + break; + case DIAMETER_ATT_ACCT_AUTHENTIC: + return rd_match_strval(value, diameter_acct_authentic_vals); + break; + case DIAMETER_ATT_FRAMED_PROTOCOL: + return rd_match_strval(value, diameter_framed_protocol_vals); + break; + case DIAMETER_ATT_FRAMED_COMPRESSION: + return rd_match_strval(value, diameter_framed_compression_vals); + break; + case DIAMETER_ATT_AUTHENTICATION_TYPE: + return rd_match_strval(value, diameter_authentication_type_vals); + break; + case DIAMETER_ATT_ACCT_TERMINATE_CAUSE: + return rd_match_strval(value, diameter_acct_terminate_cause_vals); + break; + case DIAMETER_ATT_PROTOCOL: + return rd_match_strval(value, diameter_protocol_vals); + break; + case DIAMETER_ATT_DESTINATION_PORT: + return rd_match_strval(value, diameter_destination_port_vals); + break; + case DIAMETER_ATT_TERMINATION_ACTION: + return rd_match_strval(value, diameter_termination_action_vals); + break; + case DIAMETER_ATT_EXTENSION_ID: + return rd_match_strval(value, diameter_extension_id_vals); + break; + case DIAMETER_ATT_MERIT_LAS_CODE: + return rd_match_strval(value, diameter_merit_las_code_vals); + break; + case DIAMETER_ATT_LOGIN_SERVICE: + return rd_match_strval(value, diameter_login_service_vals); + break; + case DIAMETER_ATT_RSVP_SERVICE_TYPE: + return rd_match_strval(value, diameter_rsvp_service_type_vals); + break; + case DIAMETER_ATT_REBOOT_TYPE: + return rd_match_strval(value, diameter_reboot_type_vals); + break; + case DIAMETER_ATT_ACCT_STATUS_TYPE: + return rd_match_strval(value, diameter_acct_status_type_vals); + break; + } + + return NULL; +} + +static gchar *rd_value_to_str(e_avphdr *avph,const u_char *pd, int offset) +{ + int print_type; + gchar *cont; + guint32 intval; + int dataLen; + char *valstr; + static char buffer[1024]; + + dataLen = avph->avp_length - sizeof(e_avphdr); + + if (!(avph->avp_flags & AVP_FLAGS_V)) + dataLen += 4; + if (!(avph->avp_flags & AVP_FLAGS_T)) + dataLen += 4; + +/* prints the values of the attribute value pairs into a text buffer */ + + print_type=match_numval(avph->avp_type,diameter_printinfo); + /* Default begin */ + sprintf(buffer,"Value: "); + cont=&buffer[strlen(buffer)]; + switch(print_type) + { + case DIAMETER_COMPLEX: + valstr=complexValCheck(avph, &(pd[offset]), dataLen); + if (valstr) { + strcpy(cont, valstr); + break; + } + + /* Intentional fall through */ + case DIAMETER_DATA: + case DIAMETER_STRING: + rdconvertbufftostr(cont,dataLen, + &(pd[offset])); + break; + case DIAMETER_ADDRESS: + sprintf(cont,"%u.%u.%u.%u",(guint8)pd[offset], + (guint8)pd[offset+1],(guint8)pd[offset+2], + (guint8)pd[offset+3]); + break; + case DIAMETER_INTEGER32: + /* Check for custom values */ + intval=pntohl(&(pd[offset])); + valstr=customValCheck(avph->avp_type, intval); + if (valstr) { + sprintf(cont,"%s (%u)", valstr, intval); + } else { + sprintf(cont,"%u", intval); + } + break; + case DIAMETER_INTEGER64: + sprintf(cont,"Unsupported Conversion"); + break; + case DIAMETER_TIME: + { + struct tm lt; + intval=pntohl(&(pd[offset])); + intval -= NTP_TIME_DIFF; + lt=*localtime((time_t *)&intval); + strftime(cont, 1024, + "%a, %d %b %Y %H:%M:%S %z",<); + } + break; + + default: + rdconvertbufftostr(cont,dataLen, + &(pd[offset])); + break; + } + if (cont == buffer) { + strcpy(cont,"Unknown Value"); + } + return buffer; +} + + +static void dissect_attribute_value_pairs(const u_char *pd, int offset, + frame_data *fd, proto_tree *tree, int avplength) { +/* adds the attribute value pairs to the tree */ + e_avphdr avph; + gchar *avptpstrval; + gchar *valstr; + guint32 tag=0; + guint32 vendorId=0; + int dataOffset; + int fixAmt; + proto_item *avptf; + proto_tree *avptree; + int vendorOffset, tagOffset; + + if (avplength==0) { + proto_tree_add_text(tree, NullTVB,offset,0, + "No Attribute Value Pairs Found"); + return; + } + + while (avplength > 0 ) { + vendorOffset = tagOffset = 0; + memcpy(&avph,&pd[offset],sizeof(e_avphdr)); + avph.avp_type = ntohl(avph.avp_type); + avph.avp_length = ntohs(avph.avp_length); + avph.avp_flags = ntohs(avph.avp_flags); + + if (avph.avp_flags & AVP_FLAGS_V) { + vendorId = ntohl(avph.avp_vendorId); + vendorOffset = 8; + if (avph.avp_flags & AVP_FLAGS_T) { + tag = ntohl(avph.avp_tag); + tagOffset = 12; + dataOffset = sizeof(e_avphdr); + } else { + /* only a vendor id */ + dataOffset = sizeof(e_avphdr) - sizeof(guint32); + } + } else { + if (avph.avp_flags & AVP_FLAGS_T) { + /* tag in vendor field */ + tag = ntohl(avph.avp_vendorId); + tagOffset = 8; + dataOffset = sizeof(e_avphdr) - sizeof(guint32); + } else { + /* No vendor or tag info */ + dataOffset = sizeof(e_avphdr) - + (2*sizeof(guint32)); + } + } + + /* + * Fix byte-alignment + */ + fixAmt = 4 - (avph.avp_length % 4); + if (fixAmt == 4) fixAmt = 0; + avplength=avplength - (avph.avp_length + fixAmt); + avptpstrval=match_strval(avph.avp_type, diameter_attrib_type_vals); + if (avptpstrval == NULL) avptpstrval="Unknown Type"; + if (!BYTES_ARE_IN_FRAME(offset, avph.avp_length)) { + break; + } + avptf = proto_tree_add_text(tree,NullTVB, + offset, avph.avp_length, + "%s(%d) l:0x%x (%d bytes)", + avptpstrval,avph.avp_type,avph.avp_length, + avph.avp_length); + avptree = proto_item_add_subtree(avptf, + ett_diameter_avpinfo); + if (avptree !=NULL) { + proto_tree_add_text(avptree,NullTVB, + offset, 4, + "AVP Code: %s(%d)", + avptpstrval,avph.avp_type); + proto_tree_add_text(avptree,NullTVB, + offset+4 , 2, + "Length: 0x%x(%d bytes)", + avph.avp_length, avph.avp_length); + proto_tree_add_text(avptree,NullTVB, + offset+6, 2, + "Flags: P:%d T:%d V:%d R:%d M:%d", + (avph.avp_flags & AVP_FLAGS_P)?1:0, + (avph.avp_flags & AVP_FLAGS_T)?1:0, + (avph.avp_flags & AVP_FLAGS_V)?1:0, + (avph.avp_flags & AVP_FLAGS_R)?1:0, + (avph.avp_flags & AVP_FLAGS_M)?1:0); + if (vendorOffset) { + proto_tree_add_text(avptree,NullTVB, + offset+vendorOffset, 4, + "VendorId: 0x%08x (%d)", + vendorId, vendorId); + } + if (tagOffset) { + proto_tree_add_text(avptree,NullTVB, + offset+tagOffset, 4, + "Tag: 0x%08x (%d)", + tag, tag); + } + valstr=rd_value_to_str(&avph, pd, offset+dataOffset); + proto_tree_add_text(avptree,NullTVB, + offset+dataOffset, avph.avp_length - dataOffset, + "Data: (%d bytes) %s", + avph.avp_length - dataOffset, valstr); + } + offset=offset+avph.avp_length + fixAmt; + if (avph.avp_length == 0) { + break; + } + } +} + +void dissect_diameter(const u_char *pd, int offset, frame_data *fd, + proto_tree *tree) +{ + proto_tree *diameter_tree,*avptree; + proto_item *ti,*avptf; + int avplength,hdrlength, offsetavp; + e_diameterhdr dh; + int commandCode; + char buffer[2000]; + int nextSend=0, nextReceived=0; + + gchar *codestrval; + + + if (gbl_commandCodeInHeader) + hdrlength=sizeof(e_diameterhdr); + else + hdrlength = sizeof(e_diameterhdr) - (2 * sizeof(uint32_t)); + + memcpy(&dh,&pd[offset],hdrlength); + /* Fix byte ordering in our static structure */ + dh.pktLength = ntohs(dh.pktLength); + dh.identifier = ntohl(dh.identifier); + + /* Our code is in first avp */ + if (gbl_commandCodeInHeader) { + dh.u.new.commandCode = ntohl(dh.u.new.commandCode); + dh.u.new.vendorId = ntohl(dh.u.new.vendorId); + + if ((DIAM_FLAGS_W & dh.flagsVer)) { + dh.u.new.nextSend = ntohs(dh.u.new.nextSend); + dh.u.new.nextReceived = ntohs(dh.u.new.nextReceived); + nextSend = dh.u.new.nextSend; + nextReceived = dh.u.new.nextReceived; + } + commandCode = dh.u.new.commandCode; + } else { + if ((DIAM_FLAGS_W & dh.flagsVer)) { + dh.u.old.nextSend = ntohs(dh.u.old.nextSend); + dh.u.old.nextReceived = ntohs(dh.u.old.nextReceived); + nextSend = dh.u.old.nextSend; + nextReceived = dh.u.old.nextReceived; + } + memcpy(&commandCode, &pd[offset+COMMAND_CODE_OFFSET], 4); + commandCode = ntohl(commandCode); + } + + codestrval= match_strval(commandCode,diameter_command_code_vals); + if (codestrval==NULL) { + codestrval="Unknown Packet"; + } + if (check_col(fd, COL_PROTOCOL)) + col_add_str(fd, COL_PROTOCOL, "DIAMETER"); + if (check_col(fd, COL_INFO)) { + if (DIAM_FLAGS_A & dh.flagsVer) { + sprintf(buffer,"ACK (id=%d, l=%d, s=%d, r=%d)", + dh.identifier, dh.pktLength, nextSend, + nextReceived); + } else { + sprintf(buffer,"%s(%d) (id=%d, l=%d, s=%d, r=%d)", + codestrval,commandCode, dh.identifier, dh.pktLength, + nextSend, nextReceived); + } + col_add_fstr(fd,COL_INFO,buffer); + } + + if (tree) { + + ti = proto_tree_add_protocol_format(tree, proto_diameter, NullTVB, + offset, dh.pktLength, "%s", + gbl_diameterString); + diameter_tree = proto_item_add_subtree(ti, ett_diameter); + + if (!(DIAM_FLAGS_A & dh.flagsVer)) { + proto_tree_add_uint_format(diameter_tree, + hf_diameter_code, + NullTVB, + offset+0, + 1, dh.code, "Packet code:0x%02x", + dh.code); + } + + proto_tree_add_uint_format(diameter_tree, + hf_diameter_flags, + NullTVB, offset+1, 1, + dh.flagsVer, + "Packet flags/Version: 0x%02x (Flags:0x%x," + " A:%d W:%d Version=0x%1x (%d)", + dh.flagsVer, (dh.flagsVer&0xf8)>>3, + (DIAM_FLAGS_A & dh.flagsVer)?1:0, + (DIAM_FLAGS_W & dh.flagsVer)?1:0, + dh.flagsVer&0x07, dh.flagsVer&0x07); + proto_tree_add_uint_format(diameter_tree, + hf_diameter_length, NullTVB, + offset+2, 2, + dh.pktLength, + "Packet length: 0x%04x (%d)",dh.pktLength, + dh.pktLength); + proto_tree_add_uint_format(diameter_tree,hf_diameter_id, + NullTVB, offset+4, 4, + dh.identifier, "Packet identifier: 0x%08x (%d)", + dh.identifier, dh.identifier); + if (gbl_commandCodeInHeader) { + proto_tree_add_uint_format(diameter_tree,hf_diameter_id, + NullTVB, offset+8, 4, + dh.identifier, "Command Code: 0x%08x (%d:%s)", + dh.u.new.commandCode, dh.u.new.commandCode, + codestrval); + proto_tree_add_uint_format(diameter_tree,hf_diameter_id, + NullTVB, offset+12, 4, + dh.identifier, "VendorId: 0x%08x (%d)", + dh.u.new.vendorId, dh.u.new.vendorId); + if (DIAM_FLAGS_W & dh.flagsVer) { + proto_tree_add_uint_format(diameter_tree, + hf_diameter_ns, NullTVB, + offset+16, 2, + nextSend, + "Ns: 0x%02x(%d)",nextSend, nextSend); + + proto_tree_add_uint_format(diameter_tree, + hf_diameter_nr, NullTVB, + offset+20, 2, + nextReceived, + "Nr: 0x%02x(%d)", nextReceived, + nextReceived); + } + } else { + if (DIAM_FLAGS_W & dh.flagsVer) { + proto_tree_add_uint_format(diameter_tree, + hf_diameter_ns, NullTVB, + offset+8, 2, + nextSend, + "Ns: 0x%02x(%d)",nextSend, nextSend); + + proto_tree_add_uint_format(diameter_tree, + hf_diameter_nr, NullTVB, + offset+10, 2, + nextReceived, + "Nr: 0x%02x(%d)", nextReceived, + nextReceived); + } + } + + /* Update the lengths */ + avplength= dh.pktLength -hdrlength; + offsetavp=offset+hdrlength; + + /* list the attribute value pairs */ + + avptf = proto_tree_add_text(diameter_tree, + NullTVB,offset+hdrlength,avplength, + "Attribute value pairs"); + avptree = proto_item_add_subtree(avptf, + ett_diameter_avp); + if (avptree !=NULL) { + dissect_attribute_value_pairs( pd, + offsetavp,fd,avptree,avplength); + } + } +} + +/* registration with the filtering engine */ +void +proto_register_diameter(void) +{ + static hf_register_info hf[] = { + { &hf_diameter_code, + { "Code","diameter.code", FT_UINT8, BASE_DEC, NULL, 0x0, + "" }}, + + { &hf_diameter_flags, + { "Flags+Version", "diameter.flags", FT_UINT8, BASE_DEC, NULL, 0x0, + "" }}, + + { &hf_diameter_length, + { "Length","diameter.length", FT_UINT32, BASE_DEC, NULL, 0x0, + "" }}, + + { &hf_diameter_id, + { "Identifier", "diameter.id", FT_UINT32, BASE_DEC, NULL, 0x0, + "" }}, + + { &hf_diameter_ns, + { "Next Send", "diameter.ns", FT_UINT16, BASE_DEC, NULL, 0x0, + "" }}, + { &hf_diameter_nr, + { "Next Received", "diameter.nr", FT_UINT16, BASE_DEC, NULL, 0x0, + "" }}, + + }; + static gint *ett[] = { + &ett_diameter, + &ett_diameter_avp, + &ett_diameter_avpinfo + }; + module_t *diameter_module; + + /* Register a configuration option for port */ + diameter_module = prefs_register_module("Diameter", "Diameter", + proto_reg_handoff_diameter); + prefs_register_uint_preference(diameter_module, "udp.port", + "DIAMETER UDP Port", + "Set the port for DIAMETER messages (if" + " other than RADIUS port)", + 10, + &gbl_diameterUdpPort); + prefs_register_uint_preference(diameter_module, "tcp.port", + "DIAMETER UDP Port", + "Set the TCP port for DIAMETER messages", + 10, + &gbl_diameterTcpPort); +#ifdef SCTP_DISSECTORS_ENABLED + prefs_register_uint_preference(diameter_module, "sctp.port", + "DIAMETER SCTP Port", + "Set the SCTP port for DIAMETER messages", + 10, + &gbl_diameterSctpPort); +#endif + prefs_register_bool_preference(diameter_module, "command_in_header", + "Command code in header", + "Whether the command code is in the header, or in the first AVP", + &gbl_commandCodeInHeader); + + proto_diameter = proto_register_protocol (gbl_diameterString, "diameter"); + proto_register_field_array(proto_diameter, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); +} + +void +proto_reg_handoff_diameter(void) +{ + static int Initialized=FALSE; + static int UdpPort=0; + static int TcpPort=0; +#ifdef SCTP_DISSECTORS_ENABLED + static int SctpPort=0; +#endif + if (Initialized) { + dissector_delete("udp.port", UdpPort, dissect_diameter); + dissector_delete("tcp.port", TcpPort, dissect_diameter); +#ifdef SCTP_DISSECTORS_ENABLED + dissector_delete("sctp.srcport", SctpPort, dissect_diameter); + dissector_delete("sctp.destport", SctpPort, dissect_diameter); +#endif + } else { + Initialized=TRUE; + } + + /* set port for future deletes */ + UdpPort=gbl_diameterUdpPort; + TcpPort=gbl_diameterTcpPort; +#ifdef SCTP_DISSECTORS_ENABLED + SctpPort=gbl_diameterSctpPort; +#endif + + strcpy(gbl_diameterString, "Diameter Protocol"); + + dissector_add("udp.port", gbl_diameterUdpPort, dissect_diameter); + dissector_add("tcp.port", gbl_diameterTcpPort, dissect_diameter); +#ifdef SCTP_DISSECTORS_ENABLED + dissector_add("sctp.srcport", gbl_diameterSctpPort, dissect_diameter); + dissector_add("sctp.destport", gbl_diameterSctpPort, dissect_diameter); +#endif +} diff --git a/packet-diameter.h b/packet-diameter.h new file mode 100644 index 0000000000..c08ea8900f --- /dev/null +++ b/packet-diameter.h @@ -0,0 +1,27 @@ +/* packet-diameter.h + * Declaration of the DIAMETER dissector. + * + * $Id: packet-diameter.h,v 1.1 2000/07/30 07:16:03 guy Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs <gerald@zing.org> + * Copyright 1998 Gerald Combs + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +extern void dissect_diameter(const u_char *pd, int offset, frame_data *fd, + proto_tree *tree); diff --git a/packet-radius.c b/packet-radius.c index cf88fe4e18..b5d5172037 100644 --- a/packet-radius.c +++ b/packet-radius.c @@ -1,7 +1,7 @@ /* packet-radius.c * Routines for RADIUS packet disassembly * - * $Id: packet-radius.c,v 1.13 2000/05/31 05:07:33 guy Exp $ + * $Id: packet-radius.c,v 1.14 2000/07/30 07:16:03 guy Exp $ * * Ethereal - Network traffic analyzer * By Johan Feyaerts @@ -39,6 +39,7 @@ #include <glib.h> #include "packet.h" #include "resolv.h" +#include "packet-diameter.h" static int proto_radius = -1; static int hf_radius_length = -1; @@ -680,6 +681,12 @@ proto_tree gchar *codestrval; + if (pd[offset] == 254) { + /* We have a diameter packet */ + dissect_diameter(pd, offset, fd, tree); + return; + } + memcpy(&rh,&pd[offset],sizeof(e_radiushdr)); |