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 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 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 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