BD ARP entry use common API types
[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 int
41 mac_address_is_zero (const mac_address_t * mac)
42 {
43   return (0 == mac->as_u64);
44 }
45
46 static_always_inline u64
47 mac_address_as_u64 (const mac_address_t * mac)
48 {
49   return (mac->as_u64);
50 }
51
52 static_always_inline void
53 mac_address_from_u64 (u64 u, mac_address_t * mac)
54 {
55   mac->as_u64 = u;
56   mac->bytes[4] = 0;
57   mac->bytes[5] = 0;
58 }
59
60 extern uword unformat_mac_address_t (unformat_input_t * input,
61                                      va_list * args);
62 extern u8 *format_mac_address_t (u8 * s, va_list * args);
63
64 #endif
65
66 /*
67  * fd.io coding-style-patch-verification: ON
68  *
69  * Local Variables:
70  * eval: (c-set-style "gnu")
71  * End:
72  */