12 #include <net/ethernet.h>
13 #include <linux/if_ether.h>
29 #define CNE_ETHER_MAX_VLAN_FRAME_LEN (ETHER_MAX_LEN + 4)
32 #define CNE_ETHER_MAX_JUMBO_FRAME_LEN 0x3F00
34 #define CNE_ETHER_MAX_VLAN_ID 4095
36 #define CNE_ETHER_MIN_MTU 68
57 #define ETHER_LOCAL_ADMIN_ADDR 0x02
58 #define ETHER_GROUP_ADDR 0x01
81 #define CNE_ETHER_TYPE_IPV4 0x0800
82 #define CNE_ETHER_TYPE_IPV6 0x86DD
83 #define CNE_ETHER_TYPE_ARP 0x0806
84 #define CNE_ETHER_TYPE_RARP 0x8035
85 #define CNE_ETHER_TYPE_VLAN 0x8100
86 #define CNE_ETHER_TYPE_QINQ 0x88A8
87 #define CNE_ETHER_TYPE_PPPOE_DISCOVERY 0x8863
88 #define CNE_ETHER_TYPE_PPPOE_SESSION 0x8864
89 #define CNE_ETHER_TYPE_ETAG 0x893F
90 #define CNE_ETHER_TYPE_1588 0x88F7
92 #define CNE_ETHER_TYPE_SLOW 0x8809
93 #define CNE_ETHER_TYPE_TEB 0x6558
94 #define CNE_ETHER_TYPE_LLDP 0x88CC
95 #define CNE_ETHER_TYPE_MPLS 0x8847
96 #define CNE_ETHER_TYPE_MPLSM 0x8848
99 #define __ETHER_TYPE_IPV4 0x0008
100 #define __ETHER_TYPE_IPV6 0xDD86
101 #define __ETHER_TYPE_ARP 0x0608
102 #define __ETHER_TYPE_RARP 0x3580
103 #define __ETHER_TYPE_VLAN 0x0081
104 #define __ETHER_TYPE_QINQ 0xA888
105 #define __ETHER_TYPE_PPPOE_DISCOVERY 0x6388
106 #define __ETHER_TYPE_PPPOE_SESSION 0x6488
107 #define __ETHER_TYPE_ETAG 0x3F89
108 #define __ETHER_TYPE_1588 0xF788
110 #define __ETHER_TYPE_SLOW 0x0988
111 #define __ETHER_TYPE_TEB 0x5865
112 #define __ETHER_TYPE_LLDP 0xCC88
113 #define __ETHER_TYPE_MPLS 0x4788
114 #define __ETHER_TYPE_MPLSM 0x4888
133 const uint16_t *w1 = (
const uint16_t *)ea1;
134 const uint16_t *w2 = (
const uint16_t *)ea2;
136 return ((w1[0] ^ w2[0]) | (w1[1] ^ w2[1]) | (w1[2] ^ w2[2])) == 0;
152 const uint16_t *w = (
const uint16_t *)ea;
154 return (w[0] | w[1] | w[2]) == 0;
202 const uint16_t *ea_words = (
const uint16_t *)ea;
204 return (ea_words[0] == 0xFFFF && ea_words[1] == 0xFFFF && ea_words[2] == 0xFFFF);
265 uint64_t rnd = rand();
266 uint8_t *p = (uint8_t *)&rnd;
268 memcpy(addr, p, ETH_ALEN);
284 #ifdef __INTEL_COMPILER
288 to_words[0] = from_words[0];
289 to_words[1] = from_words[1];
290 to_words[2] = from_words[2];
301 ether_swap(uint16_t *t, uint16_t *f)
314 uint16_t *d = (uint16_t *)t;
315 uint16_t *s = (uint16_t *)f;
317 ether_swap(d++, s++);
318 ether_swap(d++, s++);
322 #define CNE_ETHER_ADDR_FMT_SIZE 18
337 snprintf(buf, size,
"%02X:%02X:%02X:%02X:%02X:%02X", eth_addr->
ether_addr_octet[0],
345 __get_xdigit(
char ch)
347 if (ch >=
'0' && ch <=
'9')
349 if (ch >=
'a' && ch <=
'f')
350 return ch -
'a' + 10;
351 if (ch >=
'A' && ch <=
'F')
352 return ch -
'A' + 10;
358 __get_ether_addr6(
const char *s0,
struct ether_addr *ea)
363 for (i = 0; i < ETH_ALEN; i++) {
366 x = __get_xdigit(*s++);
371 x = __get_xdigit(*s++);
376 if (i < ETH_ALEN - 1 && *s++ !=
':')
386 __get_ether_addr3(
const char *s,
struct ether_addr *ea)
390 for (i = 0; i < ETH_ALEN; i += 2) {
393 for (j = 0; j < 4; j++) {
396 x = __get_xdigit(*s++);
404 if (i < ETH_ALEN - 2 && *s++ !=
':')
428 if (__get_ether_addr6(s, ea))
430 if (__get_ether_addr3(s, ea))
453 unsigned long o[ETH_ALEN];
461 o[i] = strtoul(a, &end, 16);
462 if (errno != 0 || end == a || (end[0] !=
':' && end[0] != 0))
465 }
while (++i !=
sizeof(o) /
sizeof(o[0]) && end[0] != 0);
474 if (o[i] > UINT8_MAX)
479 }
else if (i == ETH_ALEN / 2) {
481 if (o[i] > UINT16_MAX)
495 inet_mtoa(
char *buff,
int len,
struct ether_addr *eaddr)
497 snprintf(buff, len,
"%02x:%02x:%02x:%02x:%02x:%02x", eaddr->
ether_addr_octet[0],
#define __cne_always_inline
CNDP_API __cne_always_inline void ether_random_addr(uint8_t *addr)
CNDP_API __cne_always_inline int ether_addr_is_zero(const struct ether_addr *ea)
CNDP_API __cne_always_inline int ether_addr_is_unicast(const struct ether_addr *ea)
CNDP_API __cne_always_inline int ether_addr_is_broadcast(const struct ether_addr *ea)
CNDP_API __cne_always_inline int ether_addr_is_universal(const struct ether_addr *ea)
CNDP_API __cne_always_inline int ether_addr_is_valid_assigned(const struct ether_addr *ea)
CNDP_API __cne_always_inline int ether_addr_is_same(const struct ether_addr *ea1, const struct ether_addr *ea2)
#define ETHER_LOCAL_ADMIN_ADDR
CNDP_API __cne_always_inline void ether_format_addr(char *buf, uint16_t size, const struct ether_addr *eth_addr)
CNDP_API __cne_always_inline int ether_addr_is_local_admin(const struct ether_addr *ea)
CNDP_API __cne_always_inline void ether_addr_copy(const struct ether_addr *ea_from, struct ether_addr *ea_to)
CNDP_API __cne_always_inline int ether_addr_is_multicast(const struct ether_addr *ea)
CNDP_API __cne_always_inline int ether_unformat_addr(const char *s, struct ether_addr *ea)
CNDP_API __cne_always_inline struct ether_addr * cne_ether_aton(const char *a, struct ether_addr *e)
uint8_t ether_addr_octet[ETH_ALEN]