blob: 1ed8a04358e12c08b18eaa9c11a369f08aac4e87 [file] [edit]
/*
* Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <stdint.h>
#include <stdio.h>
#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);
}