1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
--- src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c.orig 2020-07-09 16:57:01 UTC
+++ src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
@@ -216,7 +216,11 @@ static void VBoxNetAdpFreeBSDNetinit(void *priv)
PVBOXNETADP pThis = priv;
struct ifnet *ifp = pThis->u.s.ifp;
+#if __FreeBSD_version >= 1500000
+ if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
+#else
ifp->if_drv_flags |= IFF_DRV_RUNNING;
+#endif
}
/**
@@ -226,21 +230,46 @@ static void VBoxNetAdpFreeBSDNetstart(struct ifnet *if
*/
static void VBoxNetAdpFreeBSDNetstart(struct ifnet *ifp)
{
+#if __FreeBSD_version >= 1500000
+ PVBOXNETADP pThis = if_getsoftc(ifp);
+#else
PVBOXNETADP pThis = ifp->if_softc;
+#endif
struct mbuf *m;
+#if __FreeBSD_version >= 1500000
+ if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
+#else
if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
+#endif
return;
+#if __FreeBSD_version >= 1500000
+ if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
+ while (!if_sendq_empty(ifp))
+#else
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+#endif
{
+#if __FreeBSD_version >= 1100036
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
+#else
ifp->if_opackets++;
+#endif
+#if __FreeBSD_version >= 1500000
+ m = if_dequeue(ifp);
+#else
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
+#endif
BPF_MTAP(ifp, m);
m_freem(m);
}
+#if __FreeBSD_version >= 1500000
+ if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
+#else
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+#endif
}
/**
@@ -253,6 +282,18 @@ static int VBoxNetAdpFreeBSDNetioctl(struct ifnet *ifp
switch (cmd)
{
case SIOCSIFFLAGS:
+#if __FreeBSD_version >= 1500000
+ if (if_getflags(ifp) & IFF_UP)
+ {
+ if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING))
+ if_init(ifp, if_getsoftc(ifp));
+ }
+ else
+ {
+ if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
+ if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
+ }
+#else
if (ifp->if_flags & IFF_UP)
{
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
@@ -263,6 +304,7 @@ static int VBoxNetAdpFreeBSDNetioctl(struct ifnet *ifp
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
}
+#endif
break;
case SIOCGIFMEDIA:
{
@@ -297,7 +339,11 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac
int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac)
{
+#if __FreeBSD_version >= 1500000
+ if_t ifp;
+#else
struct ifnet *ifp;
+#endif
VBOXCURVNET_SET_FROM_UCRED();
ifp = if_alloc(IFT_ETHER);
@@ -305,6 +351,16 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac
return VERR_NO_MEMORY;
if_initname(ifp, VBOXNETADP_NAME, pThis->iUnit);
+#if __FreeBSD_version >= 1500000
+ if_setsoftc(ifp, pThis);
+ if_setmtu(ifp, ETHERMTU);
+ if_setflagbits(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST, 0);
+ if_setioctlfn(ifp, VBoxNetAdpFreeBSDNetioctl);
+ if_setstartfn(ifp, VBoxNetAdpFreeBSDNetstart);
+ if_setinitfn(ifp, VBoxNetAdpFreeBSDNetinit);
+ if_setsendqlen(ifp, IFQ_MAXLEN);
+ if_setsendqready(ifp);
+#else
ifp->if_softc = pThis;
ifp->if_mtu = ETHERMTU;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
@@ -314,10 +370,17 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac
IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
IFQ_SET_READY(&ifp->if_snd);
+#endif
ether_ifattach(ifp, (void *)pMac);
+#if __FreeBSD_version >= 1500000
+ (void)if_setbaudrate(ifp, 0);
+
+ strncpy(pThis->szName, if_name(ifp), VBOXNETADP_MAX_NAME_LEN);
+#else
ifp->if_baudrate = 0;
strncpy(pThis->szName, ifp->if_xname, VBOXNETADP_MAX_NAME_LEN);
+#endif
pThis->u.s.ifp = ifp;
VBOXCURVNET_RESTORE();
return 0;
@@ -328,7 +391,11 @@ void vboxNetAdpOsDestroy(PVBOXNETADP pThis)
struct ifnet *ifp;
ifp = pThis->u.s.ifp;
+#if __FreeBSD_version >= 1500000
+ VBOXCURVNET_SET(if_getvnet(ifp));
+#else
VBOXCURVNET_SET(ifp->if_vnet);
+#endif
ether_ifdetach(ifp);
if_free(ifp);
VBOXCURVNET_RESTORE();
|