ethernet.h
Go to the documentation of this file.
1 /**
2  * @file ethernet.h
3  * @brief Ethernet
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2010-2024 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneTCP Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.4.4
29  **/
30 
31 #ifndef _ETHERNET_H
32 #define _ETHERNET_H
33 
34 //Dependencies
35 #include "core/net.h"
36 
37 //Ethernet support
38 #ifndef ETH_SUPPORT
39  #define ETH_SUPPORT ENABLED
40 #elif (ETH_SUPPORT != ENABLED && ETH_SUPPORT != DISABLED)
41  #error ETH_SUPPORT parameter is not valid
42 #endif
43 
44 //Virtual interface support
45 #ifndef ETH_VIRTUAL_IF_SUPPORT
46  #define ETH_VIRTUAL_IF_SUPPORT DISABLED
47 #elif (ETH_VIRTUAL_IF_SUPPORT != ENABLED && ETH_VIRTUAL_IF_SUPPORT != DISABLED)
48  #error ETH_VIRTUAL_IF_SUPPORT parameter is not valid
49 #endif
50 
51 //VLAN support (IEEE 802.1Q)
52 #ifndef ETH_VLAN_SUPPORT
53  #define ETH_VLAN_SUPPORT DISABLED
54 #elif (ETH_VLAN_SUPPORT != ENABLED && ETH_VLAN_SUPPORT != DISABLED)
55  #error ETH_VLAN_SUPPORT parameter is not valid
56 #endif
57 
58 //VMAN support (IEEE 802.1ad)
59 #ifndef ETH_VMAN_SUPPORT
60  #define ETH_VMAN_SUPPORT DISABLED
61 #elif (ETH_VMAN_SUPPORT != ENABLED && ETH_VMAN_SUPPORT != DISABLED)
62  #error ETH_VMAN_SUPPORT parameter is not valid
63 #endif
64 
65 //LLC support (IEEE 802.2)
66 #ifndef ETH_LLC_SUPPORT
67  #define ETH_LLC_SUPPORT DISABLED
68 #elif (ETH_LLC_SUPPORT != ENABLED && ETH_LLC_SUPPORT != DISABLED)
69  #error ETH_LLC_SUPPORT parameter is not valid
70 #endif
71 
72 //Switch port tagging
73 #ifndef ETH_PORT_TAGGING_SUPPORT
74  #define ETH_PORT_TAGGING_SUPPORT DISABLED
75 #elif (ETH_PORT_TAGGING_SUPPORT != ENABLED && ETH_PORT_TAGGING_SUPPORT != DISABLED)
76  #error ETH_PORT_TAGGING_SUPPORT parameter is not valid
77 #endif
78 
79 //Size of tags used for switch port tagging
80 #ifndef ETH_PORT_TAG_SIZE
81  #define ETH_PORT_TAG_SIZE 4
82 #elif (ETH_PORT_TAG_SIZE < 0)
83  #error ETH_PORT_TAG_SIZE parameter is not valid
84 #endif
85 
86 //Hardware time stamping support
87 #ifndef ETH_TIMESTAMP_SUPPORT
88  #define ETH_TIMESTAMP_SUPPORT DISABLED
89 #elif (ETH_TIMESTAMP_SUPPORT != ENABLED && ETH_TIMESTAMP_SUPPORT != DISABLED)
90  #error ETH_TIMESTAMP_SUPPORT parameter is not valid
91 #endif
92 
93 //Size of the MAC address filter
94 #ifndef MAC_ADDR_FILTER_SIZE
95  #define MAC_ADDR_FILTER_SIZE 12
96 #elif (MAC_ADDR_FILTER_SIZE < 1)
97  #error MAC_ADDR_FILTER_SIZE parameter is not valid
98 #endif
99 
100 //CRC32 calculation using a pre-calculated lookup table
101 #ifndef ETH_FAST_CRC_SUPPORT
102  #define ETH_FAST_CRC_SUPPORT DISABLED
103 #elif (ETH_FAST_CRC_SUPPORT != ENABLED && ETH_FAST_CRC_SUPPORT != DISABLED)
104  #error ETH_FAST_CRC_SUPPORT parameter is not valid
105 #endif
106 
107 //Minimum Ethernet frame size
108 #define ETH_MIN_FRAME_SIZE 64
109 //Maximum Ethernet frame size
110 #define ETH_MAX_FRAME_SIZE 1518
111 //Ethernet header size
112 #define ETH_HEADER_SIZE 14
113 //Ethernet CRC field size
114 #define ETH_CRC_SIZE 4
115 //Ethernet maximum transmission unit
116 #define ETH_MTU 1500
117 
118 //VLAN tag control information
119 #define VLAN_PCP_POS 13
120 #define VLAN_DEI_POS 12
121 #define VLAN_VID_POS 0
122 #define VLAN_PCP_MASK 0xE000
123 #define VLAN_DEI_MASK 0x1000
124 #define VLAN_VID_MASK 0x0FFF
125 
126 //Copy MAC address
127 #define macCopyAddr(destMacAddr, srcMacAddr) osMemcpy(destMacAddr, srcMacAddr, sizeof(MacAddr))
128 
129 //Compare MAC addresses
130 #define macCompAddr(macAddr1, macAddr2) (!osMemcmp(macAddr1, macAddr2, sizeof(MacAddr)))
131 
132 //Determine whether a MAC address is a group address
133 #define macIsMulticastAddr(macAddr) (((macAddr)->b[0] & 0x01) != 0)
134 
135 //Copy EUI-64 address
136 #define eui64CopyAddr(destEui64Addr, srcEui64Addr) osMemcpy(destEui64Addr, srcEui64Addr, sizeof(Eui64))
137 
138 //Compare EUI-64 addresses
139 #define eui64CompAddr(eui64Addr1, eui64Addr2) (!osMemcmp(eui64Addr1, eui64Addr2, sizeof(Eui64)))
140 
141 //C++ guard
142 #ifdef __cplusplus
143 extern "C" {
144 #endif
145 
146 
147 /**
148  * @brief MAC address flags
149  **/
150 
151 typedef enum
152 {
154  MAC_ADDR_FLAG_LOCAL = 0x02
156 
157 
158 /**
159  * @brief Ethernet Type field
160  **/
161 
162 typedef enum
163 {
164  ETH_TYPE_IPV4 = 0x0800,
165  ETH_TYPE_ARP = 0x0806,
166  ETH_TYPE_RARP = 0x8035,
167  ETH_TYPE_VLAN = 0x8100,
168  ETH_TYPE_IPV6 = 0x86DD,
169  ETH_TYPE_EAPOL = 0x888E,
170  ETH_TYPE_VMAN = 0x88A8,
171  ETH_TYPE_LLDP = 0x88CC,
172  ETH_TYPE_PTP = 0x88F7
174 
175 
176 //CC-RX, CodeWarrior or Win32 compiler?
177 #if defined(__CCRX__)
178  #pragma pack
179 #elif defined(__CWCC__) || defined(_WIN32)
180  #pragma pack(push, 1)
181 #endif
182 
183 
184 /**
185  * @brief MAC address
186  **/
187 
189 {
190  __packed_union
191  {
192  uint8_t b[6];
193  uint16_t w[3];
194  };
196 
197 
198 /**
199  * @brief EUI-64 identifier
200  **/
201 
202 typedef __packed_struct
203 {
204  __packed_union
205  {
206  uint8_t b[8];
207  uint16_t w[4];
208  uint32_t dw[2];
209  };
211 
212 
213 /**
214  * @brief Ethernet frame header
215  **/
216 
217 typedef __packed_struct
218 {
219  MacAddr destAddr; //0-5
220  MacAddr srcAddr; //6-11
221  uint16_t type; //12-13
222  uint8_t data[]; //14
224 
225 
226 /**
227  * @brief LLC header
228  **/
229 
230 typedef __packed_struct
231 {
232  uint8_t dsap; //0
233  uint8_t ssap; //1
234  uint8_t control; //2
236 
237 
238 /**
239  * @brief VLAN tag
240  **/
241 
242 typedef __packed_struct
243 {
244  uint16_t tci; //0-1
245  uint16_t type; //2-3
247 
248 
249 //CC-RX, CodeWarrior or Win32 compiler?
250 #if defined(__CCRX__)
251  #pragma unpack
252 #elif defined(__CWCC__) || defined(_WIN32)
253  #pragma pack(pop)
254 #endif
255 
256 
257 /**
258  * @brief MAC filter table entry
259  **/
260 
261 typedef struct
262 {
263  MacAddr addr; ///<MAC address
264  uint_t refCount; ///<Reference count for the current entry
268 
269 
270 /**
271  * @brief LLC frame received callback
272  **/
273 
274 typedef void (*LlcRxCallback)(NetInterface *interface, EthHeader *header,
275  const uint8_t *data, size_t length, NetRxAncillary *ancillary, void *param);
276 
277 
278 //Ethernet related constants
279 extern const MacAddr MAC_UNSPECIFIED_ADDR;
280 extern const MacAddr MAC_BROADCAST_ADDR;
281 extern const Eui64 EUI64_UNSPECIFIED_ADDR;
282 
283 //Ethernet related functions
284 error_t ethInit(NetInterface *interface);
285 
286 void ethProcessFrame(NetInterface *interface, uint8_t *frame, size_t length,
287  NetRxAncillary *ancillary);
288 
290  uint16_t type, NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary);
291 
292 error_t ethAcceptMacAddr(NetInterface *interface, const MacAddr *macAddr);
293 error_t ethDropMacAddr(NetInterface *interface, const MacAddr *macAddr);
294 
296  void *param);
297 
299 
300 NetBuffer *ethAllocBuffer(size_t length, size_t *offset);
301 
302 error_t macStringToAddr(const char_t *str, MacAddr *macAddr);
303 char_t *macAddrToString(const MacAddr *macAddr, char_t *str);
304 void macAddrToEui64(const MacAddr *macAddr, Eui64 *interfaceId);
305 
306 void ethDumpHeader(const EthHeader *ethHeader);
307 
308 error_t eui64StringToAddr(const char_t *str, Eui64 *eui64);
309 char_t *eui64AddrToString(const Eui64 *eui64, char_t *str);
310 
311 //C++ guard
312 #ifdef __cplusplus
313 }
314 #endif
315 
316 #endif
@ ETH_TYPE_RARP
Definition: ethernet.h:166
int bool_t
Definition: compiler_port.h:53
uint8_t b
Definition: nbns_common.h:104
Ipv4Addr destAddr
Definition: ipv4.h:329
Eui64
Definition: ethernet.h:210
uint16_t type
Definition: ethernet.h:221
error_t ethInit(NetInterface *interface)
Ethernet related initialization.
Definition: ethernet.c:64
uint8_t control
Definition: ethernet.h:234
error_t ethSendFrame(NetInterface *interface, const MacAddr *destAddr, uint16_t type, NetBuffer *buffer, size_t offset, NetTxAncillary *ancillary)
Send an Ethernet frame.
Definition: ethernet.c:399
Structure describing a buffer that spans multiple chunks.
Definition: net_mem.h:89
@ ETH_TYPE_PTP
Definition: ethernet.h:172
void macAddrToEui64(const MacAddr *macAddr, Eui64 *interfaceId)
Map a MAC address to the IPv6 modified EUI-64 identifier.
Definition: ethernet.c:946
uint8_t data[]
Definition: ethernet.h:222
@ MAC_ADDR_FLAG_LOCAL
Definition: ethernet.h:154
bool_t addFlag
Definition: ethernet.h:265
@ MAC_ADDR_FLAG_MULTICAST
Definition: ethernet.h:153
uint_t refCount
Reference count for the current entry.
Definition: ethernet.h:264
@ ETH_TYPE_IPV4
Definition: ethernet.h:164
error_t ethAttachLlcRxCalback(NetInterface *interface, LlcRxCallback callback, void *param)
Register LLC frame received callback.
Definition: ethernet.c:721
EthHeader
Definition: ethernet.h:223
VlanTag
Definition: ethernet.h:246
@ ETH_TYPE_LLDP
Definition: ethernet.h:171
void(* LlcRxCallback)(NetInterface *interface, EthHeader *header, const uint8_t *data, size_t length, NetRxAncillary *ancillary, void *param)
LLC frame received callback.
Definition: ethernet.h:274
error_t
Error codes.
Definition: error.h:43
const Eui64 EUI64_UNSPECIFIED_ADDR
Definition: ethernet.c:985
error_t ethDropMacAddr(NetInterface *interface, const MacAddr *macAddr)
Remove a unicast/multicast address from the MAC filter table.
Definition: ethernet.c:666
const MacAddr MAC_UNSPECIFIED_ADDR
Definition: ethernet.c:53
#define NetRxAncillary
Definition: net_misc.h:40
#define NetInterface
Definition: net.h:36
MacAddr addr
MAC address.
Definition: ethernet.h:263
char_t * macAddrToString(const MacAddr *macAddr, char_t *str)
Convert a MAC address to a dash delimited string.
Definition: ethernet.c:919
@ ETH_TYPE_ARP
Definition: ethernet.h:165
char_t * eui64AddrToString(const Eui64 *eui64, char_t *str)
Convert an EUI-64 address to a dash delimited string.
Definition: ethernet.c:1095
#define NetTxAncillary
Definition: net_misc.h:36
Eui64 interfaceId
Definition: ipv6cp.h:71
@ ETH_TYPE_EAPOL
Definition: ethernet.h:169
uint8_t length
Definition: tcp.h:368
error_t macStringToAddr(const char_t *str, MacAddr *macAddr)
Convert a string representation of a MAC address to a binary MAC address.
Definition: ethernet.c:821
MacAddr
Definition: ethernet.h:195
LlcHeader
Definition: ethernet.h:235
EthType
Ethernet Type field.
Definition: ethernet.h:163
@ ETH_TYPE_VLAN
Definition: ethernet.h:167
char char_t
Definition: compiler_port.h:48
MacAddrFlags
MAC address flags.
Definition: ethernet.h:152
MAC filter table entry.
Definition: ethernet.h:262
@ ETH_TYPE_IPV6
Definition: ethernet.h:168
error_t ethDetachLlcRxCalback(NetInterface *interface)
Unregister LLC frame received callback.
Definition: ethernet.c:749
@ ETH_TYPE_VMAN
Definition: ethernet.h:170
MacAddr srcAddr
Definition: ethernet.h:220
NetBuffer * ethAllocBuffer(size_t length, size_t *offset)
Allocate a buffer to hold an Ethernet frame.
Definition: ethernet.c:777
const MacAddr MAC_BROADCAST_ADDR
Definition: ethernet.c:55
typedef __packed_struct
MAC address.
Definition: ethernet.h:189
bool_t deleteFlag
Definition: ethernet.h:266
error_t ethAcceptMacAddr(NetInterface *interface, const MacAddr *macAddr)
Add a unicast/multicast address to the MAC filter table.
Definition: ethernet.c:594
void ethProcessFrame(NetInterface *interface, uint8_t *frame, size_t length, NetRxAncillary *ancillary)
Process an incoming Ethernet frame.
Definition: ethernet.c:84
uint8_t ssap
Definition: ethernet.h:233
unsigned int uint_t
Definition: compiler_port.h:50
TCP/IP stack core.
void ethDumpHeader(const EthHeader *ethHeader)
Dump Ethernet header for debugging purpose.
Definition: ethernet.c:973
error_t eui64StringToAddr(const char_t *str, Eui64 *eui64)
Convert a string representation of an EUI-64 address to a binary EUI-64 address.
Definition: ethernet.c:995