FD.io VPP  v21.01.1
Vector Packet Processing
mac_address.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef __MAC_ADDRESS_H__
17 #define __MAC_ADDRESS_H__
18 
19 #include <vlib/vlib.h>
20 
21 typedef struct mac_address_t_
22 {
23  union
24  {
25  u8 bytes[6];
26  struct
27  {
30  } __clib_packed u;
31  };
33 
34 STATIC_ASSERT ((sizeof (mac_address_t) == 6),
35  "MAC address must represent the on wire format");
36 
37 extern const mac_address_t ZERO_MAC_ADDRESS;
38 
41 {
42  return (((u64) a[0] << (u64) (5 * 8))
43  | ((u64) a[1] << (u64) (4 * 8))
44  | ((u64) a[2] << (u64) (3 * 8))
45  | ((u64) a[3] << (u64) (2 * 8))
46  | ((u64) a[4] << (u64) (1 * 8)) | ((u64) a[5] << (u64) (0 * 8)));
47 }
48 
49 always_inline void
51 {
52  i8 ii;
53 
54  for (ii = 5; ii >= 0; ii--)
55  {
56  a[ii] = u & 0xFF;
57  u = u >> 8;
58  }
59 }
60 
61 static inline int
63 {
64  return (a & (1ULL << (5 * 8))) != 0;
65 }
66 
67 static inline int
69 {
70  return ((*((u32 *) mac) == 0) && (*((u16 *) (mac + 4)) == 0));
71 }
72 
73 static inline void
75 {
76  u32 rnd = clib_cpu_time_now ();
77  rnd = random_u32 (&rnd);
78 
79  memcpy (mac + 2, &rnd, sizeof (rnd));
80  mac[0] = 2;
81  mac[1] = 0xfe;
82 }
83 
84 static inline int
85 ethernet_mac_address_equal (const u8 * a, const u8 * b)
86 {
87  return ((*((u32 *) a) == (*((u32 *) b))) &&
88  (*((u16 *) (a + 4)) == (*((u16 *) (b + 4)))));
89 }
90 
93 {
94  /* zero out the last 2 bytes, then copy over only 6 */
95  clib_memcpy_fast (mac->bytes, bytes, 6);
96 }
97 
100 {
101  /* zero out the last 2 bytes, then copy over only 6 */
102  clib_memcpy_fast (bytes, mac->bytes, 6);
103 }
104 
107 {
108  return (0 == mac->u.first_4 && 0 == mac->u.last_2);
109 }
110 
113 {
114  volatile u64 as_u64 = 0;
115 
116  clib_memcpy ((void *) &as_u64, mac->bytes, 6);
117 
118  return as_u64;
119 }
120 
123 {
124  clib_memcpy (mac->bytes, &u, 6);
125 }
126 
129 {
130  mac_address_from_bytes (dst, src->bytes);
131 }
132 
135 {
136  return (memcmp (a->bytes, b->bytes, 6));
137 }
138 
141 {
142  return (a->u.last_2 == b->u.last_2 && a->u.first_4 == b->u.first_4);
143 }
144 
147 {
148  mac->u.first_4 = 0;
149  mac->u.last_2 = 0;
150 }
151 
154 {
155  return (count_set_bits (mac_address_as_u64 (a)));
156 }
157 
158 extern void mac_address_increment (mac_address_t * mac);
160  va_list * args);
161 extern u8 *format_mac_address_t (u8 * s, va_list * args);
162 
163 #endif
164 
165 /*
166  * fd.io coding-style-patch-verification: ON
167  *
168  * Local Variables:
169  * eval: (c-set-style "gnu")
170  * End:
171  */
STATIC_ASSERT((sizeof(mac_address_t)==6), "MAC address must represent the on wire format")
a
Definition: bitmap.h:544
u64 as_u64
Definition: bihash_doc.h:63
unsigned long u64
Definition: types.h:89
#define clib_memcpy_fast(a, b, c)
Definition: string.h:81
static int ethernet_mac_address_is_multicast_u64(u64 a)
Definition: mac_address.h:62
void mac_address_increment(mac_address_t *mac)
Definition: mac_address.c:65
static u64 clib_cpu_time_now(void)
Definition: time.h:81
vl_api_address_t src
Definition: gre.api:54
static_always_inline void mac_address_copy(mac_address_t *dst, const mac_address_t *src)
Definition: mac_address.h:128
static_always_inline int mac_address_is_zero(const mac_address_t *mac)
Definition: mac_address.h:106
unsigned char u8
Definition: types.h:56
static_always_inline void mac_address_set_zero(mac_address_t *mac)
Definition: mac_address.h:146
#define clib_memcpy(d, s, n)
Definition: string.h:180
const mac_address_t ZERO_MAC_ADDRESS
Definition: mac_address.c:19
#define static_always_inline
Definition: clib.h:109
static_always_inline void mac_address_to_bytes(const mac_address_t *mac, u8 *bytes)
Definition: mac_address.h:99
const cJSON *const b
Definition: cJSON.h:255
unsigned int u32
Definition: types.h:88
static_always_inline void mac_address_from_bytes(mac_address_t *mac, const u8 *bytes)
Definition: mac_address.h:92
struct _unformat_input_t unformat_input_t
unsigned short u16
Definition: types.h:57
struct mac_address_t_::@298::@300 u
#define always_inline
Definition: ipsec.h:28
signed char i8
Definition: types.h:45
static_always_inline void mac_address_from_u64(mac_address_t *mac, u64 u)
Definition: mac_address.h:122
static_always_inline int mac_address_equal(const mac_address_t *a, const mac_address_t *b)
Definition: mac_address.h:140
vl_api_address_t dst
Definition: gre.api:55
static void ethernet_mac_address_from_u64(u64 u, u8 *a)
Definition: mac_address.h:50
static int ethernet_mac_address_equal(const u8 *a, const u8 *b)
Definition: mac_address.h:85
static_always_inline int mac_address_n_bits_set(const mac_address_t *a)
Definition: mac_address.h:153
struct mac_address_t_ mac_address_t
static u64 ethernet_mac_address_u64(const u8 *a)
Definition: mac_address.h:40
static_always_inline u64 mac_address_as_u64(const mac_address_t *mac)
Definition: mac_address.h:112
static void ethernet_mac_address_generate(u8 *mac)
Definition: mac_address.h:74
u64 uword
Definition: types.h:112
static u32 random_u32(u32 *seed)
32-bit random number generator
Definition: random.h:69
static int ethernet_mac_address_is_zero(const u8 *mac)
Definition: mac_address.h:68
static uword count_set_bits(uword x)
Definition: bitops.h:45
static_always_inline int mac_address_cmp(const mac_address_t *a, const mac_address_t *b)
Definition: mac_address.h:134
u8 * format_mac_address_t(u8 *s, va_list *args)
Definition: mac_address.c:27
uword unformat_mac_address_t(unformat_input_t *input, va_list *args)
Definition: mac_address.c:37