if_lagg: Allow lagg interfaces to be used with netmap

Reviewed by:	zlei
Sponsored by:	Zenarmor
Sponsored by:	OPNsense
Sponsored by:	Klara, Inc.
Differential Revision:	https://reviews.freebsd.org/D37436
This commit is contained in:
Tom Jones 2023-01-13 15:26:55 +00:00
parent 8bce8d28ab
commit 110ce09c90
2 changed files with 15 additions and 0 deletions

View File

@ -351,6 +351,8 @@ nm_os_catch_rx(struct netmap_generic_adapter *gna, int intercept)
ret = EBUSY; /* already set */
goto out;
}
ifp->if_capenable |= IFCAP_NETMAP;
gna->save_if_input = ifp->if_input;
ifp->if_input = freebsd_generic_rx_handler;
} else {
@ -360,6 +362,8 @@ nm_os_catch_rx(struct netmap_generic_adapter *gna, int intercept)
ret = EINVAL; /* not saved */
goto out;
}
ifp->if_capenable &= ~IFCAP_NETMAP;
ifp->if_input = gna->save_if_input;
gna->save_if_input = NULL;
}

View File

@ -84,6 +84,10 @@ __FBSDID("$FreeBSD$");
extern void nd6_setmtu(struct ifnet *);
#endif
#ifdef DEV_NETMAP
MODULE_DEPEND(if_lagg, netmap, 1, 1, 1);
#endif
#define LAGG_SX_INIT(_sc) sx_init(&(_sc)->sc_sx, "if_lagg sx")
#define LAGG_SX_DESTROY(_sc) sx_destroy(&(_sc)->sc_sx)
#define LAGG_XLOCK(_sc) sx_xlock(&(_sc)->sc_sx)
@ -2201,6 +2205,13 @@ lagg_input_ethernet(struct ifnet *ifp, struct mbuf *m)
m = NULL;
}
#ifdef DEV_NETMAP
if (m != NULL && scifp->if_capenable & IFCAP_NETMAP) {
scifp->if_input(scifp, m);
m = NULL;
}
#endif /* DEV_NETMAP */
NET_EPOCH_EXIT(et);
return (m);
}