/* * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include "util.h" /* Number of bytes in a MAC address. */ #define SIZEOF_MAC (48 / 8) uint64_t make_mac(const char *data) { uint64_t x = 0; /* Consume bytes from the input string until we've exhausted it and then * just pad the rest of the MAC with 0s. */ for (unsigned int i = 0; i < SIZEOF_MAC; i++) { if (*data == '\0') { x <<= 8; } else { x = (x << 8) | (uint64_t)(*data); data++; } } return x; } /* Note that MAC addresses are stored big endian and IP addresses are stored * little endian. Only chosen this way to make construction simpler. */ void mac_to_string(uint64_t input, char *output) { sprintf(output, "%02x:%02x:%02x:%02x:%02x:%02x", (unsigned int)(input & 0xff), (unsigned int)((input >> 8) & 0xff), (unsigned int)((input >> 16) & 0xff), (unsigned int)((input >> 24) & 0xff), (unsigned int)((input >> 32) & 0xff), (unsigned int)((input >> 40) & 0xff)); } void ip_to_string(uint32_t input, char *output) { sprintf(output, "%u.%u.%u.%u", input >> 24, (input >> 16) & 0xff, (input >> 8) & 0xff, input & 0xff); }