Deleted Added
sdiff udiff text old ( 190207 ) new ( 214478 )
full compact
1/*
2 * Copyright (C) 1998 and 1999 WIDE Project.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 26 unchanged lines hidden (view full) ---

35 * RFC3898,
36 * RFC4075,
37 * RFC4242,
38 * RFC4280,
39 */
40
41#ifndef lint
42static const char rcsid[] _U_ =
43 "@(#) $Header: /tcpdump/master/tcpdump/print-dhcp6.c,v 1.37 2008-02-06 10:26:09 guy Exp $";
44#endif
45
46#ifdef HAVE_CONFIG_H
47#include "config.h"
48#endif
49
50#include <tcpdump-stdinc.h>
51

--- 120 unchanged lines hidden (view full) ---

172#define DH6OPT_LQ_CLIENT_LINK 48
173
174struct dhcp6opt {
175 u_int16_t dh6opt_type;
176 u_int16_t dh6opt_len;
177 /* type-dependent data follows */
178};
179
180static const char *
181dhcp6opt_name(int type)
182{
183 static char genstr[sizeof("opt_65535") + 1]; /* XXX thread unsafe */
184
185 if (type > 65535)
186 return "INVALID-option";
187
188 switch(type) {
189 case DH6OPT_CLIENTID:
190 return "client-ID";
191 case DH6OPT_SERVERID:
192 return "server-ID";
193 case DH6OPT_IA_NA:
194 return "IA_NA";
195 case DH6OPT_IA_TA:
196 return "IA_TA";
197 case DH6OPT_IA_ADDR:
198 return "IA_ADDR";
199 case DH6OPT_ORO:
200 return "option-request";
201 case DH6OPT_PREFERENCE:
202 return "preference";
203 case DH6OPT_ELAPSED_TIME:
204 return "elapsed-time";
205 case DH6OPT_RELAY_MSG:
206 return "relay-message";
207 case DH6OPT_AUTH:
208 return "authentication";
209 case DH6OPT_UNICAST:
210 return "server-unicast";
211 case DH6OPT_STATUS_CODE:
212 return "status-code";
213 case DH6OPT_RAPID_COMMIT:
214 return "rapid-commit";
215 case DH6OPT_USER_CLASS:
216 return "user-class";
217 case DH6OPT_VENDOR_CLASS:
218 return "vendor-class";
219 case DH6OPT_VENDOR_OPTS:
220 return "vendor-specific-info";
221 case DH6OPT_INTERFACE_ID:
222 return "interface-ID";
223 case DH6OPT_RECONF_MSG:
224 return "reconfigure-message";
225 case DH6OPT_RECONF_ACCEPT:
226 return "reconfigure-accept";
227 case DH6OPT_SIP_SERVER_D:
228 return "SIP-servers-domain";
229 case DH6OPT_SIP_SERVER_A:
230 return "SIP-servers-address";
231 case DH6OPT_DNS:
232 return "DNS";
233 case DH6OPT_DNSNAME:
234 return "DNS-name";
235 case DH6OPT_IA_PD:
236 return "IA_PD";
237 case DH6OPT_IA_PD_PREFIX:
238 return "IA_PD-prefix";
239 case DH6OPT_NTP_SERVERS:
240 return "NTP-Server";
241 case DH6OPT_LIFETIME:
242 return "lifetime";
243 case DH6OPT_NIS_SERVERS:
244 return "NIS-server";
245 case DH6OPT_NISP_SERVERS:
246 return "NIS+-server";
247 case DH6OPT_NIS_NAME:
248 return "NIS-domain-name";
249 case DH6OPT_NISP_NAME:
250 return "NIS+-domain-name";
251 case DH6OPT_BCMCS_SERVER_D:
252 return "BCMCS-domain-name";
253 case DH6OPT_BCMCS_SERVER_A:
254 return "BCMCS-server";
255 case DH6OPT_GEOCONF_CIVIC:
256 return "Geoconf-Civic";
257 case DH6OPT_REMOTE_ID:
258 return "Remote-ID";
259 case DH6OPT_SUBSCRIBER_ID:
260 return "Subscriber-ID";
261 case DH6OPT_CLIENT_FQDN:
262 return "Client-FQDN";
263 case DH6OPT_PANA_AGENT:
264 return "PANA-agent";
265 case DH6OPT_NEW_POSIX_TIMEZONE:
266 return "POSIX-timezone";
267 case DH6OPT_NEW_TZDB_TIMEZONE:
268 return "POSIX-tz-database";
269 case DH6OPT_ERO:
270 return "Echo-request-option";
271 case DH6OPT_LQ_QUERY:
272 return "Lease-query";
273 case DH6OPT_CLIENT_DATA:
274 return "LQ-client-data";
275 case DH6OPT_CLT_TIME:
276 return "Clt-time";
277 case DH6OPT_LQ_RELAY_DATA:
278 return "LQ-relay-data";
279 case DH6OPT_LQ_CLIENT_LINK:
280 return "LQ-client-link";
281 default:
282 snprintf(genstr, sizeof(genstr), "opt_%d", type);
283 return(genstr);
284 }
285}
286
287static const char *
288dhcp6stcode(int code)

--- 35 unchanged lines hidden (view full) ---

324static void
325dhcp6opt_print(const u_char *cp, const u_char *ep)
326{
327 struct dhcp6opt *dh6o;
328 u_char *tp;
329 size_t i;
330 u_int16_t opttype;
331 size_t optlen;
332 u_int8_t auth_proto;
333 u_int authinfolen, authrealmlen;
334
335 if (cp == ep)
336 return;
337 while (cp < ep) {
338 if (ep < cp + sizeof(*dh6o))
339 goto trunc;
340 dh6o = (struct dhcp6opt *)cp;

--- 52 unchanged lines hidden (view full) ---

393 }
394 break;
395 default:
396 printf(" type %d)", EXTRACT_16BITS(tp));
397 break;
398 }
399 break;
400 case DH6OPT_IA_ADDR:
401 if (optlen < 24) {
402 /*(*/
403 printf(" ?)");
404 break;
405 }
406 tp = (u_char *)(dh6o + 1);
407 printf(" %s", ip6addr_string(&tp[0]));
408 printf(" pltime:%u vltime:%u",
409 EXTRACT_32BITS(&tp[16]),
410 EXTRACT_32BITS(&tp[20]));
411 if (optlen > 24) {
412 /* there are sub-options */
413 dhcp6opt_print(tp + 24, tp + 24 + optlen);
414 }
415 printf(")");
416 break;
417 case DH6OPT_ORO:
418 case DH6OPT_ERO:
419 if (optlen % 2) {
420 printf(" ?)");
421 break;
422 }
423 tp = (u_char *)(dh6o + 1);
424 for (i = 0; i < optlen; i += 2) {
425 printf(" %s",
426 dhcp6opt_name(EXTRACT_16BITS(&tp[i])));
427 }
428 printf(")");
429 break;
430 case DH6OPT_PREFERENCE:
431 if (optlen != 1) {
432 printf(" ?)");
433 break;
434 }
435 tp = (u_char *)(dh6o + 1);
436 printf(" %d)", *tp);
437 break;
438 case DH6OPT_ELAPSED_TIME:
439 if (optlen != 2) {
440 printf(" ?)");
441 break;
442 }
443 tp = (u_char *)(dh6o + 1);
444 printf(" %d)", EXTRACT_16BITS(tp));
445 break;
446 case DH6OPT_RELAY_MSG:
447 printf(" (");
448 tp = (u_char *)(dh6o + 1);
449 dhcp6_print(tp, optlen);
450 printf(")");
451 break;
452 case DH6OPT_AUTH:
453 if (optlen < 11) {
454 printf(" ?)");
455 break;
456 }
457 tp = (u_char *)(dh6o + 1);
458 auth_proto = *tp;
459 switch (auth_proto) {
460 case DH6OPT_AUTHPROTO_DELAYED:
461 printf(" proto: delayed");
462 break;
463 case DH6OPT_AUTHPROTO_RECONFIG:
464 printf(" proto: reconfigure");
465 break;
466 default:
467 printf(" proto: %d", auth_proto);
468 break;
469 }
470 tp++;
471 switch (*tp) {
472 case DH6OPT_AUTHALG_HMACMD5:
473 /* XXX: may depend on the protocol */
474 printf(", alg: HMAC-MD5");
475 break;
476 default:
477 printf(", alg: %d", *tp);
478 break;
479 }
480 tp++;
481 switch (*tp) {
482 case DH6OPT_AUTHRDM_MONOCOUNTER:
483 printf(", RDM: mono");
484 break;
485 default:
486 printf(", RDM: %d", *tp);
487 break;
488 }
489 tp++;
490 printf(", RD:");
491 for (i = 0; i < 4; i++, tp += 2)
492 printf(" %04x", EXTRACT_16BITS(tp));
493
494 /* protocol dependent part */
495 authinfolen = optlen - 11;
496 switch (auth_proto) {
497 case DH6OPT_AUTHPROTO_DELAYED:
498 if (authinfolen == 0)
499 break;
500 if (authinfolen < 20) {
501 printf(" ??");
502 break;
503 }
504 authrealmlen = authinfolen - 20;

--- 39 unchanged lines hidden (view full) ---

544 printf(")");
545 break;
546 case DH6OPT_INTERFACE_ID:
547 case DH6OPT_SUBSCRIBER_ID:
548 /*
549 * Since we cannot predict the encoding, print hex dump
550 * at most 10 characters.
551 */
552 tp = (u_char *)(dh6o + 1);
553 printf(" ");
554 for (i = 0; i < optlen && i < 10; i++)
555 printf("%02x", tp[i]);
556 printf("...)");
557 break;
558 case DH6OPT_RECONF_MSG:
559 tp = (u_char *)(dh6o + 1);
560 switch (*tp) {
561 case DH6_RENEW:
562 printf(" for renew)");
563 break;

--- 25 unchanged lines hidden (view full) ---

589 printf(" %s", ip6addr_string(&tp[i]));
590 printf(")");
591 break;
592 case DH6OPT_STATUS_CODE:
593 if (optlen < 2) {
594 printf(" ?)");
595 break;
596 }
597 tp = (u_char *)(dh6o + 1);
598 printf(" %s)", dhcp6stcode(EXTRACT_16BITS(&tp[0])));
599 break;
600 case DH6OPT_IA_NA:
601 case DH6OPT_IA_PD:
602 if (optlen < 12) {
603 printf(" ?)");
604 break;
605 }
606 tp = (u_char *)(dh6o + 1);
607 printf(" IAID:%u T1:%u T2:%u",
608 EXTRACT_32BITS(&tp[0]),
609 EXTRACT_32BITS(&tp[4]),
610 EXTRACT_32BITS(&tp[8]));
611 if (optlen > 12) {
612 /* there are sub-options */
613 dhcp6opt_print(tp + 12, tp + 12 + optlen);
614 }
615 printf(")");
616 break;
617 case DH6OPT_IA_TA:
618 if (optlen < 4) {
619 printf(" ?)");
620 break;
621 }
622 tp = (u_char *)(dh6o + 1);
623 printf(" IAID:%u", EXTRACT_32BITS(tp));
624 if (optlen > 4) {
625 /* there are sub-options */
626 dhcp6opt_print(tp + 4, tp + 4 + optlen);
627 }
628 printf(")");
629 break;
630 case DH6OPT_IA_PD_PREFIX:
631 if (optlen < 25) {
632 printf(" ?)");
633 break;
634 }
635 tp = (u_char *)(dh6o + 1);
636 printf(" %s/%d", ip6addr_string(&tp[9]), tp[8]);
637 printf(" pltime:%u vltime:%u",
638 EXTRACT_32BITS(&tp[0]),
639 EXTRACT_32BITS(&tp[4]));
640 if (optlen > 25) {
641 /* there are sub-options */
642 dhcp6opt_print(tp + 25, tp + 25 + optlen);
643 }
644 printf(")");
645 break;
646 case DH6OPT_LIFETIME:
647 case DH6OPT_CLT_TIME:
648 if (optlen != 4) {
649 printf(" ?)");
650 break;
651 }
652 tp = (u_char *)(dh6o + 1);
653 printf(" %d)", EXTRACT_32BITS(tp));
654 break;
655 case DH6OPT_REMOTE_ID:
656 if (optlen < 4) {
657 printf(" ?)");
658 break;
659 }
660 tp = (u_char *)(dh6o + 1);
661 printf(" %d ", EXTRACT_32BITS(tp));
662 /*
663 * Print hex dump first 10 characters.
664 */
665 for (i = 4; i < optlen && i < 14; i++)
666 printf("%02x", tp[i]);
667 printf("...)");
668 break;
669 case DH6OPT_LQ_QUERY:

--- 16 unchanged lines hidden (view full) ---

686 printf(" %s", ip6addr_string(&tp[1]));
687 if (optlen > 17) {
688 /* there are query-options */
689 dhcp6opt_print(tp + 17, tp + optlen);
690 }
691 printf(")");
692 break;
693 case DH6OPT_CLIENT_DATA:
694 tp = (u_char *)(dh6o + 1);
695 if (optlen > 0) {
696 /* there are encapsulated options */
697 dhcp6opt_print(tp, tp + optlen);
698 }
699 printf(")");
700 break;
701 case DH6OPT_LQ_RELAY_DATA:
702 if (optlen < 16) {
703 printf(" ?)");
704 break;
705 }

--- 135 unchanged lines hidden ---