xref: /openbmc/google-misc/acpi-power-state-daemon/subprojects/ncsid/src/normalize_mac.c (revision 1285115c16180bd28a3cfe79d9db8d10c84fe2ed)
1*1285115cSWilliam A. Kennington III /*
2*1285115cSWilliam A. Kennington III  * Copyright 2021 Google LLC
3*1285115cSWilliam A. Kennington III  *
4*1285115cSWilliam A. Kennington III  * Licensed under the Apache License, Version 2.0 (the "License");
5*1285115cSWilliam A. Kennington III  * you may not use this file except in compliance with the License.
6*1285115cSWilliam A. Kennington III  * You may obtain a copy of the License at
7*1285115cSWilliam A. Kennington III  *
8*1285115cSWilliam A. Kennington III  *      http://www.apache.org/licenses/LICENSE-2.0
9*1285115cSWilliam A. Kennington III  *
10*1285115cSWilliam A. Kennington III  * Unless required by applicable law or agreed to in writing, software
11*1285115cSWilliam A. Kennington III  * distributed under the License is distributed on an "AS IS" BASIS,
12*1285115cSWilliam A. Kennington III  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1285115cSWilliam A. Kennington III  * See the License for the specific language governing permissions and
14*1285115cSWilliam A. Kennington III  * limitations under the License.
15*1285115cSWilliam A. Kennington III  */
16*1285115cSWilliam A. Kennington III 
17*1285115cSWilliam A. Kennington III #include <inttypes.h>
18*1285115cSWilliam A. Kennington III #include <net/ethernet.h>
19*1285115cSWilliam A. Kennington III #include <stdio.h>
20*1285115cSWilliam A. Kennington III 
21*1285115cSWilliam A. Kennington III #define ETH_STRLEN (ETH_ALEN * 3)
22*1285115cSWilliam A. Kennington III #define HEX_OUT "%02" PRIx8
23*1285115cSWilliam A. Kennington III #define ETH_OUT                                                                \
24*1285115cSWilliam A. Kennington III     HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT
25*1285115cSWilliam A. Kennington III #define HEX_IN "%2" SCNx8
26*1285115cSWilliam A. Kennington III #define ETH_IN HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN
27*1285115cSWilliam A. Kennington III 
28*1285115cSWilliam A. Kennington III int to_ether_addr(const char* str, struct ether_addr* ret)
29*1285115cSWilliam A. Kennington III {
30*1285115cSWilliam A. Kennington III     char sentinel;
31*1285115cSWilliam A. Kennington III     return sscanf(str, ETH_IN "%c", &ret->ether_addr_octet[0],
32*1285115cSWilliam A. Kennington III                   &ret->ether_addr_octet[1], &ret->ether_addr_octet[2],
33*1285115cSWilliam A. Kennington III                   &ret->ether_addr_octet[3], &ret->ether_addr_octet[4],
34*1285115cSWilliam A. Kennington III                   &ret->ether_addr_octet[5], &sentinel) != ETH_ALEN;
35*1285115cSWilliam A. Kennington III }
36*1285115cSWilliam A. Kennington III 
37*1285115cSWilliam A. Kennington III void from_ether_addr(const struct ether_addr* addr, char* ret)
38*1285115cSWilliam A. Kennington III {
39*1285115cSWilliam A. Kennington III     sprintf(ret, ETH_OUT, addr->ether_addr_octet[0], addr->ether_addr_octet[1],
40*1285115cSWilliam A. Kennington III             addr->ether_addr_octet[2], addr->ether_addr_octet[3],
41*1285115cSWilliam A. Kennington III             addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
42*1285115cSWilliam A. Kennington III }
43*1285115cSWilliam A. Kennington III 
44*1285115cSWilliam A. Kennington III int main(int argc, char* argv[])
45*1285115cSWilliam A. Kennington III {
46*1285115cSWilliam A. Kennington III     if (argc < 1)
47*1285115cSWilliam A. Kennington III     {
48*1285115cSWilliam A. Kennington III         return 1;
49*1285115cSWilliam A. Kennington III     }
50*1285115cSWilliam A. Kennington III     if (argc != 2)
51*1285115cSWilliam A. Kennington III     {
52*1285115cSWilliam A. Kennington III         fprintf(stderr, "Usage: %s <mac address>\n", argv[0]);
53*1285115cSWilliam A. Kennington III         return 1;
54*1285115cSWilliam A. Kennington III     }
55*1285115cSWilliam A. Kennington III 
56*1285115cSWilliam A. Kennington III     struct ether_addr addr;
57*1285115cSWilliam A. Kennington III     if (to_ether_addr(argv[1], &addr) != 0)
58*1285115cSWilliam A. Kennington III     {
59*1285115cSWilliam A. Kennington III         fprintf(stderr, "Invalid MAC Address: %s\n", argv[1]);
60*1285115cSWilliam A. Kennington III         return 2;
61*1285115cSWilliam A. Kennington III     }
62*1285115cSWilliam A. Kennington III 
63*1285115cSWilliam A. Kennington III     char str[ETH_STRLEN];
64*1285115cSWilliam A. Kennington III     from_ether_addr(&addr, str);
65*1285115cSWilliam A. Kennington III     printf("%s\n", str);
66*1285115cSWilliam A. Kennington III     return 0;
67*1285115cSWilliam A. Kennington III }
68