mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
udplite: fix checksum computation on the sender side
Don't fill the fields of the UDP/IP header not used for the checksum computation before performing the checksum computation. Reviewed by: glebius MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D42275 (cherry picked from commit aa64a8f5c35c13b1c325f1a4597c987a37bec5da)
This commit is contained in:
parent
5c4da68ad7
commit
3a89a5d54d
1 changed files with 15 additions and 14 deletions
|
|
@ -1330,8 +1330,12 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
|
|||
* into network format.
|
||||
*/
|
||||
ui = mtod(m, struct udpiphdr *);
|
||||
bzero(ui->ui_x1, sizeof(ui->ui_x1)); /* XXX still needed? */
|
||||
ui->ui_v = IPVERSION << 4;
|
||||
/*
|
||||
* Filling only those fields of udpiphdr that participate in the
|
||||
* checksum calculation. The rest must be zeroed and will be filled
|
||||
* later.
|
||||
*/
|
||||
bzero(ui->ui_x1, sizeof(ui->ui_x1));
|
||||
ui->ui_pr = pr;
|
||||
ui->ui_src = laddr;
|
||||
ui->ui_dst = faddr;
|
||||
|
|
@ -1356,16 +1360,6 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
|
|||
cscov_partial = (cscov == 0) ? 0 : 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the Don't Fragment bit in the IP header.
|
||||
*/
|
||||
if (inp->inp_flags & INP_DONTFRAG) {
|
||||
struct ip *ip;
|
||||
|
||||
ip = (struct ip *)&ui->ui_i;
|
||||
ip->ip_off |= htons(IP_DF);
|
||||
}
|
||||
|
||||
if (inp->inp_socket->so_options & SO_DONTROUTE)
|
||||
ipflags |= IP_ROUTETOIF;
|
||||
if (inp->inp_socket->so_options & SO_BROADCAST)
|
||||
|
|
@ -1399,9 +1393,16 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr,
|
|||
m->m_pkthdr.csum_flags = CSUM_UDP;
|
||||
m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum);
|
||||
}
|
||||
/*
|
||||
* After finishing the checksum computation, fill the remaining fields
|
||||
* of udpiphdr.
|
||||
*/
|
||||
((struct ip *)ui)->ip_v = IPVERSION;
|
||||
((struct ip *)ui)->ip_tos = tos;
|
||||
((struct ip *)ui)->ip_len = htons(sizeof(struct udpiphdr) + len);
|
||||
((struct ip *)ui)->ip_ttl = inp->inp_ip_ttl; /* XXX */
|
||||
((struct ip *)ui)->ip_tos = tos; /* XXX */
|
||||
if (inp->inp_flags & INP_DONTFRAG)
|
||||
((struct ip *)ui)->ip_off |= htons(IP_DF);
|
||||
((struct ip *)ui)->ip_ttl = inp->inp_ip_ttl;
|
||||
UDPSTAT_INC(udps_opackets);
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue