xref: /dpdk/drivers/net/pcap/pcap_osdep_freebsd.c (revision 436c089a528cbb834381eb908ec33bd0c9da6b92)
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