From 7e4a4cda65a2e53760aa6e07c487eb5b10cc851d Mon Sep 17 00:00:00 2001 From: Herbert Wolverson Date: Thu, 20 Aug 2026 14:48:33 -0500 Subject: [PATCH] Fix prioritized VLAN redirect rewriting --- src/rust/lqos_sys/src/bpf/common/dissector.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/rust/lqos_sys/src/bpf/common/dissector.h b/src/rust/lqos_sys/src/bpf/common/dissector.h index 64d65514..95a04e7c 100644 --- a/src/rust/lqos_sys/src/bpf/common/dissector.h +++ b/src/rust/lqos_sys/src/bpf/common/dissector.h @@ -181,6 +181,7 @@ static __always_inline bool dissector_find_l3_offset( } struct vlan_hdr *vlan = (struct vlan_hdr *)(dissector->start + offset); dissector->current_vlan = vlan->h_vlan_TCI; + __u16 vlan_tci = bpf_ntohs(dissector->current_vlan); eth_type = bpf_ntohs(vlan->h_vlan_encapsulated_proto); offset += sizeof(struct vlan_hdr); // VLAN Redirection is requested, so lookup a detination and @@ -190,19 +191,22 @@ static __always_inline bool dissector_find_l3_offset( #ifdef VERBOSE bpf_debug("Searching for redirect %u:%u", dissector->ctx->ingress_ifindex, - bpf_ntohs(dissector->current_vlan)); + vlan_tci); #endif __u32 key = (dissector->ctx->ingress_ifindex << 16) | - bpf_ntohs(dissector->current_vlan); + (vlan_tci & 0x0FFF); struct bifrost_vlan *vlan_info = NULL; vlan_info = bpf_map_lookup_elem(&bifrost_vlan_map, &key); if (vlan_info) { + vlan_tci = bpf_ntohs(dissector->current_vlan); #ifdef VERBOSE bpf_debug("Redirect to VLAN %u", bpf_htons(vlan_info->redirect_to)); #endif - vlan->h_vlan_TCI = bpf_htons(vlan_info->redirect_to); + vlan->h_vlan_TCI = bpf_htons( + (vlan_tci & 0xF000) | + (vlan_info->redirect_to & 0x0FFF)); } } }