aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-radius.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-08-25 05:51:14 +0000
committerGuy Harris <guy@alum.mit.edu>2004-08-25 05:51:14 +0000
commit46edf2a910b72add623295ac34a36bc13822e41b (patch)
tree21c3b56c3b91951e965e9aeb6dae8f03a943167a /epan/dissectors/packet-radius.c
parent8d89d3556dfe1fa1e14b2bea6865fdca64c0527b (diff)
Newer version of Luis Ontanon's patch.
svn path=/trunk/; revision=11832
Diffstat (limited to 'epan/dissectors/packet-radius.c')
-rw-r--r--epan/dissectors/packet-radius.c162
1 files changed, 80 insertions, 82 deletions
diff --git a/epan/dissectors/packet-radius.c b/epan/dissectors/packet-radius.c
index 3e3d545eff..0adca75e4f 100644
--- a/epan/dissectors/packet-radius.c
+++ b/epan/dissectors/packet-radius.c
@@ -49,6 +49,9 @@
#include "crypt-md5.h"
static int proto_radius = -1;
+static int hf_radius_length = -1;
+static int hf_radius_code = -1;
+static int hf_radius_id =-1;
static int hf_radius_cisco_cai = -1;
static int hf_radius_callingStationId = -1;
static int hf_radius_calledStationId = -1;
@@ -60,10 +63,6 @@ static int hf_radius_acctSessionId = -1;
static int hf_radius_3gpp_SgsnIpAddr = -1;
static int hf_radius_3gpp_GgsnIpAddr = -1;
-static int hf_radius_length = -1;
-static int hf_radius_code = -1;
-static int hf_radius_id =-1;
-
static char *shared_secret = NULL;
static gpointer authenticator = NULL;
@@ -106,12 +105,12 @@ typedef struct _rd_vsa_table {
} rd_vsa_table;
typedef struct _rd_vsa_buffer {
- gchar *val_str;
- int val_offset;
- guint val_len;
gchar *str;
int offset;
guint8 length;
+ gchar *val_str;
+ int val_offset;
+ guint val_len;
} rd_vsa_buffer;
#define AUTHENTICATOR_LENGTH 16
@@ -217,7 +216,6 @@ static const value_string radius_vals[] =
{RADIUS_CHANGE_FILTER_REQUEST_ACK, "Change Filter Request ACK"},
{RADIUS_CHANGE_FILTER_REQUEST_NAK, "Change Filter Request NAK"},
{RADIUS_RESERVED, "Reserved"},
-
{0, NULL}
};
@@ -2906,6 +2904,8 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
int vsa_index;
const radius_attr_info *vsa_attr_info_table;
const e_avphdr *vsa_avph;
+ gchar *val_str;
+ guint32 val_addr;
/* Default begin */
strcpy(dest, "Value:");
@@ -2918,12 +2918,34 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
{
case( RADIUS_STRING ):
rdconvertbufftostr(cont,tvb,offset+2,avph->avp_length-2);
+ switch ( avph->avp_type ) {
+ case (31): /* calling station id */
+ val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
+ proto_tree_add_string_hidden(tree, hf_radius_callingStationId, tvb, offset+8,avph->avp_length-8, val_str);
+ g_free(val_str);
+ break;
+ case (30): /* called station id */
+ val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
+ proto_tree_add_string_hidden(tree, hf_radius_calledStationId, tvb, offset+8,avph->avp_length-8, val_str);
+ g_free(val_str);
+ break;
+ case(44): /* accounting session id */
+ val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
+ proto_tree_add_string_hidden(tree, hf_radius_acctSessionId, tvb, offset+8,avph->avp_length-8, val_str);
+ g_free(val_str);
+ break;
+ }
break;
- gchar *val_str;
- guint32 val_addr;
-
+
case( RADIUS_BINSTRING ):
rdconvertbufftobinstr(cont,tvb,offset+2,avph->avp_length-2);
+ switch ( avph->avp_type ) {
+ case(25): /* class */
+ val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
+ proto_tree_add_string_hidden(tree, hf_radius_class, tvb, offset+8,avph->avp_length-8, val_str);
+ g_free(val_str);
+ break;
+ }
break;
case( RADIUS_USERPASSWORD ):
@@ -2936,11 +2958,26 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
sprintf(cont, "%s(%u)", rd_match_strval(intval, attr_info->vs), intval);
else
sprintf(cont,"%u", intval);
+ switch ( avph->avp_type ) {
+ case(40): /*accounting status type */
+ proto_tree_add_uint_hidden(tree, hf_radius_acctStatusType, tvb,offset+2,1, intval);
+ break;
+ }
break;
case( RADIUS_IP_ADDRESS ):
ip_to_str_buf(tvb_get_ptr(tvb,offset+2,4),cont);
- break;
+ switch ( avph->avp_type ) {
+ case(8): /* framed address */
+ tvb_memcpy(tvb,(guint8 *)&val_addr,offset+2,4);
+ proto_tree_add_ipv4_hidden(tree, hf_radius_framedAddress, tvb,offset+2,4, val_addr);
+ break;
+ case(4): /* nas ip */
+ tvb_memcpy(tvb,(guint8 *)&val_addr,offset+2,4);
+ proto_tree_add_ipv4_hidden(tree, hf_radius_nasIp, tvb,offset+2,4, val_addr);
+ break;
+ }
+ break;
case( RADIUS_IP6_ADDRESS ):
ip6_to_str_buf((const struct e_in6_addr *)tvb_get_ptr(tvb,offset+2,16),cont);
@@ -2977,35 +3014,11 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
rdconvertbufftostr(cont,tvb,offset+3,avph->avp_length-3);
break;
}
- rdconvertbufftostr(cont,tvb,offset+2,avph->avp_length-2);
- switch ( avph->avp_type ) {
- case (31): /* calling station id */
- val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
- proto_tree_add_string_hidden(tree, hf_radius_callingStationId, tvb, offset+8,avph->avp_length-8, val_str);
- g_free(val_str);
- break;
- case (30): /* called station id */
- val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
- proto_tree_add_string_hidden(tree, hf_radius_calledStationId, tvb, offset+8,avph->avp_length-8, val_str);
- g_free(val_str);
- break;
- case(44): /* accounting session id */
- val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
- proto_tree_add_string_hidden(tree, hf_radius_acctSessionId, tvb, offset+8,avph->avp_length-8, val_str);
- g_free(val_str);
- break;
- }
+ rdconvertbufftostr(cont,tvb,offset+2,avph->avp_length-2);
break;
case ( RADIUS_VENDOR_SPECIFIC ):
intval = tvb_get_ntohl(tvb,offset+2);
- switch ( avph->avp_type ) {
- case(25): /* class */
- val_str = tvb_get_string(tvb,offset+2,avph->avp_length-2);
- proto_tree_add_string_hidden(tree, hf_radius_class, tvb, offset+8,avph->avp_length-8, val_str);
- g_free(val_str);
- break;
- }
sprintf(dest, "Vendor:%s(%u)", rd_match_strval(intval,radius_vendor_specific_vendors), intval);
cont = &dest[strlen(dest)];
vsa_length = avph->avp_length;
@@ -3018,11 +3031,6 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
avph->avp_length-vsa_len);
if (vsa_attr_info_table)
next_attr_info = find_radius_attr_info(vsa_avph->avp_type,
- switch ( avph->avp_type ) {
- case(40): /*accounting status type */
- proto_tree_add_uint_hidden(tree, hf_radius_acctStatusType, tvb,offset+2,1, intval);
- break;
- }
vsa_attr_info_table);
else
next_attr_info = NULL;
@@ -3042,6 +3050,31 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
tree);
vsa_index++;
vsa_len += vsa_avph->avp_length;
+
+ if ( next_attr_info ) {
+ switch ( intval) {
+ case (VENDOR_CISCO):
+ switch ( vsa_avph->avp_type ) {
+ case (250): /* account information */
+ val_str = tvb_get_string(tvb,offset+8,avph->avp_length-8);
+ proto_tree_add_string_hidden(tree, hf_radius_cisco_cai, tvb, offset+8,avph->avp_length-8, val_str);
+ g_free(val_str);
+ break;
+ }
+ case ( VENDOR_THE3GPP ) :
+ switch (vsa_avph->avp_type) {
+ case (6): /* sgsn ip addr*/
+ tvb_memcpy(tvb,(guint8 *)&val_addr,offset+8,4);
+ proto_tree_add_ipv4_hidden(tree, hf_radius_3gpp_SgsnIpAddr, tvb,offset+2,4, val_addr);
+ break;
+ case (7): /* sgsn ip addr*/
+ tvb_memcpy(tvb,(guint8 *)&val_addr,offset+8,4);
+ proto_tree_add_ipv4_hidden(tree, hf_radius_3gpp_GgsnIpAddr, tvb,offset+2,4, val_addr);
+ break;
+ }
+ }
+
+ }
if (next_attr_info != NULL &&
next_attr_info->value_type == THE3GPP_QOS )
{
@@ -3123,17 +3156,7 @@ static void rd_value_to_str(gchar *dest, rd_vsa_buffer (*vsabuffer)[VSABUFFER],
case( RADIUS_UNKNOWN ):
strcpy(cont,"Unknown Value Type");
- switch ( avph->avp_type ) {
- case(8): /* framed address */
- tvb_memcpy(tvb,(guint8 *)&val_addr,offset+2,4);
- proto_tree_add_ipv4_hidden(tree, hf_radius_framedAddress, tvb,offset+2,4, val_addr);
- break;
- case(4): /* nas ip */
- tvb_memcpy(tvb,(guint8 *)&val_addr,offset+2,4);
- proto_tree_add_ipv4_hidden(tree, hf_radius_nasIp, tvb,offset+2,4, val_addr);
- break;
- }
- break;
+ break;
default:
g_assert_not_reached();
}
@@ -3206,31 +3229,6 @@ dissect_attribute_value_pairs(tvbuff_t *tvb, int offset,proto_tree *tree,
if (tree)
eap_tree = proto_item_add_subtree(ti, ett_radius_eap);
tvb_len = tvb_length_remaining(tvb, offset+2);
-
- if ( next_attr_info ) {
- switch ( intval) {
- case (VENDOR_CISCO):
- switch ( vsa_avph->avp_type ) {
- case (250): /* account information */
- val_str = tvb_get_string(tvb,offset+8,avph->avp_length-8);
- proto_tree_add_string_hidden(tree, hf_radius_cisco_cai, tvb, offset+8,avph->avp_length-8, val_str);
- g_free(val_str);
- break;
- }
- case ( VENDOR_THE3GPP ) :
- switch (vsa_avph->avp_type) {
- case (6): /* sgsn ip addr*/
- tvb_memcpy(tvb,(guint8 *)&val_addr,offset+8,4);
- proto_tree_add_ipv4_hidden(tree, hf_radius_3gpp_SgsnIpAddr, tvb,offset+2,4, val_addr);
- break;
- case (7): /* sgsn ip addr*/
- tvb_memcpy(tvb,(guint8 *)&val_addr,offset+8,4);
- proto_tree_add_ipv4_hidden(tree, hf_radius_3gpp_GgsnIpAddr, tvb,offset+2,4, val_addr);
- break;
- }
- }
-
- }
data_len = avph.avp_length-2;
if (data_len < tvb_len)
tvb_len = data_len;
@@ -3346,7 +3344,7 @@ dissect_attribute_value_pairs(tvbuff_t *tvb, int offset,proto_tree *tree,
for (i = 0; vsabuffer[i].str && i < VSABUFFER; i++) {
proto_tree_add_text(vsa_tree, tvb, vsabuffer[i].offset,
vsabuffer[i].length, "%s", vsabuffer[i].str);
- }
+ }
}
}
@@ -3468,7 +3466,7 @@ proto_register_radius(void)
"", HFILL }},
{ &hf_radius_cisco_cai,
- { "Cisco Account Info", "radius.vsa.cisco.cai", FT_STRING, BASE_DEC, NULL, 0x0,
+ { "Cisco Account Info", "radius.cisco.cai", FT_STRING, BASE_DEC, NULL, 0x0,
"", HFILL }},
{ &hf_radius_callingStationId,
@@ -3496,11 +3494,11 @@ proto_register_radius(void)
"", HFILL }},
{ &hf_radius_3gpp_SgsnIpAddr,
- { "SGSN IP Address", "radius.vsa.3gpp.sgsn_ip", FT_IPv4, BASE_DEC, NULL, 0x0,
+ { "SGSN IP Address", "radius.3gpp.sgsn_ip", FT_IPv4, BASE_DEC, NULL, 0x0,
"", HFILL }},
{ &hf_radius_3gpp_GgsnIpAddr,
- { "GGSN IP Address", "radius.vsa.3gpp.ggsn_ip", FT_IPv4, BASE_DEC, NULL, 0x0,
+ { "GGSN IP Address", "radius.3gpp.ggsn_ip", FT_IPv4, BASE_DEC, NULL, 0x0,
"", HFILL }},
{ &hf_radius_acctStatusType,