1*436c089aSDmitry Kozlyuk /* SPDX-License-Identifier: BSD-3-Clause
2*436c089aSDmitry Kozlyuk * Copyright(c) 2010-2016 Intel Corporation.
3*436c089aSDmitry Kozlyuk * Copyright(c) 2014 6WIND S.A.
4*436c089aSDmitry Kozlyuk * All rights reserved.
5*436c089aSDmitry Kozlyuk */
6*436c089aSDmitry Kozlyuk
7*436c089aSDmitry Kozlyuk #include <net/if.h>
8*436c089aSDmitry Kozlyuk #include <net/if_dl.h>
9*436c089aSDmitry Kozlyuk #include <sys/sysctl.h>
10*436c089aSDmitry Kozlyuk
11*436c089aSDmitry Kozlyuk #include <rte_malloc.h>
12*436c089aSDmitry Kozlyuk #include <rte_memcpy.h>
13*436c089aSDmitry Kozlyuk
14*436c089aSDmitry Kozlyuk #include "pcap_osdep.h"
15*436c089aSDmitry Kozlyuk
16*436c089aSDmitry Kozlyuk int
osdep_iface_index_get(const char * name)17*436c089aSDmitry Kozlyuk osdep_iface_index_get(const char *name)
18*436c089aSDmitry Kozlyuk {
19*436c089aSDmitry Kozlyuk return if_nametoindex(name);
20*436c089aSDmitry Kozlyuk }
21*436c089aSDmitry Kozlyuk
22*436c089aSDmitry Kozlyuk int
osdep_iface_mac_get(const char * if_name,struct rte_ether_addr * mac)23*436c089aSDmitry Kozlyuk osdep_iface_mac_get(const char *if_name, struct rte_ether_addr *mac)
24*436c089aSDmitry Kozlyuk {
25*436c089aSDmitry Kozlyuk struct if_msghdr *ifm;
26*436c089aSDmitry Kozlyuk struct sockaddr_dl *sdl;
27*436c089aSDmitry Kozlyuk int mib[6];
28*436c089aSDmitry Kozlyuk size_t len = 0;
29*436c089aSDmitry Kozlyuk char *buf;
30*436c089aSDmitry Kozlyuk
31*436c089aSDmitry Kozlyuk mib[0] = CTL_NET;
32*436c089aSDmitry Kozlyuk mib[1] = AF_ROUTE;
33*436c089aSDmitry Kozlyuk mib[2] = 0;
34*436c089aSDmitry Kozlyuk mib[3] = AF_LINK;
35*436c089aSDmitry Kozlyuk mib[4] = NET_RT_IFLIST;
36*436c089aSDmitry Kozlyuk mib[5] = if_nametoindex(if_name);
37*436c089aSDmitry Kozlyuk
38*436c089aSDmitry Kozlyuk if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0)
39*436c089aSDmitry Kozlyuk return -1;
40*436c089aSDmitry Kozlyuk
41*436c089aSDmitry Kozlyuk if (len == 0)
42*436c089aSDmitry Kozlyuk return -1;
43*436c089aSDmitry Kozlyuk
44*436c089aSDmitry Kozlyuk buf = rte_malloc(NULL, len, 0);
45*436c089aSDmitry Kozlyuk if (!buf)
46*436c089aSDmitry Kozlyuk return -1;
47*436c089aSDmitry Kozlyuk
48*436c089aSDmitry Kozlyuk if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
49*436c089aSDmitry Kozlyuk rte_free(buf);
50*436c089aSDmitry Kozlyuk return -1;
51*436c089aSDmitry Kozlyuk }
52*436c089aSDmitry Kozlyuk ifm = (struct if_msghdr *)buf;
53*436c089aSDmitry Kozlyuk sdl = (struct sockaddr_dl *)(ifm + 1);
54*436c089aSDmitry Kozlyuk
55*436c089aSDmitry Kozlyuk rte_memcpy(mac->addr_bytes, LLADDR(sdl), RTE_ETHER_ADDR_LEN);
56*436c089aSDmitry Kozlyuk
57*436c089aSDmitry Kozlyuk rte_free(buf);
58*436c089aSDmitry Kozlyuk return 0;
59*436c089aSDmitry Kozlyuk }
60