diff options
author | Guy Harris <guy@alum.mit.edu> | 2004-08-25 05:51:14 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2004-08-25 05:51:14 +0000 |
commit | 46edf2a910b72add623295ac34a36bc13822e41b (patch) | |
tree | 21c3b56c3b91951e965e9aeb6dae8f03a943167a /epan/dissectors/packet-radius.c | |
parent | 8d89d3556dfe1fa1e14b2bea6865fdca64c0527b (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.c | 162 |
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, |