@@ -629,6 +629,7 @@ bfd_put_packet(struct bfd *bfd, struct dp_packet *p,
ip->ip_proto = IPPROTO_UDP;
put_16aligned_be32(&ip->ip_src, bfd->ip_src);
put_16aligned_be32(&ip->ip_dst, bfd->ip_dst);
+ /* Checksum has already been zeroed by put_zeros call. */
ip->ip_csum = csum(ip, sizeof *ip);
udp = dp_packet_put_zeros(p, sizeof *udp);
@@ -2226,6 +2226,7 @@ flow_compose_l4(struct dp_packet *p, const struct flow *flow)
icmp = dp_packet_put_zeros(p, l4_len);
icmp->icmp_type = ntohs(flow->tp_src);
icmp->icmp_code = ntohs(flow->tp_dst);
+ /* Checksum has already been zeroed by put_zeros call. */
icmp->icmp_csum = csum(icmp, ICMP_HEADER_LEN);
} else if (flow->nw_proto == IPPROTO_IGMP) {
struct igmp_header *igmp;
@@ -2235,6 +2236,7 @@ flow_compose_l4(struct dp_packet *p, const struct flow *flow)
igmp->igmp_type = ntohs(flow->tp_src);
igmp->igmp_code = ntohs(flow->tp_dst);
put_16aligned_be32(&igmp->group, flow->igmp_group_ip4);
+ /* Checksum has already been zeroed by put_zeros call. */
igmp->igmp_csum = csum(igmp, IGMP_HEADER_LEN);
} else if (flow->nw_proto == IPPROTO_ICMPV6) {
struct icmp6_hdr *icmp;
@@ -2323,6 +2325,7 @@ flow_compose(struct dp_packet *p, const struct flow *flow)
ip = dp_packet_l3(p);
ip->ip_tot_len = htons(p->l4_ofs - p->l3_ofs + l4_len);
+ /* Checksum has already been zeroed by put_zeros call. */
ip->ip_csum = csum(ip, sizeof *ip);
} else if (flow->dl_type == htons(ETH_TYPE_IPV6)) {
struct ovs_16aligned_ip6_hdr *nh;
@@ -273,6 +273,7 @@ netdev_tnl_ip_build_header(struct ovs_action_push_tnl *data,
ip->ip_frag_off = (params->flow->tunnel.flags & FLOW_TNL_F_DONT_FRAGMENT) ?
htons(IP_DF) : 0;
+ /* Checksum has already been zeroed by eth_build_header. */
ip->ip_csum = csum(ip, sizeof *ip);
data->header_len += IP_HEADER_LEN;
@@ -345,6 +345,7 @@ pinctrl_handle_put_dhcp_opts(
struct ip_header *out_ip = dp_packet_l3(&pkt_out);
out_ip->ip_tot_len = htons(pkt_out.l4_ofs - pkt_out.l3_ofs + new_l4_size);
udp->udp_csum = 0;
+ /* Checksum needs to be initialized to zero. */
out_ip->ip_csum = 0;
out_ip->ip_csum = csum(out_ip, sizeof *out_ip);
The checksum method csum() requires its output location to be intialized to zero when that output location is part of the checksum. Add comments to the various places where csum is called documenting where the initialization has occurred. Signed-off-by: Ryan Moats <rmoats@us.ibm.com> --- lib/bfd.c | 1 + lib/flow.c | 3 +++ lib/netdev-native-tnl.c | 1 + ovn/controller/pinctrl.c | 1 + 4 files changed, 6 insertions(+)