Thread (73 messages) flat view 73 messages, 4 authors, 2021-07-09

Re: [PATCH] net: tun: fix tun_xdp_one() for IFF_TUN mode

From: Jason Wang <hidden>
Date: 2021-06-22 07:51:54

在 2021/6/22 下午3:24, David Woodhouse 写道:
quoted hunk ↗ jump to hunk
On Tue, 2021-06-22 at 12:52 +0800, Jason Wang wrote:
quoted
I cook two patches. Please see and check if they fix the problem.
(compile test only for me).
I did the second one slightly differently (below) but those are what I
came up with too, which seems to be working.
@@ -2331,7 +2344,7 @@ static int tun_xdp_one(struct tun_struct *tun,
  {
         unsigned int datasize = xdp->data_end - xdp->data;
         struct tun_xdp_hdr *hdr = xdp->data_hard_start;
-       struct virtio_net_hdr *gso = &hdr->gso;
+       struct virtio_net_hdr *gso = NULL;
         struct bpf_prog *xdp_prog;
         struct sk_buff *skb = NULL;
         u32 rxhash = 0, act;
@@ -2340,9 +2353,12 @@ static int tun_xdp_one(struct tun_struct *tun,
         bool skb_xdp = false;
         struct page *page;
  
+       if (tun->flags & IFF_VNET_HDR)
+               gso = &hdr->gso;
+
         xdp_prog = rcu_dereference(tun->xdp_prog);
         if (xdp_prog) {
-               if (gso->gso_type) {
+               if (gso && gso->gso_type) {
                         skb_xdp = true;
                         goto build;
                 }
@@ -2388,14 +2406,18 @@ static int tun_xdp_one(struct tun_struct *tun,
         skb_reserve(skb, xdp->data - xdp->data_hard_start);
         skb_put(skb, xdp->data_end - xdp->data);
  
-       if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun))) {
+       if (!gso)
+               skb_reset_mac_header(skb);
+       else if (virtio_net_hdr_to_skb(skb, gso, tun_is_little_endian(tun))) {
                 atomic_long_inc(&tun->rx_frame_errors);
                 kfree_skb(skb);

This should work as well.

Thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help