> -----Original Message----- > From: Ananyev, Konstantin > Sent: Thursday, November 06, 2014 5:04 PM > To: Ananyev, Konstantin > Subject: FW: [dpdk-dev] UDP Checksum > > > > From: Alex Markuze [mailto:alex at weka.io] > Sent: Thursday, November 06, 2014 4:27 PM > To: Ananyev, Konstantin > Cc: dev at dpdk.org > Subject: Re: [dpdk-dev] UDP Checksum > > I was setting both ip and udp scum fields to 0.?PKT_TX_UDP_CKSUM > ==?PKT_TX_L4_MASK = 0x6000. > > I was not aware of the?get_ipv4_psd_sum(ipv4_hdr); > And I'm quite frankly surprised the HW doesn't already do this. Farther more > I don't remember kernel drivers messing with > L3 Headers(bnx2x/mlx4). Is this true for all PMDs that do scum offloads?
I suppose it depends on HW implementation. All Intel NICs I am aware about (e1000, ixgbe, i40e) expect that SW provides the pseudo IP header checksum in the L4 header. Not sure what is the story with NICs from other manufactures. > > I will give it a try now. > > > On Thu, Nov 6, 2014 at 6:15 PM, Ananyev, Konstantin <konstantin.ananyev at > intel.com> wrote: > > > > -----Original Message----- > > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Alex Markuze > > Sent: Thursday, November 06, 2014 4:05 PM > > To: dev at dpdk.org > > Subject: [dpdk-dev] UDP Checksum > > > > Hi, > > I'm seeing "UDP: bad checksum." messages(dmesg) for packets sent by my dpdk > > app to a socket on a remote machine. > > Looking at the packets the scum value is set, its just not what wireshark > > expects. > > > > When sending I'm setting these fields in the egress packets. > > > >? ? ? ? ?pkt->pkt.vlan_macip.f.l2_len = sizeof(struct ether_hdr); > > > >? ? ? ? ?pkt->pkt.vlan_macip.f.l3_len = sizeof(struct ipv4_hdr); > > > >? ? ? ? ?pkt->ol_flags |= (PKT_TX_IP_CKSUM | PKT_TX_L4_MASK); > > //PKT_TX_OFFLOAD_MASK; > > > > > > I'm working with a 82599 VF. > > > > > > Any thoughts? I'm not sure what else to check. > As I remember, you have to setup? IPV4 header checksum to 0 and > calculate and setup pseudo-header checksum for UDP. > From app/test-pmd/csumonly.c: > ... > if (pkt_ol_flags & (PKT_RX_IPV4_HDR | PKT_RX_TUNNEL_IPV4_HDR)) { > > ? ? ? ? ? ? ? ? ? ? ? ? /* Do not support ipv4 option field */ > ? ? ? ? ? ? ? ? ? ? ? ? l3_len = sizeof(struct ipv4_hdr) ; > > ? ? ? ? ? ? ? ? ? ? ? ? ... > > ? ? ? ? ? ? ? ? ? ? ? ? /* Do not delete, this is required by HW*/ > ? ? ? ? ? ? ? ? ? ? ? ? ipv4_hdr->hdr_checksum = 0; > > ? ? ? ? ? ? ? ? ? ? ? ?... > > ? ? ? ? ? ? ? ? ? ? ? if (l4_proto == IPPROTO_UDP) { > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? udp_hdr = (struct udp_hdr*) > (rte_pktmbuf_mtod(mb, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? unsigned char *) + l2_len + > l3_len); > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (tx_ol_flags & 0x2) { > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* HW Offload */ > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ol_flags |= PKT_TX_UDP_CKSUM; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (ipv4_tunnel) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? udp_hdr->dgram_cksum = 0; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Pseudo header sum need be > set properly */ > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? udp_hdr->dgram_cksum = > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > get_ipv4_psd_sum(ipv4_hdr); > >