On Wed, Oct 11, 2017 at 3:39 PM, Anton Ivanov <anton.iva...@kot-begemot.co.uk> wrote: > On 11/10/17 19:57, Willem de Bruijn wrote: >> On Wed, Oct 11, 2017 at 2:39 PM, Anton Ivanov >> <anton.iva...@kot-begemot.co.uk> wrote: >>> The check as now insists that the actual driver supports GSO_ROBUST, because >>> we have marked the skb dodgy. >>> >>> The specific bit which does this check is in net_gso_ok() >>> >>> Now, lets's see how many Ethernet drivers set GSO_ROBUST. >>> >>> find drivers/net/ethernet -type f -name "*.[c,h]" -exec grep -H GSO_ROBUST >>> {} \; >>> >>> That returns nothing in 4.x >>> >>> IMHO - af_packet allocates the skb, does all checks (and extra may be added) >>> on the gso, why is this set dodgy in the first place? >> It is set when the header has to be validated. >> >> The segmentation logic will validate and fixup gso_segs. See for >> instance tcp_gso_segment: >> >> if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) { >> /* Packet is from an untrusted source, reset gso_segs. */ >> >> skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss); >> >> segs = NULL; >> goto out; >> } >> >> If the device would have the robust bit set and otherwise supports the >> required features, fix up gso_segs and pass the large packet to the >> device. >> >> Else it continues to the software gso path. >> >> Large packets generated with psock_txring_vnet.c pass this test. I > > That test is indeed a different path
The test can be run both with and without ring: psock_txring_vnet -l 8000 -s $src_ip -d $dst_ip -v psock_txring_vnet -l 8000 -s $src_ip -d $dst_ip -v -N both with and without qdisc bypass ('-q'). > - this goes via the tpacket_snd > which allocs via sock_alloc_send_skb. That results in a non-fragged skb > as it calls pskb after that with data_len = 0 asking for a contiguous one. but attached the ring slot as fragments in tpacket_fill_skb. > My stuff is using sendmmsg which ends up via packet_snd which allocs > via sock_alloc_send_pskb which is invoked in a way which always creates > 2 segments - one for the linear section and one for the rest (and more > if needed). It is faster than tpacket by the way (several times). > > As a comparison tap and other virtual drivers use sock_alloc_send_pskb > with non-zero data length which results in multiple frags. The code in > packet_snd is in fact identical with tap (+/- some cosmetic differences). > > That is the difference between the tests and that is why your test works > and mine fails. All the above test cases work for me, including those that build skbs with fragments. Could you try those.