--- icmp6.h +++ icmp6.h @@ -396,7 +396,11 @@ u_int8_t rr_segnum; u_int8_t rr_flags; u_int16_t rr_maxdelay; - u_int32_t rr_reserved; + union { + u_int8_t rr_reserved8[4]; + u_int16_t rr_reserved16[2]; + u_int32_t rr_reserved; + }; }; #define ICMP6_RR_FLAGS_TEST 0x80 #define ICMP6_RR_FLAGS_REQRESULT 0x40 --- print-icmp.c +++ print-icmp.c @@ -47,6 +47,12 @@ * Per RFC 792, September 1981. */ +/* rfc1191 */ +struct mtu_discovery { + u_int16_t unused; + u_int16_t nexthopmtu; +}; + /* * Structure of an icmp header. */ @@ -61,8 +67,12 @@ u_int16_t icd_id; u_int16_t icd_seq; } ih_idseq; - u_int32_t ih_void; + union { + u_int32_t ih_void; + struct mtu_discovery ih_mtu_discovery; + }; } icmp_hun; +#define icmp_mtu_discovery icmp_hun.ih_mtu_discovery #define icmp_pptr icmp_hun.ih_pptr #define icmp_gwaddr icmp_hun.ih_gwaddr #define icmp_id icmp_hun.ih_idseq.icd_id @@ -243,12 +253,6 @@ { 0, NULL } }; -/* rfc1191 */ -struct mtu_discovery { - u_int16_t unused; - u_int16_t nexthopmtu; -}; - /* rfc1256 */ struct ih_rdiscovery { u_int8_t ird_addrnum; @@ -412,7 +416,7 @@ case ICMP_UNREACH_NEEDFRAG: { register const struct mtu_discovery *mp; - mp = (struct mtu_discovery *)(u_char *)&dp->icmp_void; + mp = &dp->icmp_mtu_discovery; mtu = EXTRACT_16BITS(&mp->nexthopmtu); if (mtu) { (void)snprintf(buf, sizeof(buf), --- print-icmp6.c +++ print-icmp6.c @@ -1194,7 +1194,7 @@ printf("seg=%u,", rr6->rr_segnum); printf("maxdelay=%u", EXTRACT_16BITS(&rr6->rr_maxdelay)); if (rr6->rr_reserved) - printf("rsvd=0x%x", EXTRACT_32BITS(&rr6->rr_reserved)); + printf("rsvd=0x%x", EXTRACT_16BITS(&rr6->rr_reserved16[0])); /*[*/ printf("]"); #undef F --- print-timed.c +++ print-timed.c @@ -86,8 +86,8 @@ fputs(" [|timed]", stdout); return; } - sec = EXTRACT_32BITS(&tsp->tsp_time.tv_sec); - usec = EXTRACT_32BITS(&tsp->tsp_time.tv_usec); + sec = EXTRACT_32BITS(&tsp->tsp_time.tv_sec32[0]); + usec = EXTRACT_32BITS(&tsp->tsp_time.tv_usec32[0]); if (usec < 0) /* corrupt, skip the rest of the packet */ return; --- timed.h +++ timed.h @@ -54,7 +54,16 @@ u_int8_t tsp_vers; u_int16_t tsp_seq; union { - struct tsp_timeval tspu_time; + struct { + union { + int tv_sec32[2]; + long tv_sec; + }; + union { + int tv_usec32[2]; + long tv_usec; + }; + } tspu_time; int8_t tspu_hopcnt; } tsp_u; int8_t tsp_name[256];