mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 09:41:03 -04:00
bhyve: net_backends, automatically IFF_UP tap devices
If you want communications with the outside world and tell bhyve to
create an interfaces then it should be usable as well.
Rather than relying on the sysctl net.link.tap.up_on_open automatically
try to IFF_UP the opened tap device.
(cherry picked from commit 56be282bc9)
This commit is contained in:
parent
67efa8b299
commit
f74147e269
1 changed files with 51 additions and 0 deletions
|
|
@ -46,6 +46,9 @@ __FBSDID("$FreeBSD$");
|
|||
#include <sys/uio.h>
|
||||
|
||||
#include <net/if.h>
|
||||
#if defined(INET6) || defined(INET)
|
||||
#include <net/if_tap.h>
|
||||
#endif
|
||||
#include <net/netmap.h>
|
||||
#include <net/netmap_virt.h>
|
||||
#define NETMAP_WITH_LIBS
|
||||
|
|
@ -179,6 +182,17 @@ SET_DECLARE(net_backend_set, struct net_backend);
|
|||
* The tap backend
|
||||
*/
|
||||
|
||||
#if defined(INET6) || defined(INET)
|
||||
const int pf_list[] = {
|
||||
#if defined(INET6)
|
||||
PF_INET6,
|
||||
#endif
|
||||
#if defined(INET)
|
||||
PF_INET,
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
struct tap_priv {
|
||||
struct mevent *mevp;
|
||||
/*
|
||||
|
|
@ -211,6 +225,10 @@ tap_init(struct net_backend *be, const char *devname,
|
|||
struct tap_priv *priv = (struct tap_priv *)be->opaque;
|
||||
char tbuf[80];
|
||||
int opt = 1;
|
||||
#if defined(INET6) || defined(INET)
|
||||
struct ifreq ifrq;
|
||||
int i, s;
|
||||
#endif
|
||||
#ifndef WITHOUT_CAPSICUM
|
||||
cap_rights_t rights;
|
||||
#endif
|
||||
|
|
@ -238,6 +256,39 @@ tap_init(struct net_backend *be, const char *devname,
|
|||
goto error;
|
||||
}
|
||||
|
||||
#if defined(INET6) || defined(INET)
|
||||
/*
|
||||
* Try to UP the interface rather than relying on
|
||||
* net.link.tap.up_on_open.
|
||||
*/
|
||||
bzero(&ifrq, sizeof(ifrq));
|
||||
if (ioctl(be->fd, TAPGIFNAME, &ifrq) < 0) {
|
||||
WPRINTF(("Could not get interface name"));
|
||||
goto error;
|
||||
}
|
||||
|
||||
s = -1;
|
||||
for (i = 0; s == -1 && i < nitems(pf_list); i++)
|
||||
s = socket(pf_list[i], SOCK_DGRAM, 0);
|
||||
if (s == -1) {
|
||||
WPRINTF(("Could open socket"));
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (ioctl(s, SIOCGIFFLAGS, &ifrq) < 0) {
|
||||
(void)close(s);
|
||||
WPRINTF(("Could not get interface flags"));
|
||||
goto error;
|
||||
}
|
||||
ifrq.ifr_flags |= IFF_UP;
|
||||
if (ioctl(s, SIOCSIFFLAGS, &ifrq) < 0) {
|
||||
(void)close(s);
|
||||
WPRINTF(("Could not set interface flags"));
|
||||
goto error;
|
||||
}
|
||||
(void)close(s);
|
||||
#endif
|
||||
|
||||
#ifndef WITHOUT_CAPSICUM
|
||||
cap_rights_init(&rights, CAP_EVENT, CAP_READ, CAP_WRITE);
|
||||
if (caph_rights_limit(be->fd, &rights) == -1)
|
||||
|
|
|
|||
Loading…
Reference in a new issue