Message ID | 20210928031938.17902-1-xiyou.wangcong@gmail.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] wireguard: preserve skb->mark on ingress side | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | fail | Series targets non-next tree, but doesn't contain any Fixes tags |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for net |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | warning | 2 maintainers not CCed: davem@davemloft.net kuba@kernel.org |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | warning | WARNING: line length of 100 exceeds 80 columns |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/header_inline | success | Link |
Hi Cong, I'm not so sure this makes sense, as the inner packet is in fact totally different. If you want to distinguish the ingress interface, can't you just use `iptables -i wg0` or `ip rule add ... iif wg0`? Jason
On Mon, Sep 27, 2021 at 8:22 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote: > > Hi Cong, > > I'm not so sure this makes sense, as the inner packet is in fact > totally different. If you want to distinguish the ingress interface, The contents are definitely different, but skb itself is the same. Please also take a look at other tunnels, they all preserve this in similar ways, that is, comparing net namespaces. Any reason why wireguard is so different from other tunnels? > can't you just use `iptables -i wg0` or `ip rule add ... iif wg0`? > My bad, I forgot to mention we run eBPF on egress side, where skb->dev is already set to egress device (a non-wireguard device), and of course skb_iif has been cleared even earlier. Thanks.
Hi, Jason On Mon, Sep 27, 2021 at 8:27 PM Cong Wang <xiyou.wangcong@gmail.com> wrote: > > On Mon, Sep 27, 2021 at 8:22 PM Jason A. Donenfeld <Jason@zx2c4.com> wrote: > > > > Hi Cong, > > > > I'm not so sure this makes sense, as the inner packet is in fact > > totally different. If you want to distinguish the ingress interface, > > The contents are definitely different, but skb itself is the same. > > Please also take a look at other tunnels, they all preserve this > in similar ways, that is, comparing net namespaces. Any reason > why wireguard is so different from other tunnels? Any response? Thanks.
diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h index 4ef2944a68bc..3516c1c59df0 100644 --- a/drivers/net/wireguard/queueing.h +++ b/drivers/net/wireguard/queueing.h @@ -73,15 +73,20 @@ static inline bool wg_check_packet_protocol(struct sk_buff *skb) return real_protocol && skb->protocol == real_protocol; } -static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating) +static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating, + bool xnet) { u8 l4_hash = skb->l4_hash; u8 sw_hash = skb->sw_hash; u32 hash = skb->hash; - skb_scrub_packet(skb, true); + u32 mark; + + skb_scrub_packet(skb, xnet); + mark = skb->mark; memset(&skb->headers_start, 0, offsetof(struct sk_buff, headers_end) - offsetof(struct sk_buff, headers_start)); + skb->mark = mark; if (encapsulating) { skb->l4_hash = l4_hash; skb->sw_hash = sw_hash; diff --git a/drivers/net/wireguard/receive.c b/drivers/net/wireguard/receive.c index 7dc84bcca261..385b2b60cfd9 100644 --- a/drivers/net/wireguard/receive.c +++ b/drivers/net/wireguard/receive.c @@ -476,7 +476,7 @@ int wg_packet_rx_poll(struct napi_struct *napi, int budget) if (unlikely(wg_socket_endpoint_from_skb(&endpoint, skb))) goto next; - wg_reset_packet(skb, false); + wg_reset_packet(skb, false, !net_eq(dev_net(peer->device->dev), dev_net(skb->dev))); wg_packet_consume_data_done(peer, skb, &endpoint); free = false; diff --git a/drivers/net/wireguard/send.c b/drivers/net/wireguard/send.c index 5368f7c35b4b..c77ef0815c2e 100644 --- a/drivers/net/wireguard/send.c +++ b/drivers/net/wireguard/send.c @@ -296,7 +296,7 @@ void wg_packet_encrypt_worker(struct work_struct *work) skb_list_walk_safe(first, skb, next) { if (likely(encrypt_packet(skb, PACKET_CB(first)->keypair))) { - wg_reset_packet(skb, true); + wg_reset_packet(skb, true, true); } else { state = PACKET_STATE_DEAD; break;