DPDK  21.02.0
rte_ether.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #ifndef _RTE_ETHER_H_
6 #define _RTE_ETHER_H_
7 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 #include <stdint.h>
19 #include <stdio.h>
20 
21 #include <rte_memcpy.h>
22 #include <rte_random.h>
23 #include <rte_mbuf.h>
24 #include <rte_byteorder.h>
25 
26 #ifdef RTE_EXEC_ENV_WINDOWS /* Workaround conflict with rte_ether_hdr. */
27 #undef s_addr /* Defined in winsock2.h included in windows.h. */
28 #endif
29 
30 #define RTE_ETHER_ADDR_LEN 6
31 #define RTE_ETHER_TYPE_LEN 2
32 #define RTE_ETHER_CRC_LEN 4
33 #define RTE_ETHER_HDR_LEN \
34  (RTE_ETHER_ADDR_LEN * 2 + \
35  RTE_ETHER_TYPE_LEN)
36 #define RTE_ETHER_MIN_LEN 64
37 #define RTE_ETHER_MAX_LEN 1518
38 #define RTE_ETHER_MTU \
39  (RTE_ETHER_MAX_LEN - RTE_ETHER_HDR_LEN - \
40  RTE_ETHER_CRC_LEN)
42 #define RTE_ETHER_MAX_VLAN_FRAME_LEN \
43  (RTE_ETHER_MAX_LEN + 4)
44 
46 #define RTE_ETHER_MAX_JUMBO_FRAME_LEN \
47  0x3F00
49 #define RTE_ETHER_MAX_VLAN_ID 4095
51 #define RTE_ETHER_MIN_MTU 68
64 struct rte_ether_addr {
66 } __rte_aligned(2);
67 
68 #define RTE_ETHER_LOCAL_ADMIN_ADDR 0x02
69 #define RTE_ETHER_GROUP_ADDR 0x01
85 static inline int rte_is_same_ether_addr(const struct rte_ether_addr *ea1,
86  const struct rte_ether_addr *ea2)
87 {
88  const uint16_t *w1 = (const uint16_t *)ea1;
89  const uint16_t *w2 = (const uint16_t *)ea2;
90 
91  return ((w1[0] ^ w2[0]) | (w1[1] ^ w2[1]) | (w1[2] ^ w2[2])) == 0;
92 }
93 
104 static inline int rte_is_zero_ether_addr(const struct rte_ether_addr *ea)
105 {
106  const uint16_t *w = (const uint16_t *)ea;
107 
108  return (w[0] | w[1] | w[2]) == 0;
109 }
110 
121 static inline int rte_is_unicast_ether_addr(const struct rte_ether_addr *ea)
122 {
123  return (ea->addr_bytes[0] & RTE_ETHER_GROUP_ADDR) == 0;
124 }
125 
136 static inline int rte_is_multicast_ether_addr(const struct rte_ether_addr *ea)
137 {
138  return ea->addr_bytes[0] & RTE_ETHER_GROUP_ADDR;
139 }
140 
151 static inline int rte_is_broadcast_ether_addr(const struct rte_ether_addr *ea)
152 {
153  const uint16_t *w = (const uint16_t *)ea;
154 
155  return (w[0] & w[1] & w[2]) == 0xFFFF;
156 }
157 
168 static inline int rte_is_universal_ether_addr(const struct rte_ether_addr *ea)
169 {
170  return (ea->addr_bytes[0] & RTE_ETHER_LOCAL_ADMIN_ADDR) == 0;
171 }
172 
183 static inline int rte_is_local_admin_ether_addr(const struct rte_ether_addr *ea)
184 {
185  return (ea->addr_bytes[0] & RTE_ETHER_LOCAL_ADMIN_ADDR) != 0;
186 }
187 
199 static inline int rte_is_valid_assigned_ether_addr(const struct rte_ether_addr *ea)
200 {
202 }
203 
210 void
211 rte_eth_random_addr(uint8_t *addr);
212 
221 static inline void
222 rte_ether_addr_copy(const struct rte_ether_addr *__restrict ea_from,
223  struct rte_ether_addr *__restrict ea_to)
224 {
225  *ea_to = *ea_from;
226 }
227 
228 #define RTE_ETHER_ADDR_FMT_SIZE 18
229 
239 void
240 rte_ether_format_addr(char *buf, uint16_t size,
241  const struct rte_ether_addr *eth_addr);
256 __rte_experimental
257 int
258 rte_ether_unformat_addr(const char *str, struct rte_ether_addr *eth_addr);
267  uint16_t ether_type;
268 } __rte_aligned(2);
269 
275 struct rte_vlan_hdr {
276  uint16_t vlan_tci;
277  uint16_t eth_proto;
278 } __rte_packed;
279 
280 
281 
282 /* Ethernet frame types */
283 #define RTE_ETHER_TYPE_IPV4 0x0800
284 #define RTE_ETHER_TYPE_IPV6 0x86DD
285 #define RTE_ETHER_TYPE_ARP 0x0806
286 #define RTE_ETHER_TYPE_RARP 0x8035
287 #define RTE_ETHER_TYPE_VLAN 0x8100
288 #define RTE_ETHER_TYPE_QINQ 0x88A8
289 #define RTE_ETHER_TYPE_QINQ1 0x9100
290 #define RTE_ETHER_TYPE_QINQ2 0x9200
291 #define RTE_ETHER_TYPE_QINQ3 0x9300
292 #define RTE_ETHER_TYPE_PPPOE_DISCOVERY 0x8863
293 #define RTE_ETHER_TYPE_PPPOE_SESSION 0x8864
294 #define RTE_ETHER_TYPE_ETAG 0x893F
295 #define RTE_ETHER_TYPE_1588 0x88F7
296 
297 #define RTE_ETHER_TYPE_SLOW 0x8809
298 #define RTE_ETHER_TYPE_TEB 0x6558
299 #define RTE_ETHER_TYPE_LLDP 0x88CC
300 #define RTE_ETHER_TYPE_MPLS 0x8847
301 #define RTE_ETHER_TYPE_MPLSM 0x8848
302 #define RTE_ETHER_TYPE_ECPRI 0xAEFE
315 static inline int rte_vlan_strip(struct rte_mbuf *m)
316 {
317  struct rte_ether_hdr *eh
318  = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
319  struct rte_vlan_hdr *vh;
320 
322  return -1;
323 
324  vh = (struct rte_vlan_hdr *)(eh + 1);
325  m->ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
326  m->vlan_tci = rte_be_to_cpu_16(vh->vlan_tci);
327 
328  /* Copy ether header over rather than moving whole packet */
329  memmove(rte_pktmbuf_adj(m, sizeof(struct rte_vlan_hdr)),
330  eh, 2 * RTE_ETHER_ADDR_LEN);
331 
332  return 0;
333 }
334 
347 static inline int rte_vlan_insert(struct rte_mbuf **m)
348 {
349  struct rte_ether_hdr *oh, *nh;
350  struct rte_vlan_hdr *vh;
351 
352  /* Can't insert header if mbuf is shared */
353  if (!RTE_MBUF_DIRECT(*m) || rte_mbuf_refcnt_read(*m) > 1)
354  return -EINVAL;
355 
356  /* Can't insert header if the first segment is too short */
358  return -EINVAL;
359 
360  oh = rte_pktmbuf_mtod(*m, struct rte_ether_hdr *);
361  nh = (struct rte_ether_hdr *)
362  rte_pktmbuf_prepend(*m, sizeof(struct rte_vlan_hdr));
363  if (nh == NULL)
364  return -ENOSPC;
365 
366  memmove(nh, oh, 2 * RTE_ETHER_ADDR_LEN);
368 
369  vh = (struct rte_vlan_hdr *) (nh + 1);
370  vh->vlan_tci = rte_cpu_to_be_16((*m)->vlan_tci);
371 
372  (*m)->ol_flags &= ~(PKT_RX_VLAN_STRIPPED | PKT_TX_VLAN);
373 
374  if ((*m)->ol_flags & PKT_TX_TUNNEL_MASK)
375  (*m)->outer_l2_len += sizeof(struct rte_vlan_hdr);
376  else
377  (*m)->l2_len += sizeof(struct rte_vlan_hdr);
378 
379  return 0;
380 }
381 
382 #ifdef __cplusplus
383 }
384 #endif
385 
386 #endif /* _RTE_ETHER_H_ */
#define __rte_packed
Definition: rte_common.h:84
#define RTE_ETHER_LOCAL_ADMIN_ADDR
Definition: rte_ether.h:68
#define PKT_RX_VLAN
Definition: rte_mbuf_core.h:50
static int rte_is_broadcast_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:151
#define RTE_ETHER_TYPE_VLAN
Definition: rte_ether.h:287
#define RTE_ETHER_ADDR_LEN
Definition: rte_ether.h:30
void rte_eth_random_addr(uint8_t *addr)
static void rte_ether_addr_copy(const struct rte_ether_addr *__restrict ea_from, struct rte_ether_addr *__restrict ea_to)
Definition: rte_ether.h:222
static int rte_is_zero_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:104
static int rte_is_multicast_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:136
uint16_t vlan_tci
Definition: rte_ether.h:276
static rte_be16_t rte_cpu_to_be_16(uint16_t x)
__rte_experimental int rte_ether_unformat_addr(const char *str, struct rte_ether_addr *eth_addr)
struct rte_ether_addr d_addr
Definition: rte_ether.h:265
static uint16_t rte_mbuf_refcnt_read(const struct rte_mbuf *m)
Definition: rte_mbuf.h:428
#define rte_pktmbuf_mtod(m, t)
#define RTE_ETHER_GROUP_ADDR
Definition: rte_ether.h:69
static char * rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len)
Definition: rte_mbuf.h:1636
#define RTE_MBUF_DIRECT(mb)
void rte_ether_format_addr(char *buf, uint16_t size, const struct rte_ether_addr *eth_addr)
uint16_t ether_type
Definition: rte_ether.h:267
static int rte_vlan_insert(struct rte_mbuf **m)
Definition: rte_ether.h:347
struct rte_ether_addr s_addr
Definition: rte_ether.h:266
static int rte_is_local_admin_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:183
#define rte_pktmbuf_data_len(m)
Definition: rte_mbuf.h:1555
#define PKT_RX_VLAN_STRIPPED
Definition: rte_mbuf_core.h:85
uint16_t eth_proto
Definition: rte_ether.h:277
static int rte_is_universal_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:168
uint8_t addr_bytes[RTE_ETHER_ADDR_LEN]
Definition: rte_ether.h:34
static char * rte_pktmbuf_prepend(struct rte_mbuf *m, uint16_t len)
Definition: rte_mbuf.h:1572
__extension__ struct rte_eth_link __rte_aligned(8)
static int rte_is_valid_assigned_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:199
static uint16_t rte_be_to_cpu_16(rte_be16_t x)
uint8_t addr_bytes[RTE_ETHER_ADDR_LEN]
Definition: rte_ether.h:65
static int rte_is_unicast_ether_addr(const struct rte_ether_addr *ea)
Definition: rte_ether.h:121
#define PKT_TX_VLAN