From b92faffaaa45630fc241fa166517a4b57a8c035e Mon Sep 17 00:00:00 2001 From: Simon Goldschmidt Date: Fri, 22 Sep 2023 09:53:13 +0200 Subject: [PATCH] LWIP_VLAN_PCP==1: initialize tci correctly (disabled); add pcb_tci_*() functions to access the tci --- src/core/raw.c | 1 + src/core/tcp.c | 1 + src/core/udp.c | 1 + src/include/lwip/ip.h | 11 +++++++++++ src/include/lwip/opt.h | 12 +++++++----- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/core/raw.c b/src/core/raw.c index 94e299a5..d85aaec0 100644 --- a/src/core/raw.c +++ b/src/core/raw.c @@ -610,6 +610,7 @@ raw_new(u8_t proto) #if LWIP_MULTICAST_TX_OPTIONS raw_set_multicast_ttl(pcb, RAW_TTL); #endif /* LWIP_MULTICAST_TX_OPTIONS */ + pcb_tci_init(pcb); pcb->next = raw_pcbs; raw_pcbs = pcb; } diff --git a/src/core/tcp.c b/src/core/tcp.c index 1abea8e0..ea95ffee 100644 --- a/src/core/tcp.c +++ b/src/core/tcp.c @@ -1929,6 +1929,7 @@ tcp_alloc(u8_t prio) pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT; pcb->keep_cnt = TCP_KEEPCNT_DEFAULT; #endif /* LWIP_TCP_KEEPALIVE */ + pcb_tci_init(pcb); } return pcb; } diff --git a/src/core/udp.c b/src/core/udp.c index db833d00..23c2be27 100644 --- a/src/core/udp.c +++ b/src/core/udp.c @@ -1238,6 +1238,7 @@ udp_new(void) #if LWIP_MULTICAST_TX_OPTIONS udp_set_multicast_ttl(pcb, UDP_TTL); #endif /* LWIP_MULTICAST_TX_OPTIONS */ + pcb_tci_init(pcb); } return pcb; } diff --git a/src/include/lwip/ip.h b/src/include/lwip/ip.h index 68aed6af..668d8317 100644 --- a/src/include/lwip/ip.h +++ b/src/include/lwip/ip.h @@ -93,6 +93,17 @@ struct ip_pcb { IP_PCB; }; +#if LWIP_VLAN_PCP +#define pcb_has_tci(pcb) ((pcb)->netif_hints.tci >= 0) +#define pcb_tci_get(pcb) ((pcb)->netif_hints.tci) +#define pcb_tci_clear(pcb) do { (pcb)->netif_hints.tci = -1; } while(0) +#define pcb_tci_set(pcb, tci_val) do { (pcb)->netif_hints.tci = (tci_val) & 0xffff; } while(0) +#define pcb_tci_set_pcp_dei_vid(pcb, pcp, dei, vid) pcb_tci_set(pcb, (((pcp) & 7) << 13) | (((dei) & 1) << 12) | ((vid) & 0xFFF)) +#define pcb_tci_init(pcb) pcb_tci_clear(pcb) +#else +#define pcb_tci_init(pcb) +#endif + /* * Option flags per-socket. These are the same like SO_XXX in sockets.h */ diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index 4824adeb..c27dd034 100644 --- a/src/include/lwip/opt.h +++ b/src/include/lwip/opt.h @@ -672,11 +672,13 @@ /** * LWIP_VLAN_PCP==1: Enable outgoing VLAN taggning of frames on a per-PCB basis - * for QoS purposes. With this feature enabled, each PCB has a new variable: "tci". - * (Tag Control Identifier). The TCI contains three fields: VID, CFI and PCP. - * VID is the VLAN ID, which should be set to zero. - * The "CFI" bit is used to enable or disable VLAN tags for the PCB. - * PCP (Priority Code Point) is a 3 bit field used for Ethernet level QoS. + * for QoS purposes. With this feature enabled, each PCB has a new variable: + * "netif_hints.tci" (Tag Control Identifier). + * The TCI contains three fields: VID, CFI and PCP. + * - VID is the VLAN ID, which should be set to zero. + * - The "CFI" bit is used to enable or disable VLAN tags for the PCB. + * - PCP (Priority Code Point) is a 3 bit field used for Ethernet level QoS. + * See pcb_tci_*() functions to get/set/clear this. */ #ifndef LWIP_VLAN_PCP #define LWIP_VLAN_PCP 0