12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /*
28 * Dynamic Host Configuration Protocol version 6, for IPv6. Supports
29 * RFCs 3315, 3319, 3646, 3898, 4075, 4242, 4280, 4580, 4649, and 4704.
30 */
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <time.h>
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <netinet/in.h>
39 #include <netinet/dhcp6.h>
40 #include <arpa/inet.h>
41 #include <dhcp_impl.h>
42 #include <dhcp_inittab.h>
43
44 #include "snoop.h"
45
46 static const char *mtype_to_str(uint8_t);
47 static const char *option_to_str(uint8_t);
48 static const char *duidtype_to_str(uint16_t);
49 static const char *status_to_str(uint16_t);
50 static const char *entr_to_str(uint32_t);
51 static const char *reconf_to_str(uint8_t);
614 case DHCPV6_OPT_SERVERID:
615 if (olen < sizeof (val16))
616 break;
617 (void) memcpy(&val16, data, sizeof (val16));
618 data += sizeof (val16);
619 olen -= sizeof (val16);
620 type = ntohs(val16);
621 (void) snprintf(get_line(0, 0), get_line_remain(),
622 " DUID Type = %u (%s)", type,
623 duidtype_to_str(type));
624 if (type == DHCPV6_DUID_LLT || type == DHCPV6_DUID_LL) {
625 if (olen < sizeof (val16))
626 break;
627 (void) memcpy(&val16, data, sizeof (val16));
628 data += sizeof (val16);
629 olen -= sizeof (val16);
630 val16 = ntohs(val16);
631 (void) snprintf(get_line(0, 0),
632 get_line_remain(),
633 " Hardware Type = %u (%s)", val16,
634 arp_htype(type));
635 }
636 if (type == DHCPV6_DUID_LLT) {
637 time_t timevalue;
638
639 if (olen < sizeof (val32))
640 break;
641 (void) memcpy(&val32, data, sizeof (val32));
642 data += sizeof (val32);
643 olen -= sizeof (val32);
644 timevalue = ntohl(val32) + DUID_TIME_BASE;
645 (void) snprintf(get_line(0, 0),
646 get_line_remain(),
647 " Time = %lu (%.24s)", ntohl(val32),
648 ctime(&timevalue));
649 }
650 if (type == DHCPV6_DUID_EN) {
651 if (olen < sizeof (val32))
652 break;
653 (void) memcpy(&val32, data, sizeof (val32));
654 data += sizeof (val32);
|
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /*
28 * Dynamic Host Configuration Protocol version 6, for IPv6. Supports
29 * RFCs 3315, 3319, 3646, 3898, 4075, 4242, 4280, 4580, 4649, and 4704.
30 */
31
32 #include <ctype.h>
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36 #include <time.h>
37 #include <sys/types.h>
38 #include <sys/socket.h>
39 #include <netinet/in.h>
40 #include <netinet/dhcp6.h>
41 #include <arpa/inet.h>
42 #include <dhcp_impl.h>
43 #include <dhcp_inittab.h>
44
45 #include "snoop.h"
46
47 static const char *mtype_to_str(uint8_t);
48 static const char *option_to_str(uint8_t);
49 static const char *duidtype_to_str(uint16_t);
50 static const char *status_to_str(uint16_t);
51 static const char *entr_to_str(uint32_t);
52 static const char *reconf_to_str(uint8_t);
615 case DHCPV6_OPT_SERVERID:
616 if (olen < sizeof (val16))
617 break;
618 (void) memcpy(&val16, data, sizeof (val16));
619 data += sizeof (val16);
620 olen -= sizeof (val16);
621 type = ntohs(val16);
622 (void) snprintf(get_line(0, 0), get_line_remain(),
623 " DUID Type = %u (%s)", type,
624 duidtype_to_str(type));
625 if (type == DHCPV6_DUID_LLT || type == DHCPV6_DUID_LL) {
626 if (olen < sizeof (val16))
627 break;
628 (void) memcpy(&val16, data, sizeof (val16));
629 data += sizeof (val16);
630 olen -= sizeof (val16);
631 val16 = ntohs(val16);
632 (void) snprintf(get_line(0, 0),
633 get_line_remain(),
634 " Hardware Type = %u (%s)", val16,
635 arp_htype(val16));
636 }
637 if (type == DHCPV6_DUID_LLT) {
638 time_t timevalue;
639
640 if (olen < sizeof (val32))
641 break;
642 (void) memcpy(&val32, data, sizeof (val32));
643 data += sizeof (val32);
644 olen -= sizeof (val32);
645 timevalue = ntohl(val32) + DUID_TIME_BASE;
646 (void) snprintf(get_line(0, 0),
647 get_line_remain(),
648 " Time = %lu (%.24s)", ntohl(val32),
649 ctime(&timevalue));
650 }
651 if (type == DHCPV6_DUID_EN) {
652 if (olen < sizeof (val32))
653 break;
654 (void) memcpy(&val32, data, sizeof (val32));
655 data += sizeof (val32);
|