xref: /dflybsd-src/contrib/tcpdump/print-radius.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
141c99275SPeter Avalos /*
241c99275SPeter Avalos  * Copyright (C) 2000 Alfredo Andres Omella.  All rights reserved.
341c99275SPeter Avalos  *
441c99275SPeter Avalos  * Redistribution and use in source and binary forms, with or without
541c99275SPeter Avalos  * modification, are permitted provided that the following conditions
641c99275SPeter Avalos  * are met:
741c99275SPeter Avalos  *
841c99275SPeter Avalos  *   1. Redistributions of source code must retain the above copyright
941c99275SPeter Avalos  *      notice, this list of conditions and the following disclaimer.
1041c99275SPeter Avalos  *   2. Redistributions in binary form must reproduce the above copyright
1141c99275SPeter Avalos  *      notice, this list of conditions and the following disclaimer in
1241c99275SPeter Avalos  *      the documentation and/or other materials provided with the
1341c99275SPeter Avalos  *      distribution.
1441c99275SPeter Avalos  *   3. The names of the authors may not be used to endorse or promote
1541c99275SPeter Avalos  *      products derived from this software without specific prior
1641c99275SPeter Avalos  *      written permission.
1741c99275SPeter Avalos  *
1841c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1941c99275SPeter Avalos  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
2041c99275SPeter Avalos  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2141c99275SPeter Avalos  */
22411677aeSAaron LI 
23411677aeSAaron LI /* \summary: Radius protocol printer */
24411677aeSAaron LI 
2541c99275SPeter Avalos /*
2641c99275SPeter Avalos  * Radius printer routines as specified on:
2741c99275SPeter Avalos  *
2841c99275SPeter Avalos  * RFC 2865:
2941c99275SPeter Avalos  *      "Remote Authentication Dial In User Service (RADIUS)"
3041c99275SPeter Avalos  *
3141c99275SPeter Avalos  * RFC 2866:
3241c99275SPeter Avalos  *      "RADIUS Accounting"
3341c99275SPeter Avalos  *
3441c99275SPeter Avalos  * RFC 2867:
3541c99275SPeter Avalos  *      "RADIUS Accounting Modifications for Tunnel Protocol Support"
3641c99275SPeter Avalos  *
3741c99275SPeter Avalos  * RFC 2868:
3841c99275SPeter Avalos  *      "RADIUS Attributes for Tunnel Protocol Support"
3941c99275SPeter Avalos  *
4041c99275SPeter Avalos  * RFC 2869:
4141c99275SPeter Avalos  *      "RADIUS Extensions"
4241c99275SPeter Avalos  *
43*ed775ee7SAntonio Huete Jimenez  * RFC 3162:
44*ed775ee7SAntonio Huete Jimenez  *      "RADIUS and IPv6"
45*ed775ee7SAntonio Huete Jimenez  *
46411677aeSAaron LI  * RFC 3580:
47411677aeSAaron LI  *      "IEEE 802.1X Remote Authentication Dial In User Service (RADIUS)"
48411677aeSAaron LI  *      "Usage Guidelines"
49411677aeSAaron LI  *
50*ed775ee7SAntonio Huete Jimenez  * RFC 4072:
51*ed775ee7SAntonio Huete Jimenez  *      "Diameter Extensible Authentication Protocol (EAP) Application"
52*ed775ee7SAntonio Huete Jimenez  *
53411677aeSAaron LI  * RFC 4675:
54411677aeSAaron LI  *      "RADIUS Attributes for Virtual LAN and Priority Support"
55411677aeSAaron LI  *
56*ed775ee7SAntonio Huete Jimenez  * RFC 4818:
57*ed775ee7SAntonio Huete Jimenez  *      "RADIUS Delegated-IPv6-Prefix Attribute"
58*ed775ee7SAntonio Huete Jimenez  *
59*ed775ee7SAntonio Huete Jimenez  * RFC 4849:
60*ed775ee7SAntonio Huete Jimenez  *      "RADIUS Filter Rule Attribute"
61*ed775ee7SAntonio Huete Jimenez  *
62*ed775ee7SAntonio Huete Jimenez  * RFC 5090:
63*ed775ee7SAntonio Huete Jimenez  *      "RADIUS Extension for Digest Authentication"
64*ed775ee7SAntonio Huete Jimenez  *
65411677aeSAaron LI  * RFC 5176:
66411677aeSAaron LI  *      "Dynamic Authorization Extensions to RADIUS"
67411677aeSAaron LI  *
68*ed775ee7SAntonio Huete Jimenez  * RFC 5447:
69*ed775ee7SAntonio Huete Jimenez  *      "Diameter Mobile IPv6"
70*ed775ee7SAntonio Huete Jimenez  *
71*ed775ee7SAntonio Huete Jimenez  * RFC 5580:
72*ed775ee7SAntonio Huete Jimenez  *      "Carrying Location Objects in RADIUS and Diameter"
73*ed775ee7SAntonio Huete Jimenez  *
74*ed775ee7SAntonio Huete Jimenez  * RFC 6572:
75*ed775ee7SAntonio Huete Jimenez  *      "RADIUS Support for Proxy Mobile IPv6"
76*ed775ee7SAntonio Huete Jimenez  *
77*ed775ee7SAntonio Huete Jimenez  * RFC 7155:
78*ed775ee7SAntonio Huete Jimenez  *      "Diameter Network Access Server Application"
79*ed775ee7SAntonio Huete Jimenez  *
8041c99275SPeter Avalos  * Alfredo Andres Omella (aandres@s21sec.com) v0.1 2000/09/15
8141c99275SPeter Avalos  *
8241c99275SPeter Avalos  * TODO: Among other things to print ok MacIntosh and Vendor values
8341c99275SPeter Avalos  */
8441c99275SPeter Avalos 
8541c99275SPeter Avalos #ifdef HAVE_CONFIG_H
86*ed775ee7SAntonio Huete Jimenez #include <config.h>
8741c99275SPeter Avalos #endif
8841c99275SPeter Avalos 
89*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
9041c99275SPeter Avalos 
9141c99275SPeter Avalos #include <string.h>
9241c99275SPeter Avalos 
93*ed775ee7SAntonio Huete Jimenez #include "netdissect-ctype.h"
94*ed775ee7SAntonio Huete Jimenez 
95411677aeSAaron LI #include "netdissect.h"
9641c99275SPeter Avalos #include "addrtoname.h"
9741c99275SPeter Avalos #include "extract.h"
9841c99275SPeter Avalos #include "oui.h"
99*ed775ee7SAntonio Huete Jimenez #include "ntp.h"
10041c99275SPeter Avalos 
101411677aeSAaron LI 
10241c99275SPeter Avalos #define TAM_SIZE(x) (sizeof(x)/sizeof(x[0]) )
10341c99275SPeter Avalos 
10441c99275SPeter Avalos #define PRINT_HEX(bytes_len, ptr_data)                               \
10541c99275SPeter Avalos            while(bytes_len)                                          \
10641c99275SPeter Avalos            {                                                         \
107*ed775ee7SAntonio Huete Jimenez               ND_PRINT("%02X", *ptr_data );                   \
10841c99275SPeter Avalos               ptr_data++;                                            \
10941c99275SPeter Avalos               bytes_len--;                                           \
11041c99275SPeter Avalos            }
11141c99275SPeter Avalos 
11241c99275SPeter Avalos 
11341c99275SPeter Avalos /* Radius packet codes */
114*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-27 */
11541c99275SPeter Avalos #define RADCMD_ACCESS_REQ   1 /* Access-Request      */
11641c99275SPeter Avalos #define RADCMD_ACCESS_ACC   2 /* Access-Accept       */
11741c99275SPeter Avalos #define RADCMD_ACCESS_REJ   3 /* Access-Reject       */
11841c99275SPeter Avalos #define RADCMD_ACCOUN_REQ   4 /* Accounting-Request  */
11941c99275SPeter Avalos #define RADCMD_ACCOUN_RES   5 /* Accounting-Response */
12041c99275SPeter Avalos #define RADCMD_ACCESS_CHA  11 /* Access-Challenge    */
12141c99275SPeter Avalos #define RADCMD_STATUS_SER  12 /* Status-Server       */
12241c99275SPeter Avalos #define RADCMD_STATUS_CLI  13 /* Status-Client       */
123411677aeSAaron LI #define RADCMD_DISCON_REQ  40 /* Disconnect-Request  */
124411677aeSAaron LI #define RADCMD_DISCON_ACK  41 /* Disconnect-ACK      */
125411677aeSAaron LI #define RADCMD_DISCON_NAK  42 /* Disconnect-NAK      */
126411677aeSAaron LI #define RADCMD_COA_REQ     43 /* CoA-Request         */
127411677aeSAaron LI #define RADCMD_COA_ACK     44 /* CoA-ACK             */
128411677aeSAaron LI #define RADCMD_COA_NAK     45 /* CoA-NAK             */
12941c99275SPeter Avalos #define RADCMD_RESERVED   255 /* Reserved            */
13041c99275SPeter Avalos 
131411677aeSAaron LI static const struct tok radius_command_values[] = {
132411677aeSAaron LI     { RADCMD_ACCESS_REQ, "Access-Request" },
133411677aeSAaron LI     { RADCMD_ACCESS_ACC, "Access-Accept" },
134411677aeSAaron LI     { RADCMD_ACCESS_REJ, "Access-Reject" },
135411677aeSAaron LI     { RADCMD_ACCOUN_REQ, "Accounting-Request" },
136411677aeSAaron LI     { RADCMD_ACCOUN_RES, "Accounting-Response" },
137411677aeSAaron LI     { RADCMD_ACCESS_CHA, "Access-Challenge" },
138411677aeSAaron LI     { RADCMD_STATUS_SER, "Status-Server" },
139411677aeSAaron LI     { RADCMD_STATUS_CLI, "Status-Client" },
140411677aeSAaron LI     { RADCMD_DISCON_REQ, "Disconnect-Request" },
141411677aeSAaron LI     { RADCMD_DISCON_ACK, "Disconnect-ACK" },
142411677aeSAaron LI     { RADCMD_DISCON_NAK, "Disconnect-NAK" },
143411677aeSAaron LI     { RADCMD_COA_REQ,    "CoA-Request" },
144411677aeSAaron LI     { RADCMD_COA_ACK,    "CoA-ACK" },
145411677aeSAaron LI     { RADCMD_COA_NAK,    "CoA-NAK" },
14641c99275SPeter Avalos     { RADCMD_RESERVED,   "Reserved" },
14741c99275SPeter Avalos     { 0, NULL}
14841c99275SPeter Avalos };
14941c99275SPeter Avalos 
15041c99275SPeter Avalos /********************************/
15141c99275SPeter Avalos /* Begin Radius Attribute types */
15241c99275SPeter Avalos /********************************/
15341c99275SPeter Avalos #define SERV_TYPE    6
15441c99275SPeter Avalos #define FRM_IPADDR   8
15541c99275SPeter Avalos #define LOG_IPHOST  14
15641c99275SPeter Avalos #define LOG_SERVICE 15
15741c99275SPeter Avalos #define FRM_IPX     23
15841c99275SPeter Avalos #define SESSION_TIMEOUT   27
15941c99275SPeter Avalos #define IDLE_TIMEOUT      28
16041c99275SPeter Avalos #define FRM_ATALK_LINK    37
16141c99275SPeter Avalos #define FRM_ATALK_NETWORK 38
16241c99275SPeter Avalos 
16341c99275SPeter Avalos #define ACCT_DELAY        41
16441c99275SPeter Avalos #define ACCT_SESSION_TIME 46
16541c99275SPeter Avalos 
166411677aeSAaron LI #define EGRESS_VLAN_ID   56
167411677aeSAaron LI #define EGRESS_VLAN_NAME 58
168411677aeSAaron LI 
16941c99275SPeter Avalos #define TUNNEL_TYPE        64
17041c99275SPeter Avalos #define TUNNEL_MEDIUM      65
17141c99275SPeter Avalos #define TUNNEL_CLIENT_END  66
17241c99275SPeter Avalos #define TUNNEL_SERVER_END  67
17341c99275SPeter Avalos #define TUNNEL_PASS        69
17441c99275SPeter Avalos 
17541c99275SPeter Avalos #define ARAP_PASS          70
17641c99275SPeter Avalos #define ARAP_FEATURES      71
17741c99275SPeter Avalos 
178*ed775ee7SAntonio Huete Jimenez #define EAP_MESSAGE        79
179*ed775ee7SAntonio Huete Jimenez 
18041c99275SPeter Avalos #define TUNNEL_PRIV_GROUP  81
18141c99275SPeter Avalos #define TUNNEL_ASSIGN_ID   82
18241c99275SPeter Avalos #define TUNNEL_PREFERENCE  83
18341c99275SPeter Avalos 
18441c99275SPeter Avalos #define ARAP_CHALLENGE_RESP 84
18541c99275SPeter Avalos #define ACCT_INT_INTERVAL   85
18641c99275SPeter Avalos 
18741c99275SPeter Avalos #define TUNNEL_CLIENT_AUTH 90
18841c99275SPeter Avalos #define TUNNEL_SERVER_AUTH 91
189*ed775ee7SAntonio Huete Jimenez 
190*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE 101
19141c99275SPeter Avalos /********************************/
19241c99275SPeter Avalos /* End Radius Attribute types */
19341c99275SPeter Avalos /********************************/
19441c99275SPeter Avalos 
195411677aeSAaron LI #define RFC4675_TAGGED   0x31
196411677aeSAaron LI #define RFC4675_UNTAGGED 0x32
19741c99275SPeter Avalos 
198411677aeSAaron LI static const struct tok rfc4675_tagged[] = {
199411677aeSAaron LI     { RFC4675_TAGGED,   "Tagged" },
200411677aeSAaron LI     { RFC4675_UNTAGGED, "Untagged" },
201411677aeSAaron LI     { 0, NULL}
202411677aeSAaron LI };
20341c99275SPeter Avalos 
20441c99275SPeter Avalos 
205*ed775ee7SAntonio Huete Jimenez static void print_attr_string(netdissect_options *, const u_char *, u_int, u_short );
206*ed775ee7SAntonio Huete Jimenez static void print_attr_num(netdissect_options *, const u_char *, u_int, u_short );
207*ed775ee7SAntonio Huete Jimenez static void print_vendor_attr(netdissect_options *, const u_char *, u_int, u_short );
208*ed775ee7SAntonio Huete Jimenez static void print_attr_address(netdissect_options *, const u_char *, u_int, u_short);
209*ed775ee7SAntonio Huete Jimenez static void print_attr_address6(netdissect_options *, const u_char *, u_int, u_short);
210*ed775ee7SAntonio Huete Jimenez static void print_attr_netmask6(netdissect_options *, const u_char *, u_int, u_short);
211*ed775ee7SAntonio Huete Jimenez static void print_attr_mip6_home_link_prefix(netdissect_options *, const u_char *, u_int, u_short);
212*ed775ee7SAntonio Huete Jimenez static void print_attr_operator_name(netdissect_options *, const u_char *, u_int, u_short);
213*ed775ee7SAntonio Huete Jimenez static void print_attr_location_information(netdissect_options *, const u_char *, u_int, u_short);
214*ed775ee7SAntonio Huete Jimenez static void print_attr_location_data(netdissect_options *, const u_char *, u_int, u_short);
215*ed775ee7SAntonio Huete Jimenez static void print_basic_location_policy_rules(netdissect_options *, const u_char *, u_int, u_short);
216*ed775ee7SAntonio Huete Jimenez static void print_attr_time(netdissect_options *, const u_char *, u_int, u_short);
217*ed775ee7SAntonio Huete Jimenez static void print_attr_vector64(netdissect_options *, register const u_char *, u_int, u_short);
218*ed775ee7SAntonio Huete Jimenez static void print_attr_strange(netdissect_options *, const u_char *, u_int, u_short);
219411677aeSAaron LI 
220411677aeSAaron LI 
221*ed775ee7SAntonio Huete Jimenez struct radius_hdr { nd_uint8_t  code;     /* Radius packet code  */
222*ed775ee7SAntonio Huete Jimenez                     nd_uint8_t  id;       /* Radius packet id    */
223*ed775ee7SAntonio Huete Jimenez                     nd_uint16_t len;      /* Radius total length */
224*ed775ee7SAntonio Huete Jimenez                     nd_byte     auth[16]; /* Authenticator   */
22541c99275SPeter Avalos                   };
22641c99275SPeter Avalos 
22741c99275SPeter Avalos #define MIN_RADIUS_LEN	20
22841c99275SPeter Avalos 
229*ed775ee7SAntonio Huete Jimenez struct radius_attr { nd_uint8_t type; /* Attribute type   */
230*ed775ee7SAntonio Huete Jimenez                      nd_uint8_t len;  /* Attribute length */
23141c99275SPeter Avalos                    };
23241c99275SPeter Avalos 
23341c99275SPeter Avalos 
23441c99275SPeter Avalos /* Service-Type Attribute standard values */
235*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-4 */
23641c99275SPeter Avalos static const char *serv_type[]={ NULL,
23741c99275SPeter Avalos                                 "Login",
23841c99275SPeter Avalos                                 "Framed",
23941c99275SPeter Avalos                                 "Callback Login",
24041c99275SPeter Avalos                                 "Callback Framed",
24141c99275SPeter Avalos                                 "Outbound",
24241c99275SPeter Avalos                                 "Administrative",
24341c99275SPeter Avalos                                 "NAS Prompt",
24441c99275SPeter Avalos                                 "Authenticate Only",
24541c99275SPeter Avalos                                 "Callback NAS Prompt",
246*ed775ee7SAntonio Huete Jimenez                                 /* ^ [0, 9] ^ */
24741c99275SPeter Avalos                                 "Call Check",
24841c99275SPeter Avalos                                 "Callback Administrative",
249*ed775ee7SAntonio Huete Jimenez                                 "Voice",
250*ed775ee7SAntonio Huete Jimenez                                 "Fax",
251*ed775ee7SAntonio Huete Jimenez                                 "Modem Relay",
252*ed775ee7SAntonio Huete Jimenez                                 "IAPP-Register",
253*ed775ee7SAntonio Huete Jimenez                                 "IAPP-AP-Check",
254*ed775ee7SAntonio Huete Jimenez                                 "Authorize Only",
255*ed775ee7SAntonio Huete Jimenez                                 "Framed-Management",
256*ed775ee7SAntonio Huete Jimenez                                 "Additional-Authorization",
257*ed775ee7SAntonio Huete Jimenez                                 /* ^ [10, 19] ^ */
25841c99275SPeter Avalos                                };
25941c99275SPeter Avalos 
26041c99275SPeter Avalos /* Framed-Protocol Attribute standard values */
261*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-5 */
26241c99275SPeter Avalos static const char *frm_proto[]={ NULL,
26341c99275SPeter Avalos                                  "PPP",
26441c99275SPeter Avalos                                  "SLIP",
26541c99275SPeter Avalos                                  "ARAP",
26641c99275SPeter Avalos                                  "Gandalf proprietary",
26741c99275SPeter Avalos                                  "Xylogics IPX/SLIP",
26841c99275SPeter Avalos                                  "X.75 Synchronous",
269*ed775ee7SAntonio Huete Jimenez                                  "GPRS PDP Context",
27041c99275SPeter Avalos                                };
27141c99275SPeter Avalos 
27241c99275SPeter Avalos /* Framed-Routing Attribute standard values */
273*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-6 */
27441c99275SPeter Avalos static const char *frm_routing[]={ "None",
27541c99275SPeter Avalos                                    "Send",
27641c99275SPeter Avalos                                    "Listen",
27741c99275SPeter Avalos                                    "Send&Listen",
27841c99275SPeter Avalos                                  };
27941c99275SPeter Avalos 
28041c99275SPeter Avalos /* Framed-Compression Attribute standard values */
281*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-7 */
28241c99275SPeter Avalos static const char *frm_comp[]={ "None",
28341c99275SPeter Avalos                                 "VJ TCP/IP",
28441c99275SPeter Avalos                                 "IPX",
28541c99275SPeter Avalos                                 "Stac-LZS",
28641c99275SPeter Avalos                               };
28741c99275SPeter Avalos 
28841c99275SPeter Avalos /* Login-Service Attribute standard values */
289*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-8 */
29041c99275SPeter Avalos static const char *login_serv[]={ "Telnet",
29141c99275SPeter Avalos                                   "Rlogin",
29241c99275SPeter Avalos                                   "TCP Clear",
29341c99275SPeter Avalos                                   "PortMaster(proprietary)",
29441c99275SPeter Avalos                                   "LAT",
29541c99275SPeter Avalos                                   "X.25-PAD",
29641c99275SPeter Avalos                                   "X.25-T3POS",
29741c99275SPeter Avalos                                   "Unassigned",
29841c99275SPeter Avalos                                   "TCP Clear Quiet",
29941c99275SPeter Avalos                                 };
30041c99275SPeter Avalos 
30141c99275SPeter Avalos 
30241c99275SPeter Avalos /* Termination-Action Attribute standard values */
303*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-9 */
30441c99275SPeter Avalos static const char *term_action[]={ "Default",
30541c99275SPeter Avalos                                    "RADIUS-Request",
30641c99275SPeter Avalos                                  };
30741c99275SPeter Avalos 
308411677aeSAaron LI /* Ingress-Filters Attribute standard values */
309411677aeSAaron LI static const char *ingress_filters[]={ NULL,
310411677aeSAaron LI                                        "Enabled",
311411677aeSAaron LI                                        "Disabled",
312411677aeSAaron LI                                      };
313411677aeSAaron LI 
31441c99275SPeter Avalos /* NAS-Port-Type Attribute standard values */
315*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-13 */
31641c99275SPeter Avalos static const char *nas_port_type[]={ "Async",
31741c99275SPeter Avalos                                      "Sync",
31841c99275SPeter Avalos                                      "ISDN Sync",
31941c99275SPeter Avalos                                      "ISDN Async V.120",
32041c99275SPeter Avalos                                      "ISDN Async V.110",
32141c99275SPeter Avalos                                      "Virtual",
32241c99275SPeter Avalos                                      "PIAFS",
32341c99275SPeter Avalos                                      "HDLC Clear Channel",
32441c99275SPeter Avalos                                      "X.25",
32541c99275SPeter Avalos                                      "X.75",
326*ed775ee7SAntonio Huete Jimenez                                      /* ^ [0, 9] ^ */
32741c99275SPeter Avalos                                      "G.3 Fax",
32841c99275SPeter Avalos                                      "SDSL",
32941c99275SPeter Avalos                                      "ADSL-CAP",
33041c99275SPeter Avalos                                      "ADSL-DMT",
33141c99275SPeter Avalos                                      "ISDN-DSL",
33241c99275SPeter Avalos                                      "Ethernet",
33341c99275SPeter Avalos                                      "xDSL",
33441c99275SPeter Avalos                                      "Cable",
33541c99275SPeter Avalos                                      "Wireless - Other",
33641c99275SPeter Avalos                                      "Wireless - IEEE 802.11",
337*ed775ee7SAntonio Huete Jimenez                                      /* ^ [10, 19] ^ */
338*ed775ee7SAntonio Huete Jimenez                                      "Token-Ring",
339*ed775ee7SAntonio Huete Jimenez                                      "FDDI",
340*ed775ee7SAntonio Huete Jimenez                                      "Wireless - CDMA200",
341*ed775ee7SAntonio Huete Jimenez                                      "Wireless - UMTS",
342*ed775ee7SAntonio Huete Jimenez                                      "Wireless - 1X-EV",
343*ed775ee7SAntonio Huete Jimenez                                      "IAPP",
344*ed775ee7SAntonio Huete Jimenez                                      "FTTP",
345*ed775ee7SAntonio Huete Jimenez                                      "Wireless - IEEE 802.16",
346*ed775ee7SAntonio Huete Jimenez                                      "Wireless - IEEE 802.20",
347*ed775ee7SAntonio Huete Jimenez                                      "Wireless - IEEE 802.22",
348*ed775ee7SAntonio Huete Jimenez                                      /* ^ [20, 29] ^ */
349*ed775ee7SAntonio Huete Jimenez                                      "PPPoA",
350*ed775ee7SAntonio Huete Jimenez                                      "PPPoEoA",
351*ed775ee7SAntonio Huete Jimenez                                      "PPPoEoE",
352*ed775ee7SAntonio Huete Jimenez                                      "PPPoEoVLAN",
353*ed775ee7SAntonio Huete Jimenez                                      "PPPoEoQinQ",
354*ed775ee7SAntonio Huete Jimenez                                      "xPON",
355*ed775ee7SAntonio Huete Jimenez                                      "Wireless - XGP",
356*ed775ee7SAntonio Huete Jimenez                                      "WiMAX Pre-Release 8 IWK Function",
357*ed775ee7SAntonio Huete Jimenez                                      "WIMAX-WIFI-IWK",
358*ed775ee7SAntonio Huete Jimenez                                      "WIMAX-SFF",
359*ed775ee7SAntonio Huete Jimenez                                      /* ^ [30, 39] ^ */
360*ed775ee7SAntonio Huete Jimenez                                      "WIMAX-HA-LMA",
361*ed775ee7SAntonio Huete Jimenez                                      "WIMAX-DHCP",
362*ed775ee7SAntonio Huete Jimenez                                      "WIMAX-LBS",
363*ed775ee7SAntonio Huete Jimenez                                      "WIMAX-WVS",
36441c99275SPeter Avalos                                    };
36541c99275SPeter Avalos 
36641c99275SPeter Avalos /* Acct-Status-Type Accounting Attribute standard values */
367*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-10 */
36841c99275SPeter Avalos static const char *acct_status[]={ NULL,
36941c99275SPeter Avalos                                    "Start",
37041c99275SPeter Avalos                                    "Stop",
37141c99275SPeter Avalos                                    "Interim-Update",
37241c99275SPeter Avalos                                    "Unassigned",
37341c99275SPeter Avalos                                    "Unassigned",
37441c99275SPeter Avalos                                    "Unassigned",
37541c99275SPeter Avalos                                    "Accounting-On",
37641c99275SPeter Avalos                                    "Accounting-Off",
37741c99275SPeter Avalos                                    "Tunnel-Start",
378*ed775ee7SAntonio Huete Jimenez                                      /* ^ [0, 9] ^ */
37941c99275SPeter Avalos                                    "Tunnel-Stop",
38041c99275SPeter Avalos                                    "Tunnel-Reject",
38141c99275SPeter Avalos                                    "Tunnel-Link-Start",
38241c99275SPeter Avalos                                    "Tunnel-Link-Stop",
38341c99275SPeter Avalos                                    "Tunnel-Link-Reject",
38441c99275SPeter Avalos                                    "Failed",
38541c99275SPeter Avalos                                  };
38641c99275SPeter Avalos 
38741c99275SPeter Avalos /* Acct-Authentic Accounting Attribute standard values */
388*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-11 */
38941c99275SPeter Avalos static const char *acct_auth[]={ NULL,
39041c99275SPeter Avalos                                  "RADIUS",
39141c99275SPeter Avalos                                  "Local",
39241c99275SPeter Avalos                                  "Remote",
393*ed775ee7SAntonio Huete Jimenez                                  "Diameter",
39441c99275SPeter Avalos                                };
39541c99275SPeter Avalos 
39641c99275SPeter Avalos /* Acct-Terminate-Cause Accounting Attribute standard values */
397*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-12 */
39841c99275SPeter Avalos static const char *acct_term[]={ NULL,
39941c99275SPeter Avalos                                  "User Request",
40041c99275SPeter Avalos                                  "Lost Carrier",
40141c99275SPeter Avalos                                  "Lost Service",
40241c99275SPeter Avalos                                  "Idle Timeout",
40341c99275SPeter Avalos                                  "Session Timeout",
40441c99275SPeter Avalos                                  "Admin Reset",
40541c99275SPeter Avalos                                  "Admin Reboot",
40641c99275SPeter Avalos                                  "Port Error",
40741c99275SPeter Avalos                                  "NAS Error",
408*ed775ee7SAntonio Huete Jimenez                                  /* ^ [0, 9] ^ */
40941c99275SPeter Avalos                                  "NAS Request",
41041c99275SPeter Avalos                                  "NAS Reboot",
41141c99275SPeter Avalos                                  "Port Unneeded",
41241c99275SPeter Avalos                                  "Port Preempted",
41341c99275SPeter Avalos                                  "Port Suspended",
41441c99275SPeter Avalos                                  "Service Unavailable",
41541c99275SPeter Avalos                                  "Callback",
41641c99275SPeter Avalos                                  "User Error",
41741c99275SPeter Avalos                                  "Host Request",
418*ed775ee7SAntonio Huete Jimenez                                  "Supplicant Restart",
419*ed775ee7SAntonio Huete Jimenez                                  /* ^ [10, 19] ^ */
420*ed775ee7SAntonio Huete Jimenez                                  "Reauthentication Failure",
421*ed775ee7SAntonio Huete Jimenez                                  "Port Reinitialized",
422*ed775ee7SAntonio Huete Jimenez                                  "Port Administratively Disabled",
423*ed775ee7SAntonio Huete Jimenez                                  "Lost Power",
42441c99275SPeter Avalos                                };
42541c99275SPeter Avalos 
42641c99275SPeter Avalos /* Tunnel-Type Attribute standard values */
427*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-14 */
42841c99275SPeter Avalos static const char *tunnel_type[]={ NULL,
42941c99275SPeter Avalos                                    "PPTP",
43041c99275SPeter Avalos                                    "L2F",
43141c99275SPeter Avalos                                    "L2TP",
43241c99275SPeter Avalos                                    "ATMP",
43341c99275SPeter Avalos                                    "VTP",
43441c99275SPeter Avalos                                    "AH",
43541c99275SPeter Avalos                                    "IP-IP",
43641c99275SPeter Avalos                                    "MIN-IP-IP",
43741c99275SPeter Avalos                                    "ESP",
438*ed775ee7SAntonio Huete Jimenez                                    /* ^ [0, 9] ^ */
43941c99275SPeter Avalos                                    "GRE",
44041c99275SPeter Avalos                                    "DVS",
44141c99275SPeter Avalos                                    "IP-in-IP Tunneling",
442411677aeSAaron LI                                    "VLAN",
44341c99275SPeter Avalos                                  };
44441c99275SPeter Avalos 
44541c99275SPeter Avalos /* Tunnel-Medium-Type Attribute standard values */
446*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-15 */
44741c99275SPeter Avalos static const char *tunnel_medium[]={ NULL,
44841c99275SPeter Avalos                                      "IPv4",
44941c99275SPeter Avalos                                      "IPv6",
45041c99275SPeter Avalos                                      "NSAP",
45141c99275SPeter Avalos                                      "HDLC",
45241c99275SPeter Avalos                                      "BBN 1822",
45341c99275SPeter Avalos                                      "802",
45441c99275SPeter Avalos                                      "E.163",
45541c99275SPeter Avalos                                      "E.164",
45641c99275SPeter Avalos                                      "F.69",
457*ed775ee7SAntonio Huete Jimenez                                      /* ^ [0, 9] ^ */
45841c99275SPeter Avalos                                      "X.121",
45941c99275SPeter Avalos                                      "IPX",
46041c99275SPeter Avalos                                      "Appletalk",
46141c99275SPeter Avalos                                      "Decnet IV",
46241c99275SPeter Avalos                                      "Banyan Vines",
46341c99275SPeter Avalos                                      "E.164 with NSAP subaddress",
46441c99275SPeter Avalos                                    };
46541c99275SPeter Avalos 
46641c99275SPeter Avalos /* ARAP-Zone-Access Attribute standard values */
467*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-16 */
46841c99275SPeter Avalos static const char *arap_zone[]={ NULL,
46941c99275SPeter Avalos                                  "Only access to dfl zone",
47041c99275SPeter Avalos                                  "Use zone filter inc.",
47141c99275SPeter Avalos                                  "Not used",
47241c99275SPeter Avalos                                  "Use zone filter exc.",
47341c99275SPeter Avalos                                };
47441c99275SPeter Avalos 
475*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-17 */
47641c99275SPeter Avalos static const char *prompt[]={ "No Echo",
47741c99275SPeter Avalos                               "Echo",
47841c99275SPeter Avalos                             };
47941c99275SPeter Avalos 
480*ed775ee7SAntonio Huete Jimenez /* Error-Cause standard values */
481*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-18 */
482*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_RESIDUAL_CONTEXT_REMOVED 201
483*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_INVALID_EAP_PACKET 202
484*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_UNSUPPORTED_ATTRIBUTE 401
485*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_MISSING_ATTRIBUTE 402
486*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_NAS_IDENTIFICATION_MISMATCH 403
487*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_INVALID_REQUEST 404
488*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_UNSUPPORTED_SERVICE 405
489*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_UNSUPPORTED_EXTENSION 406
490*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_INVALID_ATTRIBUTE_VALUE 407
491*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_ADMINISTRATIVELY_PROHIBITED 501
492*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_PROXY_REQUEST_NOT_ROUTABLE 502
493*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_SESSION_CONTEXT_NOT_FOUND 503
494*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_SESSION_CONTEXT_NOT_REMOVABLE 504
495*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_PROXY_PROCESSING_ERROR 505
496*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_RESOURCES_UNAVAILABLE 506
497*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_REQUEST_INITIATED 507
498*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_MULTIPLE_SESSION_SELECTION_UNSUPPORTED 508
499*ed775ee7SAntonio Huete Jimenez #define ERROR_CAUSE_LOCATION_INFO_REQUIRED 509
500*ed775ee7SAntonio Huete Jimenez static const struct tok errorcausetype[] = {
501*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_RESIDUAL_CONTEXT_REMOVED,               "Residual Session Context Removed" },
502*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_INVALID_EAP_PACKET,                     "Invalid EAP Packet (Ignored)" },
503*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_UNSUPPORTED_ATTRIBUTE,                  "Unsupported Attribute" },
504*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_MISSING_ATTRIBUTE,                      "Missing Attribute" },
505*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_NAS_IDENTIFICATION_MISMATCH,            "NAS Identification Mismatch" },
506*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_INVALID_REQUEST,                        "Invalid Request" },
507*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_UNSUPPORTED_SERVICE,                    "Unsupported Service" },
508*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_UNSUPPORTED_EXTENSION,                  "Unsupported Extension" },
509*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_INVALID_ATTRIBUTE_VALUE,                "Invalid Attribute Value" },
510*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_ADMINISTRATIVELY_PROHIBITED,            "Administratively Prohibited" },
511*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_PROXY_REQUEST_NOT_ROUTABLE,             "Request Not Routable (Proxy)" },
512*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_SESSION_CONTEXT_NOT_FOUND,              "Session Context Not Found" },
513*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_SESSION_CONTEXT_NOT_REMOVABLE,          "Session Context Not Removable" },
514*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_PROXY_PROCESSING_ERROR,                 "Other Proxy Processing Error" },
515*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_RESOURCES_UNAVAILABLE,                  "Resources Unavailable" },
516*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_REQUEST_INITIATED,                      "Request Initiated" },
517*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_MULTIPLE_SESSION_SELECTION_UNSUPPORTED, "Multiple Session Selection Unsupported" },
518*ed775ee7SAntonio Huete Jimenez                                  { ERROR_CAUSE_LOCATION_INFO_REQUIRED,                 "Location Info Required" },
519*ed775ee7SAntonio Huete Jimenez 																 { 0, NULL }
520*ed775ee7SAntonio Huete Jimenez                                };
52141c99275SPeter Avalos 
522*ed775ee7SAntonio Huete Jimenez /* MIP6-Feature-Vector standard values */
523*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/aaa-parameters/aaa-parameters.xhtml */
524*ed775ee7SAntonio Huete Jimenez #define MIP6_INTEGRATED 0x0000000000000001
525*ed775ee7SAntonio Huete Jimenez #define LOCAL_HOME_AGENT_ASSIGNMENT 0x0000000000000002
526*ed775ee7SAntonio Huete Jimenez #define PMIP6_SUPPORTED 0x0000010000000000
527*ed775ee7SAntonio Huete Jimenez #define IP4_HOA_SUPPORTED 0x0000020000000000
528*ed775ee7SAntonio Huete Jimenez #define LOCAL_MAG_ROUTING_SUPPORTED 0x0000040000000000
529*ed775ee7SAntonio Huete Jimenez #define ASSIGN_LOCAL_IP 0x0000080000000000
530*ed775ee7SAntonio Huete Jimenez #define MIP4_SUPPORTED 0x0000100000000000
531*ed775ee7SAntonio Huete Jimenez #define OPTIMIZED_IDLE_MODE_MOBILITY 0x0000200000000000
532*ed775ee7SAntonio Huete Jimenez #define GTPv2_SUPPORTED 0x0000400000000000
533*ed775ee7SAntonio Huete Jimenez #define IP4_TRANSPORT_SUPPORTED 0x0000800000000000
534*ed775ee7SAntonio Huete Jimenez #define IP4_HOA_ONLY_SUPPORTED 0x0001000000000000
535*ed775ee7SAntonio Huete Jimenez #define INTER_MAG_ROUTING_SUPPORTED 0x0002000000000000
536*ed775ee7SAntonio Huete Jimenez static const struct mip6_feature_vector {
537*ed775ee7SAntonio Huete Jimenez                   uint64_t v;
538*ed775ee7SAntonio Huete Jimenez                   const char *s;
539*ed775ee7SAntonio Huete Jimenez                 } mip6_feature_vector[] = {
540*ed775ee7SAntonio Huete Jimenez                                  { MIP6_INTEGRATED,             "MIP6_INTEGRATED" },
541*ed775ee7SAntonio Huete Jimenez                                  { LOCAL_HOME_AGENT_ASSIGNMENT, "LOCAL_HOME_AGENT_ASSIGNMENT" },
542*ed775ee7SAntonio Huete Jimenez                                  { PMIP6_SUPPORTED,             "PMIP6_SUPPORTED" },
543*ed775ee7SAntonio Huete Jimenez                                  { IP4_HOA_SUPPORTED,           "IP4_HOA_SUPPORTED" },
544*ed775ee7SAntonio Huete Jimenez                                  { LOCAL_MAG_ROUTING_SUPPORTED, "LOCAL_MAG_ROUTING_SUPPORTED" },
545*ed775ee7SAntonio Huete Jimenez                                  { ASSIGN_LOCAL_IP,             "ASSIGN_LOCAL_IP" },
546*ed775ee7SAntonio Huete Jimenez                                  { MIP4_SUPPORTED,              "MIP4_SUPPORTED" },
547*ed775ee7SAntonio Huete Jimenez                                  { OPTIMIZED_IDLE_MODE_MOBILITY, "OPTIMIZED_IDLE_MODE_MOBILITY" },
548*ed775ee7SAntonio Huete Jimenez                                  { GTPv2_SUPPORTED,             "GTPv2_SUPPORTED" },
549*ed775ee7SAntonio Huete Jimenez                                  { IP4_TRANSPORT_SUPPORTED,     "IP4_TRANSPORT_SUPPORTED" },
550*ed775ee7SAntonio Huete Jimenez                                  { IP4_HOA_ONLY_SUPPORTED,      "IP4_HOA_ONLY_SUPPORTED" },
551*ed775ee7SAntonio Huete Jimenez                                  { INTER_MAG_ROUTING_SUPPORTED, "INTER_MAG_ROUTING_SUPPORTED" },
552*ed775ee7SAntonio Huete Jimenez                                };
553*ed775ee7SAntonio Huete Jimenez 
554*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-19 */
555*ed775ee7SAntonio Huete Jimenez #define OPERATOR_NAME_TADIG 0x30
556*ed775ee7SAntonio Huete Jimenez #define OPERATOR_NAME_REALM 0x31
557*ed775ee7SAntonio Huete Jimenez #define OPERATOR_NAME_E212  0x32
558*ed775ee7SAntonio Huete Jimenez #define OPERATOR_NAME_ICC   0x33
559*ed775ee7SAntonio Huete Jimenez static const struct tok operator_name_vector[] = {
560*ed775ee7SAntonio Huete Jimenez                                  { OPERATOR_NAME_TADIG, "TADIG" },
561*ed775ee7SAntonio Huete Jimenez                                  { OPERATOR_NAME_REALM, "REALM" },
562*ed775ee7SAntonio Huete Jimenez                                  { OPERATOR_NAME_E212,  "E212"  },
563*ed775ee7SAntonio Huete Jimenez                                  { OPERATOR_NAME_ICC,   "ICC"   },
564*ed775ee7SAntonio Huete Jimenez                                  { 0, NULL }
565*ed775ee7SAntonio Huete Jimenez                                };
566*ed775ee7SAntonio Huete Jimenez 
567*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-20 */
568*ed775ee7SAntonio Huete Jimenez #define LOCATION_INFORMATION_CODE_CIVIC      0
569*ed775ee7SAntonio Huete Jimenez #define LOCATION_INFORMATION_CODE_GEOSPATIAL 1
570*ed775ee7SAntonio Huete Jimenez static const struct tok location_information_code_vector[] = {
571*ed775ee7SAntonio Huete Jimenez                                  { LOCATION_INFORMATION_CODE_CIVIC     , "Civic"      },
572*ed775ee7SAntonio Huete Jimenez                                  { LOCATION_INFORMATION_CODE_GEOSPATIAL, "Geospatial" },
573*ed775ee7SAntonio Huete Jimenez                                  { 0, NULL }
574*ed775ee7SAntonio Huete Jimenez                                };
575*ed775ee7SAntonio Huete Jimenez 
576*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-21 */
577*ed775ee7SAntonio Huete Jimenez #define LOCATION_INFORMATION_ENTITY_USER   0
578*ed775ee7SAntonio Huete Jimenez #define LOCATION_INFORMATION_ENTITY_RADIUS 1
579*ed775ee7SAntonio Huete Jimenez static const struct tok location_information_entity_vector[] = {
580*ed775ee7SAntonio Huete Jimenez                                  { LOCATION_INFORMATION_ENTITY_USER,   "User"   },
581*ed775ee7SAntonio Huete Jimenez                                  { LOCATION_INFORMATION_ENTITY_RADIUS, "RADIUS" },
582*ed775ee7SAntonio Huete Jimenez                                  { 0, NULL }
583*ed775ee7SAntonio Huete Jimenez                                };
584*ed775ee7SAntonio Huete Jimenez 
585*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-22 */
586*ed775ee7SAntonio Huete Jimenez static const struct tok blpr_bm[] = {
587*ed775ee7SAntonio Huete Jimenez                                  { 0x0001, "MBZ-15" },
588*ed775ee7SAntonio Huete Jimenez                                  { 0x0002, "MBZ-14" },
589*ed775ee7SAntonio Huete Jimenez                                  { 0x0004, "MBZ-13" },
590*ed775ee7SAntonio Huete Jimenez                                  { 0x0008, "MBZ-12" },
591*ed775ee7SAntonio Huete Jimenez                                  { 0x0010, "MBZ-11" },
592*ed775ee7SAntonio Huete Jimenez                                  { 0x0020, "MBZ-10" },
593*ed775ee7SAntonio Huete Jimenez                                  { 0x0040, "MBZ-9" },
594*ed775ee7SAntonio Huete Jimenez                                  { 0x0080, "MBZ-8" },
595*ed775ee7SAntonio Huete Jimenez                                  { 0x0100, "MBZ-7" },
596*ed775ee7SAntonio Huete Jimenez                                  { 0x0200, "MBZ-6" },
597*ed775ee7SAntonio Huete Jimenez                                  { 0x0400, "MBZ-5" },
598*ed775ee7SAntonio Huete Jimenez                                  { 0x0800, "MBZ-4" },
599*ed775ee7SAntonio Huete Jimenez                                  { 0x1000, "MBZ-3" },
600*ed775ee7SAntonio Huete Jimenez                                  { 0x2000, "MBZ-2" },
601*ed775ee7SAntonio Huete Jimenez                                  { 0x4000, "MBZ-1" },
602*ed775ee7SAntonio Huete Jimenez                                  { 0x8000, "Retransmission Allowed" },
603*ed775ee7SAntonio Huete Jimenez                                  { 0, NULL }
604*ed775ee7SAntonio Huete Jimenez                                };
605*ed775ee7SAntonio Huete Jimenez 
606*ed775ee7SAntonio Huete Jimenez /* https://www.iana.org/assignments/radius-types/radius-types.xhtml#radius-types-2 */
607*ed775ee7SAntonio Huete Jimenez static const struct attrtype {
608411677aeSAaron LI                   const char *name;      /* Attribute name                 */
60941c99275SPeter Avalos                   const char **subtypes; /* Standard Values (if any)       */
61041c99275SPeter Avalos                   u_char siz_subtypes;   /* Size of total standard values  */
61141c99275SPeter Avalos                   u_char first_subtype;  /* First standard value is 0 or 1 */
612*ed775ee7SAntonio Huete Jimenez                   void (*print_func)(netdissect_options *, const u_char *, u_int, u_short);
61341c99275SPeter Avalos                 } attr_type[]=
61441c99275SPeter Avalos   {
61541c99275SPeter Avalos      { NULL,                              NULL, 0, 0, NULL               },
616411677aeSAaron LI      { "User-Name",                       NULL, 0, 0, print_attr_string  },
617411677aeSAaron LI      { "User-Password",                   NULL, 0, 0, NULL               },
618411677aeSAaron LI      { "CHAP-Password",                   NULL, 0, 0, NULL               },
619411677aeSAaron LI      { "NAS-IP-Address",                  NULL, 0, 0, print_attr_address },
620411677aeSAaron LI      { "NAS-Port",                        NULL, 0, 0, print_attr_num     },
621411677aeSAaron LI      { "Service-Type",                    serv_type, TAM_SIZE(serv_type)-1, 1, print_attr_num },
622411677aeSAaron LI      { "Framed-Protocol",                 frm_proto, TAM_SIZE(frm_proto)-1, 1, print_attr_num },
623411677aeSAaron LI      { "Framed-IP-Address",               NULL, 0, 0, print_attr_address },
624411677aeSAaron LI      { "Framed-IP-Netmask",               NULL, 0, 0, print_attr_address },
625*ed775ee7SAntonio Huete Jimenez      /* ^ [0, 9] ^ */
626411677aeSAaron LI      { "Framed-Routing",                  frm_routing, TAM_SIZE(frm_routing), 0, print_attr_num },
627411677aeSAaron LI      { "Filter-Id",                       NULL, 0, 0, print_attr_string  },
628411677aeSAaron LI      { "Framed-MTU",                      NULL, 0, 0, print_attr_num     },
629411677aeSAaron LI      { "Framed-Compression",              frm_comp, TAM_SIZE(frm_comp),   0, print_attr_num },
630411677aeSAaron LI      { "Login-IP-Host",                   NULL, 0, 0, print_attr_address },
631411677aeSAaron LI      { "Login-Service",                   login_serv, TAM_SIZE(login_serv), 0, print_attr_num },
632411677aeSAaron LI      { "Login-TCP-Port",                  NULL, 0, 0, print_attr_num     },
63341c99275SPeter Avalos      { "Unassigned",                      NULL, 0, 0, NULL }, /*17*/
634411677aeSAaron LI      { "Reply-Message",                   NULL, 0, 0, print_attr_string },
635411677aeSAaron LI      { "Callback-Number",                 NULL, 0, 0, print_attr_string },
636*ed775ee7SAntonio Huete Jimenez      /* ^ [10, 19] ^ */
637411677aeSAaron LI      { "Callback-Id",                     NULL, 0, 0, print_attr_string },
63841c99275SPeter Avalos      { "Unassigned",                      NULL, 0, 0, NULL }, /*21*/
639411677aeSAaron LI      { "Framed-Route",                    NULL, 0, 0, print_attr_string },
640411677aeSAaron LI      { "Framed-IPX-Network",              NULL, 0, 0, print_attr_num    },
64141c99275SPeter Avalos      { "State",                           NULL, 0, 0, print_attr_string },
64241c99275SPeter Avalos      { "Class",                           NULL, 0, 0, print_attr_string },
643411677aeSAaron LI      { "Vendor-Specific",                 NULL, 0, 0, print_vendor_attr },
644411677aeSAaron LI      { "Session-Timeout",                 NULL, 0, 0, print_attr_num    },
645411677aeSAaron LI      { "Idle-Timeout",                    NULL, 0, 0, print_attr_num    },
646411677aeSAaron LI      { "Termination-Action",              term_action, TAM_SIZE(term_action), 0, print_attr_num },
647*ed775ee7SAntonio Huete Jimenez      /* ^ [20, 29] ^ */
648411677aeSAaron LI      { "Called-Station-Id",               NULL, 0, 0, print_attr_string },
649411677aeSAaron LI      { "Calling-Station-Id",              NULL, 0, 0, print_attr_string },
650411677aeSAaron LI      { "NAS-Identifier",                  NULL, 0, 0, print_attr_string },
651411677aeSAaron LI      { "Proxy-State",                     NULL, 0, 0, print_attr_string },
652411677aeSAaron LI      { "Login-LAT-Service",               NULL, 0, 0, print_attr_string },
653411677aeSAaron LI      { "Login-LAT-Node",                  NULL, 0, 0, print_attr_string },
654411677aeSAaron LI      { "Login-LAT-Group",                 NULL, 0, 0, print_attr_string },
655411677aeSAaron LI      { "Framed-AppleTalk-Link",           NULL, 0, 0, print_attr_num    },
656411677aeSAaron LI      { "Framed-AppleTalk-Network",        NULL, 0, 0, print_attr_num    },
657411677aeSAaron LI      { "Framed-AppleTalk-Zone",           NULL, 0, 0, print_attr_string },
658*ed775ee7SAntonio Huete Jimenez      /* ^ [30, 39] ^ */
659411677aeSAaron LI      { "Acct-Status-Type",                acct_status, TAM_SIZE(acct_status)-1, 1, print_attr_num },
660411677aeSAaron LI      { "Acct-Delay-Time",                 NULL, 0, 0, print_attr_num    },
661411677aeSAaron LI      { "Acct-Input-Octets",               NULL, 0, 0, print_attr_num    },
662411677aeSAaron LI      { "Acct-Output-Octets",              NULL, 0, 0, print_attr_num    },
663411677aeSAaron LI      { "Acct-Session-Id",                 NULL, 0, 0, print_attr_string },
664411677aeSAaron LI      { "Acct-Authentic",                  acct_auth, TAM_SIZE(acct_auth)-1, 1, print_attr_num },
665411677aeSAaron LI      { "Acct-Session-Time",               NULL, 0, 0, print_attr_num },
666411677aeSAaron LI      { "Acct-Input-Packets",              NULL, 0, 0, print_attr_num },
667411677aeSAaron LI      { "Acct-Output-Packets",             NULL, 0, 0, print_attr_num },
668411677aeSAaron LI      { "Acct-Terminate-Cause",            acct_term, TAM_SIZE(acct_term)-1, 1, print_attr_num },
669*ed775ee7SAntonio Huete Jimenez      /* ^ [40, 49] ^ */
670411677aeSAaron LI      { "Acct-Multi-Session-Id",           NULL, 0, 0, print_attr_string },
671411677aeSAaron LI      { "Acct-Link-Count",                 NULL, 0, 0, print_attr_num },
672411677aeSAaron LI      { "Acct-Input-Gigawords",            NULL, 0, 0, print_attr_num },
673411677aeSAaron LI      { "Acct-Output-Gigawords",           NULL, 0, 0, print_attr_num },
67441c99275SPeter Avalos      { "Unassigned",                      NULL, 0, 0, NULL }, /*54*/
675411677aeSAaron LI      { "Event-Timestamp",                 NULL, 0, 0, print_attr_time },
676411677aeSAaron LI      { "Egress-VLANID",                   NULL, 0, 0, print_attr_num },
677411677aeSAaron LI      { "Ingress-Filters",                 ingress_filters, TAM_SIZE(ingress_filters)-1, 1, print_attr_num },
678411677aeSAaron LI      { "Egress-VLAN-Name",                NULL, 0, 0, print_attr_string },
679411677aeSAaron LI      { "User-Priority-Table",             NULL, 0, 0, NULL },
680*ed775ee7SAntonio Huete Jimenez      /* ^ [50, 59] ^ */
681411677aeSAaron LI      { "CHAP-Challenge",                  NULL, 0, 0, print_attr_string },
682411677aeSAaron LI      { "NAS-Port-Type",                   nas_port_type, TAM_SIZE(nas_port_type), 0, print_attr_num },
683411677aeSAaron LI      { "Port-Limit",                      NULL, 0, 0, print_attr_num },
684411677aeSAaron LI      { "Login-LAT-Port",                  NULL, 0, 0, print_attr_string }, /*63*/
685411677aeSAaron LI      { "Tunnel-Type",                     tunnel_type, TAM_SIZE(tunnel_type)-1, 1, print_attr_num },
686411677aeSAaron LI      { "Tunnel-Medium-Type",              tunnel_medium, TAM_SIZE(tunnel_medium)-1, 1, print_attr_num },
687411677aeSAaron LI      { "Tunnel-Client-Endpoint",          NULL, 0, 0, print_attr_string },
688411677aeSAaron LI      { "Tunnel-Server-Endpoint",          NULL, 0, 0, print_attr_string },
689411677aeSAaron LI      { "Acct-Tunnel-Connection",          NULL, 0, 0, print_attr_string },
690411677aeSAaron LI      { "Tunnel-Password",                 NULL, 0, 0, print_attr_string  },
691*ed775ee7SAntonio Huete Jimenez      /* ^ [60, 69] ^ */
692411677aeSAaron LI      { "ARAP-Password",                   NULL, 0, 0, print_attr_strange },
693411677aeSAaron LI      { "ARAP-Features",                   NULL, 0, 0, print_attr_strange },
694411677aeSAaron LI      { "ARAP-Zone-Access",                arap_zone, TAM_SIZE(arap_zone)-1, 1, print_attr_num }, /*72*/
695411677aeSAaron LI      { "ARAP-Security",                   NULL, 0, 0, print_attr_string },
696411677aeSAaron LI      { "ARAP-Security-Data",              NULL, 0, 0, print_attr_string },
697411677aeSAaron LI      { "Password-Retry",                  NULL, 0, 0, print_attr_num    },
69841c99275SPeter Avalos      { "Prompt",                          prompt, TAM_SIZE(prompt), 0, print_attr_num },
699411677aeSAaron LI      { "Connect-Info",                    NULL, 0, 0, print_attr_string   },
700411677aeSAaron LI      { "Configuration-Token",             NULL, 0, 0, print_attr_string   },
701411677aeSAaron LI      { "EAP-Message",                     NULL, 0, 0, print_attr_string   },
702*ed775ee7SAntonio Huete Jimenez      /* ^ [70, 79] ^ */
703411677aeSAaron LI      { "Message-Authenticator",           NULL, 0, 0, print_attr_string }, /*80*/
704411677aeSAaron LI      { "Tunnel-Private-Group-ID",         NULL, 0, 0, print_attr_string },
705411677aeSAaron LI      { "Tunnel-Assignment-ID",            NULL, 0, 0, print_attr_string },
706411677aeSAaron LI      { "Tunnel-Preference",               NULL, 0, 0, print_attr_num    },
707411677aeSAaron LI      { "ARAP-Challenge-Response",         NULL, 0, 0, print_attr_strange },
708411677aeSAaron LI      { "Acct-Interim-Interval",           NULL, 0, 0, print_attr_num     },
709411677aeSAaron LI      { "Acct-Tunnel-Packets-Lost",        NULL, 0, 0, print_attr_num }, /*86*/
710411677aeSAaron LI      { "NAS-Port-Id",                     NULL, 0, 0, print_attr_string },
711411677aeSAaron LI      { "Framed-Pool",                     NULL, 0, 0, print_attr_string },
712411677aeSAaron LI      { "CUI",                             NULL, 0, 0, print_attr_string },
713*ed775ee7SAntonio Huete Jimenez      /* ^ [80, 89] ^ */
714411677aeSAaron LI      { "Tunnel-Client-Auth-ID",           NULL, 0, 0, print_attr_string },
715411677aeSAaron LI      { "Tunnel-Server-Auth-ID",           NULL, 0, 0, print_attr_string },
716*ed775ee7SAntonio Huete Jimenez      { "NAS-Filter-Rule",                 NULL, 0, 0, print_attr_string },
717*ed775ee7SAntonio Huete Jimenez      { "Unassigned",                      NULL, 0, 0, NULL },  /*93*/
718*ed775ee7SAntonio Huete Jimenez      { "Originating-Line-Info",           NULL, 0, 0, NULL },
719*ed775ee7SAntonio Huete Jimenez      { "NAS-IPv6-Address",                NULL, 0, 0, print_attr_address6 },
720*ed775ee7SAntonio Huete Jimenez      { "Framed-Interface-ID",             NULL, 0, 0, NULL },
721*ed775ee7SAntonio Huete Jimenez      { "Framed-IPv6-Prefix",              NULL, 0, 0, print_attr_netmask6 },
722*ed775ee7SAntonio Huete Jimenez      { "Login-IPv6-Host",                 NULL, 0, 0, print_attr_address6 },
723*ed775ee7SAntonio Huete Jimenez      { "Framed-IPv6-Route",               NULL, 0, 0, print_attr_string },
724*ed775ee7SAntonio Huete Jimenez      /* ^ [90, 99] ^ */
725*ed775ee7SAntonio Huete Jimenez      { "Framed-IPv6-Pool",                NULL, 0, 0, print_attr_string },
726*ed775ee7SAntonio Huete Jimenez      { "Error-Cause",                     NULL, 0, 0, print_attr_strange },
727*ed775ee7SAntonio Huete Jimenez      { "EAP-Key-Name",                    NULL, 0, 0, NULL },
728*ed775ee7SAntonio Huete Jimenez      { "Digest-Response",                 NULL, 0, 0, print_attr_string },
729*ed775ee7SAntonio Huete Jimenez      { "Digest-Realm",                    NULL, 0, 0, print_attr_string },
730*ed775ee7SAntonio Huete Jimenez      { "Digest-Nonce",                    NULL, 0, 0, print_attr_string },
731*ed775ee7SAntonio Huete Jimenez      { "Digest-Response-Auth",            NULL, 0, 0, print_attr_string },
732*ed775ee7SAntonio Huete Jimenez      { "Digest-Nextnonce",                NULL, 0, 0, print_attr_string },
733*ed775ee7SAntonio Huete Jimenez      { "Digest-Method",                   NULL, 0, 0, print_attr_string },
734*ed775ee7SAntonio Huete Jimenez      { "Digest-URI",                      NULL, 0, 0, print_attr_string },
735*ed775ee7SAntonio Huete Jimenez      /* ^ [100, 109] ^ */
736*ed775ee7SAntonio Huete Jimenez      { "Digest-Qop",                      NULL, 0, 0, print_attr_string },
737*ed775ee7SAntonio Huete Jimenez      { "Digest-Algorithm",                NULL, 0, 0, print_attr_string },
738*ed775ee7SAntonio Huete Jimenez      { "Digest-Entity-Body-Hash",         NULL, 0, 0, print_attr_string },
739*ed775ee7SAntonio Huete Jimenez      { "Digest-CNonce",                   NULL, 0, 0, print_attr_string },
740*ed775ee7SAntonio Huete Jimenez      { "Digest-Nonce-Count",              NULL, 0, 0, print_attr_string },
741*ed775ee7SAntonio Huete Jimenez      { "Digest-Username",                 NULL, 0, 0, print_attr_string },
742*ed775ee7SAntonio Huete Jimenez      { "Digest-Opaque",                   NULL, 0, 0, print_attr_string },
743*ed775ee7SAntonio Huete Jimenez      { "Digest-Auth-Param",               NULL, 0, 0, print_attr_string },
744*ed775ee7SAntonio Huete Jimenez      { "Digest-AKA-Auts",                 NULL, 0, 0, print_attr_string },
745*ed775ee7SAntonio Huete Jimenez      { "Digest-Domain",                   NULL, 0, 0, print_attr_string },
746*ed775ee7SAntonio Huete Jimenez      /* ^ [110, 119] ^ */
747*ed775ee7SAntonio Huete Jimenez      { "Digest-Stale",                    NULL, 0, 0, print_attr_string },
748*ed775ee7SAntonio Huete Jimenez      { "Digest-HA1",                      NULL, 0, 0, print_attr_string },
749*ed775ee7SAntonio Huete Jimenez      { "SIP-AOR",                         NULL, 0, 0, print_attr_string },
750*ed775ee7SAntonio Huete Jimenez      { "Delegated-IPv6-Prefix",           NULL, 0, 0, print_attr_netmask6 },
751*ed775ee7SAntonio Huete Jimenez      { "MIP6-Feature-Vector",             NULL, 0, 0, print_attr_vector64 },
752*ed775ee7SAntonio Huete Jimenez      { "MIP6-Home-Link-Prefix",           NULL, 0, 0, print_attr_mip6_home_link_prefix },
753*ed775ee7SAntonio Huete Jimenez      { "Operator-Name",                   NULL, 0, 0, print_attr_operator_name },
754*ed775ee7SAntonio Huete Jimenez      { "Location-Information",            NULL, 0, 0, print_attr_location_information },
755*ed775ee7SAntonio Huete Jimenez      { "Location-Data",                   NULL, 0, 0, print_attr_location_data },
756*ed775ee7SAntonio Huete Jimenez      { "Basic-Location-Policy-Rules",     NULL, 0, 0, print_basic_location_policy_rules }
757*ed775ee7SAntonio Huete Jimenez      /* ^ [120, 129] ^ */
75841c99275SPeter Avalos   };
75941c99275SPeter Avalos 
76041c99275SPeter Avalos 
76141c99275SPeter Avalos /*****************************/
76241c99275SPeter Avalos /* Print an attribute string */
76341c99275SPeter Avalos /* value pointed by 'data'   */
76441c99275SPeter Avalos /* and 'length' size.        */
76541c99275SPeter Avalos /*****************************/
76641c99275SPeter Avalos /* Returns nothing.          */
76741c99275SPeter Avalos /*****************************/
76841c99275SPeter Avalos static void
print_attr_string(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code)769411677aeSAaron LI print_attr_string(netdissect_options *ndo,
770*ed775ee7SAntonio Huete Jimenez                   const u_char *data, u_int length, u_short attr_code)
77141c99275SPeter Avalos {
772*ed775ee7SAntonio Huete Jimenez    u_int i;
77341c99275SPeter Avalos 
774*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
77541c99275SPeter Avalos 
77641c99275SPeter Avalos    switch(attr_code)
77741c99275SPeter Avalos    {
77841c99275SPeter Avalos       case TUNNEL_PASS:
77941c99275SPeter Avalos            if (length < 3)
780411677aeSAaron LI               goto trunc;
781*ed775ee7SAntonio Huete Jimenez            if (GET_U_1(data) && (GET_U_1(data) <= 0x1F))
782*ed775ee7SAntonio Huete Jimenez               ND_PRINT("Tag[%u] ", GET_U_1(data));
783411677aeSAaron LI            else
784*ed775ee7SAntonio Huete Jimenez               ND_PRINT("Tag[Unused] ");
78541c99275SPeter Avalos            data++;
78641c99275SPeter Avalos            length--;
787*ed775ee7SAntonio Huete Jimenez            ND_PRINT("Salt %u ", GET_BE_U_2(data));
78841c99275SPeter Avalos            data+=2;
78941c99275SPeter Avalos            length-=2;
79041c99275SPeter Avalos         break;
79141c99275SPeter Avalos       case TUNNEL_CLIENT_END:
79241c99275SPeter Avalos       case TUNNEL_SERVER_END:
79341c99275SPeter Avalos       case TUNNEL_PRIV_GROUP:
79441c99275SPeter Avalos       case TUNNEL_ASSIGN_ID:
79541c99275SPeter Avalos       case TUNNEL_CLIENT_AUTH:
79641c99275SPeter Avalos       case TUNNEL_SERVER_AUTH:
797*ed775ee7SAntonio Huete Jimenez            if (GET_U_1(data) <= 0x1F)
79841c99275SPeter Avalos            {
79941c99275SPeter Avalos               if (length < 1)
800411677aeSAaron LI                  goto trunc;
801*ed775ee7SAntonio Huete Jimenez               if (GET_U_1(data))
802*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("Tag[%u] ", GET_U_1(data));
803411677aeSAaron LI               else
804*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("Tag[Unused] ");
80541c99275SPeter Avalos               data++;
80641c99275SPeter Avalos               length--;
80741c99275SPeter Avalos            }
80841c99275SPeter Avalos         break;
809411677aeSAaron LI       case EGRESS_VLAN_NAME:
810411677aeSAaron LI            if (length < 1)
811411677aeSAaron LI               goto trunc;
812*ed775ee7SAntonio Huete Jimenez            ND_PRINT("%s (0x%02x) ",
813*ed775ee7SAntonio Huete Jimenez                   tok2str(rfc4675_tagged,"Unknown tag",GET_U_1(data)),
814*ed775ee7SAntonio Huete Jimenez                   GET_U_1(data));
815411677aeSAaron LI            data++;
816411677aeSAaron LI            length--;
817411677aeSAaron LI         break;
818*ed775ee7SAntonio Huete Jimenez       case EAP_MESSAGE:
819*ed775ee7SAntonio Huete Jimenez            if (length < 1)
820*ed775ee7SAntonio Huete Jimenez               goto trunc;
821*ed775ee7SAntonio Huete Jimenez            eap_print(ndo, data, length);
822*ed775ee7SAntonio Huete Jimenez            return;
82341c99275SPeter Avalos    }
82441c99275SPeter Avalos 
825*ed775ee7SAntonio Huete Jimenez    for (i=0; i < length && GET_U_1(data); i++, data++)
826*ed775ee7SAntonio Huete Jimenez        ND_PRINT("%c", ND_ASCII_ISPRINT(GET_U_1(data)) ? GET_U_1(data) : '.');
82741c99275SPeter Avalos 
82841c99275SPeter Avalos    return;
82941c99275SPeter Avalos 
83041c99275SPeter Avalos    trunc:
831*ed775ee7SAntonio Huete Jimenez       nd_print_trunc(ndo);
83241c99275SPeter Avalos }
83341c99275SPeter Avalos 
83441c99275SPeter Avalos /*
83541c99275SPeter Avalos  * print vendor specific attributes
83641c99275SPeter Avalos  */
83741c99275SPeter Avalos static void
print_vendor_attr(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)838411677aeSAaron LI print_vendor_attr(netdissect_options *ndo,
839*ed775ee7SAntonio Huete Jimenez                   const u_char *data, u_int length, u_short attr_code _U_)
84041c99275SPeter Avalos {
84141c99275SPeter Avalos     u_int idx;
84241c99275SPeter Avalos     u_int vendor_id;
84341c99275SPeter Avalos     u_int vendor_type;
84441c99275SPeter Avalos     u_int vendor_length;
84541c99275SPeter Avalos 
84641c99275SPeter Avalos     if (length < 4)
84741c99275SPeter Avalos         goto trunc;
848*ed775ee7SAntonio Huete Jimenez     vendor_id = GET_BE_U_4(data);
84941c99275SPeter Avalos     data+=4;
85041c99275SPeter Avalos     length-=4;
85141c99275SPeter Avalos 
852*ed775ee7SAntonio Huete Jimenez     ND_PRINT("Vendor: %s (%u)",
85341c99275SPeter Avalos            tok2str(smi_values,"Unknown",vendor_id),
854*ed775ee7SAntonio Huete Jimenez            vendor_id);
85541c99275SPeter Avalos 
85641c99275SPeter Avalos     while (length >= 2) {
857*ed775ee7SAntonio Huete Jimenez         vendor_type = GET_U_1(data);
858*ed775ee7SAntonio Huete Jimenez         vendor_length = GET_U_1(data + 1);
85941c99275SPeter Avalos 
86041c99275SPeter Avalos         if (vendor_length < 2)
86141c99275SPeter Avalos         {
862*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Vendor Attribute: %u, Length: %u (bogus, must be >= 2)",
86341c99275SPeter Avalos                    vendor_type,
864*ed775ee7SAntonio Huete Jimenez                    vendor_length);
86541c99275SPeter Avalos             return;
86641c99275SPeter Avalos         }
86741c99275SPeter Avalos         if (vendor_length > length)
86841c99275SPeter Avalos         {
869*ed775ee7SAntonio Huete Jimenez             ND_PRINT("\n\t    Vendor Attribute: %u, Length: %u (bogus, goes past end of vendor-specific attribute)",
87041c99275SPeter Avalos                    vendor_type,
871*ed775ee7SAntonio Huete Jimenez                    vendor_length);
87241c99275SPeter Avalos             return;
87341c99275SPeter Avalos         }
87441c99275SPeter Avalos         data+=2;
87541c99275SPeter Avalos         vendor_length-=2;
87641c99275SPeter Avalos         length-=2;
877*ed775ee7SAntonio Huete Jimenez 	ND_TCHECK_LEN(data, vendor_length);
87841c99275SPeter Avalos 
879*ed775ee7SAntonio Huete Jimenez         ND_PRINT("\n\t    Vendor Attribute: %u, Length: %u, Value: ",
88041c99275SPeter Avalos                vendor_type,
881*ed775ee7SAntonio Huete Jimenez                vendor_length);
88241c99275SPeter Avalos         for (idx = 0; idx < vendor_length ; idx++, data++)
883*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%c", ND_ASCII_ISPRINT(GET_U_1(data)) ? GET_U_1(data) : '.');
88441c99275SPeter Avalos         length-=vendor_length;
88541c99275SPeter Avalos     }
88641c99275SPeter Avalos     return;
88741c99275SPeter Avalos 
88841c99275SPeter Avalos    trunc:
889*ed775ee7SAntonio Huete Jimenez      nd_print_trunc(ndo);
89041c99275SPeter Avalos }
89141c99275SPeter Avalos 
89241c99275SPeter Avalos /******************************/
89341c99275SPeter Avalos /* Print an attribute numeric */
89441c99275SPeter Avalos /* value pointed by 'data'    */
89541c99275SPeter Avalos /* and 'length' size.         */
89641c99275SPeter Avalos /******************************/
89741c99275SPeter Avalos /* Returns nothing.           */
89841c99275SPeter Avalos /******************************/
89941c99275SPeter Avalos static void
print_attr_num(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code)900411677aeSAaron LI print_attr_num(netdissect_options *ndo,
901*ed775ee7SAntonio Huete Jimenez                const u_char *data, u_int length, u_short attr_code)
90241c99275SPeter Avalos {
903411677aeSAaron LI    uint32_t timeout;
90441c99275SPeter Avalos 
90541c99275SPeter Avalos    if (length != 4)
90641c99275SPeter Avalos    {
907*ed775ee7SAntonio Huete Jimenez        ND_PRINT("ERROR: length %u != 4", length);
90841c99275SPeter Avalos        return;
90941c99275SPeter Avalos    }
91041c99275SPeter Avalos 
91141c99275SPeter Avalos                           /* This attribute has standard values */
91241c99275SPeter Avalos    if (attr_type[attr_code].siz_subtypes)
91341c99275SPeter Avalos    {
91441c99275SPeter Avalos       static const char **table;
915411677aeSAaron LI       uint32_t data_value;
91641c99275SPeter Avalos       table = attr_type[attr_code].subtypes;
91741c99275SPeter Avalos 
91841c99275SPeter Avalos       if ( (attr_code == TUNNEL_TYPE) || (attr_code == TUNNEL_MEDIUM) )
91941c99275SPeter Avalos       {
920*ed775ee7SAntonio Huete Jimenez          if (!GET_U_1(data))
921*ed775ee7SAntonio Huete Jimenez             ND_PRINT("Tag[Unused] ");
92241c99275SPeter Avalos          else
923*ed775ee7SAntonio Huete Jimenez             ND_PRINT("Tag[%u] ", GET_U_1(data));
92441c99275SPeter Avalos          data++;
925*ed775ee7SAntonio Huete Jimenez          data_value = GET_BE_U_3(data);
92641c99275SPeter Avalos       }
92741c99275SPeter Avalos       else
92841c99275SPeter Avalos       {
929*ed775ee7SAntonio Huete Jimenez          data_value = GET_BE_U_4(data);
93041c99275SPeter Avalos       }
931411677aeSAaron LI       if ( data_value <= (uint32_t)(attr_type[attr_code].siz_subtypes - 1 +
93241c99275SPeter Avalos             attr_type[attr_code].first_subtype) &&
93341c99275SPeter Avalos 	   data_value >= attr_type[attr_code].first_subtype )
934*ed775ee7SAntonio Huete Jimenez          ND_PRINT("%s", table[data_value]);
93541c99275SPeter Avalos       else
936*ed775ee7SAntonio Huete Jimenez          ND_PRINT("#%u", data_value);
93741c99275SPeter Avalos    }
93841c99275SPeter Avalos    else
93941c99275SPeter Avalos    {
94041c99275SPeter Avalos       switch(attr_code) /* Be aware of special cases... */
94141c99275SPeter Avalos       {
94241c99275SPeter Avalos         case FRM_IPX:
943*ed775ee7SAntonio Huete Jimenez              if (GET_BE_U_4(data) == 0xFFFFFFFE )
944*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("NAS Select");
94541c99275SPeter Avalos              else
946*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%u", GET_BE_U_4(data));
94741c99275SPeter Avalos           break;
94841c99275SPeter Avalos 
94941c99275SPeter Avalos         case SESSION_TIMEOUT:
95041c99275SPeter Avalos         case IDLE_TIMEOUT:
95141c99275SPeter Avalos         case ACCT_DELAY:
95241c99275SPeter Avalos         case ACCT_SESSION_TIME:
95341c99275SPeter Avalos         case ACCT_INT_INTERVAL:
954*ed775ee7SAntonio Huete Jimenez              timeout = GET_BE_U_4(data);
95541c99275SPeter Avalos              if ( timeout < 60 )
956*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%02d secs", timeout);
95741c99275SPeter Avalos              else
95841c99275SPeter Avalos              {
95941c99275SPeter Avalos                 if ( timeout < 3600 )
960*ed775ee7SAntonio Huete Jimenez                    ND_PRINT("%02d:%02d min",
961*ed775ee7SAntonio Huete Jimenez                           timeout / 60, timeout % 60);
96241c99275SPeter Avalos                 else
963*ed775ee7SAntonio Huete Jimenez                    ND_PRINT("%02d:%02d:%02d hours",
96441c99275SPeter Avalos                           timeout / 3600, (timeout % 3600) / 60,
965*ed775ee7SAntonio Huete Jimenez                           timeout % 60);
96641c99275SPeter Avalos              }
96741c99275SPeter Avalos           break;
96841c99275SPeter Avalos 
96941c99275SPeter Avalos         case FRM_ATALK_LINK:
970*ed775ee7SAntonio Huete Jimenez              if (GET_BE_U_4(data))
971*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%u", GET_BE_U_4(data));
97241c99275SPeter Avalos              else
973*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("Unnumbered");
97441c99275SPeter Avalos           break;
97541c99275SPeter Avalos 
97641c99275SPeter Avalos         case FRM_ATALK_NETWORK:
977*ed775ee7SAntonio Huete Jimenez              if (GET_BE_U_4(data))
978*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("%u", GET_BE_U_4(data));
97941c99275SPeter Avalos              else
980*ed775ee7SAntonio Huete Jimenez                 ND_PRINT("NAS assigned");
98141c99275SPeter Avalos           break;
98241c99275SPeter Avalos 
98341c99275SPeter Avalos         case TUNNEL_PREFERENCE:
984*ed775ee7SAntonio Huete Jimenez             if (GET_U_1(data))
985*ed775ee7SAntonio Huete Jimenez                ND_PRINT("Tag[%u] ", GET_U_1(data));
98641c99275SPeter Avalos             else
987*ed775ee7SAntonio Huete Jimenez                ND_PRINT("Tag[Unused] ");
988411677aeSAaron LI             data++;
989*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%u", GET_BE_U_3(data));
990411677aeSAaron LI           break;
991411677aeSAaron LI 
992411677aeSAaron LI         case EGRESS_VLAN_ID:
993*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%s (0x%02x) ",
994*ed775ee7SAntonio Huete Jimenez                    tok2str(rfc4675_tagged,"Unknown tag",GET_U_1(data)),
995*ed775ee7SAntonio Huete Jimenez                    GET_U_1(data));
996411677aeSAaron LI             data++;
997*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%u", GET_BE_U_3(data));
99841c99275SPeter Avalos           break;
99941c99275SPeter Avalos 
100041c99275SPeter Avalos         default:
1001*ed775ee7SAntonio Huete Jimenez              ND_PRINT("%u", GET_BE_U_4(data));
100241c99275SPeter Avalos           break;
100341c99275SPeter Avalos 
100441c99275SPeter Avalos       } /* switch */
100541c99275SPeter Avalos 
100641c99275SPeter Avalos    } /* if-else */
100741c99275SPeter Avalos }
100841c99275SPeter Avalos 
100941c99275SPeter Avalos /*****************************/
101041c99275SPeter Avalos /* Print an attribute IPv4   */
101141c99275SPeter Avalos /* address value pointed by  */
101241c99275SPeter Avalos /* 'data' and 'length' size. */
101341c99275SPeter Avalos /*****************************/
101441c99275SPeter Avalos /* Returns nothing.          */
101541c99275SPeter Avalos /*****************************/
101641c99275SPeter Avalos static void
print_attr_address(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code)1017411677aeSAaron LI print_attr_address(netdissect_options *ndo,
1018*ed775ee7SAntonio Huete Jimenez                    const u_char *data, u_int length, u_short attr_code)
101941c99275SPeter Avalos {
102041c99275SPeter Avalos    if (length != 4)
102141c99275SPeter Avalos    {
1022*ed775ee7SAntonio Huete Jimenez        ND_PRINT("ERROR: length %u != 4", length);
102341c99275SPeter Avalos        return;
102441c99275SPeter Avalos    }
102541c99275SPeter Avalos 
102641c99275SPeter Avalos    switch(attr_code)
102741c99275SPeter Avalos    {
102841c99275SPeter Avalos       case FRM_IPADDR:
102941c99275SPeter Avalos       case LOG_IPHOST:
1030*ed775ee7SAntonio Huete Jimenez            if (GET_BE_U_4(data) == 0xFFFFFFFF )
1031*ed775ee7SAntonio Huete Jimenez               ND_PRINT("User Selected");
103241c99275SPeter Avalos            else
1033*ed775ee7SAntonio Huete Jimenez               if (GET_BE_U_4(data) == 0xFFFFFFFE )
1034*ed775ee7SAntonio Huete Jimenez                  ND_PRINT("NAS Select");
103541c99275SPeter Avalos               else
1036*ed775ee7SAntonio Huete Jimenez                  ND_PRINT("%s",GET_IPADDR_STRING(data));
103741c99275SPeter Avalos       break;
103841c99275SPeter Avalos 
103941c99275SPeter Avalos       default:
1040*ed775ee7SAntonio Huete Jimenez           ND_PRINT("%s", GET_IPADDR_STRING(data));
104141c99275SPeter Avalos       break;
104241c99275SPeter Avalos    }
1043*ed775ee7SAntonio Huete Jimenez }
1044*ed775ee7SAntonio Huete Jimenez 
1045*ed775ee7SAntonio Huete Jimenez /*****************************/
1046*ed775ee7SAntonio Huete Jimenez /* Print an attribute IPv6   */
1047*ed775ee7SAntonio Huete Jimenez /* address value pointed by  */
1048*ed775ee7SAntonio Huete Jimenez /* 'data' and 'length' size. */
1049*ed775ee7SAntonio Huete Jimenez /*****************************/
1050*ed775ee7SAntonio Huete Jimenez /* Returns nothing.          */
1051*ed775ee7SAntonio Huete Jimenez /*****************************/
1052*ed775ee7SAntonio Huete Jimenez static void
print_attr_address6(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1053*ed775ee7SAntonio Huete Jimenez print_attr_address6(netdissect_options *ndo,
1054*ed775ee7SAntonio Huete Jimenez                    const u_char *data, u_int length, u_short attr_code _U_)
1055*ed775ee7SAntonio Huete Jimenez {
1056*ed775ee7SAntonio Huete Jimenez    if (length != 16)
1057*ed775ee7SAntonio Huete Jimenez    {
1058*ed775ee7SAntonio Huete Jimenez        ND_PRINT("ERROR: length %u != 16", length);
1059*ed775ee7SAntonio Huete Jimenez        return;
1060*ed775ee7SAntonio Huete Jimenez    }
1061*ed775ee7SAntonio Huete Jimenez 
1062*ed775ee7SAntonio Huete Jimenez    ND_PRINT("%s", GET_IP6ADDR_STRING(data));
1063*ed775ee7SAntonio Huete Jimenez }
1064*ed775ee7SAntonio Huete Jimenez 
1065*ed775ee7SAntonio Huete Jimenez static void
print_attr_netmask6(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1066*ed775ee7SAntonio Huete Jimenez print_attr_netmask6(netdissect_options *ndo,
1067*ed775ee7SAntonio Huete Jimenez                     const u_char *data, u_int length, u_short attr_code _U_)
1068*ed775ee7SAntonio Huete Jimenez {
1069*ed775ee7SAntonio Huete Jimenez    u_char data2[16];
1070*ed775ee7SAntonio Huete Jimenez 
1071*ed775ee7SAntonio Huete Jimenez    if (length < 2 || length > 18)
1072*ed775ee7SAntonio Huete Jimenez    {
1073*ed775ee7SAntonio Huete Jimenez        ND_PRINT("ERROR: length %u not in range (2..18)", length);
1074*ed775ee7SAntonio Huete Jimenez        return;
1075*ed775ee7SAntonio Huete Jimenez    }
1076*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
1077*ed775ee7SAntonio Huete Jimenez    if (GET_U_1(data + 1) > 128)
1078*ed775ee7SAntonio Huete Jimenez    {
1079*ed775ee7SAntonio Huete Jimenez       ND_PRINT("ERROR: netmask %u not in range (0..128)", GET_U_1(data + 1));
1080*ed775ee7SAntonio Huete Jimenez       return;
1081*ed775ee7SAntonio Huete Jimenez    }
1082*ed775ee7SAntonio Huete Jimenez 
1083*ed775ee7SAntonio Huete Jimenez    memset(data2, 0, sizeof(data2));
1084*ed775ee7SAntonio Huete Jimenez    if (length > 2)
1085*ed775ee7SAntonio Huete Jimenez       memcpy(data2, data+2, length-2);
1086*ed775ee7SAntonio Huete Jimenez 
1087*ed775ee7SAntonio Huete Jimenez    ND_PRINT("%s/%u", ip6addr_string(ndo, data2), GET_U_1(data + 1));
1088*ed775ee7SAntonio Huete Jimenez 
1089*ed775ee7SAntonio Huete Jimenez    if (GET_U_1(data + 1) > 8 * (length - 2))
1090*ed775ee7SAntonio Huete Jimenez       ND_PRINT(" (inconsistent prefix length)");
1091*ed775ee7SAntonio Huete Jimenez 
1092*ed775ee7SAntonio Huete Jimenez    return;
1093*ed775ee7SAntonio Huete Jimenez 
1094*ed775ee7SAntonio Huete Jimenez    trunc:
1095*ed775ee7SAntonio Huete Jimenez      nd_print_trunc(ndo);
1096*ed775ee7SAntonio Huete Jimenez }
1097*ed775ee7SAntonio Huete Jimenez 
1098*ed775ee7SAntonio Huete Jimenez static void
print_attr_mip6_home_link_prefix(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1099*ed775ee7SAntonio Huete Jimenez print_attr_mip6_home_link_prefix(netdissect_options *ndo,
1100*ed775ee7SAntonio Huete Jimenez                     const u_char *data, u_int length, u_short attr_code _U_)
1101*ed775ee7SAntonio Huete Jimenez {
1102*ed775ee7SAntonio Huete Jimenez    if (length != 17)
1103*ed775ee7SAntonio Huete Jimenez    {
1104*ed775ee7SAntonio Huete Jimenez       ND_PRINT("ERROR: length %u != 17", length);
1105*ed775ee7SAntonio Huete Jimenez       return;
1106*ed775ee7SAntonio Huete Jimenez    }
1107*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
1108*ed775ee7SAntonio Huete Jimenez    if (GET_U_1(data) > 128)
1109*ed775ee7SAntonio Huete Jimenez    {
1110*ed775ee7SAntonio Huete Jimenez       ND_PRINT("ERROR: netmask %u not in range (0..128)", GET_U_1(data));
1111*ed775ee7SAntonio Huete Jimenez       return;
1112*ed775ee7SAntonio Huete Jimenez    }
1113*ed775ee7SAntonio Huete Jimenez 
1114*ed775ee7SAntonio Huete Jimenez    ND_PRINT("%s/%u", GET_IP6ADDR_STRING(data + 1), GET_U_1(data));
1115*ed775ee7SAntonio Huete Jimenez 
1116*ed775ee7SAntonio Huete Jimenez    return;
1117*ed775ee7SAntonio Huete Jimenez 
1118*ed775ee7SAntonio Huete Jimenez    trunc:
1119*ed775ee7SAntonio Huete Jimenez      nd_print_trunc(ndo);
1120*ed775ee7SAntonio Huete Jimenez }
1121*ed775ee7SAntonio Huete Jimenez 
1122*ed775ee7SAntonio Huete Jimenez static void
print_attr_operator_name(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1123*ed775ee7SAntonio Huete Jimenez print_attr_operator_name(netdissect_options *ndo,
1124*ed775ee7SAntonio Huete Jimenez                     const u_char *data, u_int length, u_short attr_code _U_)
1125*ed775ee7SAntonio Huete Jimenez {
1126*ed775ee7SAntonio Huete Jimenez    u_int namespace_value;
1127*ed775ee7SAntonio Huete Jimenez 
1128*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
1129*ed775ee7SAntonio Huete Jimenez    if (length < 2)
1130*ed775ee7SAntonio Huete Jimenez    {
1131*ed775ee7SAntonio Huete Jimenez       ND_PRINT("ERROR: length %u < 2", length);
1132*ed775ee7SAntonio Huete Jimenez       return;
1133*ed775ee7SAntonio Huete Jimenez    }
1134*ed775ee7SAntonio Huete Jimenez    namespace_value = GET_U_1(data);
1135*ed775ee7SAntonio Huete Jimenez    data++;
1136*ed775ee7SAntonio Huete Jimenez    ND_PRINT("[%s] ", tok2str(operator_name_vector, "unknown namespace %u", namespace_value));
1137*ed775ee7SAntonio Huete Jimenez 
1138*ed775ee7SAntonio Huete Jimenez    (void)nd_printn(ndo, data, length - 1, NULL);
1139*ed775ee7SAntonio Huete Jimenez 
1140*ed775ee7SAntonio Huete Jimenez    return;
1141*ed775ee7SAntonio Huete Jimenez 
1142*ed775ee7SAntonio Huete Jimenez    trunc:
1143*ed775ee7SAntonio Huete Jimenez       nd_print_trunc(ndo);
1144*ed775ee7SAntonio Huete Jimenez }
1145*ed775ee7SAntonio Huete Jimenez 
1146*ed775ee7SAntonio Huete Jimenez static void
print_attr_location_information(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1147*ed775ee7SAntonio Huete Jimenez print_attr_location_information(netdissect_options *ndo,
1148*ed775ee7SAntonio Huete Jimenez                     const u_char *data, u_int length, u_short attr_code _U_)
1149*ed775ee7SAntonio Huete Jimenez {
1150*ed775ee7SAntonio Huete Jimenez    uint16_t index;
1151*ed775ee7SAntonio Huete Jimenez    uint8_t code, entity;
1152*ed775ee7SAntonio Huete Jimenez 
1153*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
1154*ed775ee7SAntonio Huete Jimenez    if (length < 21)
1155*ed775ee7SAntonio Huete Jimenez    {
1156*ed775ee7SAntonio Huete Jimenez      ND_PRINT("ERROR: length %u < 21", length);
1157*ed775ee7SAntonio Huete Jimenez       return;
1158*ed775ee7SAntonio Huete Jimenez    }
1159*ed775ee7SAntonio Huete Jimenez 
1160*ed775ee7SAntonio Huete Jimenez    index = GET_BE_U_2(data);
1161*ed775ee7SAntonio Huete Jimenez    data += 2;
1162*ed775ee7SAntonio Huete Jimenez 
1163*ed775ee7SAntonio Huete Jimenez    code = GET_U_1(data);
1164*ed775ee7SAntonio Huete Jimenez    data++;
1165*ed775ee7SAntonio Huete Jimenez 
1166*ed775ee7SAntonio Huete Jimenez    entity = GET_U_1(data);
1167*ed775ee7SAntonio Huete Jimenez    data++;
1168*ed775ee7SAntonio Huete Jimenez 
1169*ed775ee7SAntonio Huete Jimenez    ND_PRINT("index %u, code %s, entity %s, ",
1170*ed775ee7SAntonio Huete Jimenez        index,
1171*ed775ee7SAntonio Huete Jimenez        tok2str(location_information_code_vector, "Unknown (%u)", code),
1172*ed775ee7SAntonio Huete Jimenez        tok2str(location_information_entity_vector, "Unknown (%u)", entity)
1173*ed775ee7SAntonio Huete Jimenez    );
1174*ed775ee7SAntonio Huete Jimenez 
1175*ed775ee7SAntonio Huete Jimenez    ND_PRINT("sighting time ");
1176*ed775ee7SAntonio Huete Jimenez    p_ntp_time(ndo, (const struct l_fixedpt *)data);
1177*ed775ee7SAntonio Huete Jimenez    ND_PRINT(", ");
1178*ed775ee7SAntonio Huete Jimenez    data += 8;
1179*ed775ee7SAntonio Huete Jimenez 
1180*ed775ee7SAntonio Huete Jimenez    ND_PRINT("time to live ");
1181*ed775ee7SAntonio Huete Jimenez    p_ntp_time(ndo, (const struct l_fixedpt *)data);
1182*ed775ee7SAntonio Huete Jimenez    ND_PRINT(", ");
1183*ed775ee7SAntonio Huete Jimenez    data += 8;
1184*ed775ee7SAntonio Huete Jimenez 
1185*ed775ee7SAntonio Huete Jimenez    ND_PRINT("method \"");
1186*ed775ee7SAntonio Huete Jimenez    (void)nd_printn(ndo, data, length - 20, NULL);
1187*ed775ee7SAntonio Huete Jimenez    ND_PRINT("\"");
1188*ed775ee7SAntonio Huete Jimenez 
1189*ed775ee7SAntonio Huete Jimenez    return;
1190*ed775ee7SAntonio Huete Jimenez 
1191*ed775ee7SAntonio Huete Jimenez    trunc:
1192*ed775ee7SAntonio Huete Jimenez       nd_print_trunc(ndo);
1193*ed775ee7SAntonio Huete Jimenez }
1194*ed775ee7SAntonio Huete Jimenez 
1195*ed775ee7SAntonio Huete Jimenez static void
print_attr_location_data(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1196*ed775ee7SAntonio Huete Jimenez print_attr_location_data(netdissect_options *ndo,
1197*ed775ee7SAntonio Huete Jimenez                     const u_char *data, u_int length, u_short attr_code _U_)
1198*ed775ee7SAntonio Huete Jimenez {
1199*ed775ee7SAntonio Huete Jimenez    uint16_t index;
1200*ed775ee7SAntonio Huete Jimenez 
1201*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
1202*ed775ee7SAntonio Huete Jimenez    if (length < 3)
1203*ed775ee7SAntonio Huete Jimenez    {
1204*ed775ee7SAntonio Huete Jimenez      ND_PRINT("ERROR: length %u < 3", length);
1205*ed775ee7SAntonio Huete Jimenez       return;
1206*ed775ee7SAntonio Huete Jimenez    }
1207*ed775ee7SAntonio Huete Jimenez 
1208*ed775ee7SAntonio Huete Jimenez    index = GET_BE_U_2(data);
1209*ed775ee7SAntonio Huete Jimenez    data += 2;
1210*ed775ee7SAntonio Huete Jimenez    ND_PRINT("index %u, location", index);
1211*ed775ee7SAntonio Huete Jimenez 
1212*ed775ee7SAntonio Huete Jimenez    /* The Location field of the String field of the Location-Data attribute
1213*ed775ee7SAntonio Huete Jimenez     * can have two completely different structures depending on the value of
1214*ed775ee7SAntonio Huete Jimenez     * the Code field of a Location-Info attribute, which supposedly precedes
1215*ed775ee7SAntonio Huete Jimenez     * the current attribute. Unfortunately, this choice of encoding makes it
1216*ed775ee7SAntonio Huete Jimenez     * non-trivial to decode the Location field without preserving some state
1217*ed775ee7SAntonio Huete Jimenez     * between the attributes.
1218*ed775ee7SAntonio Huete Jimenez     */
1219*ed775ee7SAntonio Huete Jimenez    hex_and_ascii_print(ndo, "\n\t    ", data, length - 2);
1220*ed775ee7SAntonio Huete Jimenez 
1221*ed775ee7SAntonio Huete Jimenez    return;
1222*ed775ee7SAntonio Huete Jimenez 
1223*ed775ee7SAntonio Huete Jimenez    trunc:
1224*ed775ee7SAntonio Huete Jimenez       nd_print_trunc(ndo);
1225*ed775ee7SAntonio Huete Jimenez }
1226*ed775ee7SAntonio Huete Jimenez 
1227*ed775ee7SAntonio Huete Jimenez static void
print_basic_location_policy_rules(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1228*ed775ee7SAntonio Huete Jimenez print_basic_location_policy_rules(netdissect_options *ndo,
1229*ed775ee7SAntonio Huete Jimenez                     const u_char *data, u_int length, u_short attr_code _U_)
1230*ed775ee7SAntonio Huete Jimenez {
1231*ed775ee7SAntonio Huete Jimenez    uint16_t flags;
1232*ed775ee7SAntonio Huete Jimenez 
1233*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(data, length);
1234*ed775ee7SAntonio Huete Jimenez    if (length < 10)
1235*ed775ee7SAntonio Huete Jimenez    {
1236*ed775ee7SAntonio Huete Jimenez      ND_PRINT("ERROR: length %u < 10", length);
1237*ed775ee7SAntonio Huete Jimenez       return;
1238*ed775ee7SAntonio Huete Jimenez    }
1239*ed775ee7SAntonio Huete Jimenez 
1240*ed775ee7SAntonio Huete Jimenez    flags = GET_BE_U_2(data);
1241*ed775ee7SAntonio Huete Jimenez    data += 2;
1242*ed775ee7SAntonio Huete Jimenez    ND_PRINT("flags [%s], ", bittok2str(blpr_bm, "none", flags));
1243*ed775ee7SAntonio Huete Jimenez 
1244*ed775ee7SAntonio Huete Jimenez    ND_PRINT("retention expires ");
1245*ed775ee7SAntonio Huete Jimenez    p_ntp_time(ndo, (const struct l_fixedpt *)data);
1246*ed775ee7SAntonio Huete Jimenez    data += 8;
1247*ed775ee7SAntonio Huete Jimenez 
1248*ed775ee7SAntonio Huete Jimenez    if (length > 10) {
1249*ed775ee7SAntonio Huete Jimenez       ND_PRINT(", note well \"");
1250*ed775ee7SAntonio Huete Jimenez       (void)nd_printn(ndo, data, length - 10, NULL);
1251*ed775ee7SAntonio Huete Jimenez       ND_PRINT("\"");
1252*ed775ee7SAntonio Huete Jimenez    }
125341c99275SPeter Avalos 
125441c99275SPeter Avalos    return;
125541c99275SPeter Avalos 
125641c99275SPeter Avalos    trunc:
1257*ed775ee7SAntonio Huete Jimenez       nd_print_trunc(ndo);
125841c99275SPeter Avalos }
125941c99275SPeter Avalos 
1260*ed775ee7SAntonio Huete Jimenez 
126141c99275SPeter Avalos /*************************************/
126241c99275SPeter Avalos /* Print an attribute of 'secs since */
126341c99275SPeter Avalos /* January 1, 1970 00:00 UTC' value  */
126441c99275SPeter Avalos /* pointed by 'data' and 'length'    */
126541c99275SPeter Avalos /* size.                             */
126641c99275SPeter Avalos /*************************************/
126741c99275SPeter Avalos /* Returns nothing.                  */
126841c99275SPeter Avalos /*************************************/
1269411677aeSAaron LI static void
print_attr_time(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code _U_)1270411677aeSAaron LI print_attr_time(netdissect_options *ndo,
1271*ed775ee7SAntonio Huete Jimenez                 const u_char *data, u_int length, u_short attr_code _U_)
127241c99275SPeter Avalos {
127341c99275SPeter Avalos    time_t attr_time;
127441c99275SPeter Avalos    char string[26];
127541c99275SPeter Avalos 
127641c99275SPeter Avalos    if (length != 4)
127741c99275SPeter Avalos    {
1278*ed775ee7SAntonio Huete Jimenez        ND_PRINT("ERROR: length %u != 4", length);
127941c99275SPeter Avalos        return;
128041c99275SPeter Avalos    }
128141c99275SPeter Avalos 
1282*ed775ee7SAntonio Huete Jimenez    attr_time = GET_BE_U_4(data);
128341c99275SPeter Avalos    strlcpy(string, ctime(&attr_time), sizeof(string));
128441c99275SPeter Avalos    /* Get rid of the newline */
128541c99275SPeter Avalos    string[24] = '\0';
1286*ed775ee7SAntonio Huete Jimenez    ND_PRINT("%.24s", string);
1287*ed775ee7SAntonio Huete Jimenez }
128841c99275SPeter Avalos 
1289*ed775ee7SAntonio Huete Jimenez static void
print_attr_vector64(netdissect_options * ndo,register const u_char * data,u_int length,u_short attr_code _U_)1290*ed775ee7SAntonio Huete Jimenez print_attr_vector64(netdissect_options *ndo,
1291*ed775ee7SAntonio Huete Jimenez                  register const u_char *data, u_int length, u_short attr_code _U_)
1292*ed775ee7SAntonio Huete Jimenez {
1293*ed775ee7SAntonio Huete Jimenez    uint64_t data_value, i;
1294*ed775ee7SAntonio Huete Jimenez    const char *sep = "";
1295*ed775ee7SAntonio Huete Jimenez 
1296*ed775ee7SAntonio Huete Jimenez    if (length != 8)
1297*ed775ee7SAntonio Huete Jimenez    {
1298*ed775ee7SAntonio Huete Jimenez        ND_PRINT("ERROR: length %u != 8", length);
1299*ed775ee7SAntonio Huete Jimenez        return;
1300*ed775ee7SAntonio Huete Jimenez    }
1301*ed775ee7SAntonio Huete Jimenez 
1302*ed775ee7SAntonio Huete Jimenez    ND_PRINT("[");
1303*ed775ee7SAntonio Huete Jimenez 
1304*ed775ee7SAntonio Huete Jimenez    data_value = GET_BE_U_8(data);
1305*ed775ee7SAntonio Huete Jimenez    /* Print the 64-bit field in a format similar to bittok2str(), less
1306*ed775ee7SAntonio Huete Jimenez     * flagging any unknown bits. This way it should be easier to replace
1307*ed775ee7SAntonio Huete Jimenez     * the custom code with a library function later.
1308*ed775ee7SAntonio Huete Jimenez     */
1309*ed775ee7SAntonio Huete Jimenez    for (i = 0; i < TAM_SIZE(mip6_feature_vector); i++) {
1310*ed775ee7SAntonio Huete Jimenez        if (data_value & mip6_feature_vector[i].v) {
1311*ed775ee7SAntonio Huete Jimenez            ND_PRINT("%s%s", sep, mip6_feature_vector[i].s);
1312*ed775ee7SAntonio Huete Jimenez            sep = ", ";
1313*ed775ee7SAntonio Huete Jimenez        }
1314*ed775ee7SAntonio Huete Jimenez    }
1315*ed775ee7SAntonio Huete Jimenez 
1316*ed775ee7SAntonio Huete Jimenez    ND_PRINT("]");
131741c99275SPeter Avalos }
131841c99275SPeter Avalos 
131941c99275SPeter Avalos /***********************************/
132041c99275SPeter Avalos /* Print an attribute of 'strange' */
132141c99275SPeter Avalos /* data format pointed by 'data'   */
132241c99275SPeter Avalos /* and 'length' size.              */
132341c99275SPeter Avalos /***********************************/
132441c99275SPeter Avalos /* Returns nothing.                */
132541c99275SPeter Avalos /***********************************/
1326411677aeSAaron LI static void
print_attr_strange(netdissect_options * ndo,const u_char * data,u_int length,u_short attr_code)1327411677aeSAaron LI print_attr_strange(netdissect_options *ndo,
1328*ed775ee7SAntonio Huete Jimenez                    const u_char *data, u_int length, u_short attr_code)
132941c99275SPeter Avalos {
133041c99275SPeter Avalos    u_short len_data;
1331*ed775ee7SAntonio Huete Jimenez    u_int error_cause_value;
133241c99275SPeter Avalos 
133341c99275SPeter Avalos    switch(attr_code)
133441c99275SPeter Avalos    {
133541c99275SPeter Avalos       case ARAP_PASS:
133641c99275SPeter Avalos            if (length != 16)
133741c99275SPeter Avalos            {
1338*ed775ee7SAntonio Huete Jimenez                ND_PRINT("ERROR: length %u != 16", length);
133941c99275SPeter Avalos                return;
134041c99275SPeter Avalos            }
1341*ed775ee7SAntonio Huete Jimenez            ND_PRINT("User_challenge (");
1342*ed775ee7SAntonio Huete Jimenez            ND_TCHECK_8(data);
134341c99275SPeter Avalos            len_data = 8;
134441c99275SPeter Avalos            PRINT_HEX(len_data, data);
1345*ed775ee7SAntonio Huete Jimenez            ND_PRINT(") User_resp(");
1346*ed775ee7SAntonio Huete Jimenez            ND_TCHECK_8(data);
134741c99275SPeter Avalos            len_data = 8;
134841c99275SPeter Avalos            PRINT_HEX(len_data, data);
1349*ed775ee7SAntonio Huete Jimenez            ND_PRINT(")");
135041c99275SPeter Avalos         break;
135141c99275SPeter Avalos 
135241c99275SPeter Avalos       case ARAP_FEATURES:
135341c99275SPeter Avalos            if (length != 14)
135441c99275SPeter Avalos            {
1355*ed775ee7SAntonio Huete Jimenez                ND_PRINT("ERROR: length %u != 14", length);
135641c99275SPeter Avalos                return;
135741c99275SPeter Avalos            }
1358*ed775ee7SAntonio Huete Jimenez            if (GET_U_1(data))
1359*ed775ee7SAntonio Huete Jimenez               ND_PRINT("User can change password");
136041c99275SPeter Avalos            else
1361*ed775ee7SAntonio Huete Jimenez               ND_PRINT("User cannot change password");
136241c99275SPeter Avalos            data++;
1363*ed775ee7SAntonio Huete Jimenez            ND_PRINT(", Min password length: %u", GET_U_1(data));
136441c99275SPeter Avalos            data++;
1365*ed775ee7SAntonio Huete Jimenez            ND_PRINT(", created at: ");
1366*ed775ee7SAntonio Huete Jimenez            ND_TCHECK_4(data);
136741c99275SPeter Avalos            len_data = 4;
136841c99275SPeter Avalos            PRINT_HEX(len_data, data);
1369*ed775ee7SAntonio Huete Jimenez            ND_PRINT(", expires in: ");
1370*ed775ee7SAntonio Huete Jimenez            ND_TCHECK_4(data);
137141c99275SPeter Avalos            len_data = 4;
137241c99275SPeter Avalos            PRINT_HEX(len_data, data);
1373*ed775ee7SAntonio Huete Jimenez            ND_PRINT(", Current Time: ");
1374*ed775ee7SAntonio Huete Jimenez            ND_TCHECK_4(data);
137541c99275SPeter Avalos            len_data = 4;
137641c99275SPeter Avalos            PRINT_HEX(len_data, data);
137741c99275SPeter Avalos         break;
137841c99275SPeter Avalos 
137941c99275SPeter Avalos       case ARAP_CHALLENGE_RESP:
138041c99275SPeter Avalos            if (length < 8)
138141c99275SPeter Avalos            {
1382*ed775ee7SAntonio Huete Jimenez                ND_PRINT("ERROR: length %u != 8", length);
138341c99275SPeter Avalos                return;
138441c99275SPeter Avalos            }
1385*ed775ee7SAntonio Huete Jimenez            ND_TCHECK_8(data);
138641c99275SPeter Avalos            len_data = 8;
138741c99275SPeter Avalos            PRINT_HEX(len_data, data);
138841c99275SPeter Avalos         break;
1389*ed775ee7SAntonio Huete Jimenez 
1390*ed775ee7SAntonio Huete Jimenez       case ERROR_CAUSE:
1391*ed775ee7SAntonio Huete Jimenez            if (length != 4)
1392*ed775ee7SAntonio Huete Jimenez            {
1393*ed775ee7SAntonio Huete Jimenez                ND_PRINT("Error: length %u != 4", length);
1394*ed775ee7SAntonio Huete Jimenez                return;
1395*ed775ee7SAntonio Huete Jimenez            }
1396*ed775ee7SAntonio Huete Jimenez 
1397*ed775ee7SAntonio Huete Jimenez            error_cause_value = GET_BE_U_4(data);
1398*ed775ee7SAntonio Huete Jimenez            ND_PRINT("Error cause %u: %s", error_cause_value, tok2str(errorcausetype, "Error-Cause %u not known", error_cause_value));
1399*ed775ee7SAntonio Huete Jimenez         break;
140041c99275SPeter Avalos    }
140141c99275SPeter Avalos    return;
140241c99275SPeter Avalos 
140341c99275SPeter Avalos    trunc:
1404*ed775ee7SAntonio Huete Jimenez      nd_print_trunc(ndo);
140541c99275SPeter Avalos }
140641c99275SPeter Avalos 
140741c99275SPeter Avalos static void
radius_attrs_print(netdissect_options * ndo,const u_char * attr,u_int length)1408411677aeSAaron LI radius_attrs_print(netdissect_options *ndo,
1409*ed775ee7SAntonio Huete Jimenez                    const u_char *attr, u_int length)
141041c99275SPeter Avalos {
1411*ed775ee7SAntonio Huete Jimenez    const struct radius_attr *rad_attr = (const struct radius_attr *)attr;
141241c99275SPeter Avalos    const char *attr_string;
1413*ed775ee7SAntonio Huete Jimenez    uint8_t type, len;
141441c99275SPeter Avalos 
141541c99275SPeter Avalos    while (length > 0)
141641c99275SPeter Avalos    {
141741c99275SPeter Avalos      if (length < 2)
141841c99275SPeter Avalos         goto trunc;
1419*ed775ee7SAntonio Huete Jimenez      ND_TCHECK_SIZE(rad_attr);
142041c99275SPeter Avalos 
1421*ed775ee7SAntonio Huete Jimenez      type = GET_U_1(rad_attr->type);
1422*ed775ee7SAntonio Huete Jimenez      len = GET_U_1(rad_attr->len);
1423*ed775ee7SAntonio Huete Jimenez      if (type != 0 && type < TAM_SIZE(attr_type))
1424*ed775ee7SAntonio Huete Jimenez 	attr_string = attr_type[type].name;
142541c99275SPeter Avalos      else
142641c99275SPeter Avalos 	attr_string = "Unknown";
142741c99275SPeter Avalos 
1428*ed775ee7SAntonio Huete Jimenez      ND_PRINT("\n\t  %s Attribute (%u), length: %u",
1429*ed775ee7SAntonio Huete Jimenez                attr_string,
1430*ed775ee7SAntonio Huete Jimenez                type,
1431*ed775ee7SAntonio Huete Jimenez                len);
1432*ed775ee7SAntonio Huete Jimenez      if (len < 2)
143341c99275SPeter Avalos      {
1434*ed775ee7SAntonio Huete Jimenez        ND_PRINT(" (bogus, must be >= 2)");
1435*ed775ee7SAntonio Huete Jimenez        return;
1436*ed775ee7SAntonio Huete Jimenez      }
1437*ed775ee7SAntonio Huete Jimenez      if (len > length)
143841c99275SPeter Avalos      {
1439*ed775ee7SAntonio Huete Jimenez         ND_PRINT(" (bogus, goes past end of packet)");
1440*ed775ee7SAntonio Huete Jimenez         return;
1441*ed775ee7SAntonio Huete Jimenez      }
1442*ed775ee7SAntonio Huete Jimenez      ND_PRINT(", Value: ");
1443*ed775ee7SAntonio Huete Jimenez 
1444*ed775ee7SAntonio Huete Jimenez      if (type < TAM_SIZE(attr_type))
1445*ed775ee7SAntonio Huete Jimenez      {
1446*ed775ee7SAntonio Huete Jimenez          if (len > 2)
1447*ed775ee7SAntonio Huete Jimenez          {
1448*ed775ee7SAntonio Huete Jimenez              if ( attr_type[type].print_func )
1449*ed775ee7SAntonio Huete Jimenez                  (*attr_type[type].print_func)(
1450411677aeSAaron LI                      ndo, ((const u_char *)(rad_attr+1)),
1451*ed775ee7SAntonio Huete Jimenez                      len - 2, type);
145241c99275SPeter Avalos          }
145341c99275SPeter Avalos      }
145441c99275SPeter Avalos      /* do we also want to see a hex dump ? */
1455411677aeSAaron LI      if (ndo->ndo_vflag> 1)
1456*ed775ee7SAntonio Huete Jimenez          print_unknown_data(ndo, (const u_char *)rad_attr+2, "\n\t    ", (len)-2);
145741c99275SPeter Avalos 
1458*ed775ee7SAntonio Huete Jimenez      length-=(len);
1459*ed775ee7SAntonio Huete Jimenez      rad_attr = (const struct radius_attr *)( ((const char *)(rad_attr))+len);
146041c99275SPeter Avalos    }
146141c99275SPeter Avalos    return;
146241c99275SPeter Avalos 
146341c99275SPeter Avalos trunc:
1464*ed775ee7SAntonio Huete Jimenez    nd_print_trunc(ndo);
146541c99275SPeter Avalos }
146641c99275SPeter Avalos 
146741c99275SPeter Avalos void
radius_print(netdissect_options * ndo,const u_char * dat,u_int length)1468411677aeSAaron LI radius_print(netdissect_options *ndo,
1469411677aeSAaron LI              const u_char *dat, u_int length)
147041c99275SPeter Avalos {
1471*ed775ee7SAntonio Huete Jimenez    const struct radius_hdr *rad;
147241c99275SPeter Avalos    u_int len, auth_idx;
147341c99275SPeter Avalos 
1474*ed775ee7SAntonio Huete Jimenez    ndo->ndo_protocol = "radius";
1475*ed775ee7SAntonio Huete Jimenez    ND_TCHECK_LEN(dat, MIN_RADIUS_LEN);
1476411677aeSAaron LI    rad = (const struct radius_hdr *)dat;
1477*ed775ee7SAntonio Huete Jimenez    len = GET_BE_U_2(rad->len);
147841c99275SPeter Avalos 
147941c99275SPeter Avalos    if (len < MIN_RADIUS_LEN)
148041c99275SPeter Avalos    {
1481*ed775ee7SAntonio Huete Jimenez 	  nd_print_trunc(ndo);
148241c99275SPeter Avalos 	  return;
148341c99275SPeter Avalos    }
148441c99275SPeter Avalos 
148541c99275SPeter Avalos    if (len > length)
148641c99275SPeter Avalos 	  len = length;
148741c99275SPeter Avalos 
1488411677aeSAaron LI    if (ndo->ndo_vflag < 1) {
1489*ed775ee7SAntonio Huete Jimenez        ND_PRINT("RADIUS, %s (%u), id: 0x%02x length: %u",
1490*ed775ee7SAntonio Huete Jimenez               tok2str(radius_command_values,"Unknown Command",GET_U_1(rad->code)),
1491*ed775ee7SAntonio Huete Jimenez               GET_U_1(rad->code),
1492*ed775ee7SAntonio Huete Jimenez               GET_U_1(rad->id),
1493*ed775ee7SAntonio Huete Jimenez               len);
149441c99275SPeter Avalos        return;
149541c99275SPeter Avalos    }
149641c99275SPeter Avalos    else {
1497*ed775ee7SAntonio Huete Jimenez        ND_PRINT("RADIUS, length: %u\n\t%s (%u), id: 0x%02x, Authenticator: ",
149841c99275SPeter Avalos               len,
1499*ed775ee7SAntonio Huete Jimenez               tok2str(radius_command_values,"Unknown Command",GET_U_1(rad->code)),
1500*ed775ee7SAntonio Huete Jimenez               GET_U_1(rad->code),
1501*ed775ee7SAntonio Huete Jimenez               GET_U_1(rad->id));
150241c99275SPeter Avalos 
150341c99275SPeter Avalos        for(auth_idx=0; auth_idx < 16; auth_idx++)
1504*ed775ee7SAntonio Huete Jimenez             ND_PRINT("%02x", rad->auth[auth_idx]);
150541c99275SPeter Avalos    }
150641c99275SPeter Avalos 
150741c99275SPeter Avalos    if (len > MIN_RADIUS_LEN)
1508411677aeSAaron LI       radius_attrs_print(ndo, dat + MIN_RADIUS_LEN, len - MIN_RADIUS_LEN);
150941c99275SPeter Avalos    return;
151041c99275SPeter Avalos 
151141c99275SPeter Avalos trunc:
1512*ed775ee7SAntonio Huete Jimenez    nd_print_trunc(ndo);
151341c99275SPeter Avalos }
1514