1 /** @file
2  * @brief VLAN specific definitions.
3  *
4  * Virtual LAN specific definitions.
5  */
6 
7 /*
8  * Copyright (c) 2018 Intel Corporation
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  */
12 
13 #ifndef ZEPHYR_INCLUDE_NET_ETHERNET_VLAN_H_
14 #define ZEPHYR_INCLUDE_NET_ETHERNET_VLAN_H_
15 
16 /**
17  * @brief VLAN definitions and helpers
18  * @defgroup vlan_api Virtual LAN definitions and helpers
19  * @since 1.12
20  * @version 0.8.0
21  * @ingroup networking
22  * @{
23  */
24 
25 #include <zephyr/types.h>
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 /** Unspecified VLAN tag value */
32 #define NET_VLAN_TAG_UNSPEC 0x0fff
33 
34 /** VLAN ID for forwarding to the native interface (priority tagging) */
35 #define NET_VLAN_TAG_PRIORITY 0x0000
36 
37 /**
38  * @brief Get VLAN identifier from TCI.
39  *
40  * @param tci VLAN tag control information.
41  *
42  * @return VLAN identifier.
43  */
net_eth_vlan_get_vid(uint16_t tci)44 static inline uint16_t net_eth_vlan_get_vid(uint16_t tci)
45 {
46 	return tci & 0x0fff;
47 }
48 
49 /**
50  * @brief Get Drop Eligible Indicator from TCI.
51  *
52  * @param tci VLAN tag control information.
53  *
54  * @return Drop eligible indicator.
55  */
net_eth_vlan_get_dei(uint16_t tci)56 static inline uint8_t net_eth_vlan_get_dei(uint16_t tci)
57 {
58 	return (tci >> 12) & 0x01;
59 }
60 
61 /**
62  * @brief Get Priority Code Point from TCI.
63  *
64  * @param tci VLAN tag control information.
65  *
66  * @return Priority code point.
67  */
net_eth_vlan_get_pcp(uint16_t tci)68 static inline uint8_t net_eth_vlan_get_pcp(uint16_t tci)
69 {
70 	return (tci >> 13) & 0x07;
71 }
72 
73 /**
74  * @brief Set VLAN identifier to TCI.
75  *
76  * @param tci VLAN tag control information.
77  * @param vid VLAN identifier.
78  *
79  * @return New TCI value.
80  */
net_eth_vlan_set_vid(uint16_t tci,uint16_t vid)81 static inline uint16_t net_eth_vlan_set_vid(uint16_t tci, uint16_t vid)
82 {
83 	return (tci & 0xf000) | (vid & 0x0fff);
84 }
85 
86 /**
87  * @brief Set Drop Eligible Indicator to TCI.
88  *
89  * @param tci VLAN tag control information.
90  * @param dei Drop eligible indicator.
91  *
92  * @return New TCI value.
93  */
net_eth_vlan_set_dei(uint16_t tci,bool dei)94 static inline uint16_t net_eth_vlan_set_dei(uint16_t tci, bool dei)
95 {
96 	return (tci & 0xefff) | ((!!dei) << 12);
97 }
98 
99 /**
100  * @brief Set Priority Code Point to TCI.
101  *
102  * @param tci VLAN tag control information.
103  * @param pcp Priority code point.
104  *
105  * @return New TCI value.
106  */
net_eth_vlan_set_pcp(uint16_t tci,uint8_t pcp)107 static inline uint16_t net_eth_vlan_set_pcp(uint16_t tci, uint8_t pcp)
108 {
109 	return (tci & 0x1fff) | ((pcp & 0x07) << 13);
110 }
111 
112 #ifdef __cplusplus
113 }
114 #endif
115 
116 /**
117  * @}
118  */
119 
120 
121 #endif /* ZEPHYR_INCLUDE_NET_ETHERNET_VLAN_H_ */
122