summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Goldschmidt <[email protected]>2023-09-22 09:53:13 +0200
committerSimon Goldschmidt <[email protected]>2023-09-22 09:53:13 +0200
commitb92faffaaa45630fc241fa166517a4b57a8c035e (patch)
treec57d1fd9a8e9e494b04676e9d18cf4141b88f82d
parent84fde1ebbfe35b3125fc2d89b8a456cbacf148e9 (diff)
downloadlwip-b92faffaaa45630fc241fa166517a4b57a8c035e.tar.gz
LWIP_VLAN_PCP==1: initialize tci correctly (disabled); add pcb_tci_*() functions to access the tci
-rw-r--r--src/core/raw.c1
-rw-r--r--src/core/tcp.c1
-rw-r--r--src/core/udp.c1
-rw-r--r--src/include/lwip/ip.h11
-rw-r--r--src/include/lwip/opt.h12
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