Lines 1-4
Link Here
|
1 |
--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig 2021-01-07 15:41:28 UTC |
1 |
--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig 2021-04-28 16:31:54 UTC |
2 |
+++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c |
2 |
+++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c |
3 |
@@ -52,6 +52,7 @@ |
3 |
@@ -52,6 +52,7 @@ |
4 |
#include <net/if_dl.h> |
4 |
#include <net/if_dl.h> |
Lines 16-22
Link Here
|
16 |
|
16 |
|
17 |
static int vboxnetflt_modevent(struct module *, int, void *); |
17 |
static int vboxnetflt_modevent(struct module *, int, void *); |
18 |
static ng_constructor_t ng_vboxnetflt_constructor; |
18 |
static ng_constructor_t ng_vboxnetflt_constructor; |
19 |
@@ -361,7 +363,14 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i |
19 |
@@ -149,6 +151,7 @@ NETGRAPH_INIT(vboxnetflt, &ng_vboxnetflt_typestruct); |
|
|
20 |
*/ |
21 |
MODULE_VERSION(vboxnetflt, 1); |
22 |
MODULE_DEPEND(ng_vboxnetflt, vboxdrv, 1, 1, 1); |
23 |
+MODULE_DEPEND(ng_vboxnetflt, ng_ether, 1, 1, 1); |
24 |
|
25 |
/** |
26 |
* The (common) global data. |
27 |
@@ -181,8 +184,6 @@ static int vboxnetflt_modevent(struct module *pMod, in |
28 |
printf("vboxNetFltInitGlobalsAndIdc failed %d\n", rc); |
29 |
return RTErrConvertToErrno(rc); |
30 |
} |
31 |
- /* No MODULE_VERSION in ng_ether so we can't MODULE_DEPEND it */ |
32 |
- kern_kldload(curthread, "ng_ether", NULL); |
33 |
break; |
34 |
|
35 |
case MOD_UNLOAD: |
36 |
@@ -361,7 +362,14 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i |
20 |
{ |
37 |
{ |
21 |
if (mtag != NULL || !fActive) |
38 |
if (mtag != NULL || !fActive) |
22 |
{ |
39 |
{ |
Lines 31-37
Link Here
|
31 |
if (fActive) |
48 |
if (fActive) |
32 |
vboxNetFltRelease(pThis, true /*fBusy*/); |
49 |
vboxNetFltRelease(pThis, true /*fBusy*/); |
33 |
VBOXCURVNET_RESTORE(); |
50 |
VBOXCURVNET_RESTORE(); |
34 |
@@ -436,6 +445,8 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend |
51 |
@@ -436,6 +444,8 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend |
35 |
struct ifnet *ifp = pThis->u.s.ifp; |
52 |
struct ifnet *ifp = pThis->u.s.ifp; |
36 |
unsigned int cSegs = 0; |
53 |
unsigned int cSegs = 0; |
37 |
bool fDropIt = false, fActive; |
54 |
bool fDropIt = false, fActive; |
Lines 40-46
Link Here
|
40 |
PINTNETSG pSG; |
57 |
PINTNETSG pSG; |
41 |
|
58 |
|
42 |
VBOXCURVNET_SET(ifp->if_vnet); |
59 |
VBOXCURVNET_SET(ifp->if_vnet); |
43 |
@@ -448,6 +459,19 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend |
60 |
@@ -448,6 +458,19 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend |
44 |
if (m == NULL) |
61 |
if (m == NULL) |
45 |
break; |
62 |
break; |
46 |
|
63 |
|
Lines 60-66
Link Here
|
60 |
for (m0 = m; m0 != NULL; m0 = m0->m_next) |
77 |
for (m0 = m; m0 != NULL; m0 = m0->m_next) |
61 |
if (m0->m_len > 0) |
78 |
if (m0->m_len > 0) |
62 |
cSegs++; |
79 |
cSegs++; |
63 |
@@ -462,10 +486,39 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend |
80 |
@@ -462,10 +485,39 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend |
64 |
vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0); |
81 |
vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0); |
65 |
fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE); |
82 |
fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE); |
66 |
RTMemTmpFree(pSG); |
83 |
RTMemTmpFree(pSG); |
Lines 101-107
Link Here
|
101 |
} |
118 |
} |
102 |
vboxNetFltRelease(pThis, true /* fBusy */); |
119 |
vboxNetFltRelease(pThis, true /* fBusy */); |
103 |
VBOXCURVNET_RESTORE(); |
120 |
VBOXCURVNET_RESTORE(); |
104 |
@@ -521,6 +574,7 @@ static void vboxNetFltFreeBSDoutput(void *arg, int pen |
121 |
@@ -521,6 +573,7 @@ static void vboxNetFltFreeBSDoutput(void *arg, int pen |
105 |
*/ |
122 |
*/ |
106 |
int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst) |
123 |
int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst) |
107 |
{ |
124 |
{ |
Lines 109-115
Link Here
|
109 |
NOREF(pvIfData); |
126 |
NOREF(pvIfData); |
110 |
|
127 |
|
111 |
void (*input_f)(struct ifnet *, struct mbuf *); |
128 |
void (*input_f)(struct ifnet *, struct mbuf *); |
112 |
@@ -537,10 +591,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
129 |
@@ -537,10 +590,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
113 |
{ |
130 |
{ |
114 |
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG); |
131 |
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG); |
115 |
if (m == NULL) |
132 |
if (m == NULL) |
Lines 126-132
Link Here
|
126 |
|
143 |
|
127 |
m->m_flags |= M_PKTHDR; |
144 |
m->m_flags |= M_PKTHDR; |
128 |
ether_output_frame(ifp, m); |
145 |
ether_output_frame(ifp, m); |
129 |
@@ -550,10 +610,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
146 |
@@ -550,10 +609,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
130 |
{ |
147 |
{ |
131 |
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG); |
148 |
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG); |
132 |
if (m == NULL) |
149 |
if (m == NULL) |
Lines 143-149
Link Here
|
143 |
/* |
160 |
/* |
144 |
* Delivering packets to the host will be captured by the |
161 |
* Delivering packets to the host will be captured by the |
145 |
* input hook. Tag the packet with a mbuf tag so that we |
162 |
* input hook. Tag the packet with a mbuf tag so that we |
146 |
@@ -564,6 +630,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
163 |
@@ -564,6 +629,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
147 |
if (mtag == NULL) |
164 |
if (mtag == NULL) |
148 |
{ |
165 |
{ |
149 |
m_freem(m); |
166 |
m_freem(m); |
Lines 151-157
Link Here
|
151 |
return VERR_NO_MEMORY; |
168 |
return VERR_NO_MEMORY; |
152 |
} |
169 |
} |
153 |
|
170 |
|
154 |
@@ -574,6 +641,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
171 |
@@ -574,6 +640,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p |
155 |
ifp->if_input(ifp, m); |
172 |
ifp->if_input(ifp, m); |
156 |
} |
173 |
} |
157 |
VBOXCURVNET_RESTORE(); |
174 |
VBOXCURVNET_RESTORE(); |
Lines 159-165
Link Here
|
159 |
return VINF_SUCCESS; |
176 |
return VINF_SUCCESS; |
160 |
} |
177 |
} |
161 |
|
178 |
|
162 |
@@ -586,6 +654,7 @@ static bool vboxNetFltFreeBsdIsPromiscuous(PVBOXNETFLT |
179 |
@@ -586,6 +653,7 @@ static bool vboxNetFltFreeBsdIsPromiscuous(PVBOXNETFLT |
163 |
|
180 |
|
164 |
int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) |
181 |
int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) |
165 |
{ |
182 |
{ |
Lines 167-173
Link Here
|
167 |
char nam[NG_NODESIZ]; |
184 |
char nam[NG_NODESIZ]; |
168 |
struct ifnet *ifp; |
185 |
struct ifnet *ifp; |
169 |
node_p node; |
186 |
node_p node; |
170 |
@@ -594,7 +663,10 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi |
187 |
@@ -594,7 +662,10 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi |
171 |
NOREF(pvContext); |
188 |
NOREF(pvContext); |
172 |
ifp = ifunit(pThis->szName); |
189 |
ifp = ifunit(pThis->szName); |
173 |
if (ifp == NULL) |
190 |
if (ifp == NULL) |
Lines 178-184
Link Here
|
178 |
|
195 |
|
179 |
/* Create a new netgraph node for this instance */ |
196 |
/* Create a new netgraph node for this instance */ |
180 |
if (ng_make_node_common(&ng_vboxnetflt_typestruct, &node) != 0) |
197 |
if (ng_make_node_common(&ng_vboxnetflt_typestruct, &node) != 0) |
181 |
@@ -638,12 +710,14 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi |
198 |
@@ -638,12 +709,14 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi |
182 |
vboxNetFltRelease(pThis, true /*fBusy*/); |
199 |
vboxNetFltRelease(pThis, true /*fBusy*/); |
183 |
} |
200 |
} |
184 |
VBOXCURVNET_RESTORE(); |
201 |
VBOXCURVNET_RESTORE(); |
Lines 193-199
Link Here
|
193 |
struct ifnet *ifp, *ifp0; |
210 |
struct ifnet *ifp, *ifp0; |
194 |
|
211 |
|
195 |
ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *); |
212 |
ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *); |
196 |
@@ -660,6 +734,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi |
213 |
@@ -660,6 +733,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi |
197 |
pThis->u.s.node = NULL; |
214 |
pThis->u.s.node = NULL; |
198 |
} |
215 |
} |
199 |
VBOXCURVNET_RESTORE(); |
216 |
VBOXCURVNET_RESTORE(); |
Lines 201-207
Link Here
|
201 |
|
218 |
|
202 |
if (ifp0 != NULL) |
219 |
if (ifp0 != NULL) |
203 |
{ |
220 |
{ |
204 |
@@ -672,6 +747,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi |
221 |
@@ -672,6 +746,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi |
205 |
|
222 |
|
206 |
void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) |
223 |
void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) |
207 |
{ |
224 |
{ |
Lines 209-215
Link Here
|
209 |
|
226 |
|
210 |
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskin); |
227 |
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskin); |
211 |
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskout); |
228 |
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskout); |
212 |
@@ -684,6 +760,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) |
229 |
@@ -684,6 +759,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) |
213 |
ng_rmnode_self(pThis->u.s.node); |
230 |
ng_rmnode_self(pThis->u.s.node); |
214 |
VBOXCURVNET_RESTORE(); |
231 |
VBOXCURVNET_RESTORE(); |
215 |
pThis->u.s.node = NULL; |
232 |
pThis->u.s.node = NULL; |
Lines 217-223
Link Here
|
217 |
} |
234 |
} |
218 |
|
235 |
|
219 |
int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) |
236 |
int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) |
220 |
@@ -697,6 +774,7 @@ int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) |
237 |
@@ -697,6 +773,7 @@ int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) |
221 |
|
238 |
|
222 |
void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) |
239 |
void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) |
223 |
{ |
240 |
{ |
Lines 225-231
Link Here
|
225 |
struct ifnet *ifp; |
242 |
struct ifnet *ifp; |
226 |
struct ifreq ifreq; |
243 |
struct ifreq ifreq; |
227 |
int error; |
244 |
int error; |
228 |
@@ -730,7 +808,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
245 |
@@ -730,7 +807,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
229 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT, |
246 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT, |
230 |
sizeof(struct ngm_connect), M_NOWAIT); |
247 |
sizeof(struct ngm_connect), M_NOWAIT); |
231 |
if (msg == NULL) |
248 |
if (msg == NULL) |
Lines 236-242
Link Here
|
236 |
con = (struct ngm_connect *)msg->data; |
253 |
con = (struct ngm_connect *)msg->data; |
237 |
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", ifp->if_xname); |
254 |
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", ifp->if_xname); |
238 |
strlcpy(con->ourhook, "lower", NG_HOOKSIZ); |
255 |
strlcpy(con->ourhook, "lower", NG_HOOKSIZ); |
239 |
@@ -744,7 +825,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
256 |
@@ -744,7 +824,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
240 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT, |
257 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT, |
241 |
sizeof(struct ngm_connect), M_NOWAIT); |
258 |
sizeof(struct ngm_connect), M_NOWAIT); |
242 |
if (msg == NULL) |
259 |
if (msg == NULL) |
Lines 247-253
Link Here
|
247 |
con = (struct ngm_connect *)msg->data; |
264 |
con = (struct ngm_connect *)msg->data; |
248 |
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", |
265 |
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", |
249 |
ifp->if_xname); |
266 |
ifp->if_xname); |
250 |
@@ -767,7 +851,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
267 |
@@ -767,7 +850,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
251 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK, |
268 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK, |
252 |
sizeof(struct ngm_rmhook), M_NOWAIT); |
269 |
sizeof(struct ngm_rmhook), M_NOWAIT); |
253 |
if (msg == NULL) |
270 |
if (msg == NULL) |
Lines 258-264
Link Here
|
258 |
rm = (struct ngm_rmhook *)msg->data; |
275 |
rm = (struct ngm_rmhook *)msg->data; |
259 |
strlcpy(rm->ourhook, "input", NG_HOOKSIZ); |
276 |
strlcpy(rm->ourhook, "input", NG_HOOKSIZ); |
260 |
NG_SEND_MSG_PATH(error, node, msg, path, 0); |
277 |
NG_SEND_MSG_PATH(error, node, msg, path, 0); |
261 |
@@ -778,12 +865,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
278 |
@@ -778,12 +864,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b |
262 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK, |
279 |
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK, |
263 |
sizeof(struct ngm_rmhook), M_NOWAIT); |
280 |
sizeof(struct ngm_rmhook), M_NOWAIT); |
264 |
if (msg == NULL) |
281 |
if (msg == NULL) |