remove version in all files
[dpdk.git] / lib / librte_ether / rte_ether.h
1 /*-
2  *   BSD LICENSE
3  * 
4  *   Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  * 
7  *   Redistribution and use in source and binary forms, with or without 
8  *   modification, are permitted provided that the following conditions 
9  *   are met:
10  * 
11  *     * Redistributions of source code must retain the above copyright 
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright 
14  *       notice, this list of conditions and the following disclaimer in 
15  *       the documentation and/or other materials provided with the 
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its 
18  *       contributors may be used to endorse or promote products derived 
19  *       from this software without specific prior written permission.
20  * 
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  * 
33  */
34
35 #ifndef _RTE_ETHER_H_
36 #define _RTE_ETHER_H_
37
38 /**
39  * @file
40  *
41  * Ethernet Helpers in RTE
42  */
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 #include <stdint.h>
49
50 #define ETHER_ADDR_LEN  6 /**< Length of Ethernet address. */
51 #define ETHER_TYPE_LEN  2 /**< Length of Ethernet type field. */
52 #define ETHER_CRC_LEN   4 /**< Length of Ethernet CRC. */
53 #define ETHER_HDR_LEN   \
54         (ETHER_ADDR_LEN * 2 + ETHER_TYPE_LEN) /**< Length of Ethernet header. */
55 #define ETHER_MIN_LEN   64    /**< Minimum frame len, including CRC. */
56 #define ETHER_MAX_LEN   1518  /**< Maximum frame len, including CRC. */
57 #define ETHER_MTU       \
58         (ETHER_MAX_LEN - ETHER_HDR_LEN - ETHER_CRC_LEN) /**< Ethernet MTU. */
59
60 #define ETHER_MAX_VLAN_FRAME_LEN \
61         (ETHER_MAX_LEN + 4) /**< Maximum VLAN frame length, including CRC. */
62
63 #define ETHER_MAX_JUMBO_FRAME_LEN \
64         0x3F00 /**< Maximum Jumbo frame length, including CRC. */
65
66 /**
67  * Ethernet address:
68  * A universally administered address is uniquely assigned to a device by its
69  * manufacturer. The first three octets (in transmission order) contain the
70  * Organizationally Unique Identifier (OUI). The following three (MAC-48 and
71  * EUI-48) octets are assigned by that organization with the only constraint
72  * of uniqueness.
73  * A locally administered address is assigned to a device by a network
74  * administrator and does not contain OUIs.
75  * See http://standards.ieee.org/regauth/groupmac/tutorial.html
76  */
77 struct ether_addr {
78         uint8_t addr_bytes[ETHER_ADDR_LEN]; /**< Address bytes in transmission order */
79 } __attribute__((__packed__));
80
81 #define ETHER_LOCAL_ADMIN_ADDR 0x02 /**< Locally assigned Eth. address. */
82 #define ETHER_GROUP_ADDR       0x01 /**< Multicast or broadcast Eth. address. */
83
84 /**
85  * Check if an Ethernet address is filled with zeros.
86  *
87  * @param ea
88  *   A pointer to a ether_addr structure containing the ethernet address
89  *   to check.
90  * @return
91  *   True  (1) if the given ethernet address is filled with zeros;
92  *   false (0) otherwise.
93  */
94 static inline int is_zero_ether_addr(const struct ether_addr *ea)
95 {
96         int i;
97         for (i = 0; i < ETHER_ADDR_LEN; i++)
98                 if (ea->addr_bytes[i] != 0x00)
99                         return 0;
100         return 1;
101 }
102
103 /**
104  * Check if an Ethernet address is a unicast address.
105  *
106  * @param ea
107  *   A pointer to a ether_addr structure containing the ethernet address
108  *   to check.
109  * @return
110  *   True  (1) if the given ethernet address is a unicast address;
111  *   false (0) otherwise.
112  */
113 static inline int is_unicast_ether_addr(const struct ether_addr *ea)
114 {
115         return ((ea->addr_bytes[0] & ETHER_GROUP_ADDR) == 0);
116 }
117
118 /**
119  * Check if an Ethernet address is a multicast address.
120  *
121  * @param ea
122  *   A pointer to a ether_addr structure containing the ethernet address
123  *   to check.
124  * @return
125  *   True  (1) if the given ethernet address is a multicast address;
126  *   false (0) otherwise.
127  */
128 static inline int is_multicast_ether_addr(const struct ether_addr *ea)
129 {
130         return (ea->addr_bytes[0] & ETHER_GROUP_ADDR);
131 }
132
133 /**
134  * Check if an Ethernet address is a broadcast address.
135  *
136  * @param ea
137  *   A pointer to a ether_addr structure containing the ethernet address
138  *   to check.
139  * @return
140  *   True  (1) if the given ethernet address is a broadcast address;
141  *   false (0) otherwise.
142  */
143 static inline int is_broadcast_ether_addr(const struct ether_addr *ea)
144 {
145         const uint16_t *ea_words = (const uint16_t *)ea;
146
147         return (ea_words[0] == 0xFFFF && ea_words[1] == 0xFFFF &&
148                 ea_words[2] == 0xFFFF);
149 }
150
151 /**
152  * Check if an Ethernet address is a universally assigned address.
153  *
154  * @param ea
155  *   A pointer to a ether_addr structure containing the ethernet address
156  *   to check.
157  * @return
158  *   True  (1) if the given ethernet address is a universally assigned address;
159  *   false (0) otherwise.
160  */
161 static inline int is_universal_ether_addr(const struct ether_addr *ea)
162 {
163         return ((ea->addr_bytes[0] & ETHER_LOCAL_ADMIN_ADDR) == 0);
164 }
165
166 /**
167  * Check if an Ethernet address is a locally assigned address.
168  *
169  * @param ea
170  *   A pointer to a ether_addr structure containing the ethernet address
171  *   to check.
172  * @return
173  *   True  (1) if the given ethernet address is a locally assigned address;
174  *   false (0) otherwise.
175  */
176 static inline int is_local_admin_ether_addr(const struct ether_addr *ea)
177 {
178         return ((ea->addr_bytes[0] & ETHER_LOCAL_ADMIN_ADDR) == 1);
179 }
180
181 /**
182  * Check if an Ethernet address is a valid address. Checks that the address is a
183  * unicast address and is not filled with zeros.
184  *
185  * @param ea
186  *   A pointer to a ether_addr structure containing the ethernet address
187  *   to check.
188  * @return
189  *   True  (1) if the given ethernet address is valid;
190  *   false (0) otherwise.
191  */
192 static inline int is_valid_assigned_ether_addr(const struct ether_addr *ea)
193 {
194         return (is_unicast_ether_addr(ea) && (! is_zero_ether_addr(ea)));
195 }
196
197 /**
198  * Fast copy an Ethernet address.
199  *
200  * @param ea_from
201  *   A pointer to a ether_addr structure holding the Ethernet address to copy.
202  * @param ea_to
203  *   A pointer to a ether_addr structure where to copy the Ethernet address.
204  */
205 static inline void ether_addr_copy(const struct ether_addr *ea_from,
206                                    struct ether_addr *ea_to)
207 {
208 #ifdef __INTEL_COMPILER
209         uint16_t *from_words = (uint16_t *)(ea_from->addr_bytes);
210         uint16_t *to_words   = (uint16_t *)(ea_to->addr_bytes);
211
212         to_words[0] = from_words[0];
213         to_words[1] = from_words[1];
214         to_words[2] = from_words[2];
215 #else
216         /*
217          * Use the common way, because of a strange gcc warning.
218          */
219         *ea_to = *ea_from;
220 #endif
221 }
222
223 /**
224  * Ethernet header: Contains the destination address, source address
225  * and frame type.
226  */
227 struct ether_hdr {
228         struct ether_addr d_addr; /**< Destination address. */
229         struct ether_addr s_addr; /**< Source address. */
230         uint16_t ether_type;      /**< Frame type. */
231 } __attribute__((__packed__));
232
233 /**
234  * Ethernet VLAN Header.
235  * Contains the 16-bit VLAN Tag Control Identifier and the Ethernet type
236  * of the encapsulated frame.
237  */
238 struct vlan_hdr {
239         uint16_t vlan_tci; /**< Priority (3) + CFI (1) + Identifier Code (12) */
240         uint16_t eth_proto;/**< Ethernet type of encapsulated frame. */
241 } __attribute__((__packed__));
242
243 /* Ethernet frame types */
244 #define ETHER_TYPE_IPv4 0x0800 /**< IPv4 Protocol. */
245 #define ETHER_TYPE_IPv6 0x86DD /**< IPv6 Protocol. */
246 #define ETHER_TYPE_ARP  0x0806 /**< Arp Protocol. */
247 #define ETHER_TYPE_RARP 0x8035 /**< Reverse Arp Protocol. */
248 #define ETHER_TYPE_VLAN 0x8100 /**< IEEE 802.1Q VLAN tagging. */
249 #define ETHER_TYPE_1588 0x88F7 /**< IEEE 802.1AS 1588 Precise Time Protocol. */
250
251 #ifdef __cplusplus
252 }
253 #endif
254
255 #endif /* _RTE_ETHER_H_ */