#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.124.2.2 2003-11-16 08:51:52 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-udp.c,v 1.124.2.5 2003-11-19 00:19:25 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
static int udp_cksum(register const struct ip *ip,
register const struct udphdr *up,
- register int len)
+ register u_int len)
{
union phu {
struct phdr {
register const u_int16_t *sp;
/* pseudo-header.. */
- phu.ph.len = htons(len);
+ phu.ph.len = htons((u_int16_t)len);
phu.ph.mbz = 0;
phu.ph.proto = IPPROTO_UDP;
memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
#ifdef INET6
static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
- int len)
+ u_int len)
{
- int i, tlen;
+ size_t i;
register const u_int16_t *sp;
u_int32_t sum;
union {
u_int16_t pa[20];
} phu;
- tlen = EXTRACT_16BITS(&ip6->ip6_plen) + sizeof(struct ip6_hdr) -
- ((const char *)up - (const char*)ip6);
-
/* pseudo-header */
memset(&phu, 0, sizeof(phu));
phu.ph.ph_src = ip6->ip6_src;
phu.ph.ph_dst = ip6->ip6_dst;
- phu.ph.ph_len = htonl(tlen);
+ phu.ph.ph_len = htonl(len);
phu.ph.ph_nxt = IPPROTO_UDP;
sum = 0;
sp = (const u_int16_t *)up;
- for (i = 0; i < (tlen & ~1); i += 2)
+ for (i = 0; i < (len & ~1); i += 2)
sum += *sp++;
- if (tlen & 1)
+ if (len & 1)
sum += htons((*(const u_int8_t *)sp) << 8);
while (sum > 0xffff)
int sum = up->uh_sum;
/* for IPv6, UDP checksum is mandatory */
if (TTEST2(cp[0], length)) {
- sum = udp6_cksum(ip6, up, length);
+ sum = udp6_cksum(ip6, up, length + sizeof(struct udphdr));
if (sum != 0)
(void)printf("[bad udp cksum %x!] ", sum);
else
else if (ISPORT(RIPNG_PORT))
ripng_print((const u_char *)(up + 1), length);
else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT)) {
- dhcp6_print((const u_char *)(up + 1), length,
- sport, dport);
+ dhcp6_print((const u_char *)(up + 1), length);
}
#endif /*INET6*/
/*