1/**
2 * @file
3 * Ethernet protocol definitions
4 */
5
6/*
7 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without modification,
11 * are permitted provided that the following conditions are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright notice,
14 *    this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 *    this list of conditions and the following disclaimer in the documentation
17 *    and/or other materials provided with the distribution.
18 * 3. The name of the author may not be used to endorse or promote products
19 *    derived from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
24 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
30 * OF SUCH DAMAGE.
31 *
32 * This file is part of the lwIP TCP/IP stack.
33 *
34 * Author: Adam Dunkels <adam@sics.se>
35 *
36 */
37#ifndef LWIP_HDR_PROT_ETHERNET_H
38#define LWIP_HDR_PROT_ETHERNET_H
39
40#include "lwip/arch.h"
41
42#ifdef __cplusplus
43extern "C" {
44#endif
45
46#ifndef ETH_HWADDR_LEN
47#ifdef ETHARP_HWADDR_LEN
48#define ETH_HWADDR_LEN    ETHARP_HWADDR_LEN /* compatibility mode */
49#else
50#define ETH_HWADDR_LEN    6
51#endif
52#endif
53
54#ifdef PACK_STRUCT_USE_INCLUDES
55#  include "arch/bpstruct.h"
56#endif
57PACK_STRUCT_BEGIN
58struct eth_addr {
59  PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]);
60} PACK_STRUCT_STRUCT;
61PACK_STRUCT_END
62#ifdef PACK_STRUCT_USE_INCLUDES
63#  include "arch/epstruct.h"
64#endif
65
66#ifdef PACK_STRUCT_USE_INCLUDES
67#  include "arch/bpstruct.h"
68#endif
69PACK_STRUCT_BEGIN
70/** Ethernet header */
71struct eth_hdr {
72#if ETH_PAD_SIZE
73  PACK_STRUCT_FLD_8(u8_t padding[ETH_PAD_SIZE]);
74#endif
75  PACK_STRUCT_FLD_S(struct eth_addr dest);
76  PACK_STRUCT_FLD_S(struct eth_addr src);
77  PACK_STRUCT_FIELD(u16_t type);
78} PACK_STRUCT_STRUCT;
79PACK_STRUCT_END
80#ifdef PACK_STRUCT_USE_INCLUDES
81#  include "arch/epstruct.h"
82#endif
83
84#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)
85
86#ifdef PACK_STRUCT_USE_INCLUDES
87#  include "arch/bpstruct.h"
88#endif
89PACK_STRUCT_BEGIN
90/** VLAN header inserted between ethernet header and payload
91 * if 'type' in ethernet header is ETHTYPE_VLAN.
92 * See IEEE802.Q */
93struct eth_vlan_hdr {
94  PACK_STRUCT_FIELD(u16_t prio_vid);
95  PACK_STRUCT_FIELD(u16_t tpid);
96} PACK_STRUCT_STRUCT;
97PACK_STRUCT_END
98#ifdef PACK_STRUCT_USE_INCLUDES
99#  include "arch/epstruct.h"
100#endif
101
102#define SIZEOF_VLAN_HDR 4
103#define VLAN_ID(vlan_hdr) (lwip_htons((vlan_hdr)->prio_vid) & 0xFFF)
104
105/**
106 * @ingroup ethernet
107 * A list of often ethtypes (although lwIP does not use all of them): */
108enum eth_type {
109  /** Internet protocol v4 */
110  ETHTYPE_IP        = 0x0800U,
111  /** Address resolution protocol */
112  ETHTYPE_ARP       = 0x0806U,
113  /** Wake on lan */
114  ETHTYPE_WOL       = 0x0842U,
115  /** RARP */
116  ETHTYPE_RARP      = 0x8035U,
117  /** Virtual local area network */
118  ETHTYPE_VLAN      = 0x8100U,
119  /** Internet protocol v6 */
120  ETHTYPE_IPV6      = 0x86DDU,
121  /** PPP Over Ethernet Discovery Stage */
122  ETHTYPE_PPPOEDISC = 0x8863U,
123  /** PPP Over Ethernet Session Stage */
124  ETHTYPE_PPPOE     = 0x8864U,
125  /** Jumbo Frames */
126  ETHTYPE_JUMBO     = 0x8870U,
127  /** Process field network */
128  ETHTYPE_PROFINET  = 0x8892U,
129  /** Ethernet for control automation technology */
130  ETHTYPE_ETHERCAT  = 0x88A4U,
131  /** Link layer discovery protocol */
132  ETHTYPE_LLDP      = 0x88CCU,
133  /** Serial real-time communication system */
134  ETHTYPE_SERCOS    = 0x88CDU,
135  /** Media redundancy protocol */
136  ETHTYPE_MRP       = 0x88E3U,
137  /** Precision time protocol */
138  ETHTYPE_PTP       = 0x88F7U,
139  /** Q-in-Q, 802.1ad */
140  ETHTYPE_QINQ      = 0x9100U
141};
142
143/** The 24-bit IANA IPv4-multicast OUI is 01-00-5e: */
144#define LL_IP4_MULTICAST_ADDR_0 0x01
145#define LL_IP4_MULTICAST_ADDR_1 0x00
146#define LL_IP4_MULTICAST_ADDR_2 0x5e
147
148/** IPv6 multicast uses this prefix */
149#define LL_IP6_MULTICAST_ADDR_0 0x33
150#define LL_IP6_MULTICAST_ADDR_1 0x33
151
152/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables
153 * or known to be 32-bit aligned within the protocol header. */
154#ifndef ETHADDR32_COPY
155#define ETHADDR32_COPY(dst, src)  SMEMCPY(dst, src, ETH_HWADDR_LEN)
156#endif
157
158/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local
159 * variables and known to be 16-bit aligned within the protocol header. */
160#ifndef ETHADDR16_COPY
161#define ETHADDR16_COPY(dst, src)  SMEMCPY(dst, src, ETH_HWADDR_LEN)
162#endif
163
164#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0)
165
166#ifdef __cplusplus
167}
168#endif
169
170#endif /* LWIP_HDR_PROT_ETHERNET_H */
171