Deleted Added
full compact
34c34
< * $FreeBSD: head/sys/netinet/udp_usrreq.c 55009 1999-12-22 19:13:38Z shin $
---
> * $FreeBSD: head/sys/netinet/udp_usrreq.c 58698 2000-03-27 19:14:27Z jlemon $
39a40
> #include <stddef.h>
78a80,81
> #include <machine/in_cksum.h>
>
211,213c214,226
< bzero(((struct ipovly *)ip)->ih_x1, 9);
< ((struct ipovly *)ip)->ih_len = uh->uh_ulen;
< uh->uh_sum = in_cksum(m, len + sizeof (struct ip));
---
> if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID) {
> if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR)
> uh->uh_sum = m->m_pkthdr.csum_data;
> else
> uh->uh_sum = in_pseudo(ip->ip_src.s_addr,
> ip->ip_dst.s_addr, htonl(ip->ip_len +
> m->m_pkthdr.csum_data + IPPROTO_UDP));
> uh->uh_sum ^= 0xffff;
> } else {
> bzero(((struct ipovly *)ip)->ih_x1, 9);
> ((struct ipovly *)ip)->ih_len = uh->uh_ulen;
> uh->uh_sum = in_cksum(m, len + sizeof (struct ip));
> }
682c695
< bzero(ui->ui_x1, sizeof(ui->ui_x1));
---
> bzero(ui->ui_x1, sizeof(ui->ui_x1)); /* XXX still needed? */
684d696
< ui->ui_len = htons((u_short)len + sizeof (struct udphdr));
689c701
< ui->ui_ulen = ui->ui_len;
---
> ui->ui_ulen = htons((u_short)len + sizeof(struct udphdr));
692c704
< * Stuff checksum and output datagram.
---
> * Set up checksum and output datagram.
694d705
< ui->ui_sum = 0;
696,697c707,712
< if ((ui->ui_sum = in_cksum(m, sizeof (struct udpiphdr) + len)) == 0)
< ui->ui_sum = 0xffff;
---
> ui->ui_sum = in_pseudo(ui->ui_src.s_addr, ui->ui_dst.s_addr,
> htons((u_short)len + sizeof(struct udphdr) + IPPROTO_UDP));
> m->m_pkthdr.csum_flags = CSUM_UDP;
> m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
> } else {
> ui->ui_sum = 0;