eui48.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018 Freie Universität Berlin
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
9 #pragma once
10 
23 #include <stdint.h>
24 
25 #include "net/eui64.h"
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
34 typedef struct {
35  uint8_t uint8[6];
36 } eui48_t;
37 
48 #define EUI48_LOCAL_FLAG 0x02
49 
53 #define EUI48_GROUP_FLAG 0x01
63 static inline void eui48_set_local(eui48_t *addr)
64 {
65  addr->uint8[0] |= EUI48_LOCAL_FLAG;
66 }
67 
76 static inline void eui48_clear_group(eui48_t *addr)
77 {
78  addr->uint8[0] &= ~EUI48_GROUP_FLAG;
79 }
80 
89 static inline void eui48_to_eui64(eui64_t *eui64, const eui48_t *addr)
90 {
91  eui64->uint8[0] = addr->uint8[0];
92  eui64->uint8[1] = addr->uint8[1];
93  eui64->uint8[2] = addr->uint8[2];
94  eui64->uint8[3] = 0xff;
95  eui64->uint8[4] = 0xfe;
96  eui64->uint8[5] = addr->uint8[3];
97  eui64->uint8[6] = addr->uint8[4];
98  eui64->uint8[7] = addr->uint8[5];
99 }
100 
110 static inline void eui64_to_eui48(eui48_t *eui48, const eui64_t *addr)
111 {
112  /* Preserve vendor id */
113  eui48->uint8[0] = addr->uint8[0];
114  eui48->uint8[1] = addr->uint8[1];
115  eui48->uint8[2] = addr->uint8[2];
116 
117  /* Use most volatile bits */
118  eui48->uint8[3] = addr->uint8[5];
119  eui48->uint8[4] = addr->uint8[6];
120  eui48->uint8[5] = addr->uint8[7];
121 
122  /* EUI is only locally unique */
123  eui48_set_local(eui48);
124 }
125 
136 static inline void eui48_to_ipv6_iid(eui64_t *iid, const eui48_t *addr)
137 {
138  eui48_to_eui64(iid, addr);
139  iid->uint8[0] ^= 0x02;
140 }
141 
148 static inline void eui48_from_ipv6_iid(eui48_t *addr, const eui64_t *iid)
149 {
150  addr->uint8[0] = iid->uint8[0] ^ 0x02;
151  addr->uint8[1] = iid->uint8[1];
152  addr->uint8[2] = iid->uint8[2];
153  addr->uint8[3] = iid->uint8[5];
154  addr->uint8[4] = iid->uint8[6];
155  addr->uint8[5] = iid->uint8[7];
156 }
157 
158 #ifdef __cplusplus
159 }
160 #endif
161 
EUI-64 data type definition.
static void eui64_to_eui48(eui48_t *eui48, const eui64_t *addr)
Generates an EUI-48 from a 64-bit device address.
Definition: eui48.h:110
static void eui48_to_ipv6_iid(eui64_t *iid, const eui48_t *addr)
Generates an IPv6 interface identifier from a 48-bit device address.
Definition: eui48.h:136
static void eui48_set_local(eui48_t *addr)
Set the locally administrated bit in the EUI-48 address.
Definition: eui48.h:63
#define EUI48_GROUP_FLAG
Group type address.
Definition: eui48.h:53
static void eui48_from_ipv6_iid(eui48_t *addr, const eui64_t *iid)
Convert a 64-bit IPv6 IID into a EUI-48 device address.
Definition: eui48.h:148
static void eui48_clear_group(eui48_t *addr)
Clear the group address bit to signal the address as individual address.
Definition: eui48.h:76
#define EUI48_LOCAL_FLAG
Locally administered address.
Definition: eui48.h:48
static void eui48_to_eui64(eui64_t *eui64, const eui48_t *addr)
Generates an EUI-64 from a 48-bit device address.
Definition: eui48.h:89
Data type to represent an EUI-48.
Definition: eui48.h:34
uint8_t uint8[6]
split into 6 8-bit words.
Definition: eui48.h:35
Data type to represent an EUI-64.
Definition: eui64.h:55
uint8_t uint8[8]
split into 8 8-bit words.
Definition: eui64.h:57