]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-icmp6.c
Use more the EXTRACT_U_1() macro (40/n)
[tcpdump] / print-icmp6.c
index ce4b185609f1b1409de5e01b2b25ec5d8de075f5..761b3779e6f2c75b9744ffa97626120b77be1f8e 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+/* \summary: IPv6 Internet Control Message Protocol (ICMPv6) printer */
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#ifdef INET6
-
 #include <netdissect-stdinc.h>
 
 #include <stdio.h>
@@ -32,6 +32,7 @@
 
 #include "netdissect.h"
 #include "addrtoname.h"
+#include "addrtostr.h"
 #include "extract.h"
 
 #include "ip6.h"
@@ -283,13 +284,13 @@ struct nd_opt_hdr {               /* Neighbor discovery option header */
 #define ND_OPT_DNSSL                   31
 
 struct nd_opt_prefix_info {    /* prefix information */
-       uint8_t         nd_opt_pi_type;
-       uint8_t         nd_opt_pi_len;
-       uint8_t         nd_opt_pi_prefix_len;
-       uint8_t         nd_opt_pi_flags_reserved;
-       uint8_t         nd_opt_pi_valid_time[4];
-       uint8_t         nd_opt_pi_preferred_time[4];
-       uint8_t         nd_opt_pi_reserved2[4];
+       nd_uint8_t              nd_opt_pi_type;
+       nd_uint8_t              nd_opt_pi_len;
+       nd_uint8_t              nd_opt_pi_prefix_len;
+       nd_uint8_t              nd_opt_pi_flags_reserved;
+       nd_uint32_t             nd_opt_pi_valid_time;
+       nd_uint32_t             nd_opt_pi_preferred_time;
+       nd_uint32_t             nd_opt_pi_reserved2;
        struct in6_addr nd_opt_pi_prefix;
 };
 
@@ -616,19 +617,20 @@ print_lladdr(netdissect_options *ndo, const uint8_t *p, size_t l)
        while (l > 0 && q < ep) {
                if (q > p)
                         ND_PRINT((ndo,":"));
-               ND_PRINT((ndo,"%02x", *q++));
+               ND_PRINT((ndo,"%02x", EXTRACT_U_1(q)));
+               q++;
                l--;
        }
 }
 
-static int icmp6_cksum(const struct ip6_hdr *ip6, const struct icmp6_hdr *icp,
-       u_int len)
+static int icmp6_cksum(netdissect_options *ndo, const struct ip6_hdr *ip6,
+       const struct icmp6_hdr *icp, u_int len)
 {
-       return nextproto6_cksum(ip6, (const uint8_t *)(const void *)icp, len, len,
+       return nextproto6_cksum(ndo, ip6, (const uint8_t *)(const void *)icp, len, len,
                                IPPROTO_ICMPV6);
 }
 
-const struct tok rpl_mop_values[] = {
+static const struct tok rpl_mop_values[] = {
         { RPL_DIO_NONSTORING,         "nonstoring"},
         { RPL_DIO_STORING,            "storing"},
         { RPL_DIO_NONSTORING_MULTICAST, "nonstoring-multicast"},
@@ -636,7 +638,7 @@ const struct tok rpl_mop_values[] = {
         { 0, NULL},
 };
 
-const struct tok rpl_subopt_values[] = {
+static const struct tok rpl_subopt_values[] = {
         { RPL_OPT_PAD0, "pad0"},
         { RPL_OPT_PADN, "padN"},
         { RPL_DIO_METRICS, "metrics"},
@@ -649,23 +651,6 @@ const struct tok rpl_subopt_values[] = {
         { 0, NULL},
 };
 
-static void
-rpl_format_dagid(char dagid_str[65], const u_char *dagid)
-{
-        char *d = dagid_str;
-        int  i;
-
-        for(i=0;i<16;i++) {
-                if(isprint(dagid[i])) {
-                        *d++ = dagid[i];
-                } else {
-                        snprintf(d,5,"0x%02x", dagid[i]); /* 4 + null char */
-                        d += 4;
-                }
-        }
-        *d++ = '\0';
-}
-
 static void
 rpl_dio_printopt(netdissect_options *ndo,
                  const struct rpl_dio_genoption *opt,
@@ -711,16 +696,16 @@ rpl_dio_print(netdissect_options *ndo,
               const u_char *bp, u_int length)
 {
         const struct nd_rpl_dio *dio = (const struct nd_rpl_dio *)bp;
-        char dagid_str[65];
+        const char *dagid_str;
 
         ND_TCHECK(*dio);
-        rpl_format_dagid(dagid_str, dio->rpl_dagid);
+        dagid_str = ip6addr_string (ndo, dio->rpl_dagid);
 
         ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,rank:%u,%smop:%s,prf:%u]",
                   dagid_str,
                   dio->rpl_dtsn,
                   dio->rpl_instanceid,
-                  EXTRACT_16BITS(&dio->rpl_dagrank),
+                  EXTRACT_BE_U_2(&dio->rpl_dagrank),
                   RPL_DIO_GROUNDED(dio->rpl_mopprf) ? "grounded,":"",
                   tok2str(rpl_mop_values, "mop%u", RPL_DIO_MOP(dio->rpl_mopprf)),
                   RPL_DIO_PRF(dio->rpl_mopprf)));
@@ -740,20 +725,19 @@ rpl_dao_print(netdissect_options *ndo,
               const u_char *bp, u_int length)
 {
         const struct nd_rpl_dao *dao = (const struct nd_rpl_dao *)bp;
-        char dagid_str[65];
+        const char *dagid_str = "<elided>";
 
         ND_TCHECK(*dao);
         if (length < ND_RPL_DAO_MIN_LEN)
                goto tooshort;
 
-        strcpy(dagid_str,"<elided>");
         bp += ND_RPL_DAO_MIN_LEN;
         length -= ND_RPL_DAO_MIN_LEN;
         if(RPL_DAO_D(dao->rpl_flags)) {
                 ND_TCHECK2(dao->rpl_dagid, DAGID_LEN);
                 if (length < DAGID_LEN)
                        goto tooshort;
-                rpl_format_dagid(dagid_str, dao->rpl_dagid);
+                dagid_str = ip6addr_string (ndo, dao->rpl_dagid);
                 bp += DAGID_LEN;
                 length -= DAGID_LEN;
         }
@@ -786,20 +770,19 @@ rpl_daoack_print(netdissect_options *ndo,
                  const u_char *bp, u_int length)
 {
         const struct nd_rpl_daoack *daoack = (const struct nd_rpl_daoack *)bp;
-        char dagid_str[65];
+        const char *dagid_str = "<elided>";
 
         ND_TCHECK2(*daoack, ND_RPL_DAOACK_MIN_LEN);
         if (length < ND_RPL_DAOACK_MIN_LEN)
                goto tooshort;
 
-        strcpy(dagid_str,"<elided>");
         bp += ND_RPL_DAOACK_MIN_LEN;
         length -= ND_RPL_DAOACK_MIN_LEN;
         if(RPL_DAOACK_D(daoack->rpl_flags)) {
-                ND_TCHECK2(daoack->rpl_dagid, 16);
+                ND_TCHECK2(daoack->rpl_dagid, DAGID_LEN);
                 if (length < DAGID_LEN)
                        goto tooshort;
-                rpl_format_dagid(dagid_str, daoack->rpl_dagid);
+                dagid_str = ip6addr_string (ndo, daoack->rpl_dagid);
                 bp += DAGID_LEN;
                 length -= DAGID_LEN;
         }
@@ -908,8 +891,8 @@ icmp6_print(netdissect_options *ndo,
                uint16_t sum, udp_sum;
 
                if (ND_TTEST2(bp[0], length)) {
-                       udp_sum = EXTRACT_16BITS(&dp->icmp6_cksum);
-                       sum = icmp6_cksum(ip, dp, length);
+                       udp_sum = EXTRACT_BE_U_2(&dp->icmp6_cksum);
+                       sum = icmp6_cksum(ndo, ip, dp, length);
                        if (sum != 0)
                                ND_PRINT((ndo,"[bad icmp6 cksum 0x%04x -> 0x%04x!] ",
                                                 udp_sum,
@@ -952,7 +935,7 @@ icmp6_print(netdissect_options *ndo,
                            == NULL)
                                goto trunc;
 
-                       dport = EXTRACT_16BITS(&ouh->uh_dport);
+                       dport = EXTRACT_BE_U_2(&ouh->uh_dport);
                        switch (prot) {
                        case IPPROTO_TCP:
                                ND_PRINT((ndo,", %s tcp port %s",
@@ -981,7 +964,7 @@ icmp6_print(netdissect_options *ndo,
                break;
        case ICMP6_PACKET_TOO_BIG:
                ND_TCHECK(dp->icmp6_mtu);
-               ND_PRINT((ndo,", mtu %u", EXTRACT_32BITS(&dp->icmp6_mtu)));
+               ND_PRINT((ndo,", mtu %u", EXTRACT_BE_U_4(&dp->icmp6_mtu)));
                break;
        case ICMP6_TIME_EXCEEDED:
                ND_TCHECK(oip->ip6_dst);
@@ -1002,13 +985,13 @@ icmp6_print(netdissect_options *ndo,
                ND_TCHECK(oip->ip6_dst);
                switch (dp->icmp6_code) {
                case ICMP6_PARAMPROB_HEADER:
-                        ND_PRINT((ndo,", erroneous - octet %u", EXTRACT_32BITS(&dp->icmp6_pptr)));
+                        ND_PRINT((ndo,", erroneous - octet %u", EXTRACT_BE_U_4(&dp->icmp6_pptr)));
                         break;
                case ICMP6_PARAMPROB_NEXTHEADER:
-                        ND_PRINT((ndo,", next header - octet %u", EXTRACT_32BITS(&dp->icmp6_pptr)));
+                        ND_PRINT((ndo,", next header - octet %u", EXTRACT_BE_U_4(&dp->icmp6_pptr)));
                         break;
                case ICMP6_PARAMPROB_OPTION:
-                        ND_PRINT((ndo,", option - octet %u", EXTRACT_32BITS(&dp->icmp6_pptr)));
+                        ND_PRINT((ndo,", option - octet %u", EXTRACT_BE_U_4(&dp->icmp6_pptr)));
                         break;
                default:
                         ND_PRINT((ndo,", code-#%d",
@@ -1019,7 +1002,7 @@ icmp6_print(netdissect_options *ndo,
        case ICMP6_ECHO_REQUEST:
        case ICMP6_ECHO_REPLY:
                 ND_TCHECK(dp->icmp6_seq);
-                ND_PRINT((ndo,", seq %u", EXTRACT_16BITS(&dp->icmp6_seq)));
+                ND_PRINT((ndo,", seq %u", EXTRACT_BE_U_2(&dp->icmp6_seq)));
                break;
        case ICMP6_MEMBERSHIP_QUERY:
                if (length == MLD_MINLEN) {
@@ -1056,9 +1039,9 @@ icmp6_print(netdissect_options *ndo,
                                   (u_int)p->nd_ra_curhoplimit,
                                   bittok2str(icmp6_opt_ra_flag_values,"none",(p->nd_ra_flags_reserved)),
                                   get_rtpref(p->nd_ra_flags_reserved),
-                                  EXTRACT_16BITS(&p->nd_ra_router_lifetime),
-                                  EXTRACT_32BITS(&p->nd_ra_reachable),
-                                  EXTRACT_32BITS(&p->nd_ra_retransmit)));
+                                  EXTRACT_BE_U_2(&p->nd_ra_router_lifetime),
+                                  EXTRACT_BE_U_4(&p->nd_ra_reachable),
+                                  EXTRACT_BE_U_4(&p->nd_ra_retransmit)));
 
                        icmp6_opt_print(ndo, (const u_char *)dp + RTADVLEN,
                                        length - RTADVLEN);
@@ -1089,7 +1072,7 @@ icmp6_print(netdissect_options *ndo,
                         ND_PRINT((ndo,", Flags [%s]",
                                   bittok2str(icmp6_nd_na_flag_values,
                                              "none",
-                                             EXTRACT_32BITS(&p->nd_na_flags_reserved))));
+                                             EXTRACT_BE_U_4(&p->nd_na_flags_reserved))));
 #define NDADVLEN 24
                        icmp6_opt_print(ndo, (const u_char *)dp + NDADVLEN,
                                        length - NDADVLEN);
@@ -1100,10 +1083,10 @@ icmp6_print(netdissect_options *ndo,
        case ND_REDIRECT:
 #define RDR(i) ((const struct nd_redirect *)(i))
                          ND_TCHECK(RDR(dp)->nd_rd_dst);
-                         ND_PRINT((ndo,", %s", getname6(ndo, (const u_char *)&RDR(dp)->nd_rd_dst)));
+                         ND_PRINT((ndo,", %s", ip6addr_string(ndo, &RDR(dp)->nd_rd_dst)));
                ND_TCHECK(RDR(dp)->nd_rd_target);
                ND_PRINT((ndo," to %s",
-                          getname6(ndo, (const u_char*)&RDR(dp)->nd_rd_target)));
+                          ip6addr_string(ndo, &RDR(dp)->nd_rd_target)));
 #define REDIRECTLEN 40
                if (ndo->ndo_vflag) {
                        icmp6_opt_print(ndo, (const u_char *)dp + REDIRECTLEN,
@@ -1128,7 +1111,7 @@ icmp6_print(netdissect_options *ndo,
        case ICMP6_MOBILEPREFIX_SOLICIT: /* fall through */
        case ICMP6_HADISCOV_REQUEST:
                 ND_TCHECK(dp->icmp6_data16[0]);
-                ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0])));
+                ND_PRINT((ndo,", id 0x%04x", EXTRACT_BE_U_2(&dp->icmp6_data16[0])));
                 break;
        case ICMP6_HADISCOV_REPLY:
                if (ndo->ndo_vflag) {
@@ -1136,7 +1119,7 @@ icmp6_print(netdissect_options *ndo,
                        const u_char *cp;
 
                        ND_TCHECK(dp->icmp6_data16[0]);
-                       ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0])));
+                       ND_PRINT((ndo,", id 0x%04x", EXTRACT_BE_U_2(&dp->icmp6_data16[0])));
                        cp = (const u_char *)dp + length;
                        in6 = (const struct in6_addr *)(dp + 1);
                        for (; (const u_char *)in6 < cp; in6++) {
@@ -1148,7 +1131,8 @@ icmp6_print(netdissect_options *ndo,
        case ICMP6_MOBILEPREFIX_ADVERT:
                if (ndo->ndo_vflag) {
                        ND_TCHECK(dp->icmp6_data16[0]);
-                       ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0])));
+                       ND_PRINT((ndo,", id 0x%04x", EXTRACT_BE_U_2(&dp->icmp6_data16[0])));
+                       ND_TCHECK(dp->icmp6_data16[1]);
                        if (dp->icmp6_data16[1] & 0xc0)
                                ND_PRINT((ndo," "));
                        if (dp->icmp6_data16[1] & 0x80)
@@ -1228,7 +1212,7 @@ get_upperlayer(netdissect_options *ndo, const u_char *bp, u_int *prot)
                        if (!ND_TTEST(fragh->ip6f_offlg))
                                return(NULL);
                        /* fragments with non-zero offset are meaningless */
-                       if ((EXTRACT_16BITS(&fragh->ip6f_offlg) & IP6F_OFF_MASK) != 0)
+                       if ((EXTRACT_BE_U_2(&fragh->ip6f_offlg) & IP6F_OFF_MASK) != 0)
                                return(NULL);
                        nh = fragh->ip6f_nxt;
                        hlen = sizeof(struct ip6_frag);
@@ -1308,8 +1292,8 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
                                   opp->nd_opt_pi_prefix_len,
                                   (op->nd_opt_len != 4) ? "badlen" : "",
                                   bittok2str(icmp6_opt_pi_flag_values, "none", opp->nd_opt_pi_flags_reserved),
-                                  get_lifetime(EXTRACT_32BITS(&opp->nd_opt_pi_valid_time))));
-                        ND_PRINT((ndo,", pref. time %s", get_lifetime(EXTRACT_32BITS(&opp->nd_opt_pi_preferred_time))));
+                                  get_lifetime(EXTRACT_BE_U_4(&opp->nd_opt_pi_valid_time))));
+                        ND_PRINT((ndo,", pref. time %s", get_lifetime(EXTRACT_BE_U_4(&opp->nd_opt_pi_preferred_time))));
                        break;
                case ND_OPT_REDIRECTED_HEADER:
                         print_unknown_data(ndo, bp,"\n\t    ",op->nd_opt_len<<3);
@@ -1319,14 +1303,14 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
                        opm = (const struct nd_opt_mtu *)op;
                        ND_TCHECK(opm->nd_opt_mtu_mtu);
                        ND_PRINT((ndo," %u%s",
-                               EXTRACT_32BITS(&opm->nd_opt_mtu_mtu),
-                                  (op->nd_opt_len != 1) ? "bad option length" : "" ));
+                               EXTRACT_BE_U_4(&opm->nd_opt_mtu_mtu),
+                               (op->nd_opt_len != 1) ? "bad option length" : "" ));
                         break;
                case ND_OPT_RDNSS:
                        oprd = (const struct nd_opt_rdnss *)op;
                        l = (op->nd_opt_len - 1) / 2;
                        ND_PRINT((ndo," lifetime %us,",
-                                  EXTRACT_32BITS(&oprd->nd_opt_rdnss_lifetime)));
+                                  EXTRACT_BE_U_4(&oprd->nd_opt_rdnss_lifetime)));
                        for (i = 0; i < l; i++) {
                                ND_TCHECK(oprd->nd_opt_rdnss_addr[i]);
                                ND_PRINT((ndo," addr: %s",
@@ -1336,9 +1320,9 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
                case ND_OPT_DNSSL:
                        opds = (const struct nd_opt_dnssl *)op;
                        ND_PRINT((ndo," lifetime %us, domain(s):",
-                                  EXTRACT_32BITS(&opds->nd_opt_dnssl_lifetime)));
+                                  EXTRACT_BE_U_4(&opds->nd_opt_dnssl_lifetime)));
                        domp = cp + 8; /* domain names, variable-sized, RFC1035-encoded */
-                       while (domp < cp + (op->nd_opt_len << 3) && *domp != '\0')
+                       while (domp < cp + (op->nd_opt_len << 3) && EXTRACT_U_1(domp) != '\0')
                        {
                                ND_PRINT((ndo, " "));
                                if ((domp = ns_nprint (ndo, domp, bp)) == NULL)
@@ -1348,14 +1332,14 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
                case ND_OPT_ADVINTERVAL:
                        opa = (const struct nd_opt_advinterval *)op;
                        ND_TCHECK(opa->nd_opt_adv_interval);
-                       ND_PRINT((ndo," %ums", EXTRACT_32BITS(&opa->nd_opt_adv_interval)));
+                       ND_PRINT((ndo," %ums", EXTRACT_BE_U_4(&opa->nd_opt_adv_interval)));
                        break;
                 case ND_OPT_HOMEAGENT_INFO:
                        oph = (const struct nd_opt_homeagent_info *)op;
                        ND_TCHECK(oph->nd_opt_hai_lifetime);
                        ND_PRINT((ndo," preference %u, lifetime %u",
-                                  EXTRACT_16BITS(&oph->nd_opt_hai_preference),
-                                  EXTRACT_16BITS(&oph->nd_opt_hai_lifetime)));
+                                  EXTRACT_BE_U_2(&oph->nd_opt_hai_preference),
+                                  EXTRACT_BE_U_2(&oph->nd_opt_hai_lifetime)));
                        break;
                case ND_OPT_ROUTE_INFO:
                        opri = (const struct nd_opt_route_info *)op;
@@ -1366,7 +1350,7 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
                        case 1:
                                break;
                        case 2:
-                               ND_TCHECK2(*in6p, 8);
+                               ND_TCHECK_8(in6p);
                                memcpy(&in6, opri + 1, 8);
                                break;
                        case 3:
@@ -1380,7 +1364,7 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid)
                                   opri->nd_opt_rti_prefixlen));
                        ND_PRINT((ndo,", pref=%s", get_rtpref(opri->nd_opt_rti_flags)));
                        ND_PRINT((ndo,", lifetime=%s",
-                                  get_lifetime(EXTRACT_32BITS(&opri->nd_opt_rti_lifetime))));
+                                  get_lifetime(EXTRACT_BE_U_4(&opri->nd_opt_rti_lifetime))));
                        break;
                default:
                         if (ndo->ndo_vflag <= 1) {
@@ -1416,7 +1400,7 @@ mld6_print(netdissect_options *ndo, const u_char *bp)
        if ((const u_char *)mp + sizeof(*mp) > ep)
                return;
 
-       ND_PRINT((ndo,"max resp delay: %d ", EXTRACT_16BITS(&mp->mld6_maxdelay)));
+       ND_PRINT((ndo,"max resp delay: %d ", EXTRACT_BE_U_2(&mp->mld6_maxdelay)));
        ND_PRINT((ndo,"addr: %s", ip6addr_string(ndo, &mp->mld6_addr)));
 }
 
@@ -1434,7 +1418,7 @@ mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len)
     }
 
     ND_TCHECK(icp->icmp6_data16[1]);
-    ngroups = EXTRACT_16BITS(&icp->icmp6_data16[1]);
+    ngroups = EXTRACT_BE_U_2(&icp->icmp6_data16[1]);
     ND_PRINT((ndo,", %d group record(s)", ngroups));
     if (ndo->ndo_vflag > 0) {
        /* Print the group records */
@@ -1446,9 +1430,9 @@ mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len)
                     return;
            }
             ND_TCHECK2(bp[group + 4], sizeof(struct in6_addr));
-            ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, &bp[group + 4])));
+            ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, bp + group + 4)));
            ND_PRINT((ndo," %s", tok2str(mldv2report2str, " [v2-report-#%d]",
-                                         bp[group])));
+                                         EXTRACT_U_1(bp + group))));
             nsrcs = (bp[group + 2] << 8) + bp[group + 3];
            /* Check the number of sources and print them */
            if (len < group + 20 + (nsrcs * sizeof(struct in6_addr))) {
@@ -1463,7 +1447,7 @@ mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len)
                 for (j = 0; j < nsrcs; j++) {
                     ND_TCHECK2(bp[group + 20 + j * sizeof(struct in6_addr)],
                             sizeof(struct in6_addr));
-                   ND_PRINT((ndo," %s", ip6addr_string(ndo, &bp[group + 20 + j * sizeof(struct in6_addr)])));
+                   ND_PRINT((ndo," %s", ip6addr_string(ndo, bp + group + 20 + (j * sizeof(struct in6_addr)))));
                }
                 ND_PRINT((ndo," }"));
             }
@@ -1493,7 +1477,7 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len)
        return;
     }
     ND_TCHECK(icp->icmp6_data16[0]);
-    mrc = EXTRACT_16BITS(&icp->icmp6_data16[0]);
+    mrc = EXTRACT_BE_U_2(&icp->icmp6_data16[0]);
     if (mrc < 32768) {
        mrt = mrc;
     } else {
@@ -1503,7 +1487,7 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len)
             ND_PRINT((ndo," [max resp delay=%d]", mrt));
     }
     ND_TCHECK2(bp[8], sizeof(struct in6_addr));
-    ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, &bp[8])));
+    ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, bp + 8)));
 
     if (ndo->ndo_vflag) {
         ND_TCHECK(bp[25]);
@@ -1511,7 +1495,7 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len)
                ND_PRINT((ndo," sflag"));
        }
        if (bp[24] & 0x07) {
-               ND_PRINT((ndo," robustness=%d", bp[24] & 0x07));
+               ND_PRINT((ndo," robustness=%d", EXTRACT_U_1(bp + 24) & 0x07));
        }
        if (bp[25] < 128) {
                qqi = bp[25];
@@ -1521,8 +1505,8 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len)
        ND_PRINT((ndo," qqi=%d", qqi));
     }
 
-    ND_TCHECK2(bp[26], 2);
-    nsrcs = EXTRACT_16BITS(&bp[26]);
+    ND_TCHECK_2(bp + 26);
+    nsrcs = EXTRACT_BE_U_2(bp + 26);
     if (nsrcs > 0) {
        if (len < 28 + nsrcs * sizeof(struct in6_addr))
            ND_PRINT((ndo," [invalid number of sources]"));
@@ -1531,7 +1515,7 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len)
            for (i = 0; i < nsrcs; i++) {
                ND_TCHECK2(bp[28 + i * sizeof(struct in6_addr)],
                         sizeof(struct in6_addr));
-               ND_PRINT((ndo," %s", ip6addr_string(ndo, &bp[28 + i * sizeof(struct in6_addr)])));
+               ND_PRINT((ndo," %s", ip6addr_string(ndo, bp + 28 + (i * sizeof(struct in6_addr)))));
            }
            ND_PRINT((ndo," }"));
        } else
@@ -1552,17 +1536,18 @@ dnsname_print(netdissect_options *ndo, const u_char *cp, const u_char *ep)
        /* DNS name decoding - no decompression */
        ND_PRINT((ndo,", \""));
        while (cp < ep) {
-               i = *cp++;
+               i = EXTRACT_U_1(cp);
+               cp++;
                if (i) {
                        if (i > ep - cp) {
                                ND_PRINT((ndo,"???"));
                                break;
                        }
                        while (i-- && cp < ep) {
-                               safeputchar(ndo, *cp);
+                               safeputchar(ndo, EXTRACT_U_1(cp));
                                cp++;
                        }
-                       if (cp + 1 < ep && *cp)
+                       if (cp + 1 < ep && EXTRACT_U_1(cp))
                                ND_PRINT((ndo,"."));
                } else {
                        if (cp == ep) {
@@ -1607,13 +1592,13 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                ND_TCHECK2(*dp, sizeof(*ni6));
                ni6 = (const struct icmp6_nodeinfo *)dp;
                ND_PRINT((ndo," ("));   /*)*/
-               switch (EXTRACT_16BITS(&ni6->ni_qtype)) {
+               switch (EXTRACT_BE_U_2(&ni6->ni_qtype)) {
                case NI_QTYPE_NOOP:
                        ND_PRINT((ndo,"noop"));
                        break;
                case NI_QTYPE_SUPTYPES:
                        ND_PRINT((ndo,"supported qtypes"));
-                       i = EXTRACT_16BITS(&ni6->ni_flags);
+                       i = EXTRACT_BE_U_2(&ni6->ni_flags);
                        if (i)
                                ND_PRINT((ndo," [%s]", (i & 0x01) ? "C" : ""));
                        break;
@@ -1669,7 +1654,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                                break;
                        }
                        ND_PRINT((ndo,", subject=%s",
-                                  getname6(ndo, (const u_char *)(ni6 + 1))));
+                                  ip6addr_string(ndo, ni6 + 1)));
                        break;
                case ICMP6_NI_SUBJ_FQDN:
                        ND_PRINT((ndo,", subject=DNS name"));
@@ -1681,7 +1666,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                                cp++;
                                ND_PRINT((ndo,", \""));
                                while (cp < ep) {
-                                       safeputchar(ndo, *cp);
+                                       safeputchar(ndo, EXTRACT_U_1(cp));
                                        cp++;
                                }
                                ND_PRINT((ndo,"\""));
@@ -1697,7 +1682,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                                break;
                        }
                        ND_PRINT((ndo,", subject=%s",
-                                  getname(ndo, (const u_char *)(ni6 + 1))));
+                                  ipaddr_string(ndo, ni6 + 1)));
                        break;
                default:
                        ND_PRINT((ndo,", unknown subject"));
@@ -1716,6 +1701,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
 
                needcomma = 0;
 
+               ND_TCHECK2(*dp, sizeof(*ni6));
                ni6 = (const struct icmp6_nodeinfo *)dp;
                ND_PRINT((ndo," node information reply"));
                ND_PRINT((ndo," ("));   /*)*/
@@ -1748,7 +1734,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                        break;
                }
 
-               switch (EXTRACT_16BITS(&ni6->ni_qtype)) {
+               switch (EXTRACT_BE_U_2(&ni6->ni_qtype)) {
                case NI_QTYPE_NOOP:
                        if (needcomma)
                                ND_PRINT((ndo,", "));
@@ -1761,7 +1747,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                        if (needcomma)
                                ND_PRINT((ndo,", "));
                        ND_PRINT((ndo,"supported qtypes"));
-                       i = EXTRACT_16BITS(&ni6->ni_flags);
+                       i = EXTRACT_BE_U_2(&ni6->ni_flags);
                        if (i)
                                ND_PRINT((ndo," [%s]", (i & 0x01) ? "C" : ""));
                        break;
@@ -1770,6 +1756,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                                ND_PRINT((ndo,", "));
                        ND_PRINT((ndo,"DNS name"));
                        cp = (const u_char *)(ni6 + 1) + 4;
+                       ND_TCHECK(cp[0]);
                        if (cp[0] == ep - cp - 1) {
                                /* icmp-name-lookup-03, pascal string */
                                if (ndo->ndo_vflag)
@@ -1777,14 +1764,14 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                                cp++;
                                ND_PRINT((ndo,", \""));
                                while (cp < ep) {
-                                       safeputchar(ndo, *cp);
+                                       safeputchar(ndo, EXTRACT_U_1(cp));
                                        cp++;
                                }
                                ND_PRINT((ndo,"\""));
                        } else
                                dnsname_print(ndo, cp, ep);
-                       if ((EXTRACT_16BITS(&ni6->ni_flags) & 0x01) != 0)
-                               ND_PRINT((ndo," [TTL=%u]", EXTRACT_32BITS(ni6 + 1)));
+                       if ((EXTRACT_BE_U_2(&ni6->ni_flags) & 0x01) != 0)
+                               ND_PRINT((ndo," [TTL=%u]", EXTRACT_BE_U_4(ni6 + 1)));
                        break;
                case NI_QTYPE_NODEADDR:
                        if (needcomma)
@@ -1794,9 +1781,9 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp,
                        while (i < siz) {
                                if (i + sizeof(struct in6_addr) + sizeof(int32_t) > siz)
                                        break;
-                               ND_PRINT((ndo," %s", getname6(ndo, bp + i)));
+                               ND_PRINT((ndo," %s", ip6addr_string(ndo, bp + i)));
                                i += sizeof(struct in6_addr);
-                               ND_PRINT((ndo,"(%d)", (int32_t)EXTRACT_32BITS(bp + i)));
+                               ND_PRINT((ndo,"(%d)", (int32_t) EXTRACT_BE_U_4(bp + i)));
                                i += sizeof(int32_t);
                        }
                        i = ni6->ni_flags;
@@ -1859,7 +1846,7 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep)
                break;
        }
 
-        ND_PRINT((ndo,", seq=%u", EXTRACT_32BITS(&rr6->rr_seqnum)));
+        ND_PRINT((ndo,", seq=%u", EXTRACT_BE_U_4(&rr6->rr_seqnum)));
 
        if (ndo->ndo_vflag) {
 #define F(x, y)        ((rr6->rr_flags) & (x) ? (y) : "")
@@ -1872,9 +1859,9 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep)
                                   F(ICMP6_RR_FLAGS_PREVDONE, "P")));
                }
                 ND_PRINT((ndo,"seg=%u,", rr6->rr_segnum));
-                ND_PRINT((ndo,"maxdelay=%u", EXTRACT_16BITS(&rr6->rr_maxdelay)));
+                ND_PRINT((ndo,"maxdelay=%u", EXTRACT_BE_U_2(&rr6->rr_maxdelay)));
                if (rr6->rr_reserved)
-                       ND_PRINT((ndo,"rsvd=0x%x", EXTRACT_32BITS(&rr6->rr_reserved)));
+                       ND_PRINT((ndo,"rsvd=0x%x", EXTRACT_BE_U_4(&rr6->rr_reserved)));
                /*[*/
                ND_PRINT((ndo,"]"));
 #undef F
@@ -1903,7 +1890,7 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep)
                        ND_PRINT((ndo,",min=%u", match->rpm_minlen));
                        ND_PRINT((ndo,",max=%u", match->rpm_maxlen));
                }
-               if (inet_ntop(AF_INET6, &match->rpm_prefix, hbuf, sizeof(hbuf)))
+               if (addrtostr6(&match->rpm_prefix, hbuf, sizeof(hbuf)))
                        ND_PRINT((ndo,",%s/%u", hbuf, match->rpm_matchlen));
                else
                        ND_PRINT((ndo,",?/%u", match->rpm_matchlen));
@@ -1939,15 +1926,14 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep)
                                        ND_PRINT((ndo,"vltime=infty,"));
                                else
                                        ND_PRINT((ndo,"vltime=%u,",
-                                                  EXTRACT_32BITS(&use->rpu_vltime)));
+                                                  EXTRACT_BE_U_4(&use->rpu_vltime)));
                                if (~use->rpu_pltime == 0)
                                        ND_PRINT((ndo,"pltime=infty,"));
                                else
                                        ND_PRINT((ndo,"pltime=%u,",
-                                                  EXTRACT_32BITS(&use->rpu_pltime)));
+                                                  EXTRACT_BE_U_4(&use->rpu_pltime)));
                        }
-                       if (inet_ntop(AF_INET6, &use->rpu_prefix, hbuf,
-                           sizeof(hbuf)))
+                       if (addrtostr6(&use->rpu_prefix, hbuf, sizeof(hbuf)))
                                ND_PRINT((ndo,"%s/%u/%u", hbuf, use->rpu_uselen,
                                           use->rpu_keeplen));
                        else
@@ -1964,8 +1950,6 @@ trunc:
        ND_PRINT((ndo,"[|icmp6]"));
 }
 
-#endif /* INET6 */
-
 /*
  * Local Variables:
  * c-style: whitesmith