blob: eb48de5059bd1fc4f9368477aa09b0614df068f9 [file] [log] [blame]
The Android Open Source Project2949f582009-03-03 19:30:46 -08001/*
2 * Copyright (C) 2000 Alfredo Andres Omella. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 * 3. The names of the authors may not be used to endorse or promote
15 * products derived from this software without specific prior
16 * written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 */
Elliott Hughese2e3bd12017-05-15 10:59:29 -070022
23/* \summary: Radius protocol printer */
24
The Android Open Source Project2949f582009-03-03 19:30:46 -080025/*
26 * Radius printer routines as specified on:
27 *
28 * RFC 2865:
29 * "Remote Authentication Dial In User Service (RADIUS)"
30 *
31 * RFC 2866:
32 * "RADIUS Accounting"
33 *
34 * RFC 2867:
35 * "RADIUS Accounting Modifications for Tunnel Protocol Support"
36 *
37 * RFC 2868:
38 * "RADIUS Attributes for Tunnel Protocol Support"
39 *
40 * RFC 2869:
41 * "RADIUS Extensions"
42 *
Elliott Hughese2e3bd12017-05-15 10:59:29 -070043 * RFC 3580:
44 * "IEEE 802.1X Remote Authentication Dial In User Service (RADIUS)"
45 * "Usage Guidelines"
46 *
Elliott Hughes892a68b2015-10-19 14:43:53 -070047 * RFC 4675:
48 * "RADIUS Attributes for Virtual LAN and Priority Support"
49 *
50 * RFC 5176:
51 * "Dynamic Authorization Extensions to RADIUS"
52 *
The Android Open Source Project2949f582009-03-03 19:30:46 -080053 * Alfredo Andres Omella (aandres@s21sec.com) v0.1 2000/09/15
54 *
55 * TODO: Among other things to print ok MacIntosh and Vendor values
56 */
57
The Android Open Source Project2949f582009-03-03 19:30:46 -080058#ifdef HAVE_CONFIG_H
59#include "config.h"
60#endif
61
Elliott Hughese2e3bd12017-05-15 10:59:29 -070062#include <netdissect-stdinc.h>
The Android Open Source Project2949f582009-03-03 19:30:46 -080063
64#include <string.h>
65
Elliott Hughese2e3bd12017-05-15 10:59:29 -070066#include "netdissect.h"
The Android Open Source Project2949f582009-03-03 19:30:46 -080067#include "addrtoname.h"
68#include "extract.h"
69#include "oui.h"
70
Elliott Hughes892a68b2015-10-19 14:43:53 -070071static const char tstr[] = " [|radius]";
72
The Android Open Source Project2949f582009-03-03 19:30:46 -080073#define TAM_SIZE(x) (sizeof(x)/sizeof(x[0]) )
74
75#define PRINT_HEX(bytes_len, ptr_data) \
76 while(bytes_len) \
77 { \
Elliott Hughes892a68b2015-10-19 14:43:53 -070078 ND_PRINT((ndo, "%02X", *ptr_data )); \
The Android Open Source Project2949f582009-03-03 19:30:46 -080079 ptr_data++; \
80 bytes_len--; \
81 }
82
83
84/* Radius packet codes */
85#define RADCMD_ACCESS_REQ 1 /* Access-Request */
86#define RADCMD_ACCESS_ACC 2 /* Access-Accept */
87#define RADCMD_ACCESS_REJ 3 /* Access-Reject */
88#define RADCMD_ACCOUN_REQ 4 /* Accounting-Request */
89#define RADCMD_ACCOUN_RES 5 /* Accounting-Response */
90#define RADCMD_ACCESS_CHA 11 /* Access-Challenge */
91#define RADCMD_STATUS_SER 12 /* Status-Server */
92#define RADCMD_STATUS_CLI 13 /* Status-Client */
Elliott Hughes892a68b2015-10-19 14:43:53 -070093#define RADCMD_DISCON_REQ 40 /* Disconnect-Request */
94#define RADCMD_DISCON_ACK 41 /* Disconnect-ACK */
95#define RADCMD_DISCON_NAK 42 /* Disconnect-NAK */
96#define RADCMD_COA_REQ 43 /* CoA-Request */
97#define RADCMD_COA_ACK 44 /* CoA-ACK */
98#define RADCMD_COA_NAK 45 /* CoA-NAK */
The Android Open Source Project2949f582009-03-03 19:30:46 -080099#define RADCMD_RESERVED 255 /* Reserved */
100
JP Abgrall53f17a92014-02-12 14:02:41 -0800101static const struct tok radius_command_values[] = {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700102 { RADCMD_ACCESS_REQ, "Access-Request" },
103 { RADCMD_ACCESS_ACC, "Access-Accept" },
104 { RADCMD_ACCESS_REJ, "Access-Reject" },
105 { RADCMD_ACCOUN_REQ, "Accounting-Request" },
106 { RADCMD_ACCOUN_RES, "Accounting-Response" },
107 { RADCMD_ACCESS_CHA, "Access-Challenge" },
108 { RADCMD_STATUS_SER, "Status-Server" },
109 { RADCMD_STATUS_CLI, "Status-Client" },
110 { RADCMD_DISCON_REQ, "Disconnect-Request" },
111 { RADCMD_DISCON_ACK, "Disconnect-ACK" },
112 { RADCMD_DISCON_NAK, "Disconnect-NAK" },
113 { RADCMD_COA_REQ, "CoA-Request" },
114 { RADCMD_COA_ACK, "CoA-ACK" },
115 { RADCMD_COA_NAK, "CoA-NAK" },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800116 { RADCMD_RESERVED, "Reserved" },
117 { 0, NULL}
118};
119
120/********************************/
121/* Begin Radius Attribute types */
122/********************************/
123#define SERV_TYPE 6
124#define FRM_IPADDR 8
125#define LOG_IPHOST 14
126#define LOG_SERVICE 15
127#define FRM_IPX 23
128#define SESSION_TIMEOUT 27
129#define IDLE_TIMEOUT 28
130#define FRM_ATALK_LINK 37
131#define FRM_ATALK_NETWORK 38
132
133#define ACCT_DELAY 41
134#define ACCT_SESSION_TIME 46
135
Elliott Hughes892a68b2015-10-19 14:43:53 -0700136#define EGRESS_VLAN_ID 56
137#define EGRESS_VLAN_NAME 58
138
The Android Open Source Project2949f582009-03-03 19:30:46 -0800139#define TUNNEL_TYPE 64
140#define TUNNEL_MEDIUM 65
141#define TUNNEL_CLIENT_END 66
142#define TUNNEL_SERVER_END 67
143#define TUNNEL_PASS 69
144
145#define ARAP_PASS 70
146#define ARAP_FEATURES 71
147
148#define TUNNEL_PRIV_GROUP 81
149#define TUNNEL_ASSIGN_ID 82
150#define TUNNEL_PREFERENCE 83
151
152#define ARAP_CHALLENGE_RESP 84
153#define ACCT_INT_INTERVAL 85
154
155#define TUNNEL_CLIENT_AUTH 90
156#define TUNNEL_SERVER_AUTH 91
157/********************************/
158/* End Radius Attribute types */
159/********************************/
160
Elliott Hughes892a68b2015-10-19 14:43:53 -0700161#define RFC4675_TAGGED 0x31
162#define RFC4675_UNTAGGED 0x32
The Android Open Source Project2949f582009-03-03 19:30:46 -0800163
Elliott Hughes892a68b2015-10-19 14:43:53 -0700164static const struct tok rfc4675_tagged[] = {
165 { RFC4675_TAGGED, "Tagged" },
166 { RFC4675_UNTAGGED, "Untagged" },
167 { 0, NULL}
168};
The Android Open Source Project2949f582009-03-03 19:30:46 -0800169
170
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700171static void print_attr_string(netdissect_options *, register const u_char *, u_int, u_short );
172static void print_attr_num(netdissect_options *, register const u_char *, u_int, u_short );
173static void print_vendor_attr(netdissect_options *, register const u_char *, u_int, u_short );
174static void print_attr_address(netdissect_options *, register const u_char *, u_int, u_short);
175static void print_attr_time(netdissect_options *, register const u_char *, u_int, u_short);
176static void print_attr_strange(netdissect_options *, register const u_char *, u_int, u_short);
Elliott Hughes892a68b2015-10-19 14:43:53 -0700177
178
179struct radius_hdr { uint8_t code; /* Radius packet code */
180 uint8_t id; /* Radius packet id */
181 uint16_t len; /* Radius total length */
182 uint8_t auth[16]; /* Authenticator */
The Android Open Source Project2949f582009-03-03 19:30:46 -0800183 };
184
185#define MIN_RADIUS_LEN 20
186
Elliott Hughes892a68b2015-10-19 14:43:53 -0700187struct radius_attr { uint8_t type; /* Attribute type */
188 uint8_t len; /* Attribute length */
The Android Open Source Project2949f582009-03-03 19:30:46 -0800189 };
190
191
192/* Service-Type Attribute standard values */
193static const char *serv_type[]={ NULL,
194 "Login",
195 "Framed",
196 "Callback Login",
197 "Callback Framed",
198 "Outbound",
199 "Administrative",
200 "NAS Prompt",
201 "Authenticate Only",
202 "Callback NAS Prompt",
203 "Call Check",
204 "Callback Administrative",
205 };
206
207/* Framed-Protocol Attribute standard values */
208static const char *frm_proto[]={ NULL,
209 "PPP",
210 "SLIP",
211 "ARAP",
212 "Gandalf proprietary",
213 "Xylogics IPX/SLIP",
214 "X.75 Synchronous",
215 };
216
217/* Framed-Routing Attribute standard values */
218static const char *frm_routing[]={ "None",
219 "Send",
220 "Listen",
221 "Send&Listen",
222 };
223
224/* Framed-Compression Attribute standard values */
225static const char *frm_comp[]={ "None",
226 "VJ TCP/IP",
227 "IPX",
228 "Stac-LZS",
229 };
230
231/* Login-Service Attribute standard values */
232static const char *login_serv[]={ "Telnet",
233 "Rlogin",
234 "TCP Clear",
235 "PortMaster(proprietary)",
236 "LAT",
237 "X.25-PAD",
238 "X.25-T3POS",
239 "Unassigned",
240 "TCP Clear Quiet",
241 };
242
243
244/* Termination-Action Attribute standard values */
245static const char *term_action[]={ "Default",
246 "RADIUS-Request",
247 };
248
Elliott Hughes892a68b2015-10-19 14:43:53 -0700249/* Ingress-Filters Attribute standard values */
250static const char *ingress_filters[]={ NULL,
251 "Enabled",
252 "Disabled",
253 };
254
The Android Open Source Project2949f582009-03-03 19:30:46 -0800255/* NAS-Port-Type Attribute standard values */
256static const char *nas_port_type[]={ "Async",
257 "Sync",
258 "ISDN Sync",
259 "ISDN Async V.120",
260 "ISDN Async V.110",
261 "Virtual",
262 "PIAFS",
263 "HDLC Clear Channel",
264 "X.25",
265 "X.75",
266 "G.3 Fax",
267 "SDSL",
268 "ADSL-CAP",
269 "ADSL-DMT",
270 "ISDN-DSL",
271 "Ethernet",
272 "xDSL",
273 "Cable",
274 "Wireless - Other",
275 "Wireless - IEEE 802.11",
276 };
277
278/* Acct-Status-Type Accounting Attribute standard values */
279static const char *acct_status[]={ NULL,
280 "Start",
281 "Stop",
282 "Interim-Update",
283 "Unassigned",
284 "Unassigned",
285 "Unassigned",
286 "Accounting-On",
287 "Accounting-Off",
288 "Tunnel-Start",
289 "Tunnel-Stop",
290 "Tunnel-Reject",
291 "Tunnel-Link-Start",
292 "Tunnel-Link-Stop",
293 "Tunnel-Link-Reject",
294 "Failed",
295 };
296
297/* Acct-Authentic Accounting Attribute standard values */
298static const char *acct_auth[]={ NULL,
299 "RADIUS",
300 "Local",
301 "Remote",
302 };
303
304/* Acct-Terminate-Cause Accounting Attribute standard values */
305static const char *acct_term[]={ NULL,
306 "User Request",
307 "Lost Carrier",
308 "Lost Service",
309 "Idle Timeout",
310 "Session Timeout",
311 "Admin Reset",
312 "Admin Reboot",
313 "Port Error",
314 "NAS Error",
315 "NAS Request",
316 "NAS Reboot",
317 "Port Unneeded",
318 "Port Preempted",
319 "Port Suspended",
320 "Service Unavailable",
321 "Callback",
322 "User Error",
323 "Host Request",
324 };
325
326/* Tunnel-Type Attribute standard values */
327static const char *tunnel_type[]={ NULL,
328 "PPTP",
329 "L2F",
330 "L2TP",
331 "ATMP",
332 "VTP",
333 "AH",
334 "IP-IP",
335 "MIN-IP-IP",
336 "ESP",
337 "GRE",
338 "DVS",
339 "IP-in-IP Tunneling",
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700340 "VLAN",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800341 };
342
343/* Tunnel-Medium-Type Attribute standard values */
344static const char *tunnel_medium[]={ NULL,
345 "IPv4",
346 "IPv6",
347 "NSAP",
348 "HDLC",
349 "BBN 1822",
350 "802",
351 "E.163",
352 "E.164",
353 "F.69",
354 "X.121",
355 "IPX",
356 "Appletalk",
357 "Decnet IV",
358 "Banyan Vines",
359 "E.164 with NSAP subaddress",
360 };
361
362/* ARAP-Zone-Access Attribute standard values */
363static const char *arap_zone[]={ NULL,
364 "Only access to dfl zone",
365 "Use zone filter inc.",
366 "Not used",
367 "Use zone filter exc.",
368 };
369
370static const char *prompt[]={ "No Echo",
371 "Echo",
372 };
373
374
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700375static struct attrtype {
376 const char *name; /* Attribute name */
The Android Open Source Project2949f582009-03-03 19:30:46 -0800377 const char **subtypes; /* Standard Values (if any) */
378 u_char siz_subtypes; /* Size of total standard values */
379 u_char first_subtype; /* First standard value is 0 or 1 */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700380 void (*print_func)(netdissect_options *, register const u_char *, u_int, u_short);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800381 } attr_type[]=
382 {
383 { NULL, NULL, 0, 0, NULL },
Elliott Hughes892a68b2015-10-19 14:43:53 -0700384 { "User-Name", NULL, 0, 0, print_attr_string },
385 { "User-Password", NULL, 0, 0, NULL },
386 { "CHAP-Password", NULL, 0, 0, NULL },
387 { "NAS-IP-Address", NULL, 0, 0, print_attr_address },
388 { "NAS-Port", NULL, 0, 0, print_attr_num },
389 { "Service-Type", serv_type, TAM_SIZE(serv_type)-1, 1, print_attr_num },
390 { "Framed-Protocol", frm_proto, TAM_SIZE(frm_proto)-1, 1, print_attr_num },
391 { "Framed-IP-Address", NULL, 0, 0, print_attr_address },
392 { "Framed-IP-Netmask", NULL, 0, 0, print_attr_address },
393 { "Framed-Routing", frm_routing, TAM_SIZE(frm_routing), 0, print_attr_num },
394 { "Filter-Id", NULL, 0, 0, print_attr_string },
395 { "Framed-MTU", NULL, 0, 0, print_attr_num },
396 { "Framed-Compression", frm_comp, TAM_SIZE(frm_comp), 0, print_attr_num },
397 { "Login-IP-Host", NULL, 0, 0, print_attr_address },
398 { "Login-Service", login_serv, TAM_SIZE(login_serv), 0, print_attr_num },
399 { "Login-TCP-Port", NULL, 0, 0, print_attr_num },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800400 { "Unassigned", NULL, 0, 0, NULL }, /*17*/
Elliott Hughes892a68b2015-10-19 14:43:53 -0700401 { "Reply-Message", NULL, 0, 0, print_attr_string },
402 { "Callback-Number", NULL, 0, 0, print_attr_string },
403 { "Callback-Id", NULL, 0, 0, print_attr_string },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800404 { "Unassigned", NULL, 0, 0, NULL }, /*21*/
Elliott Hughes892a68b2015-10-19 14:43:53 -0700405 { "Framed-Route", NULL, 0, 0, print_attr_string },
406 { "Framed-IPX-Network", NULL, 0, 0, print_attr_num },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800407 { "State", NULL, 0, 0, print_attr_string },
408 { "Class", NULL, 0, 0, print_attr_string },
Elliott Hughes892a68b2015-10-19 14:43:53 -0700409 { "Vendor-Specific", NULL, 0, 0, print_vendor_attr },
410 { "Session-Timeout", NULL, 0, 0, print_attr_num },
411 { "Idle-Timeout", NULL, 0, 0, print_attr_num },
412 { "Termination-Action", term_action, TAM_SIZE(term_action), 0, print_attr_num },
413 { "Called-Station-Id", NULL, 0, 0, print_attr_string },
414 { "Calling-Station-Id", NULL, 0, 0, print_attr_string },
415 { "NAS-Identifier", NULL, 0, 0, print_attr_string },
416 { "Proxy-State", NULL, 0, 0, print_attr_string },
417 { "Login-LAT-Service", NULL, 0, 0, print_attr_string },
418 { "Login-LAT-Node", NULL, 0, 0, print_attr_string },
419 { "Login-LAT-Group", NULL, 0, 0, print_attr_string },
420 { "Framed-AppleTalk-Link", NULL, 0, 0, print_attr_num },
421 { "Framed-AppleTalk-Network", NULL, 0, 0, print_attr_num },
422 { "Framed-AppleTalk-Zone", NULL, 0, 0, print_attr_string },
423 { "Acct-Status-Type", acct_status, TAM_SIZE(acct_status)-1, 1, print_attr_num },
424 { "Acct-Delay-Time", NULL, 0, 0, print_attr_num },
425 { "Acct-Input-Octets", NULL, 0, 0, print_attr_num },
426 { "Acct-Output-Octets", NULL, 0, 0, print_attr_num },
427 { "Acct-Session-Id", NULL, 0, 0, print_attr_string },
428 { "Acct-Authentic", acct_auth, TAM_SIZE(acct_auth)-1, 1, print_attr_num },
429 { "Acct-Session-Time", NULL, 0, 0, print_attr_num },
430 { "Acct-Input-Packets", NULL, 0, 0, print_attr_num },
431 { "Acct-Output-Packets", NULL, 0, 0, print_attr_num },
432 { "Acct-Terminate-Cause", acct_term, TAM_SIZE(acct_term)-1, 1, print_attr_num },
433 { "Acct-Multi-Session-Id", NULL, 0, 0, print_attr_string },
434 { "Acct-Link-Count", NULL, 0, 0, print_attr_num },
435 { "Acct-Input-Gigawords", NULL, 0, 0, print_attr_num },
436 { "Acct-Output-Gigawords", NULL, 0, 0, print_attr_num },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800437 { "Unassigned", NULL, 0, 0, NULL }, /*54*/
Elliott Hughes892a68b2015-10-19 14:43:53 -0700438 { "Event-Timestamp", NULL, 0, 0, print_attr_time },
439 { "Egress-VLANID", NULL, 0, 0, print_attr_num },
440 { "Ingress-Filters", ingress_filters, TAM_SIZE(ingress_filters)-1, 1, print_attr_num },
441 { "Egress-VLAN-Name", NULL, 0, 0, print_attr_string },
442 { "User-Priority-Table", NULL, 0, 0, NULL },
443 { "CHAP-Challenge", NULL, 0, 0, print_attr_string },
444 { "NAS-Port-Type", nas_port_type, TAM_SIZE(nas_port_type), 0, print_attr_num },
445 { "Port-Limit", NULL, 0, 0, print_attr_num },
446 { "Login-LAT-Port", NULL, 0, 0, print_attr_string }, /*63*/
447 { "Tunnel-Type", tunnel_type, TAM_SIZE(tunnel_type)-1, 1, print_attr_num },
448 { "Tunnel-Medium-Type", tunnel_medium, TAM_SIZE(tunnel_medium)-1, 1, print_attr_num },
449 { "Tunnel-Client-Endpoint", NULL, 0, 0, print_attr_string },
450 { "Tunnel-Server-Endpoint", NULL, 0, 0, print_attr_string },
451 { "Acct-Tunnel-Connection", NULL, 0, 0, print_attr_string },
452 { "Tunnel-Password", NULL, 0, 0, print_attr_string },
453 { "ARAP-Password", NULL, 0, 0, print_attr_strange },
454 { "ARAP-Features", NULL, 0, 0, print_attr_strange },
455 { "ARAP-Zone-Access", arap_zone, TAM_SIZE(arap_zone)-1, 1, print_attr_num }, /*72*/
456 { "ARAP-Security", NULL, 0, 0, print_attr_string },
457 { "ARAP-Security-Data", NULL, 0, 0, print_attr_string },
458 { "Password-Retry", NULL, 0, 0, print_attr_num },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800459 { "Prompt", prompt, TAM_SIZE(prompt), 0, print_attr_num },
Elliott Hughes892a68b2015-10-19 14:43:53 -0700460 { "Connect-Info", NULL, 0, 0, print_attr_string },
461 { "Configuration-Token", NULL, 0, 0, print_attr_string },
462 { "EAP-Message", NULL, 0, 0, print_attr_string },
463 { "Message-Authenticator", NULL, 0, 0, print_attr_string }, /*80*/
464 { "Tunnel-Private-Group-ID", NULL, 0, 0, print_attr_string },
465 { "Tunnel-Assignment-ID", NULL, 0, 0, print_attr_string },
466 { "Tunnel-Preference", NULL, 0, 0, print_attr_num },
467 { "ARAP-Challenge-Response", NULL, 0, 0, print_attr_strange },
468 { "Acct-Interim-Interval", NULL, 0, 0, print_attr_num },
469 { "Acct-Tunnel-Packets-Lost", NULL, 0, 0, print_attr_num }, /*86*/
470 { "NAS-Port-Id", NULL, 0, 0, print_attr_string },
471 { "Framed-Pool", NULL, 0, 0, print_attr_string },
472 { "CUI", NULL, 0, 0, print_attr_string },
473 { "Tunnel-Client-Auth-ID", NULL, 0, 0, print_attr_string },
474 { "Tunnel-Server-Auth-ID", NULL, 0, 0, print_attr_string },
The Android Open Source Project2949f582009-03-03 19:30:46 -0800475 { "Unassigned", NULL, 0, 0, NULL }, /*92*/
476 { "Unassigned", NULL, 0, 0, NULL } /*93*/
477 };
478
479
480/*****************************/
481/* Print an attribute string */
482/* value pointed by 'data' */
483/* and 'length' size. */
484/*****************************/
485/* Returns nothing. */
486/*****************************/
487static void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700488print_attr_string(netdissect_options *ndo,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700489 register const u_char *data, u_int length, u_short attr_code)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800490{
491 register u_int i;
492
Elliott Hughes892a68b2015-10-19 14:43:53 -0700493 ND_TCHECK2(data[0],length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800494
495 switch(attr_code)
496 {
497 case TUNNEL_PASS:
498 if (length < 3)
499 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700500 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800501 return;
502 }
503 if (*data && (*data <=0x1F) )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700504 ND_PRINT((ndo, "Tag[%u] ", *data));
505 else
506 ND_PRINT((ndo, "Tag[Unused] "));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800507 data++;
508 length--;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700509 ND_PRINT((ndo, "Salt %u ", EXTRACT_16BITS(data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800510 data+=2;
511 length-=2;
512 break;
513 case TUNNEL_CLIENT_END:
514 case TUNNEL_SERVER_END:
515 case TUNNEL_PRIV_GROUP:
516 case TUNNEL_ASSIGN_ID:
517 case TUNNEL_CLIENT_AUTH:
518 case TUNNEL_SERVER_AUTH:
519 if (*data <= 0x1F)
520 {
521 if (length < 1)
522 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700523 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800524 return;
525 }
Elliott Hughes892a68b2015-10-19 14:43:53 -0700526 if (*data)
527 ND_PRINT((ndo, "Tag[%u] ", *data));
528 else
529 ND_PRINT((ndo, "Tag[Unused] "));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800530 data++;
531 length--;
532 }
533 break;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700534 case EGRESS_VLAN_NAME:
535 ND_PRINT((ndo, "%s (0x%02x) ",
536 tok2str(rfc4675_tagged,"Unknown tag",*data),
537 *data));
538 data++;
539 length--;
540 break;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800541 }
542
543 for (i=0; *data && i < length ; i++, data++)
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700544 ND_PRINT((ndo, "%c", (*data < 32 || *data > 126) ? '.' : *data));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800545
546 return;
547
548 trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700549 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800550}
551
552/*
553 * print vendor specific attributes
554 */
The Android Open Source Project2949f582009-03-03 19:30:46 -0800555static void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700556print_vendor_attr(netdissect_options *ndo,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700557 register const u_char *data, u_int length, u_short attr_code _U_)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800558{
559 u_int idx;
560 u_int vendor_id;
561 u_int vendor_type;
562 u_int vendor_length;
563
564 if (length < 4)
565 goto trunc;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700566 ND_TCHECK2(*data, 4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800567 vendor_id = EXTRACT_32BITS(data);
568 data+=4;
569 length-=4;
570
Elliott Hughes892a68b2015-10-19 14:43:53 -0700571 ND_PRINT((ndo, "Vendor: %s (%u)",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800572 tok2str(smi_values,"Unknown",vendor_id),
Elliott Hughes892a68b2015-10-19 14:43:53 -0700573 vendor_id));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800574
575 while (length >= 2) {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700576 ND_TCHECK2(*data, 2);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800577
578 vendor_type = *(data);
579 vendor_length = *(data+1);
580
581 if (vendor_length < 2)
582 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700583 ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u (bogus, must be >= 2)",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800584 vendor_type,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700585 vendor_length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800586 return;
587 }
588 if (vendor_length > length)
589 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700590 ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u (bogus, goes past end of vendor-specific attribute)",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800591 vendor_type,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700592 vendor_length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800593 return;
594 }
595 data+=2;
596 vendor_length-=2;
597 length-=2;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700598 ND_TCHECK2(*data, vendor_length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800599
Elliott Hughes892a68b2015-10-19 14:43:53 -0700600 ND_PRINT((ndo, "\n\t Vendor Attribute: %u, Length: %u, Value: ",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800601 vendor_type,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700602 vendor_length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800603 for (idx = 0; idx < vendor_length ; idx++, data++)
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700604 ND_PRINT((ndo, "%c", (*data < 32 || *data > 126) ? '.' : *data));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800605 length-=vendor_length;
606 }
607 return;
608
609 trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700610 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800611}
612
The Android Open Source Project2949f582009-03-03 19:30:46 -0800613/******************************/
614/* Print an attribute numeric */
615/* value pointed by 'data' */
616/* and 'length' size. */
617/******************************/
618/* Returns nothing. */
619/******************************/
620static void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700621print_attr_num(netdissect_options *ndo,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700622 register const u_char *data, u_int length, u_short attr_code)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800623{
Elliott Hughes892a68b2015-10-19 14:43:53 -0700624 uint32_t timeout;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800625
626 if (length != 4)
627 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700628 ND_PRINT((ndo, "ERROR: length %u != 4", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800629 return;
630 }
631
Elliott Hughes892a68b2015-10-19 14:43:53 -0700632 ND_TCHECK2(data[0],4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800633 /* This attribute has standard values */
634 if (attr_type[attr_code].siz_subtypes)
635 {
636 static const char **table;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700637 uint32_t data_value;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800638 table = attr_type[attr_code].subtypes;
639
640 if ( (attr_code == TUNNEL_TYPE) || (attr_code == TUNNEL_MEDIUM) )
641 {
642 if (!*data)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700643 ND_PRINT((ndo, "Tag[Unused] "));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800644 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700645 ND_PRINT((ndo, "Tag[%d] ", *data));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800646 data++;
647 data_value = EXTRACT_24BITS(data);
648 }
649 else
650 {
651 data_value = EXTRACT_32BITS(data);
652 }
Elliott Hughes892a68b2015-10-19 14:43:53 -0700653 if ( data_value <= (uint32_t)(attr_type[attr_code].siz_subtypes - 1 +
The Android Open Source Project2949f582009-03-03 19:30:46 -0800654 attr_type[attr_code].first_subtype) &&
655 data_value >= attr_type[attr_code].first_subtype )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700656 ND_PRINT((ndo, "%s", table[data_value]));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800657 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700658 ND_PRINT((ndo, "#%u", data_value));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800659 }
660 else
661 {
662 switch(attr_code) /* Be aware of special cases... */
663 {
664 case FRM_IPX:
665 if (EXTRACT_32BITS( data) == 0xFFFFFFFE )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700666 ND_PRINT((ndo, "NAS Select"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800667 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700668 ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800669 break;
670
671 case SESSION_TIMEOUT:
672 case IDLE_TIMEOUT:
673 case ACCT_DELAY:
674 case ACCT_SESSION_TIME:
675 case ACCT_INT_INTERVAL:
676 timeout = EXTRACT_32BITS( data);
677 if ( timeout < 60 )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700678 ND_PRINT((ndo, "%02d secs", timeout));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800679 else
680 {
681 if ( timeout < 3600 )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700682 ND_PRINT((ndo, "%02d:%02d min",
683 timeout / 60, timeout % 60));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800684 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700685 ND_PRINT((ndo, "%02d:%02d:%02d hours",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800686 timeout / 3600, (timeout % 3600) / 60,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700687 timeout % 60));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800688 }
689 break;
690
691 case FRM_ATALK_LINK:
692 if (EXTRACT_32BITS(data) )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700693 ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800694 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700695 ND_PRINT((ndo, "Unnumbered"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800696 break;
697
698 case FRM_ATALK_NETWORK:
699 if (EXTRACT_32BITS(data) )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700700 ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800701 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700702 ND_PRINT((ndo, "NAS assigned"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800703 break;
704
705 case TUNNEL_PREFERENCE:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700706 if (*data)
707 ND_PRINT((ndo, "Tag[%d] ", *data));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800708 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700709 ND_PRINT((ndo, "Tag[Unused] "));
710 data++;
711 ND_PRINT((ndo, "%d", EXTRACT_24BITS(data)));
712 break;
713
714 case EGRESS_VLAN_ID:
715 ND_PRINT((ndo, "%s (0x%02x) ",
716 tok2str(rfc4675_tagged,"Unknown tag",*data),
717 *data));
718 data++;
719 ND_PRINT((ndo, "%d", EXTRACT_24BITS(data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800720 break;
721
722 default:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700723 ND_PRINT((ndo, "%d", EXTRACT_32BITS(data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800724 break;
725
726 } /* switch */
727
728 } /* if-else */
729
730 return;
731
732 trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700733 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800734}
735
The Android Open Source Project2949f582009-03-03 19:30:46 -0800736/*****************************/
737/* Print an attribute IPv4 */
738/* address value pointed by */
739/* 'data' and 'length' size. */
740/*****************************/
741/* Returns nothing. */
742/*****************************/
743static void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700744print_attr_address(netdissect_options *ndo,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700745 register const u_char *data, u_int length, u_short attr_code)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800746{
747 if (length != 4)
748 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700749 ND_PRINT((ndo, "ERROR: length %u != 4", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800750 return;
751 }
752
Elliott Hughes892a68b2015-10-19 14:43:53 -0700753 ND_TCHECK2(data[0],4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800754
755 switch(attr_code)
756 {
757 case FRM_IPADDR:
758 case LOG_IPHOST:
759 if (EXTRACT_32BITS(data) == 0xFFFFFFFF )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700760 ND_PRINT((ndo, "User Selected"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800761 else
762 if (EXTRACT_32BITS(data) == 0xFFFFFFFE )
Elliott Hughes892a68b2015-10-19 14:43:53 -0700763 ND_PRINT((ndo, "NAS Select"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800764 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700765 ND_PRINT((ndo, "%s",ipaddr_string(ndo, data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800766 break;
767
768 default:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700769 ND_PRINT((ndo, "%s", ipaddr_string(ndo, data)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800770 break;
771 }
772
773 return;
774
775 trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700776 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800777}
778
The Android Open Source Project2949f582009-03-03 19:30:46 -0800779/*************************************/
780/* Print an attribute of 'secs since */
781/* January 1, 1970 00:00 UTC' value */
782/* pointed by 'data' and 'length' */
783/* size. */
784/*************************************/
785/* Returns nothing. */
786/*************************************/
Elliott Hughes892a68b2015-10-19 14:43:53 -0700787static void
788print_attr_time(netdissect_options *ndo,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700789 register const u_char *data, u_int length, u_short attr_code _U_)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800790{
791 time_t attr_time;
792 char string[26];
793
794 if (length != 4)
795 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700796 ND_PRINT((ndo, "ERROR: length %u != 4", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800797 return;
798 }
799
Elliott Hughes892a68b2015-10-19 14:43:53 -0700800 ND_TCHECK2(data[0],4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800801
802 attr_time = EXTRACT_32BITS(data);
803 strlcpy(string, ctime(&attr_time), sizeof(string));
804 /* Get rid of the newline */
805 string[24] = '\0';
Elliott Hughes892a68b2015-10-19 14:43:53 -0700806 ND_PRINT((ndo, "%.24s", string));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800807 return;
808
809 trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700810 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800811}
812
The Android Open Source Project2949f582009-03-03 19:30:46 -0800813/***********************************/
814/* Print an attribute of 'strange' */
815/* data format pointed by 'data' */
816/* and 'length' size. */
817/***********************************/
818/* Returns nothing. */
819/***********************************/
Elliott Hughes892a68b2015-10-19 14:43:53 -0700820static void
821print_attr_strange(netdissect_options *ndo,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700822 register const u_char *data, u_int length, u_short attr_code)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800823{
824 u_short len_data;
825
826 switch(attr_code)
827 {
828 case ARAP_PASS:
829 if (length != 16)
830 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700831 ND_PRINT((ndo, "ERROR: length %u != 16", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800832 return;
833 }
Elliott Hughes892a68b2015-10-19 14:43:53 -0700834 ND_PRINT((ndo, "User_challenge ("));
835 ND_TCHECK2(data[0],8);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800836 len_data = 8;
837 PRINT_HEX(len_data, data);
Elliott Hughes892a68b2015-10-19 14:43:53 -0700838 ND_PRINT((ndo, ") User_resp("));
839 ND_TCHECK2(data[0],8);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800840 len_data = 8;
841 PRINT_HEX(len_data, data);
Elliott Hughes892a68b2015-10-19 14:43:53 -0700842 ND_PRINT((ndo, ")"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800843 break;
844
845 case ARAP_FEATURES:
846 if (length != 14)
847 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700848 ND_PRINT((ndo, "ERROR: length %u != 14", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800849 return;
850 }
Elliott Hughes892a68b2015-10-19 14:43:53 -0700851 ND_TCHECK2(data[0],1);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800852 if (*data)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700853 ND_PRINT((ndo, "User can change password"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800854 else
Elliott Hughes892a68b2015-10-19 14:43:53 -0700855 ND_PRINT((ndo, "User cannot change password"));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800856 data++;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700857 ND_TCHECK2(data[0],1);
858 ND_PRINT((ndo, ", Min password length: %d", *data));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800859 data++;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700860 ND_PRINT((ndo, ", created at: "));
861 ND_TCHECK2(data[0],4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800862 len_data = 4;
863 PRINT_HEX(len_data, data);
Elliott Hughes892a68b2015-10-19 14:43:53 -0700864 ND_PRINT((ndo, ", expires in: "));
865 ND_TCHECK2(data[0],4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800866 len_data = 4;
867 PRINT_HEX(len_data, data);
Elliott Hughes892a68b2015-10-19 14:43:53 -0700868 ND_PRINT((ndo, ", Current Time: "));
869 ND_TCHECK2(data[0],4);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800870 len_data = 4;
871 PRINT_HEX(len_data, data);
872 break;
873
874 case ARAP_CHALLENGE_RESP:
875 if (length < 8)
876 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700877 ND_PRINT((ndo, "ERROR: length %u != 8", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800878 return;
879 }
Elliott Hughes892a68b2015-10-19 14:43:53 -0700880 ND_TCHECK2(data[0],8);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800881 len_data = 8;
882 PRINT_HEX(len_data, data);
883 break;
884 }
885 return;
886
887 trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700888 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800889}
890
The Android Open Source Project2949f582009-03-03 19:30:46 -0800891static void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700892radius_attrs_print(netdissect_options *ndo,
893 register const u_char *attr, u_int length)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800894{
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700895 register const struct radius_attr *rad_attr = (const struct radius_attr *)attr;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800896 const char *attr_string;
897
898 while (length > 0)
899 {
900 if (length < 2)
901 goto trunc;
Elliott Hughes892a68b2015-10-19 14:43:53 -0700902 ND_TCHECK(*rad_attr);
903
The Android Open Source Project2949f582009-03-03 19:30:46 -0800904 if (rad_attr->type > 0 && rad_attr->type < TAM_SIZE(attr_type))
905 attr_string = attr_type[rad_attr->type].name;
906 else
907 attr_string = "Unknown";
908 if (rad_attr->len < 2)
909 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700910 ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u (bogus, must be >= 2)",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800911 attr_string,
912 rad_attr->type,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700913 rad_attr->len));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800914 return;
915 }
916 if (rad_attr->len > length)
917 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700918 ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u (bogus, goes past end of packet)",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800919 attr_string,
920 rad_attr->type,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700921 rad_attr->len));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800922 return;
923 }
Elliott Hughes892a68b2015-10-19 14:43:53 -0700924 ND_PRINT((ndo, "\n\t %s Attribute (%u), length: %u, Value: ",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800925 attr_string,
926 rad_attr->type,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700927 rad_attr->len));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800928
929 if (rad_attr->type < TAM_SIZE(attr_type))
930 {
931 if (rad_attr->len > 2)
932 {
933 if ( attr_type[rad_attr->type].print_func )
934 (*attr_type[rad_attr->type].print_func)(
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700935 ndo, ((const u_char *)(rad_attr+1)),
The Android Open Source Project2949f582009-03-03 19:30:46 -0800936 rad_attr->len - 2, rad_attr->type);
937 }
938 }
939 /* do we also want to see a hex dump ? */
Elliott Hughes892a68b2015-10-19 14:43:53 -0700940 if (ndo->ndo_vflag> 1)
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700941 print_unknown_data(ndo, (const u_char *)rad_attr+2, "\n\t ", (rad_attr->len)-2);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800942
943 length-=(rad_attr->len);
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700944 rad_attr = (const struct radius_attr *)( ((const char *)(rad_attr))+rad_attr->len);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800945 }
946 return;
947
948trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700949 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800950}
951
The Android Open Source Project2949f582009-03-03 19:30:46 -0800952void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700953radius_print(netdissect_options *ndo,
954 const u_char *dat, u_int length)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800955{
956 register const struct radius_hdr *rad;
957 u_int len, auth_idx;
958
Elliott Hughes892a68b2015-10-19 14:43:53 -0700959 ND_TCHECK2(*dat, MIN_RADIUS_LEN);
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700960 rad = (const struct radius_hdr *)dat;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800961 len = EXTRACT_16BITS(&rad->len);
962
963 if (len < MIN_RADIUS_LEN)
964 {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700965 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800966 return;
967 }
968
969 if (len > length)
970 len = length;
971
Elliott Hughes892a68b2015-10-19 14:43:53 -0700972 if (ndo->ndo_vflag < 1) {
973 ND_PRINT((ndo, "RADIUS, %s (%u), id: 0x%02x length: %u",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800974 tok2str(radius_command_values,"Unknown Command",rad->code),
975 rad->code,
976 rad->id,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700977 len));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800978 return;
979 }
980 else {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700981 ND_PRINT((ndo, "RADIUS, length: %u\n\t%s (%u), id: 0x%02x, Authenticator: ",
The Android Open Source Project2949f582009-03-03 19:30:46 -0800982 len,
983 tok2str(radius_command_values,"Unknown Command",rad->code),
984 rad->code,
Elliott Hughes892a68b2015-10-19 14:43:53 -0700985 rad->id));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800986
987 for(auth_idx=0; auth_idx < 16; auth_idx++)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700988 ND_PRINT((ndo, "%02x", rad->auth[auth_idx]));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800989 }
990
991 if (len > MIN_RADIUS_LEN)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700992 radius_attrs_print(ndo, dat + MIN_RADIUS_LEN, len - MIN_RADIUS_LEN);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800993 return;
994
995trunc:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700996 ND_PRINT((ndo, "%s", tstr));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800997}