Hi Chenmin, If packets are marked as having a bad csum, or marked as needing a csum and that turns out to be wrong after ip-local computes it, ip-local should drop them. From the trace lower, l4 csum is reported as bad by dpdk.
So why is this unexpected? Regards, Florin > On Apr 14, 2020, at 6:14 AM, Sun, Chenmin <chenmin....@intel.com> wrote: > > Hi Florin, > But what I saw in current master branch is, the bad checksum packets are all > dropped in ip4-local node. See log below: > > 00:06:42:511858: dpdk-input > 1/2 rx queue 0 > buffer 0xfe57e2: current data 0, length 124, buffer-pool 0, ref-count 1, > totlen-nifb 0, trace handle 0x1000000 > ext-hdr-valid > PKT MBUF: port 1, nb_segs 1, pkt_len 124 > buf_len 2176, data_len 124, ol_flags 0x8a, data_off 128, phys_addr > 0xbf95f900 > packet_type 0x191 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0 > rss 0x5bf78172 fdir.hi 0x0 fdir.lo 0x5bf78172 > Packet Offload Flags > PKT_RX_RSS_HASH (0x0002) RX packet with RSS hash result > PKT_RX_L4_CKSUM_BAD (0x0008) L4 cksum of RX pkt. is not OK > PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid > Packet Types > RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet > RTE_PTYPE_L3_IPV4_EXT_UNKNOWN (0x0090) IPv4 packet with or without > extension headers > RTE_PTYPE_L4_TCP (0x0100) TCP packet > IP4: 00:00:01:00:24:00 -> 00:00:00:00:01:01 > TCP: 66.66.66.6 -> 66.66.66.66 > tos 0x00, ttl 64, length 110, checksum 0x71be dscp CS0 ecn NON_ECN > fragment id 0x0000 > TCP: 111 -> 222 > seq. 0x00000201 ack 0x00000200 > flags 0x00, tcp header: 20 bytes > window 0, checksum 0xf6b5 > 00:06:42:512116: ethernet-input > frame: flags 0x3, hw-if-index 2, sw-if-index 2 > IP4: 00:00:01:00:24:00 -> 00:00:00:00:01:01 > 00:06:42:512143: ip4-input-no-checksum > TCP: 66.66.66.6 -> 66.66.66.66 > tos 0x00, ttl 64, length 110, checksum 0x71be dscp CS0 ecn NON_ECN > fragment id 0x0000 > TCP: 111 -> 222 > seq. 0x00000201 ack 0x00000200 > flags 0x00, tcp header: 20 bytes > window 0, checksum 0xf6b5 > 00:06:42:512175: ip4-lookup > fib 0 dpo-idx 8 flow hash: 0x00000000 > TCP: 66.66.66.6 -> 66.66.66.66 > tos 0x00, ttl 64, length 110, checksum 0x71be dscp CS0 ecn NON_ECN > fragment id 0x0000 > TCP: 111 -> 222 > seq. 0x00000201 ack 0x00000200 > flags 0x00, tcp header: 20 bytes > window 0, checksum 0xf6b5 > 00:06:42:512217: ip4-local > TCP: 66.66.66.6 -> 66.66.66.66 > tos 0x00, ttl 64, length 110, checksum 0x71be dscp CS0 ecn NON_ECN > fragment id 0x0000 > TCP: 111 -> 222 > seq. 0x00000201 ack 0x00000200 > flags 0x00, tcp header: 20 bytes > window 0, checksum 0xf6b5 > 00:06:42:512280: ip4-drop > TCP: 66.66.66.6 -> 66.66.66.66 > tos 0x00, ttl 64, length 110, checksum 0x71be dscp CS0 ecn NON_ECN > fragment id 0x0000 > TCP: 111 -> 222 > seq. 0x00000201 ack 0x00000200 > flags 0x00, tcp header: 20 bytes > window 0, checksum 0xf6b5 > 00:06:42:512308: error-drop > rx:1/2 > 00:06:42:512323: drop > ip4-local: bad tcp checksum > > > Best Regards, > Sun, Chenmin > > From: Florin Coras <fcoras.li...@gmail.com> > Sent: Tuesday, April 14, 2020 12:04 AM > To: Sun, Chenmin <chenmin....@intel.com> > Cc: vpp-dev <vpp-dev@lists.fd.io> > Subject: Re: [vpp-dev] VPP checksum behavior problems > > Hi Chenmin, > > Regarding your second question, some of the device drivers could mark buffers > for tx csum offload which is honored only if data is about to be delivered to > the network (or if some other action performed to the buffer requires csums > to be computed). Otherwise, if packets end up consumed locally, e.g., tunnel > or host stack termination, the data is assumed to be correct and no checksum > is computed. > > So, for instance, if udp/tcp packets received from a tap interface are > terminated locally, we don’t try to compute/validate checksum, since there’s > nothing to validate as the checksum has not yet been filled in. > > Regards, > Florin > > On Apr 13, 2020, at 12:52 AM, Sun, Chenmin <chenmin....@intel.com > <mailto:chenmin....@intel.com>> wrote: > > [Edited Message Follows] > Hi experts, > > I am confusing about the L4 checksum behavior in VPP. I noticed the code was > there for a very long time(more than 3 years) so I open this topic to see if > anybody knows the history and why. > > The first problem is in DPDK plugin and was introduced in commit d81566ff92: > Disable for-us udp/tcp checksum validation by default > in Current DPDK plugin, the code clears flags > VNET_BUFFER_F_L4_CHECKSUM_COMPUTED and VNET_BUFFER_F_L4_CHECKSUM_CORRECT when > "enable-tcp-udp-checksum" option is enabled. While these two flags are used > to identify if the L4 checksum is checked and correct, respectively. So I > think this is a wrong behavior - are we doing the opposite? > The current DPDK plugin assumes all the packets from DPDK are correct but in > fact we should check per packet and set the corresponding bits. I've pushed a > patch to fix this issue and Dave invited experts to help to review - Thanks > Dave :-) > > Another problem in the IP4 graph node. The following mechanism was first > introduced in commit 96be8e88109b3e1 and got refactored in commit 1b25552eb. > > #define ip4_local_csum_is_offloaded(_b) \ > _b->flags & VNET_BUFFER_F_OFFLOAD_TCP_CKSUM \ > || _b->flags & VNET_BUFFER_F_OFFLOAD_UDP_CKSUM > > #define ip4_local_need_csum_check(is_tcp_udp, _b) \ > (is_tcp_udp && !(_b->flags & VNET_BUFFER_F_L4_CHECKSUM_COMPUTED \ > || ip4_local_csum_is_offloaded (_b))) > > #define ip4_local_csum_is_valid(_b) \ > (_b->flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT \ > || (ip4_local_csum_is_offloaded (_b))) != 0 > > In my understanding, the Marcos ip4_local_need_csum_check and > ip4_local_csum_is_valid are used to check if the L4 checksum is computed and > checked before ip4-local node. While the Macro ip4_local_csum_is_offloaded is > to check if the L4 checksum can be offloaded to NIC on the TX side. I am not > very clear why do we need to check the tx offload capability in the RX path - > maybe we are expecting the NIC can help to re-calculate the checksum before > sending out? Think about if an APP(local APP running upon TCP/UDP stack or a > tunnel like VxLAN/GTPU/etc...) is running on L4, it would get invalid > checksum packets(Considering the DPDK plugin marked all the packets are > COMPUTED and CORRECT as I described in the first problem). > > see in: > commit 96be8e88109b3e166b76f58e552dbe438d73bb73 > Author: Jakub Grajciar <jakub.grajc...@pantheon.tech > <mailto:jakub.grajc...@pantheon.tech>> > Date: Mon Oct 30 14:56:17 2017 +0100 > > vnet: ip4/6_local->don't drop packet if marked for TCP/UDP offload cksum > calculation > >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#16072): https://lists.fd.io/g/vpp-dev/message/16072 Mute This Topic: https://lists.fd.io/mt/72982275/21656 Group Owner: vpp-dev+ow...@lists.fd.io Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-