Skip to content

Commit

Permalink
netfilter: nft_payload: restore vlan q-in-q match support
Browse files Browse the repository at this point in the history
[ Upstream commit aff5c01 ]

Revert f6ae9f1 ("netfilter: nft_payload: add C-VLAN support").

f41f72d ("netfilter: nft_payload: simplify vlan header handling")
already allows to match on inner vlan tags by subtract the vlan header
size to the payload offset which has been popped and stored in skbuff
metadata fields.

Fixes: f6ae9f1 ("netfilter: nft_payload: add C-VLAN support")
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
ummakynes authored and Florian Bezannier committed Aug 23, 2024
1 parent 3495bf0 commit bfe9cdf
Showing 1 changed file with 7 additions and 16 deletions.
23 changes: 7 additions & 16 deletions net/netfilter/nft_payload.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,36 +45,27 @@ nft_payload_copy_vlan(u32 *d, const struct sk_buff *skb, u8 offset, u8 len)
int mac_off = skb_mac_header(skb) - skb->data;
u8 *vlanh, *dst_u8 = (u8 *) d;
struct vlan_ethhdr veth;
u8 vlan_hlen = 0;

if ((skb->protocol == htons(ETH_P_8021AD) ||
skb->protocol == htons(ETH_P_8021Q)) &&
offset >= VLAN_ETH_HLEN && offset < VLAN_ETH_HLEN + VLAN_HLEN)
vlan_hlen += VLAN_HLEN;

vlanh = (u8 *) &veth;
if (offset < VLAN_ETH_HLEN + vlan_hlen) {
if (offset < VLAN_ETH_HLEN) {
u8 ethlen = len;

if (vlan_hlen &&
skb_copy_bits(skb, mac_off, &veth, VLAN_ETH_HLEN) < 0)
return false;
else if (!nft_payload_rebuild_vlan_hdr(skb, mac_off, &veth))
if (!nft_payload_rebuild_vlan_hdr(skb, mac_off, &veth))
return false;

if (offset + len > VLAN_ETH_HLEN + vlan_hlen)
ethlen -= offset + len - VLAN_ETH_HLEN - vlan_hlen;
if (offset + len > VLAN_ETH_HLEN)
ethlen -= offset + len - VLAN_ETH_HLEN;

memcpy(dst_u8, vlanh + offset - vlan_hlen, ethlen);
memcpy(dst_u8, vlanh + offset, ethlen);

len -= ethlen;
if (len == 0)
return true;

dst_u8 += ethlen;
offset = ETH_HLEN + vlan_hlen;
offset = ETH_HLEN;
} else {
offset -= VLAN_HLEN + vlan_hlen;
offset -= VLAN_HLEN;
}

return skb_copy_bits(skb, offset + mac_off, dst_u8, len) == 0;
Expand Down

0 comments on commit bfe9cdf

Please sign in to comment.