a249cb58e7c0ed02e53059f1ad30369cae03161d
[vpp.git] / src / vnet / ethernet / mac_address.h
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 <vnet/ethernet/ethernet.h>
20
21 typedef struct mac_address_t_
22 {
23   union
24   {
25     u8 bytes[6];
26     u64 as_u64;
27   };
28 } mac_address_t;
29
30 extern const mac_address_t ZERO_MAC_ADDRESS;
31
32 static_always_inline void
33 mac_address_from_bytes (mac_address_t * mac, const u8 * bytes)
34 {
35   /* zero out the last 2 bytes, then copy over only 6 */
36   mac->as_u64 = 0;
37   clib_memcpy (mac->bytes, bytes, 6);
38 }
39
40 static_always_inline void
41 mac_address_to_bytes (const mac_address_t * mac, u8 * bytes)
42 {
43   /* zero out the last 2 bytes, then copy over only 6 */
44   clib_memcpy (bytes, mac->bytes, 6);
45 }
46
47 static_always_inline int
48 mac_address_is_zero (const mac_address_t * mac)
49 {
50   return (0 == mac->as_u64);
51 }
52
53 static_always_inline u64
54 mac_address_as_u64 (const mac_address_t * mac)
55 {
56   return (mac->as_u64);
57 }
58
59 static_always_inline void
60 mac_address_from_u64 (u64 u, mac_address_t * mac)
61 {
62   mac->as_u64 = u;
63   mac->bytes[4] = 0;
64   mac->bytes[5] = 0;
65 }
66
67 static_always_inline void
68 mac_address_copy (mac_address_t * dst, const mac_address_t * src)
69 {
70   mac_address_from_bytes (dst, src->bytes);
71 }
72
73 extern uword unformat_mac_address_t (unformat_input_t * input,
74                                      va_list * args);
75 extern u8 *format_mac_address_t (u8 * s, va_list * args);
76
77 #endif
78
79 /*
80  * fd.io coding-style-patch-verification: ON
81  *
82  * Local Variables:
83  * eval: (c-set-style "gnu")
84  * End:
85  */