X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/9df6f2ccb4635532038f027ca667b2ed852bb295..1fb50928ce27360c1c987312774f686b23c69b51:/print-icmp6.c diff --git a/print-icmp6.c b/print-icmp6.c index b200caa9..7fe639dc 100644 --- a/print-icmp6.c +++ b/print-icmp6.c @@ -19,20 +19,20 @@ * 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 +#include #include #include #include "netdissect.h" -#include "interface.h" #include "addrtoname.h" +#include "addrtostr.h" #include "extract.h" #include "ip6.h" @@ -74,13 +74,13 @@ */ struct icmp6_hdr { - u_int8_t icmp6_type; /* type field */ - u_int8_t icmp6_code; /* code field */ - u_int16_t icmp6_cksum; /* checksum field */ + uint8_t icmp6_type; /* type field */ + uint8_t icmp6_code; /* code field */ + uint16_t icmp6_cksum; /* checksum field */ union { - u_int32_t icmp6_un_data32[1]; /* type-specific field */ - u_int16_t icmp6_un_data16[2]; /* type-specific field */ - u_int8_t icmp6_un_data8[4]; /* type-specific field */ + uint32_t icmp6_un_data32[1]; /* type-specific field */ + uint16_t icmp6_un_data16[2]; /* type-specific field */ + uint8_t icmp6_un_data8[4]; /* type-specific field */ } icmp6_dataun; }; @@ -201,8 +201,8 @@ struct nd_router_solicit { /* router solicitation */ struct nd_router_advert { /* router advertisement */ struct icmp6_hdr nd_ra_hdr; - u_int32_t nd_ra_reachable; /* reachable time */ - u_int32_t nd_ra_retransmit; /* retransmit timer */ + uint32_t nd_ra_reachable; /* reachable time */ + uint32_t nd_ra_retransmit; /* retransmit timer */ /* could be followed by options */ }; @@ -267,8 +267,8 @@ struct nd_redirect { /* redirect */ #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] struct nd_opt_hdr { /* Neighbor discovery option header */ - u_int8_t nd_opt_type; - u_int8_t nd_opt_len; + uint8_t nd_opt_type; + uint8_t nd_opt_len; /* followed by option specific data*/ }; @@ -284,13 +284,13 @@ struct nd_opt_hdr { /* Neighbor discovery option header */ #define ND_OPT_DNSSL 31 struct nd_opt_prefix_info { /* prefix information */ - u_int8_t nd_opt_pi_type; - u_int8_t nd_opt_pi_len; - u_int8_t nd_opt_pi_prefix_len; - u_int8_t nd_opt_pi_flags_reserved; - u_int8_t nd_opt_pi_valid_time[4]; - u_int8_t nd_opt_pi_preferred_time[4]; - u_int8_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; }; @@ -299,57 +299,57 @@ struct nd_opt_prefix_info { /* prefix information */ #define ND_OPT_PI_FLAG_ROUTER 0x20 /*2292bis*/ struct nd_opt_rd_hdr { /* redirected header */ - u_int8_t nd_opt_rh_type; - u_int8_t nd_opt_rh_len; - u_int16_t nd_opt_rh_reserved1; - u_int32_t nd_opt_rh_reserved2; + uint8_t nd_opt_rh_type; + uint8_t nd_opt_rh_len; + uint16_t nd_opt_rh_reserved1; + uint32_t nd_opt_rh_reserved2; /* followed by IP header and data */ }; struct nd_opt_mtu { /* MTU option */ - u_int8_t nd_opt_mtu_type; - u_int8_t nd_opt_mtu_len; - u_int16_t nd_opt_mtu_reserved; - u_int32_t nd_opt_mtu_mtu; + uint8_t nd_opt_mtu_type; + uint8_t nd_opt_mtu_len; + uint16_t nd_opt_mtu_reserved; + uint32_t nd_opt_mtu_mtu; }; struct nd_opt_rdnss { /* RDNSS RFC 6106 5.1 */ - u_int8_t nd_opt_rdnss_type; - u_int8_t nd_opt_rdnss_len; - u_int16_t nd_opt_rdnss_reserved; - u_int32_t nd_opt_rdnss_lifetime; + uint8_t nd_opt_rdnss_type; + uint8_t nd_opt_rdnss_len; + uint16_t nd_opt_rdnss_reserved; + uint32_t nd_opt_rdnss_lifetime; struct in6_addr nd_opt_rdnss_addr[1]; /* variable-length */ }; struct nd_opt_dnssl { /* DNSSL RFC 6106 5.2 */ - u_int8_t nd_opt_dnssl_type; - u_int8_t nd_opt_dnssl_len; - u_int16_t nd_opt_dnssl_reserved; - u_int32_t nd_opt_dnssl_lifetime; + uint8_t nd_opt_dnssl_type; + uint8_t nd_opt_dnssl_len; + uint16_t nd_opt_dnssl_reserved; + uint32_t nd_opt_dnssl_lifetime; /* followed by list of DNS search domains, variable-length */ }; struct nd_opt_advinterval { /* Advertisement interval option */ - u_int8_t nd_opt_adv_type; - u_int8_t nd_opt_adv_len; - u_int16_t nd_opt_adv_reserved; - u_int32_t nd_opt_adv_interval; + uint8_t nd_opt_adv_type; + uint8_t nd_opt_adv_len; + uint16_t nd_opt_adv_reserved; + uint32_t nd_opt_adv_interval; }; struct nd_opt_homeagent_info { /* Home Agent info */ - u_int8_t nd_opt_hai_type; - u_int8_t nd_opt_hai_len; - u_int16_t nd_opt_hai_reserved; + uint8_t nd_opt_hai_type; + uint8_t nd_opt_hai_len; + uint16_t nd_opt_hai_reserved; int16_t nd_opt_hai_preference; - u_int16_t nd_opt_hai_lifetime; + uint16_t nd_opt_hai_lifetime; }; struct nd_opt_route_info { /* route info */ - u_int8_t nd_opt_rti_type; - u_int8_t nd_opt_rti_len; - u_int8_t nd_opt_rti_prefixlen; - u_int8_t nd_opt_rti_flags; - u_int32_t nd_opt_rti_lifetime; + uint8_t nd_opt_rti_type; + uint8_t nd_opt_rti_len; + uint8_t nd_opt_rti_prefixlen; + uint8_t nd_opt_rti_flags; + uint32_t nd_opt_rti_lifetime; /* prefix follows */ }; @@ -359,11 +359,11 @@ struct nd_opt_route_info { /* route info */ struct icmp6_namelookup { struct icmp6_hdr icmp6_nl_hdr; - u_int8_t icmp6_nl_nonce[8]; + uint8_t icmp6_nl_nonce[8]; int32_t icmp6_nl_ttl; #if 0 - u_int8_t icmp6_nl_len; - u_int8_t icmp6_nl_name[3]; + uint8_t icmp6_nl_len; + uint8_t icmp6_nl_name[3]; #endif /* could be followed by options */ }; @@ -373,7 +373,7 @@ struct icmp6_namelookup { */ struct icmp6_nodeinfo { struct icmp6_hdr icmp6_ni_hdr; - u_int8_t icmp6_ni_nonce[8]; + uint8_t icmp6_ni_nonce[8]; /* could be followed by reply data */ }; @@ -391,22 +391,22 @@ struct icmp6_nodeinfo { #define NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */ /* network endian */ -#define NI_SUPTYPE_FLAG_COMPRESS ((u_int16_t)htons(0x1)) -#define NI_FQDN_FLAG_VALIDTTL ((u_int16_t)htons(0x1)) +#define NI_SUPTYPE_FLAG_COMPRESS ((uint16_t)htons(0x1)) +#define NI_FQDN_FLAG_VALIDTTL ((uint16_t)htons(0x1)) /* network endian */ -#define NI_NODEADDR_FLAG_TRUNCATE ((u_int16_t)htons(0x1)) -#define NI_NODEADDR_FLAG_ALL ((u_int16_t)htons(0x2)) -#define NI_NODEADDR_FLAG_COMPAT ((u_int16_t)htons(0x4)) -#define NI_NODEADDR_FLAG_LINKLOCAL ((u_int16_t)htons(0x8)) -#define NI_NODEADDR_FLAG_SITELOCAL ((u_int16_t)htons(0x10)) -#define NI_NODEADDR_FLAG_GLOBAL ((u_int16_t)htons(0x20)) -#define NI_NODEADDR_FLAG_ANYCAST ((u_int16_t)htons(0x40)) /* just experimental. not in spec */ +#define NI_NODEADDR_FLAG_TRUNCATE ((uint16_t)htons(0x1)) +#define NI_NODEADDR_FLAG_ALL ((uint16_t)htons(0x2)) +#define NI_NODEADDR_FLAG_COMPAT ((uint16_t)htons(0x4)) +#define NI_NODEADDR_FLAG_LINKLOCAL ((uint16_t)htons(0x8)) +#define NI_NODEADDR_FLAG_SITELOCAL ((uint16_t)htons(0x10)) +#define NI_NODEADDR_FLAG_GLOBAL ((uint16_t)htons(0x20)) +#define NI_NODEADDR_FLAG_ANYCAST ((uint16_t)htons(0x40)) /* just experimental. not in spec */ struct ni_reply_fqdn { - u_int32_t ni_fqdn_ttl; /* TTL */ - u_int8_t ni_fqdn_namelen; /* length in octets of the FQDN */ - u_int8_t ni_fqdn_name[3]; /* XXX: alignment */ + uint32_t ni_fqdn_ttl; /* TTL */ + uint8_t ni_fqdn_namelen; /* length in octets of the FQDN */ + uint8_t ni_fqdn_name[3]; /* XXX: alignment */ }; /* @@ -414,10 +414,10 @@ struct ni_reply_fqdn { */ struct icmp6_router_renum { /* router renumbering header */ struct icmp6_hdr rr_hdr; - u_int8_t rr_segnum; - u_int8_t rr_flags; - u_int16_t rr_maxdelay; - u_int32_t rr_reserved; + uint8_t rr_segnum; + uint8_t rr_flags; + uint16_t rr_maxdelay; + uint32_t rr_reserved; }; #define ICMP6_RR_FLAGS_TEST 0x80 #define ICMP6_RR_FLAGS_REQRESULT 0x40 @@ -431,13 +431,13 @@ struct icmp6_router_renum { /* router renumbering header */ #define rr_seqnum rr_hdr.icmp6_data32[0] struct rr_pco_match { /* match prefix part */ - u_int8_t rpm_code; - u_int8_t rpm_len; - u_int8_t rpm_ordinal; - u_int8_t rpm_matchlen; - u_int8_t rpm_minlen; - u_int8_t rpm_maxlen; - u_int16_t rpm_reserved; + uint8_t rpm_code; + uint8_t rpm_len; + uint8_t rpm_ordinal; + uint8_t rpm_matchlen; + uint8_t rpm_minlen; + uint8_t rpm_maxlen; + uint16_t rpm_reserved; struct in6_addr rpm_prefix; }; @@ -447,41 +447,41 @@ struct rr_pco_match { /* match prefix part */ #define RPM_PCO_MAX 4 struct rr_pco_use { /* use prefix part */ - u_int8_t rpu_uselen; - u_int8_t rpu_keeplen; - u_int8_t rpu_ramask; - u_int8_t rpu_raflags; - u_int32_t rpu_vltime; - u_int32_t rpu_pltime; - u_int32_t rpu_flags; + uint8_t rpu_uselen; + uint8_t rpu_keeplen; + uint8_t rpu_ramask; + uint8_t rpu_raflags; + uint32_t rpu_vltime; + uint32_t rpu_pltime; + uint32_t rpu_flags; struct in6_addr rpu_prefix; }; #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x80 #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x40 /* network endian */ -#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME ((u_int32_t)htonl(0x80000000)) -#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME ((u_int32_t)htonl(0x40000000)) +#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME ((uint32_t)htonl(0x80000000)) +#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME ((uint32_t)htonl(0x40000000)) struct rr_result { /* router renumbering result message */ - u_int16_t rrr_flags; - u_int8_t rrr_ordinal; - u_int8_t rrr_matchedlen; - u_int32_t rrr_ifid; + uint16_t rrr_flags; + uint8_t rrr_ordinal; + uint8_t rrr_matchedlen; + uint32_t rrr_ifid; struct in6_addr rrr_prefix; }; /* network endian */ -#define ICMP6_RR_RESULT_FLAGS_OOB ((u_int16_t)htons(0x0002)) -#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN ((u_int16_t)htons(0x0001)) +#define ICMP6_RR_RESULT_FLAGS_OOB ((uint16_t)htons(0x0002)) +#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN ((uint16_t)htons(0x0001)) static const char *get_rtpref(u_int); -static const char *get_lifetime(u_int32_t); +static const char *get_lifetime(uint32_t); static void print_lladdr(netdissect_options *ndo, const u_char *, size_t); static void icmp6_opt_print(netdissect_options *ndo, const u_char *, int); static void mld6_print(netdissect_options *ndo, const u_char *); static void mldv2_report_print(netdissect_options *ndo, const u_char *, u_int); static void mldv2_query_print(netdissect_options *ndo, const u_char *, u_int); -static struct udphdr *get_upperlayer(netdissect_options *ndo, u_char *, u_int *); +static const struct udphdr *get_upperlayer(netdissect_options *ndo, const u_char *, u_int *); static void dnsname_print(netdissect_options *ndo, const u_char *, const u_char *); static void icmp6_nodeinfo_print(netdissect_options *ndo, u_int, const u_char *, const u_char *); static void icmp6_rrenum_print(netdissect_options *ndo, const u_char *, const u_char *); @@ -595,11 +595,11 @@ get_rtpref(u_int v) } static const char * -get_lifetime(u_int32_t v) +get_lifetime(uint32_t v) { static char buf[20]; - if (v == (u_int32_t)~0UL) + if (v == (uint32_t)~0UL) return "infinity"; else { snprintf(buf, sizeof(buf), "%us", v); @@ -608,9 +608,9 @@ get_lifetime(u_int32_t v) } static void -print_lladdr(netdissect_options *ndo, const u_int8_t *p, size_t l) +print_lladdr(netdissect_options *ndo, const uint8_t *p, size_t l) { - const u_int8_t *ep, *q; + const uint8_t *ep, *q; q = p; ep = p + l; @@ -622,14 +622,14 @@ print_lladdr(netdissect_options *ndo, const u_int8_t *p, size_t 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 u_int8_t *)(void *)icp, len, - IPPROTO_ICMPV6)); + 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"}, @@ -637,7 +637,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"}, @@ -650,35 +650,18 @@ const struct tok rpl_subopt_values[] = { { 0, NULL}, }; -static void -rpl_format_dagid(char dagid_str[65], u_char *dagid) -{ - char *d = dagid_str; - int i; - - for(i=0;i<16;i++) { - if(isprint(dagid[i])) { - *d++ = dagid[i]; - } else { - int cnt=snprintf(d,4,"0x%02x", dagid[i]); - d += cnt; - } - } - *d++ = '\0'; -} - static void rpl_dio_printopt(netdissect_options *ndo, - struct rpl_dio_genoption *opt, + const struct rpl_dio_genoption *opt, u_int length) { - if(length == 0) return; - length -= sizeof(struct rpl_dio_genoption); + if(length < RPL_DIO_GENOPTION_LEN) return; + length -= RPL_DIO_GENOPTION_LEN; ND_TCHECK(opt->rpl_dio_len); while((opt->rpl_dio_type == RPL_OPT_PAD0 && - (u_char *)opt < ndo->ndo_snapend) || + (const u_char *)opt < ndo->ndo_snapend) || ND_TTEST2(*opt,(opt->rpl_dio_len+2))) { unsigned int optlen = opt->rpl_dio_len+2; @@ -687,18 +670,18 @@ rpl_dio_printopt(netdissect_options *ndo, ND_PRINT((ndo, " opt:pad0")); } else { ND_PRINT((ndo, " opt:%s len:%u ", - tok2str(rpl_subopt_values, "%subopt:%u", opt->rpl_dio_type), + tok2str(rpl_subopt_values, "subopt:%u", opt->rpl_dio_type), optlen)); if(ndo->ndo_vflag > 2) { unsigned int paylen = opt->rpl_dio_len; if(paylen > length) paylen = length; hex_print(ndo, " ", - opt->rpl_dio_data, /* content of DIO option */ + ((const uint8_t *)opt) + RPL_DIO_GENOPTION_LEN, /* content of DIO option */ paylen); } } - opt = (struct rpl_dio_genoption *)(((char *)opt) + optlen); + opt = (const struct rpl_dio_genoption *)(((const char *)opt) + optlen); length -= optlen; } return; @@ -711,23 +694,23 @@ static void rpl_dio_print(netdissect_options *ndo, const u_char *bp, u_int length) { - struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp; - char dagid_str[65]; + const struct nd_rpl_dio *dio = (const struct nd_rpl_dio *)bp; + 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, - dio->rpl_dagrank, + EXTRACT_16BITS(&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))); if(ndo->ndo_vflag > 1) { - struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)&dio[1]; + const struct rpl_dio_genoption *opt = (const struct rpl_dio_genoption *)&dio[1]; rpl_dio_printopt(ndo, opt, length); } return; @@ -740,26 +723,34 @@ static void rpl_dao_print(netdissect_options *ndo, const u_char *bp, u_int length) { - struct nd_rpl_dao *dao = (struct nd_rpl_dao *)bp; - u_char *dao_end = (u_char *)&dao[1]; - char dagid_str[65]; + const struct nd_rpl_dao *dao = (const struct nd_rpl_dao *)bp; + const char *dagid_str = ""; ND_TCHECK(*dao); + if (length < ND_RPL_DAO_MIN_LEN) + goto tooshort; - strcpy(dagid_str,""); + bp += ND_RPL_DAO_MIN_LEN; + length -= ND_RPL_DAO_MIN_LEN; if(RPL_DAO_D(dao->rpl_flags)) { - ND_TTEST2(dao->rpl_dagid, 16); - rpl_format_dagid(dagid_str, dao->rpl_dagid); - dao_end += DAGID_LEN; + ND_TCHECK2(dao->rpl_dagid, DAGID_LEN); + if (length < DAGID_LEN) + goto tooshort; + dagid_str = ip6addr_string (ndo, dao->rpl_dagid); + bp += DAGID_LEN; + length -= DAGID_LEN; } - ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u]", + ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u%s%s,%02x]", dagid_str, dao->rpl_daoseq, - dao->rpl_instanceid)); + dao->rpl_instanceid, + RPL_DAO_K(dao->rpl_flags) ? ",acK":"", + RPL_DAO_D(dao->rpl_flags) ? ",Dagid":"", + dao->rpl_flags)); if(ndo->ndo_vflag > 1) { - struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)dao_end; + const struct rpl_dio_genoption *opt = (const struct rpl_dio_genoption *)bp; rpl_dio_printopt(ndo, opt, length); } return; @@ -767,25 +758,32 @@ rpl_dao_print(netdissect_options *ndo, trunc: ND_PRINT((ndo," [|truncated]")); return; + +tooshort: + ND_PRINT((ndo," [|length too short]")); + return; } static void rpl_daoack_print(netdissect_options *ndo, const u_char *bp, u_int length) { - struct nd_rpl_daoack *daoack = (struct nd_rpl_daoack *)bp; - u_char *daoack_end = (u_char *)&daoack[1]; - char dagid_str[65]; + const struct nd_rpl_daoack *daoack = (const struct nd_rpl_daoack *)bp; + const char *dagid_str = ""; - ND_TCHECK(*daoack); + ND_TCHECK2(*daoack, ND_RPL_DAOACK_MIN_LEN); + if (length < ND_RPL_DAOACK_MIN_LEN) + goto tooshort; - strcpy(dagid_str,""); - length -= sizeof(struct nd_rpl_daoack); + bp += ND_RPL_DAOACK_MIN_LEN; + length -= ND_RPL_DAOACK_MIN_LEN; if(RPL_DAOACK_D(daoack->rpl_flags)) { - ND_TTEST2(daoack->rpl_dagid, 16); - rpl_format_dagid(dagid_str, daoack->rpl_dagid); - daoack_end += DAGID_LEN; - length -= DAGID_LEN; + ND_TCHECK2(daoack->rpl_dagid, DAGID_LEN); + if (length < DAGID_LEN) + goto tooshort; + dagid_str = ip6addr_string (ndo, daoack->rpl_dagid); + bp += DAGID_LEN; + length -= DAGID_LEN; } ND_PRINT((ndo, " [dagid:%s,seq:%u,instance:%u,status:%u]", @@ -796,7 +794,7 @@ rpl_daoack_print(netdissect_options *ndo, /* no officially defined options for DAOACK, but print any we find */ if(ndo->ndo_vflag > 1) { - struct rpl_dio_genoption *opt = (struct rpl_dio_genoption *)daoack_end; + const struct rpl_dio_genoption *opt = (const struct rpl_dio_genoption *)bp; rpl_dio_printopt(ndo, opt, length); } return; @@ -804,6 +802,10 @@ rpl_daoack_print(netdissect_options *ndo, trunc: ND_PRINT((ndo," [|dao-truncated]")); return; + +tooshort: + ND_PRINT((ndo," [|dao-length too short]")); + return; } static void @@ -876,26 +878,26 @@ icmp6_print(netdissect_options *ndo, const u_char *ep; u_int prot; - dp = (struct icmp6_hdr *)bp; - ip = (struct ip6_hdr *)bp2; - oip = (struct ip6_hdr *)(dp + 1); + dp = (const struct icmp6_hdr *)bp; + ip = (const struct ip6_hdr *)bp2; + oip = (const struct ip6_hdr *)(dp + 1); /* 'ep' points to the end of available data. */ ep = ndo->ndo_snapend; ND_TCHECK(dp->icmp6_cksum); if (ndo->ndo_vflag && !fragmented) { - u_int16_t sum, udp_sum; + uint16_t sum, udp_sum; if (ND_TTEST2(bp[0], length)) { udp_sum = EXTRACT_16BITS(&dp->icmp6_cksum); - sum = icmp6_cksum(ip, dp, length); + sum = icmp6_cksum(ndo, ip, dp, length); if (sum != 0) - (void)ND_PRINT((ndo,"[bad icmp6 cksum 0x%04x -> 0x%04x!] ", + ND_PRINT((ndo,"[bad icmp6 cksum 0x%04x -> 0x%04x!] ", udp_sum, in_cksum_shouldbe(udp_sum, sum))); else - (void)ND_PRINT((ndo,"[icmp6 sum ok] ")); + ND_PRINT((ndo,"[icmp6 sum ok] ")); } } @@ -920,15 +922,15 @@ icmp6_print(netdissect_options *ndo, case ICMP6_DST_UNREACH_NOROUTE: /* fall through */ case ICMP6_DST_UNREACH_ADMIN: case ICMP6_DST_UNREACH_ADDR: - ND_PRINT((ndo," %s",ip6addr_string(&oip->ip6_dst))); + ND_PRINT((ndo," %s",ip6addr_string(ndo, &oip->ip6_dst))); break; case ICMP6_DST_UNREACH_BEYONDSCOPE: ND_PRINT((ndo," %s, source address %s", - ip6addr_string(&oip->ip6_dst), - ip6addr_string(&oip->ip6_src))); + ip6addr_string(ndo, &oip->ip6_dst), + ip6addr_string(ndo, &oip->ip6_src))); break; case ICMP6_DST_UNREACH_NOPORT: - if ((ouh = get_upperlayer(ndo, (u_char *)oip, &prot)) + if ((ouh = get_upperlayer(ndo, (const u_char *)oip, &prot)) == NULL) goto trunc; @@ -936,17 +938,17 @@ icmp6_print(netdissect_options *ndo, switch (prot) { case IPPROTO_TCP: ND_PRINT((ndo,", %s tcp port %s", - ip6addr_string(&oip->ip6_dst), - tcpport_string(dport))); + ip6addr_string(ndo, &oip->ip6_dst), + tcpport_string(ndo, dport))); break; case IPPROTO_UDP: ND_PRINT((ndo,", %s udp port %s", - ip6addr_string(&oip->ip6_dst), - udpport_string(dport))); + ip6addr_string(ndo, &oip->ip6_dst), + udpport_string(ndo, dport))); break; default: ND_PRINT((ndo,", %s protocol %d port %d unreachable", - ip6addr_string(&oip->ip6_dst), + ip6addr_string(ndo, &oip->ip6_dst), oip->ip6_nxt, dport)); break; } @@ -968,7 +970,7 @@ icmp6_print(netdissect_options *ndo, switch (dp->icmp6_code) { case ICMP6_TIME_EXCEED_TRANSIT: ND_PRINT((ndo," for %s", - ip6addr_string(&oip->ip6_dst))); + ip6addr_string(ndo, &oip->ip6_dst))); break; case ICMP6_TIME_EXCEED_REASSEMBLY: ND_PRINT((ndo," (reassembly)")); @@ -1027,9 +1029,9 @@ icmp6_print(netdissect_options *ndo, case ND_ROUTER_ADVERT: #define RTADVLEN 16 if (ndo->ndo_vflag) { - struct nd_router_advert *p; + const struct nd_router_advert *p; - p = (struct nd_router_advert *)dp; + p = (const struct nd_router_advert *)dp; ND_TCHECK(p->nd_ra_retransmit); ND_PRINT((ndo,"\n\thop limit %u, Flags [%s]" \ ", pref %s, router lifetime %us, reachable time %us, retrans time %us", @@ -1046,10 +1048,10 @@ icmp6_print(netdissect_options *ndo, break; case ND_NEIGHBOR_SOLICIT: { - struct nd_neighbor_solicit *p; - p = (struct nd_neighbor_solicit *)dp; + const struct nd_neighbor_solicit *p; + p = (const struct nd_neighbor_solicit *)dp; ND_TCHECK(p->nd_ns_target); - ND_PRINT((ndo,", who has %s", ip6addr_string(&p->nd_ns_target))); + ND_PRINT((ndo,", who has %s", ip6addr_string(ndo, &p->nd_ns_target))); if (ndo->ndo_vflag) { #define NDSOLLEN 24 icmp6_opt_print(ndo, (const u_char *)dp + NDSOLLEN, @@ -1059,12 +1061,12 @@ icmp6_print(netdissect_options *ndo, break; case ND_NEIGHBOR_ADVERT: { - struct nd_neighbor_advert *p; + const struct nd_neighbor_advert *p; - p = (struct nd_neighbor_advert *)dp; + p = (const struct nd_neighbor_advert *)dp; ND_TCHECK(p->nd_na_target); ND_PRINT((ndo,", tgt is %s", - ip6addr_string(&p->nd_na_target))); + ip6addr_string(ndo, &p->nd_na_target))); if (ndo->ndo_vflag) { ND_PRINT((ndo,", Flags [%s]", bittok2str(icmp6_nd_na_flag_values, @@ -1078,12 +1080,12 @@ icmp6_print(netdissect_options *ndo, } break; case ND_REDIRECT: -#define RDR(i) ((struct nd_redirect *)(i)) +#define RDR(i) ((const struct nd_redirect *)(i)) ND_TCHECK(RDR(dp)->nd_rd_dst); - ND_PRINT((ndo,", %s", getname6((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((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, @@ -1112,16 +1114,16 @@ icmp6_print(netdissect_options *ndo, break; case ICMP6_HADISCOV_REPLY: if (ndo->ndo_vflag) { - struct in6_addr *in6; - u_char *cp; + const struct in6_addr *in6; + const u_char *cp; ND_TCHECK(dp->icmp6_data16[0]); ND_PRINT((ndo,", id 0x%04x", EXTRACT_16BITS(&dp->icmp6_data16[0]))); - cp = (u_char *)dp + length; - in6 = (struct in6_addr *)(dp + 1); - for (; (u_char *)in6 < cp; in6++) { + cp = (const u_char *)dp + length; + in6 = (const struct in6_addr *)(dp + 1); + for (; (const u_char *)in6 < cp; in6++) { ND_TCHECK(*in6); - ND_PRINT((ndo,", %s", ip6addr_string(in6))); + ND_PRINT((ndo,", %s", ip6addr_string(ndo, in6))); } } break; @@ -1157,15 +1159,15 @@ trunc: ND_PRINT((ndo, "[|icmp6]")); } -static struct udphdr * -get_upperlayer(netdissect_options *ndo, u_char *bp, u_int *prot) +static const struct udphdr * +get_upperlayer(netdissect_options *ndo, const u_char *bp, u_int *prot) { const u_char *ep; - struct ip6_hdr *ip6 = (struct ip6_hdr *)bp; - struct udphdr *uh; - struct ip6_hbh *hbh; - struct ip6_frag *fragh; - struct ah *ah; + const struct ip6_hdr *ip6 = (const struct ip6_hdr *)bp; + const struct udphdr *uh; + const struct ip6_hbh *hbh; + const struct ip6_frag *fragh; + const struct ah *ah; u_int nh; int hlen; @@ -1184,7 +1186,7 @@ get_upperlayer(netdissect_options *ndo, u_char *bp, u_int *prot) switch(nh) { case IPPROTO_UDP: case IPPROTO_TCP: - uh = (struct udphdr *)bp; + uh = (const struct udphdr *)bp; if (ND_TTEST(uh->uh_dport)) { *prot = nh; return(uh); @@ -1196,7 +1198,7 @@ get_upperlayer(netdissect_options *ndo, u_char *bp, u_int *prot) case IPPROTO_HOPOPTS: case IPPROTO_DSTOPTS: case IPPROTO_ROUTING: - hbh = (struct ip6_hbh *)bp; + hbh = (const struct ip6_hbh *)bp; if (!ND_TTEST(hbh->ip6h_len)) return(NULL); nh = hbh->ip6h_nxt; @@ -1204,7 +1206,7 @@ get_upperlayer(netdissect_options *ndo, u_char *bp, u_int *prot) break; case IPPROTO_FRAGMENT: /* this should be odd, but try anyway */ - fragh = (struct ip6_frag *)bp; + fragh = (const struct ip6_frag *)bp; if (!ND_TTEST(fragh->ip6f_offlg)) return(NULL); /* fragments with non-zero offset are meaningless */ @@ -1215,7 +1217,7 @@ get_upperlayer(netdissect_options *ndo, u_char *bp, u_int *prot) break; case IPPROTO_AH: - ah = (struct ah *)bp; + ah = (const struct ah *)bp; if (!ND_TTEST(ah->ah_len)) return(NULL); nh = ah->ah_nxt; @@ -1243,18 +1245,19 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid) const struct nd_opt_homeagent_info *oph; const struct nd_opt_route_info *opri; const u_char *cp, *ep, *domp; - struct in6_addr in6, *in6p; + struct in6_addr in6; + const struct in6_addr *in6p; size_t l; u_int i; -#define ECHECK(var) if ((u_char *)&(var) > ep - sizeof(var)) return +#define ECHECK(var) if ((const u_char *)&(var) > ep - sizeof(var)) return cp = bp; /* 'ep' points to the end of available data. */ ep = ndo->ndo_snapend; while (cp < ep) { - op = (struct nd_opt_hdr *)cp; + op = (const struct nd_opt_hdr *)cp; ECHECK(op->nd_opt_len); if (resid <= 0) @@ -1280,10 +1283,10 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid) print_lladdr(ndo, cp + 2, l); break; case ND_OPT_PREFIX_INFORMATION: - opp = (struct nd_opt_prefix_info *)op; + opp = (const struct nd_opt_prefix_info *)op; ND_TCHECK(opp->nd_opt_pi_prefix); ND_PRINT((ndo,"%s/%u%s, Flags [%s], valid time %s", - ip6addr_string(&opp->nd_opt_pi_prefix), + ip6addr_string(ndo, &opp->nd_opt_pi_prefix), 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), @@ -1295,52 +1298,52 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid) /* xxx */ break; case ND_OPT_MTU: - opm = (struct nd_opt_mtu *)op; + 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" : "" )); break; case ND_OPT_RDNSS: - oprd = (struct nd_opt_rdnss *)op; + 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))); for (i = 0; i < l; i++) { ND_TCHECK(oprd->nd_opt_rdnss_addr[i]); ND_PRINT((ndo," addr: %s", - ip6addr_string(&oprd->nd_opt_rdnss_addr[i]))); + ip6addr_string(ndo, &oprd->nd_opt_rdnss_addr[i]))); } break; case ND_OPT_DNSSL: - opds = (struct nd_opt_dnssl *)op; + opds = (const struct nd_opt_dnssl *)op; ND_PRINT((ndo," lifetime %us, domain(s):", EXTRACT_32BITS(&opds->nd_opt_dnssl_lifetime))); domp = cp + 8; /* domain names, variable-sized, RFC1035-encoded */ while (domp < cp + (op->nd_opt_len << 3) && *domp != '\0') { - printf (" "); - if ((domp = ns_nprint (domp, bp)) == NULL) + ND_PRINT((ndo, " ")); + if ((domp = ns_nprint (ndo, domp, bp)) == NULL) goto trunc; } break; case ND_OPT_ADVINTERVAL: - opa = (struct nd_opt_advinterval *)op; + 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))); break; case ND_OPT_HOMEAGENT_INFO: - oph = (struct nd_opt_homeagent_info *)op; + 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))); break; case ND_OPT_ROUTE_INFO: - opri = (struct nd_opt_route_info *)op; + opri = (const struct nd_opt_route_info *)op; ND_TCHECK(opri->nd_opt_rti_lifetime); memset(&in6, 0, sizeof(in6)); - in6p = (struct in6_addr *)(opri + 1); + in6p = (const struct in6_addr *)(opri + 1); switch (op->nd_opt_len) { case 1: break; @@ -1355,7 +1358,7 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid) default: goto trunc; } - ND_PRINT((ndo," %s/%u", ip6addr_string(&in6), + ND_PRINT((ndo," %s/%u", ip6addr_string(ndo, &in6), opri->nd_opt_rti_prefixlen)); ND_PRINT((ndo,", pref=%s", get_rtpref(opri->nd_opt_rti_flags))); ND_PRINT((ndo,", lifetime=%s", @@ -1386,23 +1389,23 @@ icmp6_opt_print(netdissect_options *ndo, const u_char *bp, int resid) static void mld6_print(netdissect_options *ndo, const u_char *bp) { - struct mld6_hdr *mp = (struct mld6_hdr *)bp; + const struct mld6_hdr *mp = (const struct mld6_hdr *)bp; const u_char *ep; /* 'ep' points to the end of available data. */ ep = ndo->ndo_snapend; - if ((u_char *)mp + sizeof(*mp) > ep) + if ((const u_char *)mp + sizeof(*mp) > ep) return; ND_PRINT((ndo,"max resp delay: %d ", EXTRACT_16BITS(&mp->mld6_maxdelay))); - ND_PRINT((ndo,"addr: %s", ip6addr_string(&mp->mld6_addr))); + ND_PRINT((ndo,"addr: %s", ip6addr_string(ndo, &mp->mld6_addr))); } static void mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len) { - struct icmp6_hdr *icp = (struct icmp6_hdr *) bp; + const struct icmp6_hdr *icp = (const struct icmp6_hdr *) bp; u_int group, nsrcs, ngroups; u_int i, j; @@ -1425,7 +1428,7 @@ 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(&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]))); nsrcs = (bp[group + 2] << 8) + bp[group + 3]; @@ -1438,13 +1441,13 @@ mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len) ND_PRINT((ndo,", %d source(s)", nsrcs)); else { /* Print the sources */ - (void)ND_PRINT((ndo," {")); + ND_PRINT((ndo," {")); 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(&bp[group + 20 + j * sizeof(struct in6_addr)]))); + ND_PRINT((ndo," %s", ip6addr_string(ndo, &bp[group + 20 + j * sizeof(struct in6_addr)]))); } - (void)ND_PRINT((ndo," }")); + ND_PRINT((ndo," }")); } /* Next group record */ group += 20 + nsrcs * sizeof(struct in6_addr); @@ -1453,14 +1456,14 @@ mldv2_report_print(netdissect_options *ndo, const u_char *bp, u_int len) } return; trunc: - (void)ND_PRINT((ndo,"[|icmp6]")); + ND_PRINT((ndo,"[|icmp6]")); return; } static void mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len) { - struct icmp6_hdr *icp = (struct icmp6_hdr *) bp; + const struct icmp6_hdr *icp = (const struct icmp6_hdr *) bp; u_int mrc; int mrt, qqi; u_int nsrcs; @@ -1479,10 +1482,10 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len) mrt = ((mrc & 0x0fff) | 0x1000) << (((mrc & 0x7000) >> 12) + 3); } if (ndo->ndo_vflag) { - (void)ND_PRINT((ndo," [max resp delay=%d]", mrt)); + ND_PRINT((ndo," [max resp delay=%d]", mrt)); } ND_TCHECK2(bp[8], sizeof(struct in6_addr)); - ND_PRINT((ndo," [gaddr %s", ip6addr_string(&bp[8]))); + ND_PRINT((ndo," [gaddr %s", ip6addr_string(ndo, &bp[8]))); if (ndo->ndo_vflag) { ND_TCHECK(bp[25]); @@ -1510,7 +1513,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(&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 @@ -1519,7 +1522,7 @@ mldv2_query_print(netdissect_options *ndo, const u_char *bp, u_int len) ND_PRINT((ndo,"]")); return; trunc: - (void)ND_PRINT((ndo,"[|icmp6]")); + ND_PRINT((ndo,"[|icmp6]")); return; } @@ -1538,7 +1541,7 @@ dnsname_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) break; } while (i-- && cp < ep) { - safeputchar(*cp); + safeputchar(ndo, *cp); cp++; } if (cp + 1 < ep && *cp) @@ -1562,16 +1565,16 @@ dnsname_print(netdissect_options *ndo, const u_char *cp, const u_char *ep) static void icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, const u_char *ep) { - struct icmp6_nodeinfo *ni6; - struct icmp6_hdr *dp; + const struct icmp6_nodeinfo *ni6; + const struct icmp6_hdr *dp; const u_char *cp; size_t siz, i; int needcomma; if (ep < bp) return; - dp = (struct icmp6_hdr *)bp; - ni6 = (struct icmp6_nodeinfo *)bp; + dp = (const struct icmp6_hdr *)bp; + ni6 = (const struct icmp6_nodeinfo *)bp; siz = ep - bp; switch (ni6->ni_type) { @@ -1584,7 +1587,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, ND_PRINT((ndo," node information query")); ND_TCHECK2(*dp, sizeof(*ni6)); - ni6 = (struct icmp6_nodeinfo *)dp; + ni6 = (const struct icmp6_nodeinfo *)dp; ND_PRINT((ndo," (")); /*)*/ switch (EXTRACT_16BITS(&ni6->ni_qtype)) { case NI_QTYPE_NOOP: @@ -1596,7 +1599,6 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, if (i) ND_PRINT((ndo," [%s]", (i & 0x01) ? "C" : "")); break; - break; case NI_QTYPE_FQDN: ND_PRINT((ndo,"DNS name")); break; @@ -1649,7 +1651,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, break; } ND_PRINT((ndo,", subject=%s", - getname6((const u_char *)(ni6 + 1)))); + ip6addr_string(ndo, ni6 + 1))); break; case ICMP6_NI_SUBJ_FQDN: ND_PRINT((ndo,", subject=DNS name")); @@ -1661,7 +1663,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, cp++; ND_PRINT((ndo,", \"")); while (cp < ep) { - safeputchar(*cp); + safeputchar(ndo, *cp); cp++; } ND_PRINT((ndo,"\"")); @@ -1677,7 +1679,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, break; } ND_PRINT((ndo,", subject=%s", - getname((const u_char *)(ni6 + 1)))); + ipaddr_string(ndo, ni6 + 1))); break; default: ND_PRINT((ndo,", unknown subject")); @@ -1696,7 +1698,7 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, needcomma = 0; - ni6 = (struct icmp6_nodeinfo *)dp; + ni6 = (const struct icmp6_nodeinfo *)dp; ND_PRINT((ndo," node information reply")); ND_PRINT((ndo," (")); /*)*/ switch (ni6->ni_code) { @@ -1757,14 +1759,14 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, cp++; ND_PRINT((ndo,", \"")); while (cp < ep) { - safeputchar(*cp); + safeputchar(ndo, *cp); cp++; } ND_PRINT((ndo,"\"")); } else dnsname_print(ndo, cp, ep); if ((EXTRACT_16BITS(&ni6->ni_flags) & 0x01) != 0) - ND_PRINT((ndo," [TTL=%u]", *(u_int32_t *)(ni6 + 1))); + ND_PRINT((ndo," [TTL=%u]", EXTRACT_32BITS(ni6 + 1))); break; case NI_QTYPE_NODEADDR: if (needcomma) @@ -1774,7 +1776,7 @@ 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(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))); i += sizeof(int32_t); @@ -1811,16 +1813,16 @@ trunc: static void icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep) { - struct icmp6_router_renum *rr6; + const struct icmp6_router_renum *rr6; const char *cp; - struct rr_pco_match *match; - struct rr_pco_use *use; + const struct rr_pco_match *match; + const struct rr_pco_use *use; char hbuf[NI_MAXHOST]; int n; if (ep < bp) return; - rr6 = (struct icmp6_router_renum *)bp; + rr6 = (const struct icmp6_router_renum *)bp; cp = (const char *)(rr6 + 1); ND_TCHECK(rr6->rr_reserved); @@ -1861,7 +1863,7 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep) } if (rr6->rr_code == ICMP6_ROUTER_RENUMBERING_COMMAND) { - match = (struct rr_pco_match *)cp; + match = (const struct rr_pco_match *)cp; cp = (const char *)(match + 1); ND_TCHECK(match->rpm_prefix); @@ -1883,7 +1885,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)); @@ -1895,7 +1897,7 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep) goto trunc; n /= 4; while (n-- > 0) { - use = (struct rr_pco_use *)cp; + use = (const struct rr_pco_use *)cp; cp = (const char *)(use + 1); ND_TCHECK(use->rpu_prefix); @@ -1926,8 +1928,7 @@ icmp6_rrenum_print(netdissect_options *ndo, const u_char *bp, const u_char *ep) ND_PRINT((ndo,"pltime=%u,", EXTRACT_32BITS(&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 @@ -1944,8 +1945,6 @@ trunc: ND_PRINT((ndo,"[|icmp6]")); } -#endif /* INET6 */ - /* * Local Variables: * c-style: whitesmith