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 --- |