blob: f6b1ebb3cf82a0a3ebf6e8fcc0ac32d3cc98f57f [file] [log] [blame]
Harald Welte40d56f92014-08-18 19:03:40 +02001#include <stdint.h>
2#include <string.h>
3#include <stdlib.h>
Harald Welte78b08682014-08-21 02:37:57 +02004#include <unistd.h>
Harald Welte40d56f92014-08-18 19:03:40 +02005
6
7int osmo_macaddr_parse(uint8_t *out, const char *in)
8{
9 /* 00:00:00:00:00:00 */
10 char tmp[18];
11 char *tok;
12 unsigned int i = 0;
13
14 if (strlen(in) < 17)
15 return -1;
16
17 strncpy(tmp, in, sizeof(tmp)-1);
18 tmp[sizeof(tmp)-1] = '\0';
19
20 for (tok = strtok(tmp, ":"); tok && (i < 6); tok = strtok(NULL, ":")) {
21 unsigned long ul = strtoul(tok, NULL, 16);
22 out[i++] = ul & 0xff;
23 }
24
25 return 0;
26}
Harald Weltefe3e42b2014-08-18 19:19:45 +020027
Holger Hans Peter Freytherefe01002014-08-21 14:14:38 +020028#if defined(__FreeBSD__)
29#include <sys/socket.h>
30#include <sys/types.h>
31#include <ifaddrs.h>
32#include <net/if_dl.h>
33#include <net/if_types.h>
34
35
36int osmo_get_macaddr(uint8_t *mac_out, const char *dev_name)
37{
38 int rc = -1;
39 struct ifaddrs *ifa, *ifaddr;
40
41 if (getifaddrs(&ifaddr) != 0)
42 return -1;
43
44 for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
45 struct sockaddr_dl *sdl;
46
47 sdl = (struct sockaddr_dl *) ifa->ifa_addr;
48 if (!sdl)
49 continue;
50 if (sdl->sdl_family != AF_LINK)
51 continue;
52 if (sdl->sdl_type != IFT_ETHER)
53 continue;
54 if (strcmp(ifa->ifa_name, dev_name) != 0)
55 continue;
56
57 memcpy(mac_out, LLADDR(sdl), 6);
58 rc = 0;
59 break;
60 }
61
62 freeifaddrs(ifaddr);
63 return 0;
64}
65
66#else
67
Harald Weltefe3e42b2014-08-18 19:19:45 +020068#include <sys/ioctl.h>
69#include <net/if.h>
70#include <netinet/ip.h>
71
72int osmo_get_macaddr(uint8_t *mac_out, const char *dev_name)
73{
74 int fd, rc;
75 struct ifreq ifr;
76
77 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
78 if (fd < 0)
79 return fd;
80
81 memset(&ifr, 0, sizeof(ifr));
82 memcpy(&ifr.ifr_name, dev_name, sizeof(ifr.ifr_name));
83 rc = ioctl(fd, SIOCGIFHWADDR, &ifr);
84 close(fd);
85
86 if (rc < 0)
87 return rc;
88
89 memcpy(mac_out, ifr.ifr_hwaddr.sa_data, 6);
90
91 return 0;
92}
Holger Hans Peter Freytherefe01002014-08-21 14:14:38 +020093#endif