]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/basic/ether-addr-util.c
2 This file is part of systemd.
4 Copyright 2014 Tom Gundersen
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 #include <net/ethernet.h>
22 #include <sys/types.h>
24 #include "ether-addr-util.h"
26 #include "string-util.h"
28 char* ether_addr_to_string(const struct ether_addr
*addr
, char buffer
[ETHER_ADDR_TO_STRING_MAX
]) {
32 /* Like ether_ntoa() but uses %02x instead of %x to print
33 * ethernet addresses, which makes them look less funny. Also,
34 * doesn't use a static buffer. */
36 sprintf(buffer
, "%02x:%02x:%02x:%02x:%02x:%02x",
37 addr
->ether_addr_octet
[0],
38 addr
->ether_addr_octet
[1],
39 addr
->ether_addr_octet
[2],
40 addr
->ether_addr_octet
[3],
41 addr
->ether_addr_octet
[4],
42 addr
->ether_addr_octet
[5]);
47 bool ether_addr_equal(const struct ether_addr
*a
, const struct ether_addr
*b
) {
51 return a
->ether_addr_octet
[0] == b
->ether_addr_octet
[0] &&
52 a
->ether_addr_octet
[1] == b
->ether_addr_octet
[1] &&
53 a
->ether_addr_octet
[2] == b
->ether_addr_octet
[2] &&
54 a
->ether_addr_octet
[3] == b
->ether_addr_octet
[3] &&
55 a
->ether_addr_octet
[4] == b
->ether_addr_octet
[4] &&
56 a
->ether_addr_octet
[5] == b
->ether_addr_octet
[5];
59 int ether_addr_from_string(const char *s
, struct ether_addr
*ret
, size_t *offset
) {
60 size_t pos
= 0, n
, field
;
62 const char *hex
= HEXDIGITS
, *hexoff
;
66 #define parse_fields(v) \
67 for (field = 0; field < ELEMENTSOF(v); field++) { \
69 for (n = 0; n < (2 * sizeof(v[0])); n++) { \
72 hexoff = strchr(hex, s[pos]); \
75 assert(hexoff >= hex); \
87 if (field < (ELEMENTSOF(v)-1)) { \
98 sep
= s
[strspn(s
, hex
)];
101 if (strchr(":.-", sep
) == NULL
)
105 uint16_t shorts
[3] = { 0 };
107 parse_fields(shorts
);
109 for (n
= 0; n
< ELEMENTSOF(shorts
); n
++) {
110 ret
->ether_addr_octet
[2*n
] = ((shorts
[n
] & (uint16_t)0xff00) >> 8);
111 ret
->ether_addr_octet
[2*n
+ 1] = (shorts
[n
] & (uint16_t)0x00ff);
114 struct ether_addr out
= { .ether_addr_octet
= { 0 } };
116 parse_fields(out
.ether_addr_octet
);
118 for (n
= 0; n
< ELEMENTSOF(out
.ether_addr_octet
); n
++)
119 ret
->ether_addr_octet
[n
] = out
.ether_addr_octet
[n
];