ソースを参照

LWIP_VLAN_PCP==1: initialize tci correctly (disabled); add pcb_tci_*() functions to access the tci

Simon Goldschmidt 2 年 前
コミット
b92faffaaa
5 ファイル変更21 行追加5 行削除
  1. 1 0
      src/core/raw.c
  2. 1 0
      src/core/tcp.c
  3. 1 0
      src/core/udp.c
  4. 11 0
      src/include/lwip/ip.h
  5. 7 5
      src/include/lwip/opt.h

+ 1 - 0
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;
   }

+ 1 - 0
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;
 }

+ 1 - 0
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;
 }

+ 11 - 0
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
  */

+ 7 - 5
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