11285115cSWilliam A. Kennington III /*
21285115cSWilliam A. Kennington III  * Copyright 2021 Google LLC
31285115cSWilliam A. Kennington III  *
41285115cSWilliam A. Kennington III  * Licensed under the Apache License, Version 2.0 (the "License");
51285115cSWilliam A. Kennington III  * you may not use this file except in compliance with the License.
61285115cSWilliam A. Kennington III  * You may obtain a copy of the License at
71285115cSWilliam A. Kennington III  *
81285115cSWilliam A. Kennington III  *      http://www.apache.org/licenses/LICENSE-2.0
91285115cSWilliam A. Kennington III  *
101285115cSWilliam A. Kennington III  * Unless required by applicable law or agreed to in writing, software
111285115cSWilliam A. Kennington III  * distributed under the License is distributed on an "AS IS" BASIS,
121285115cSWilliam A. Kennington III  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131285115cSWilliam A. Kennington III  * See the License for the specific language governing permissions and
141285115cSWilliam A. Kennington III  * limitations under the License.
151285115cSWilliam A. Kennington III  */
161285115cSWilliam A. Kennington III 
171285115cSWilliam A. Kennington III #include <inttypes.h>
18*adb8ffe4SWilly Tu #include <linux/if_ether.h>
191285115cSWilliam A. Kennington III #include <net/ethernet.h>
201285115cSWilliam A. Kennington III #include <stdio.h>
211285115cSWilliam A. Kennington III 
221285115cSWilliam A. Kennington III #define ETH_STRLEN (ETH_ALEN * 3)
231285115cSWilliam A. Kennington III #define HEX_OUT "%02" PRIx8
241285115cSWilliam A. Kennington III #define ETH_OUT                                                                \
251285115cSWilliam A. Kennington III     HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT ":" HEX_OUT
261285115cSWilliam A. Kennington III #define HEX_IN "%2" SCNx8
271285115cSWilliam A. Kennington III #define ETH_IN HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN ":" HEX_IN
281285115cSWilliam A. Kennington III 
to_ether_addr(const char * str,struct ether_addr * ret)291285115cSWilliam A. Kennington III int to_ether_addr(const char* str, struct ether_addr* ret)
301285115cSWilliam A. Kennington III {
311285115cSWilliam A. Kennington III     char sentinel;
321285115cSWilliam A. Kennington III     return sscanf(str, ETH_IN "%c", &ret->ether_addr_octet[0],
331285115cSWilliam A. Kennington III                   &ret->ether_addr_octet[1], &ret->ether_addr_octet[2],
341285115cSWilliam A. Kennington III                   &ret->ether_addr_octet[3], &ret->ether_addr_octet[4],
351285115cSWilliam A. Kennington III                   &ret->ether_addr_octet[5], &sentinel) != ETH_ALEN;
361285115cSWilliam A. Kennington III }
371285115cSWilliam A. Kennington III 
from_ether_addr(const struct ether_addr * addr,char * ret)381285115cSWilliam A. Kennington III void from_ether_addr(const struct ether_addr* addr, char* ret)
391285115cSWilliam A. Kennington III {
401285115cSWilliam A. Kennington III     sprintf(ret, ETH_OUT, addr->ether_addr_octet[0], addr->ether_addr_octet[1],
411285115cSWilliam A. Kennington III             addr->ether_addr_octet[2], addr->ether_addr_octet[3],
421285115cSWilliam A. Kennington III             addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
431285115cSWilliam A. Kennington III }
441285115cSWilliam A. Kennington III 
main(int argc,char * argv[])451285115cSWilliam A. Kennington III int main(int argc, char* argv[])
461285115cSWilliam A. Kennington III {
471285115cSWilliam A. Kennington III     if (argc < 1)
481285115cSWilliam A. Kennington III     {
491285115cSWilliam A. Kennington III         return 1;
501285115cSWilliam A. Kennington III     }
511285115cSWilliam A. Kennington III     if (argc != 2)
521285115cSWilliam A. Kennington III     {
531285115cSWilliam A. Kennington III         fprintf(stderr, "Usage: %s <mac address>\n", argv[0]);
541285115cSWilliam A. Kennington III         return 1;
551285115cSWilliam A. Kennington III     }
561285115cSWilliam A. Kennington III 
571285115cSWilliam A. Kennington III     struct ether_addr addr;
581285115cSWilliam A. Kennington III     if (to_ether_addr(argv[1], &addr) != 0)
591285115cSWilliam A. Kennington III     {
601285115cSWilliam A. Kennington III         fprintf(stderr, "Invalid MAC Address: %s\n", argv[1]);
611285115cSWilliam A. Kennington III         return 2;
621285115cSWilliam A. Kennington III     }
631285115cSWilliam A. Kennington III 
641285115cSWilliam A. Kennington III     char str[ETH_STRLEN];
651285115cSWilliam A. Kennington III     from_ether_addr(&addr, str);
661285115cSWilliam A. Kennington III     printf("%s\n", str);
671285115cSWilliam A. Kennington III     return 0;
681285115cSWilliam A. Kennington III }
69