Changeset 16509 in vbox for trunk/src/VBox/HostDrivers/VBoxNetFlt/linux
- Timestamp:
- Feb 4, 2009 11:26:01 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 42425
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
r16183 r16509 158 158 159 159 160 /* 161 * TAP-related part 162 */ 163 164 #define VBOX_TAP_NAME "vboxnet%d" 165 166 struct net_device *g_pNetDev; 167 168 struct VBoxTapPriv 169 { 170 struct net_device_stats Stats; 171 }; 172 typedef struct VBoxTapPriv VBOXTAPPRIV; 173 typedef VBOXTAPPRIV *PVBOXTAPPRIV; 174 175 static int vboxTapOpen(struct net_device *pNetDev) 176 { 177 netif_start_queue(pNetDev); 178 printk("vboxTapOpen returns 0\n"); 179 return 0; 180 } 181 182 static int vboxTapStop(struct net_device *pNetDev) 183 { 184 netif_stop_queue(pNetDev); 185 return 0; 186 } 187 188 static int vboxTapXmit(struct sk_buff *pSkb, struct net_device *pNetDev) 189 { 190 PVBOXTAPPRIV pPriv = netdev_priv(pNetDev); 191 192 /* Update the stats. */ 193 pPriv->Stats.tx_packets++; 194 pPriv->Stats.tx_bytes += pSkb->len; 195 /* Update transmission time stamp. */ 196 pNetDev->trans_start = jiffies; 197 /* Nothing else to do, just free the sk_buff. */ 198 dev_kfree_skb(pSkb); 199 return 0; 200 } 201 202 struct net_device_stats *vboxTapGetStats(struct net_device *pNetDev) 203 { 204 PVBOXTAPPRIV pPriv = netdev_priv(pNetDev); 205 return &pPriv->Stats; 206 } 207 208 static int vboxTapValidateAddr(struct net_device *dev) 209 { 210 Log(("vboxTapValidateAddr: %02x:%02x:%02x:%02x:%02x:%02x\n", 211 dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], 212 dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5])); 213 return -EADDRNOTAVAIL; 214 } 215 216 static void vboxTapNetDevInit(struct net_device *pNetDev) 217 { 218 PVBOXTAPPRIV pPriv; 219 220 ether_setup(pNetDev); 221 /// @todo Use Sun vendor id 222 memcpy(pNetDev->dev_addr, "\0vbnet", ETH_ALEN); 223 Log(("vboxTapNetDevInit: pNetDev->dev_addr = %.6Rhxd\n", pNetDev->dev_addr)); 224 pNetDev->open = vboxTapOpen; 225 pNetDev->stop = vboxTapStop; 226 pNetDev->hard_start_xmit = vboxTapXmit; 227 pNetDev->get_stats = vboxTapGetStats; 228 //pNetDev->validate_addr = vboxTapValidateAddr; 229 /* pNetDev-> = vboxTap; 230 pNetDev-> = vboxTap; 231 pNetDev-> = vboxTap; 232 pNetDev-> = vboxTap; 233 pNetDev-> = vboxTap;*/ 234 235 pPriv = netdev_priv(pNetDev); 236 memset(pPriv, 0, sizeof(*pPriv)); 237 } 238 239 static int vboxTapRegisterNetDev(void) 240 { 241 int rc; 242 struct net_device *pNetDev; 243 244 /* No need for private data. */ 245 pNetDev = alloc_netdev(sizeof(VBOXTAPPRIV), VBOX_TAP_NAME, vboxTapNetDevInit); 246 if (pNetDev) 247 { 248 int err = register_netdev(pNetDev); 249 if (!err) 250 { 251 g_pNetDev = pNetDev; 252 return VINF_SUCCESS; 253 } 254 free_netdev(pNetDev); 255 rc = RTErrConvertFromErrno(err); 256 } 257 return rc; 258 } 259 260 static int vboxTapUnregisterNetDev(void) 261 { 262 unregister_netdev(g_pNetDev); 263 free_netdev(g_pNetDev); 264 g_pNetDev = NULL; 265 return VINF_SUCCESS; 266 } 267 160 268 /** 161 269 * Initialize module. … … 192 300 if (RT_SUCCESS(rc)) 193 301 { 194 LogRel(("VBoxNetFlt: Successfully started.\n")); 195 return 0; 196 } 197 198 LogRel(("VBoxNetFlt: failed to initialize device extension (rc=%d)\n", rc)); 302 rc = vboxTapRegisterNetDev(); 303 if (RT_SUCCESS(rc)) 304 { 305 LogRel(("VBoxNetFlt: Successfully started.\n")); 306 return 0; 307 } 308 else 309 LogRel(("VBoxNetFlt: failed to register device (rc=%d)\n", rc)); 310 } 311 else 312 LogRel(("VBoxNetFlt: failed to initialize device extension (rc=%d)\n", rc)); 199 313 RTR0Term(); 200 314 } … … 221 335 * Undo the work done during start (in reverse order). 222 336 */ 337 rc = vboxTapUnregisterNetDev(); 338 AssertRC(rc); 223 339 rc = vboxNetFltTryDeleteGlobals(&g_VBoxNetFltGlobals); 224 340 AssertRC(rc); NOREF(rc);
Note:
See TracChangeset
for help on using the changeset viewer.