Index: packet-radius.c
===================================================================
RCS file: /cvsroot/ethereal/packet-radius.c,v
retrieving revision 1.81
diff -u -r1.81 packet-radius.c
--- packet-radius.c	22 Nov 2003 12:02:49 -0000	1.81
+++ packet-radius.c	4 Dec 2003 00:09:56 -0000
@@ -2,6 +2,7 @@
  *
  * Routines for RADIUS packet disassembly
  * Copyright 1999 Johan Feyaerts
+ * Changed 03/12/2003 Rui Carmo (http://the.taoofmac.com - added all 3GPP VSAs, some parsing)
  *
  * RFC 2865, RFC 2866, RFC 2867, RFC 2868, RFC 2869
  *
@@ -223,7 +224,24 @@
 
     COLUMBIA_UNIVERSITY_SIP_METHOD,
 
-    THE3GPP_QOS
+    THE3GPP_IMSI,
+    THE3GPP_CHARGING_ID,
+    THE3GPP_CHARGING_GATEWAY_ADDRESS,
+    THE3GPP_QOS,
+    THE3GPP_PDP_TYPE,
+    THE3GPP_SGSN_ADDRESS,
+    THE3GPP_GGSN_ADDRESS,
+    THE3GPP_IMSI_MCC_MNC,
+    THE3GPP_GGSN_MCC_MNC,
+    THE3GPP_NSAPI,
+    THE3GPP_SESSION_STOP_INDICATOR,
+    THE3GPP_SELECTION_MODE,
+    THE3GPP_CHARGING_CHARACTERISTICS,
+    THE3GPP_CHARGING_GATEWAY_IPV6_ADDRESS,
+    THE3GPP_SGSN_IPV6_ADDRESS,
+    THE3GPP_GGSN_IPV6_ADDRESS,
+    THE3GPP_IPV6_DNS_SERVERS,
+    THE3GPP_SGSN_MCC_MNC
 };
 
 static value_string radius_vals[] =
@@ -2200,7 +2218,25 @@
 
 static value_value_string radius_vendor_3gpp_attrib[] =
 {
-   {5,	THE3GPP_QOS,	"QoS Profile"},
+   /* According to 3GPP TS 29.061 V4.8.0 (2003-06) */
+   {1,  THE3GPP_IMSI, "IMSI"},
+   {2,  THE3GPP_CHARGING_ID, "Charging ID"},
+   {3,  THE3GPP_PDP_TYPE, "PDP Type"},
+   {4,  THE3GPP_CHARGING_GATEWAY_ADDRESS, "Charging Gateway Address"},
+   {5,  THE3GPP_QOS,	"QoS Profile"},
+   {6,  THE3GPP_SGSN_ADDRESS, "SGSN Address"},
+   {7,  THE3GPP_GGSN_ADDRESS, "GGSN Address"},
+   {8,  THE3GPP_IMSI_MCC_MNC, "IMSI MCC-MNC"},
+   {9,  THE3GPP_GGSN_MCC_MNC, "GGSN MCC-MNC"},
+   {10, THE3GPP_NSAPI, "NSAPI"},
+   {11, THE3GPP_SESSION_STOP_INDICATOR, "Session Stop Indicator"},
+   {12, THE3GPP_SELECTION_MODE, "Selection Mode"},
+   {13, THE3GPP_CHARGING_CHARACTERISTICS, "Charging Characteristics"},
+   {14, THE3GPP_CHARGING_GATEWAY_IPV6_ADDRESS, "Charging Gateway IPv6 Address"},
+   {15, THE3GPP_SGSN_IPV6_ADDRESS, "SGSN IPv6 Address"},
+   {16, THE3GPP_GGSN_IPV6_ADDRESS, "GGSN IPv6 Address"},
+   {17, THE3GPP_IPV6_DNS_SERVERS, "IPv6 DNS Servers"},
+   {18, THE3GPP_SGSN_MCC_MNC, "SGSN MCC-MNC"},
    {0, 0, NULL},
 };
 
@@ -2723,6 +2759,48 @@
 			tvb_get_ntohs(tvb,offset+2),
 			tvb_get_ntohs(tvb,offset+4));
  		break;
+
+	case( THE3GPP_PDP_TYPE ):
+		intval = tvb_get_ntohl(tvb,offset+2);
+                switch(intval) {
+			case(0):
+				sprintf(cont,"IP(0)"); break;
+			case(1):
+				sprintf(cont,"PPP(1)"); break;
+			case(2):
+				sprintf(cont,"IPv6(2)"); break;
+			default:
+				sprintf(cont,"Unknown(%d)",intval);
+                }
+		break;
+
+	case( THE3GPP_SGSN_ADDRESS ):
+	case( THE3GPP_GGSN_ADDRESS ):
+		sprintf(cont,"%s", ip_to_str(tvb_get_ptr(tvb,offset+2,4)));
+		break;
+
+	case( THE3GPP_IMSI ):
+	case( THE3GPP_IMSI_MCC_MNC ):
+	case( THE3GPP_GGSN_MCC_MNC ):
+	case( THE3GPP_SGSN_MCC_MNC ):
+	case( THE3GPP_SELECTION_MODE ):
+	case( THE3GPP_CHARGING_CHARACTERISTICS ):
+		sprintf(cont,"(encoded in UTF-8 format)");
+		break;
+
+	case( THE3GPP_CHARGING_ID ):
+		sprintf(cont,"%d",tvb_get_ntohl(tvb,offset+2));
+		break;
+
+	case( THE3GPP_NSAPI ):
+	case( THE3GPP_SESSION_STOP_INDICATOR ):
+	case( THE3GPP_CHARGING_GATEWAY_IPV6_ADDRESS ):
+	case( THE3GPP_SGSN_IPV6_ADDRESS ):
+	case( THE3GPP_GGSN_IPV6_ADDRESS ):
+	case( THE3GPP_IPV6_DNS_SERVERS ):
+		sprintf(cont,"(not parsed)");
+		break;
+
 
 	case( THE3GPP_QOS ):
 		/* Find the ponter to the already-built label
