]> The Tcpdump Group git mirrors - tcpdump/commitdiff
RADIUS support, from Alfredo Andres Omella ([email protected]).
authorguy <guy>
Fri, 6 Oct 2000 06:49:20 +0000 (06:49 +0000)
committerguy <guy>
Fri, 6 Oct 2000 06:49:20 +0000 (06:49 +0000)
FILES
Makefile.in
interface.h
print-radius.c [new file with mode: 0644]
print-udp.c

diff --git a/FILES b/FILES
index a30a75cafce0ed4109313a4b57e29c442ceecf05..20f4f7a322e8af9b1b5d695838efd1cc914de23e 100644 (file)
--- a/FILES
+++ b/FILES
@@ -131,6 +131,7 @@ print-ospf6.c
 print-pim.c
 print-ppp.c
 print-pppoe.c
+print-radius.c
 print-raw.c
 print-rip.c
 print-ripng.c
index 397de442e451a1a8966ebef4c0bbbf6e43c654b2..a5d0e7ba991eb6aeb52c23a625d3f423327e70af 100644 (file)
@@ -17,7 +17,7 @@
 #  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.241 2000-10-06 05:35:36 guy Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/tcpdump/Makefile.in,v 1.242 2000-10-06 06:49:20 guy Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -79,7 +79,8 @@ CSRC =        tcpdump.c \
        print-ipcomp.c print-mobile.c print-l2tp.c print-bgp.c print-rx.c \
        print-lane.c print-cip.c print-pppoe.c print-lcp.c \
        print-smb.c smbutil.c print-ascii.c print-telnet.c print-cnfp.c \
-       print-vrrp.c print-cdp.c print-token.c print-bxxp.c print-timed.c
+       print-vrrp.c print-cdp.c print-token.c print-bxxp.c print-timed.c \
+       print-radius.c
 
 LOCALSRC = @LOCALSRC@
 GENSRC = version.c
index 3281db8e5f9c07393dd38d7541684f3413e84ff6..efe5075eddac844de82901423c7657cdd065fe4b 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.139 2000-10-06 05:35:37 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.140 2000-10-06 06:49:21 guy Exp $ (LBL)
  */
 
 #ifndef tcpdump_interface_h
@@ -282,6 +282,7 @@ extern void vrrp_print(const u_char *bp, u_int len, int ttl);
 extern void cdp_print(const u_char *p, u_int length, u_int caplen,
                      const u_char *esrc, const u_char *edst);
 extern void stp_print(const u_char *p, u_int length);
+extern void radius_print(const u_char *, u_int);
 
 #ifdef INET6
 extern void ip6_print(const u_char *, int);
diff --git a/print-radius.c b/print-radius.c
new file mode 100644 (file)
index 0000000..c27e564
--- /dev/null
@@ -0,0 +1,789 @@
+/*
+ * Radius printer routines as specified on:
+ *
+ * RFC 2865:
+ *      "Remote Authentication Dial In User Service (RADIUS)"
+ *
+ * RFC 2866:
+ *      "RADIUS Accounting"
+ *
+ * RFC 2867:
+ *      "RADIUS Accounting Modifications for Tunnel Protocol Support"
+ *
+ * RFC 2868:
+ *      "RADIUS Attributes for Tunnel Protocol Support"
+ *
+ * RFC 2869:
+ *      "RADIUS Extensions"
+ *
+ * Alfredo Andres Omella ([email protected]) v0.1 2000/09/15
+ *
+ * TODO: Among other things to print ok MacIntosh and Vendor values 
+ */
+
+#ifndef lint
+static const char rcsid[] =
+    "$Id: print-radius.c,v 1.1 2000-10-06 06:49:21 guy Exp $";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/udp.h>
+#include <netinet/udp_var.h>
+
+#include <stdio.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "extract.h"
+
+#define TAM_SIZE(x) (sizeof(x)/sizeof(x[0]) )
+
+#define HEX(a)  ((char)( (a) <= 9 ? (a) + '0' : ((a) - 10) + 'A'))
+
+#define PRINT_HEX(bytes_len, ptr_data)                               \
+           while(bytes_len)                                          \
+           {                                                         \
+              printf("%c%c", HEX( ((u_short)(*ptr_data)) >> 4 ),     \
+                             HEX( ((u_short)(*ptr_data)) & 0x0F ) ); \
+              ptr_data++;                                            \
+              bytes_len--;                                           \
+           }
+
+
+/* Radius packet codes */
+#define RADCMD_ACCESS_REQ   1 /* Access-Request      */
+#define RADCMD_ACCESS_ACC   2 /* Access-Accept       */
+#define RADCMD_ACCESS_REJ   3 /* Access-Reject       */
+#define RADCMD_ACCOUN_REQ   4 /* Accounting-Request  */
+#define RADCMD_ACCOUN_RES   5 /* Accounting-Response */
+#define RADCMD_ACCESS_CHA  11 /* Access-Challenge    */
+#define RADCMD_STATUS_SER  12 /* Status-Server       */
+#define RADCMD_STATUS_CLI  13 /* Status-Client       */
+#define RADCMD_RESERVED   255 /* Reserved            */
+
+
+/********************************/
+/* Begin Radius Attribute types */
+/********************************/
+#define SERV_TYPE    6
+#define FRM_IPADDR   8
+#define LOG_IPHOST  14
+#define LOG_SERVICE 15
+#define FRM_IPX     23
+#define SESSION_TIMEOUT   27
+#define IDLE_TIMEOUT      28
+#define FRM_ATALK_LINK    37
+#define FRM_ATALK_NETWORK 38
+
+#define ACCT_DELAY        41
+#define ACCT_SESSION_TIME 46
+
+#define TUNNEL_TYPE        64
+#define TUNNEL_MEDIUM      65
+#define TUNNEL_CLIENT_END  66
+#define TUNNEL_SERVER_END  67
+#define TUNNEL_PASS        69
+
+#define ARAP_PASS          70
+#define ARAP_FEATURES      71
+
+#define TUNNEL_PRIV_GROUP  81
+#define TUNNEL_ASSIGN_ID   82
+#define TUNNEL_PREFERENCE  83
+
+#define ARAP_CHALLENGE_RESP 84
+#define ACCT_INT_INTERVAL   85
+
+#define TUNNEL_CLIENT_AUTH 90
+#define TUNNEL_SERVER_AUTH 91
+/********************************/
+/* End Radius Attribute types */
+/********************************/
+
+
+static void print_attr_string(register u_char *, u_int, u_short );
+static void print_attr_num(register u_char *, u_int, u_short );
+static void print_attr_address(register u_char *, u_int, u_short);
+static void print_attr_time(register u_char *, u_int, u_short);
+static void print_attr_strange(register u_char *, u_int, u_short);
+
+
+struct radius_hdr { u_char  code; /* Radius packet code  */
+                    u_char  id;   /* Radius packet id    */
+                    u_short len;  /* Radius total length */
+                    u_char  auth[16]; /* Authenticator   */
+                  };
+
+
+struct radius_attr { u_char type; /* Attribute type   */
+                     u_char len;  /* Attribute length */
+                   };
+
+
+/* Service-Type Attribute standard values */                 
+static const char *serv_type[]={ NULL,
+                                "Login",
+                                "Framed",  
+                                "Callback Login",
+                                "Callback Framed",
+                                "Outbound",
+                                "Administrative",
+                                "NAS Prompt",                            
+                                "Authenticate Only",
+                                "Callback NAS Prompt",
+                                "Call Check",
+                                "Callback Administrative",
+                               };                               
+
+/* Framed-Protocol Attribute standard values */
+static const char *frm_proto[]={ NULL,
+                                 "PPP",
+                                 "SLIP",
+                                 "ARAP",
+                                 "Gandalf proprietary",
+                                 "Xylogics IPX/SLIP",
+                                 "X.75 Synchronous",
+                               };                               
+
+/* Framed-Routing Attribute standard values */
+static const char *frm_routing[]={ "None",
+                                   "Send",
+                                   "Listen",
+                                   "Send&Listen",
+                                 };                               
+
+/* Framed-Compression Attribute standard values */
+static const char *frm_comp[]={ "None",
+                                "VJ TCP/IP",
+                                "IPX",
+                                "Stac-LZS",
+                              };
+
+/* Login-Service Attribute standard values */
+static const char *login_serv[]={ "Telnet",
+                                  "Rlogin",
+                                  "TCP Clear",
+                                  "PortMaster(proprietary)",
+                                  "LAT",
+                                  "X.25-PAD",
+                                  "X.25-T3POS",
+                                  "Unassigned",
+                                  "TCP Clear Quiet",
+                                };
+
+
+/* Termination-Action Attribute standard values */
+static const char *term_action[]={ "Default",
+                                   "RADIUS-Request",
+                                 };
+
+/* NAS-Port-Type Attribute standard values */
+static const char *nas_port_type[]={ "Async",
+                                     "Sync",
+                                     "ISDN Sync",
+                                     "ISDN Async V.120",
+                                     "ISDN Async V.110",
+                                     "Virtual",
+                                     "PIAFS",
+                                     "HDLC Clear Channel",
+                                     "X.25",
+                                     "X.75",
+                                     "G.3 Fax",
+                                     "SDSL",
+                                     "ADSL-CAP",
+                                     "ADSL-DMT",
+                                     "ISDN-DSL",
+                                     "Ethernet",
+                                     "xDSL",
+                                     "Cable",
+                                     "Wireless - Other",
+                                     "Wireless - IEEE 802.11",
+                                   };         
+
+/* Acct-Status-Type Accounting Attribute standard values */
+static const char *acct_status[]={ NULL,
+                                   "Start",
+                                   "Stop",
+                                   "Interim-Update",
+                                   "Unassigned",
+                                   "Unassigned",
+                                   "Unassigned",
+                                   "Accounting-On",
+                                   "Accounting-Off",
+                                   "Tunnel-Start",
+                                   "Tunnel-Stop",
+                                   "Tunnel-Reject",
+                                   "Tunnel-Link-Start",
+                                   "Tunnel-Link-Stop",
+                                   "Tunnel-Link-Reject",
+                                   "Failed",
+                                 };
+
+/* Acct-Authentic Accounting Attribute standard values */
+static const char *acct_auth[]={ NULL,
+                                 "RADIUS",
+                                 "Local",
+                                 "Remote",
+                               };
+
+/* Acct-Terminate-Cause Accounting Attribute standard values */
+static const char *acct_term[]={ NULL,
+                                 "User Request",
+                                 "Lost Carrier",
+                                 "Lost Service",
+                                 "Idle Timeout",
+                                 "Session Timeout",
+                                 "Admin Reset",
+                                 "Admin Reboot",
+                                 "Port Error",
+                                 "NAS Error",
+                                 "NAS Request",
+                                 "NAS Reboot",
+                                 "Port Unneeded",
+                                 "Port Preempted",
+                                 "Port Suspended",
+                                 "Service Unavailable",
+                                 "Callback",
+                                 "User Error",
+                                 "Host Request",
+                               };
+
+/* Tunnel-Type Attribute standard values */
+static const char *tunnel_type[]={ NULL,
+                                   "PPTP",
+                                   "L2F",
+                                   "L2TP",
+                                   "ATMP",
+                                   "VTP",
+                                   "AH",
+                                   "IP-IP",
+                                   "MIN-IP-IP",
+                                   "ESP",
+                                   "GRE",
+                                   "DVS",
+                                   "IP-in-IP Tunneling",
+                                 };
+                                   
+/* Tunnel-Medium-Type Attribute standard values */
+static const char *tunnel_medium[]={ NULL,
+                                     "IPv4",
+                                     "IPv6",
+                                     "NSAP",
+                                     "HDLC",
+                                     "BBN 1822",
+                                     "802",
+                                     "E.163",
+                                     "E.164",
+                                     "F.69",
+                                     "X.121",
+                                     "IPX",
+                                     "Appletalk",
+                                     "Decnet IV",
+                                     "Banyan Vines",
+                                     "E.164 with NSAP subaddress",
+                                   };
+
+/* ARAP-Zone-Access Attribute standard values */
+static const char *arap_zone[]={ NULL,
+                                 "Only access to dfl zone",
+                                 "Use zone filter inc.",
+                                 "Not used",
+                                 "Use zone filter exc.",
+                               };
+
+static const char *prompt[]={ "No Echo",
+                              "Echo",
+                            };
+                            
+                                                               
+struct attrtype { char *name;            /* Attribute name                 */
+                  const char **subtypes; /* Standard Values (if any)       */
+                  u_char siz_subtypes;   /* Size of total standard values  */
+                  u_char first_subtype;  /* First standard value is 0 or 1 */
+                  void (*print_func)(register u_char *, u_int, u_short );
+                } attr_type[]=
+  {
+     { NULL,             NULL, 0, 0, NULL               },
+     { "User",           NULL, 0, 0, print_attr_string  },
+     { "Pass",           NULL, 0, 0, NULL               },
+     { "CHAP-Pass",      NULL, 0, 0, NULL               },
+     { "NAS_ipaddr",     NULL, 0, 0, print_attr_address },
+     { "NAS_port",       NULL, 0, 0, print_attr_num     },
+     { "Service_type",   serv_type, TAM_SIZE(serv_type)-1, 1, print_attr_num },                 
+     { "Framed_proto",   frm_proto, TAM_SIZE(frm_proto)-1, 1, print_attr_num },
+     { "Framed_ipaddr",  NULL, 0, 0, print_attr_address },
+     { "Framed_ipnet",   NULL, 0, 0, print_attr_address },
+     { "Framed_routing", frm_routing, TAM_SIZE(frm_routing), 0, 
+                                                              print_attr_num }, 
+     { "Filter_id",      NULL, 0, 0, print_attr_string  },
+     { "Framed_mtu",     NULL, 0, 0, print_attr_num     },
+     { "Framed_compress",  frm_comp, TAM_SIZE(frm_comp),   0, print_attr_num },
+     { "Login_iphost",   NULL, 0, 0, print_attr_address },
+     { "Login_service",  login_serv, TAM_SIZE(login_serv), 0, print_attr_num },
+     { "Login_TCP_port", NULL, 0, 0, print_attr_num     },                 
+/*17*/ { "Unassigned", NULL, 0, 0, NULL },                 
+     { "Reply",           NULL, 0, 0, print_attr_string },
+     { "Callback-number", NULL, 0, 0, print_attr_string },
+     { "Callback-id",     NULL, 0, 0, print_attr_string },
+/*21*/ { "Unassigned", NULL, 0, 0, NULL },   
+     { "Framed_route",      NULL, 0, 0, print_attr_string },
+     { "Framed_ipx_net",    NULL, 0, 0, print_attr_num    },
+     { "State",             NULL, 0, 0, print_attr_string },
+     { "Class",             NULL, 0, 0, print_attr_string },
+     { "Vendor_specific",   NULL, 0, 0, print_attr_string },
+     { "Session_timeout",   NULL, 0, 0, print_attr_num    },
+     { "Idle_timeout",      NULL, 0, 0, print_attr_num    },
+     { "Term_action", term_action, TAM_SIZE(term_action), 0, print_attr_num },
+     { "Called_station",    NULL, 0, 0, print_attr_string },
+     { "Calling_station",   NULL, 0, 0, print_attr_string },   
+     { "NAS_id",            NULL, 0, 0, print_attr_string },
+     { "Proxy_state",       NULL, 0, 0, print_attr_string },
+     { "Login_LAT_service", NULL, 0, 0, print_attr_string },
+     { "Login_LAT_node",    NULL, 0, 0, print_attr_string },
+     { "Login_LAT_group",   NULL, 0, 0, print_attr_string },
+     { "Framed_atalk_link", NULL, 0, 0, print_attr_num    },
+     { "Framed_atalk_net",  NULL, 0, 0, print_attr_num    },
+     { "Framed_atalk_zone", NULL, 0, 0, print_attr_string },
+     { "Acct_status", acct_status, TAM_SIZE(acct_status)-1, 1, print_attr_num },
+     { "Acct_delay",        NULL, 0, 0, print_attr_num    },
+     { "Acct_in_octets",    NULL, 0, 0, print_attr_num    },
+     { "Acct_out_octets",   NULL, 0, 0, print_attr_num    },
+     { "Acct_session_id",   NULL, 0, 0, print_attr_string },
+     { "Acct_authentic",  acct_auth, TAM_SIZE(acct_auth)-1, 1, print_attr_num },
+     { "Acct_session_time", NULL, 0, 0, print_attr_num },
+     { "Acct_in_packets",   NULL, 0, 0, print_attr_num },
+     { "Acct_out_packets",  NULL, 0, 0, print_attr_num },
+     { "Acct_term_cause", acct_term, TAM_SIZE(acct_term)-1, 1, print_attr_num },
+     { "Acct_multi_session_id", NULL, 0, 0, print_attr_string },
+     { "Acct_link_count", NULL, 0, 0, print_attr_num },
+     { "Acct_in_giga",    NULL, 0, 0, print_attr_num },
+     { "Acct_out_giga",   NULL, 0, 0, print_attr_num },
+/*54*/ { "Unassigned", NULL, 0, 0, NULL },
+     { "Event_timestamp", NULL, 0, 0, print_attr_time },
+/*56*/ { "Unassigned", NULL, 0, 0, NULL },
+/*57*/ { "Unassigned", NULL, 0, 0, NULL },
+/*58*/ { "Unassigned", NULL, 0, 0, NULL },
+/*59*/ { "Unassigned", NULL, 0, 0, NULL },
+     { "CHAP_challenge", NULL, 0, 0, print_attr_string },  
+     { "NAS_port_type",  nas_port_type, TAM_SIZE(nas_port_type), 0, 
+                                                              print_attr_num },
+     { "Port_limit",     NULL, 0, 0, print_attr_num },
+/*63*/ { "Login_LAT_port", NULL, 0, 0, print_attr_string },
+     { "Tunnel_type", tunnel_type, TAM_SIZE(tunnel_type)-1, 1, print_attr_num },
+     { "Tunnel_medium", tunnel_medium, TAM_SIZE(tunnel_medium)-1, 1, 
+                                                             print_attr_num },
+     { "Tunnel_client_end",   NULL, 0, 0, print_attr_string },
+     { "Tunnel_server_end",   NULL, 0, 0, print_attr_string },
+     { "Acct_tunnel_connect", NULL, 0, 0, print_attr_string },
+     { "Tunnel_pass",  NULL, 0, 0, print_attr_string  },
+     { "ARAP_pass",    NULL, 0, 0, print_attr_strange },
+     { "ARAP_feature", NULL, 0, 0, print_attr_strange },
+/*72*/ { "ARAP_zone_acces", arap_zone, TAM_SIZE(arap_zone)-1, 1, 
+                                                             print_attr_num },
+     { "ARAP_security",      NULL, 0, 0, print_attr_string },
+     { "ARAP_security_data", NULL, 0, 0, print_attr_string },
+     { "Password_retry",     NULL, 0, 0, print_attr_num    },
+     { "Prompt", prompt, TAM_SIZE(prompt), 0, print_attr_num },
+     { "Connect_info",       NULL, 0, 0, print_attr_string   },
+     { "Config_token",       NULL, 0, 0, print_attr_string   },
+     { "EAP_msg",            NULL, 0, 0, print_attr_string   },
+/*80*/ { "Message_auth",    NULL, 0, 0, print_attr_string },
+     { "Tunnel_priv_group", NULL, 0, 0, print_attr_string },
+     { "Tunnel_assign_id",  NULL, 0, 0, print_attr_string },
+     { "Tunnel_pref",       NULL, 0, 0, print_attr_num    },
+     { "ARAP_challenge_resp",    NULL, 0, 0, print_attr_strange },
+     { "Acct_interim_interval",  NULL, 0, 0, print_attr_num     },
+/*86*/ { "Acct_tunnel_pack_lost",  NULL, 0, 0, print_attr_num },
+     { "NAS_port_id", NULL, 0, 0, print_attr_string },
+     { "Framed_pool", NULL, 0, 0, print_attr_string },
+     { "Unassigned",  NULL, 0, 0, NULL },
+     { "Tunnel_client_auth_id", NULL, 0, 0, print_attr_string },
+     { "Tunnel_server_auth_id", NULL, 0, 0, print_attr_string },
+/*92*/ { "Unassigned",  NULL, 0, 0, NULL },
+/*93*/ { "Unassigned",  NULL, 0, 0, NULL }
+  };                    
+
+
+/*****************************/
+/* Print an attribute string */
+/* value pointed by 'data'   */
+/* and 'length' size.        */
+/*****************************/
+/* Returns nothing.          */
+/*****************************/
+static void
+print_attr_string(register u_char *data, u_int length, u_short attr_code )
+{
+   register u_int i;
+   
+   TCHECK2(data[0],length);
+   
+   printf("{");
+   switch(attr_code)
+   {
+      case TUNNEL_PASS:
+           if (*data && (*data <=0x1F) )
+              printf("Tag[%d] ",*data);
+           data++;
+           printf("Salt[%d] ",EXTRACT_16BITS(data) );
+           data+=2;
+           length-=2;
+        break;
+      case TUNNEL_CLIENT_END:
+      case TUNNEL_SERVER_END:
+      case TUNNEL_PRIV_GROUP:
+      case TUNNEL_ASSIGN_ID:
+      case TUNNEL_CLIENT_AUTH:
+      case TUNNEL_SERVER_AUTH:
+           if (*data <= 0x1F)
+           {
+              printf("Tag[%d] ",*data);
+              data++;
+              length--;
+           }
+        break;
+   }
+
+   for (i=0; i < length ; i++, data++)
+       printf("%c",(*data < 32 || *data > 128) ? '.' : *data );
+
+   printf("}");
+   
+   return;
+   
+   trunc:
+      printf("|radius");
+}  
+
+
+/******************************/
+/* Print an attribute numeric */
+/* value pointed by 'data'    */
+/* and 'length' size.         */
+/******************************/
+/* Returns nothing.           */
+/******************************/
+static void
+print_attr_num(register u_char *data, u_int length, u_short attr_code )
+{
+   u_int32_t timeout;
+   
+   TCHECK2(data[0],4);
+                          /* This attribute has standard values */
+   if (attr_type[attr_code].siz_subtypes) 
+   {
+      static const char **table;
+      u_int32_t data_value;
+      table = attr_type[attr_code].subtypes;
+      
+      if ( (attr_code == TUNNEL_TYPE) || (attr_code == TUNNEL_MEDIUM) )
+      {
+         if (!*data)
+            printf("{Tag[Unused]");
+         else
+            printf("{Tag[%d]", *data);
+         data_value = EXTRACT_24BITS(++data);
+      }
+      else
+         data_value = EXTRACT_32BITS(++data);
+      if ( data_value <= (attr_type[attr_code].siz_subtypes - 1 +
+            attr_type[attr_code].first_subtype) )
+         printf("{%s}",table[data_value]);
+      else
+         printf("{#%d}",data_value);          
+   }
+   else
+   {
+      switch(attr_code) /* Be aware of special cases... */
+      {
+        case FRM_IPX:
+             if (EXTRACT_32BITS( data) == 0xFFFFFFFE )
+                printf("{NAS_select}");
+             else
+                printf("{%d}",EXTRACT_32BITS( data) );          
+          break;
+
+        case SESSION_TIMEOUT:
+        case IDLE_TIMEOUT:
+        case ACCT_DELAY:
+        case ACCT_SESSION_TIME:
+        case ACCT_INT_INTERVAL:
+             timeout = EXTRACT_32BITS( data);
+             if ( timeout < 60 )
+                printf( "{%02d secs}", timeout);
+             else
+             {
+                if ( timeout < 3600 )
+                   printf( "{%02d:%02d min}", 
+                          timeout / 60, timeout % 60);
+                else
+                   printf( "{%02d:%02d:%02d hours}",
+                          timeout / 3600, (timeout % 3600) / 60, 
+                          timeout % 60);
+             }
+          break;
+
+        case FRM_ATALK_LINK:
+             if (EXTRACT_32BITS(data) )          
+                printf("{%d}",EXTRACT_32BITS(data) );
+             else
+                printf("{Unnumbered}" );
+          break;
+             
+        case FRM_ATALK_NETWORK:
+             if (EXTRACT_32BITS(data) )          
+                printf("{%d}",EXTRACT_32BITS(data) );
+             else
+                printf("{NAS_assign}" );          
+          break;
+
+        case TUNNEL_PREFERENCE:
+            if (!*data)
+               printf("{Tag[Unused] %d}",EXTRACT_24BITS(++data) );
+            else
+               printf("{Tag[%d] %d}", *data, EXTRACT_24BITS(++data) );
+          break;
+
+        default:
+             printf("{%d}",EXTRACT_32BITS( data) );
+          break;
+      
+      } /* switch */
+   
+   } /* if-else */
+
+   return;
+   
+   trunc:
+     printf("|radius}");
+}
+
+
+/*****************************/
+/* Print an attribute IPv4   */
+/* address value pointed by  */
+/* 'data' and 'length' size. */
+/*****************************/
+/* Returns nothing.          */
+/*****************************/
+static void
+print_attr_address(register u_char *data, u_int length, u_short attr_code )
+{
+   TCHECK2(data[0],4);
+   
+   switch(attr_code)
+   {
+      case FRM_IPADDR:
+      case LOG_IPHOST:
+           if (EXTRACT_32BITS(data) == 0xFFFFFFFF )
+              printf("{User_select}");
+           else
+              if (EXTRACT_32BITS(data) == 0xFFFFFFFE )
+                 printf("{NAS_select}");
+              else
+                 printf("{%s}",ipaddr_string(data));
+      break;
+      
+      default:
+          printf("{%s}",ipaddr_string(data) );
+      break;
+   }
+   
+   return;
+   
+   trunc:
+     printf("{|radius}");
+}
+
+
+/*************************************/
+/* Print an attribute of 'secs since */
+/* January 1, 1970 00:00 UTC' value  */
+/* pointed by 'data' and 'length'    */
+/* size.                             */
+/*************************************/
+/* Returns nothing.                  */
+/*************************************/
+static void print_attr_time(register u_char *data, u_int length, u_short attr_code)
+{
+   TCHECK2(data[0],4);
+   
+   printf("{%s}", ctime( ((const time_t *)EXTRACT_32BITS(data) )) );
+   return;
+   
+   trunc:
+     printf("{|radius}");
+}
+
+           
+/***********************************/
+/* Print an attribute of 'strange' */
+/* data format pointed by 'data'   */
+/* and 'length' size.              */
+/***********************************/
+/* Returns nothing.                */
+/***********************************/
+static void print_attr_strange(register u_char *data, u_int length, u_short attr_code)
+{
+   u_short len_data = 8;
+   
+   switch(attr_code)
+   {
+      case ARAP_PASS:
+           printf("{User_challenge[");
+           TCHECK2(data[0],8);
+           PRINT_HEX(len_data, data);
+           printf("] User_resp[");
+           TCHECK2(data[0],8);
+           PRINT_HEX(len_data, data);
+           printf("]}");
+        break;
+        
+      case ARAP_FEATURES:
+           if (*data)
+              printf("{User_can_change_pass");
+           else
+              printf("{User_cant_change_pass");
+           TCHECK2(data[0],1);
+           data++;
+           printf(" Min_pass_len[%d]",*data);
+           printf(" Pass_created_at[");
+           TCHECK2(data[0],8);
+           PRINT_HEX(len_data, data);
+           printf("] Pass_expired_in[");
+           TCHECK2(data[0],8);
+           PRINT_HEX(len_data, data);
+           printf("] Current_time[");
+           TCHECK2(data[0],8);
+           PRINT_HEX(len_data, data);
+           printf("]}");
+        break;
+
+      case ARAP_CHALLENGE_RESP:
+           printf("{");
+           TCHECK2(data[0],8);
+           PRINT_HEX(len_data, data);
+           printf("}");
+        break;
+   }
+   
+   trunc:
+     printf("|radius}");
+}
+
+
+
+static void
+radius_attr_print(register u_char *attr, u_int length)
+{
+   register const struct radius_attr *rad_attr = (struct radius_attr *)attr;
+   
+   if (length < 3)
+   {
+      printf(" [|radius]");
+      return;
+   }
+   printf(" Attr[ ");
+   while (length > 0)
+   {
+     if ( rad_attr->len <= length )
+     {
+        if ( !rad_attr->type || (rad_attr->type > (TAM_SIZE(attr_type)-1))  )
+           printf("#%d",rad_attr->type);
+        else
+        {
+           printf(" %s",attr_type[rad_attr->type].name);
+
+           if ( attr_type[rad_attr->type].print_func )
+              (*attr_type[rad_attr->type].print_func)( ((char *)(rad_attr+1)),
+                                           rad_attr->len - 2, rad_attr->type);
+        }
+     }
+     else
+     {
+        printf(" [|radius]");
+        return;
+     }
+     length-=(rad_attr->len);
+     rad_attr = (struct radius_attr *)( ((char *)(rad_attr))+rad_attr->len);
+   }
+   
+   printf(" ]");
+}
+
+
+void
+radius_print(const u_char *dat, u_int length)
+{
+   register const struct radius_hdr *rad;
+   register int i;
+   
+   i = min(length, snapend - dat) - sizeof(*rad);
+
+   if (i < 0) 
+   {
+         printf(" [|radius]");
+         return;
+   }
+
+   rad = (struct radius_hdr *)dat;
+   switch (rad->code) 
+   {
+     case RADCMD_ACCESS_REQ:
+         printf(" rad-access-req %d", length);
+         break;
+
+     case RADCMD_ACCESS_ACC:
+         printf(" rad-access-accept %d", length);
+         break;
+
+     case RADCMD_ACCESS_REJ:
+         printf(" rad-access-reject %d", length);
+         break;
+
+     case RADCMD_ACCOUN_REQ:
+         printf(" rad-account-req %d", length);
+         break;
+
+     case RADCMD_ACCOUN_RES:
+         printf(" rad-account-resp %d", length);
+         break;
+
+     case RADCMD_ACCESS_CHA:
+         printf(" rad-access-cha %d", length);
+         break;
+
+     case RADCMD_STATUS_SER:
+         printf(" rad-status-serv %d", length);
+         break;
+
+     case RADCMD_STATUS_CLI:
+         printf(" rad-status-cli %d", length);
+         break;
+
+     case RADCMD_RESERVED:
+         printf(" rad-reserved %d", length);
+         break;
+
+     default:
+         printf(" rad-#%d %d", rad->code, length);
+         break;
+   }
+   printf(" [id %d]", rad->id);
+   if (i)
+      radius_attr_print( ((char *)(rad+1)), i);  
+}
index 2a99488a910f96939d1b1d27c216907f8e8c10a3..737931fb9aeea5777448e88948ad3dfe379471de 100644 (file)
@@ -21,7 +21,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.83 2000-10-06 05:35:37 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.84 2000-10-06 06:49:22 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -405,6 +405,10 @@ static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
 #define NETBIOS_NS_PORT   137
 #define NETBIOS_DGRAM_PORT   138
 #define CISCO_AUTORP_PORT 496  /*XXX*/
+#define RADIUS_PORT 1645
+#define RADIUS_NEW_PORT 1812
+#define RADIUS_ACCOUNTING_PORT 1646
+#define RADIUS_NEW_ACCOUNTING_PORT 1813
 
 #ifdef INET6
 #define RIPNG_PORT 521         /*XXX*/
@@ -683,6 +687,11 @@ udp_print(register const u_char *bp, u_int length, register const u_char *bp2)
                        wb_print((const void *)(up + 1), length);
                else if (ISPORT(CISCO_AUTORP_PORT))
                        cisco_autorp_print((const void *)(up + 1), length);
+               else if (ISPORT(RADIUS_PORT) ||
+                        ISPORT(RADIUS_NEW_PORT) ||
+                        ISPORT(RADIUS_ACCOUNTING_PORT) || 
+                        ISPORT(RADIUS_NEW_ACCOUNTING_PORT) )
+                        radius_print((const u_char *)(up+1), length);
                else
                        (void)printf(" udp %u",
                            (u_int32_t)(ulen - sizeof(*up)));