Changeset 10758 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Jul 18, 2008 8:38:02 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 33511
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Makefile.kmk
r10756 r10758 537 537 Storage/DrvVD.cpp \ 538 538 Storage/VBoxHDD.cpp \ 539 Network/DrvNetSniffer.cpp 539 Network/DrvNetSniffer.cpp \ 540 Network/Pcap.cpp 540 541 ifndef VBOX_USE_NAT 541 542 Drivers_SOURCES += \ … … 631 632 Network/DrvIntNet.cpp \ 632 633 Network/DrvNetSniffer.cpp \ 634 Network/Pcap.cpp \ 633 635 Audio/audio.c \ 634 636 Audio/mixeng.c \ -
trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp
r10009 r10758 37 37 #include <VBox/param.h> 38 38 39 #include "Pcap.h" 39 40 #include "Builtins.h" 40 41 … … 66 67 /** The lock serializing the file access. */ 67 68 RTCRITSECT Lock; 69 /** The NanoTS delta we pass to the pcap writers. */ 70 uint64_t StartNanoTS; 68 71 /** Pointer to the driver instance. */ 69 72 PPDMDRVINS pDrvIns; … … 81 84 82 85 83 /* "libpcap" magic */84 #define PCAP_MAGIC 0xa1b2c3d485 86 /* "libpcap" file header (minus magic number). */87 struct pcap_hdr88 {89 uint16_t version_major; /* major version number = 2 */90 uint16_t version_minor; /* minor version number = 4 */91 int32_t thiszone; /* GMT to local correction = 0 */92 uint32_t sigfigs; /* accuracy of timestamps = 0 */93 uint32_t snaplen; /* max length of captured packets, in octets = 0xffff */94 uint32_t network; /* data link type = 01 */95 };96 97 /* "libpcap" record header. */98 struct pcaprec_hdr99 {100 uint32_t ts_sec; /* timestamp seconds */101 uint32_t ts_usec; /* timestamp microseconds */102 uint32_t incl_len; /* number of octets of packet saved in file */103 uint32_t orig_len; /* actual length of packet */104 };105 106 struct pcaprec_hdr_init107 {108 uint32_t u32Magic;109 struct pcap_hdr pcap;110 #ifdef LOG_ENABLED111 pcaprec_hdr rec;112 #endif113 };114 115 86 116 87 /** … … 125 96 static DECLCALLBACK(int) drvNetSnifferSend(PPDMINETWORKCONNECTOR pInterface, const void *pvBuf, size_t cb) 126 97 { 127 PDRVNETSNIFFER p Data= PDMINETWORKCONNECTOR_2_DRVNETSNIFFER(pInterface);98 PDRVNETSNIFFER pThis = PDMINETWORKCONNECTOR_2_DRVNETSNIFFER(pInterface); 128 99 129 100 /* output to sniffer */ 130 struct pcaprec_hdr Hdr; 131 uint64_t u64TS = RTTimeProgramNanoTS(); 132 Hdr.ts_sec = (uint32_t)(u64TS / 1000000000); 133 Hdr.ts_usec = (uint32_t)((u64TS / 1000) % 1000000); 134 Hdr.incl_len = cb; 135 Hdr.orig_len = cb; 136 RTCritSectEnter(&pData->Lock); 137 RTFileWrite(pData->File, &Hdr, sizeof(Hdr), NULL); 138 RTFileWrite(pData->File, pvBuf, cb, NULL); 139 RTCritSectLeave(&pData->Lock); 101 RTCritSectEnter(&pThis->Lock); 102 PcapFileFrame(pThis->File, pThis->StartNanoTS, pvBuf, cb, cb); 103 RTCritSectLeave(&pThis->Lock); 140 104 141 105 /* pass down */ 142 if (p Data->pConnector)143 { 144 int rc = p Data->pConnector->pfnSend(pData->pConnector, pvBuf, cb);106 if (pThis->pConnector) 107 { 108 int rc = pThis->pConnector->pfnSend(pThis->pConnector, pvBuf, cb); 145 109 #if 0 146 RTCritSectEnter(&p Data->Lock);110 RTCritSectEnter(&pThis->Lock); 147 111 u64TS = RTTimeProgramNanoTS(); 148 112 Hdr.ts_sec = (uint32_t)(u64TS / 1000000000); 149 113 Hdr.ts_usec = (uint32_t)((u64TS / 1000) % 1000000); 150 114 Hdr.incl_len = 0; 151 RTFileWrite(p Data->File, &Hdr, sizeof(Hdr), NULL);152 RTCritSectLeave(&p Data->Lock);115 RTFileWrite(pThis->File, &Hdr, sizeof(Hdr), NULL); 116 RTCritSectLeave(&pThis->Lock); 153 117 #endif 154 118 return rc; … … 171 135 { 172 136 LogFlow(("drvNetSnifferSetPromiscuousMode: fPromiscuous=%d\n", fPromiscuous)); 173 PDRVNETSNIFFER p Data= PDMINETWORKCONNECTOR_2_DRVNETSNIFFER(pInterface);174 if (p Data->pConnector)175 p Data->pConnector->pfnSetPromiscuousMode(pData->pConnector, fPromiscuous);137 PDRVNETSNIFFER pThis = PDMINETWORKCONNECTOR_2_DRVNETSNIFFER(pInterface); 138 if (pThis->pConnector) 139 pThis->pConnector->pfnSetPromiscuousMode(pThis->pConnector, fPromiscuous); 176 140 } 177 141 … … 187 151 { 188 152 LogFlow(("drvNetSnifferNotifyLinkChanged: enmLinkState=%d\n", enmLinkState)); 189 PDRVNETSNIFFER p Data= PDMINETWORKCONNECTOR_2_DRVNETSNIFFER(pInterface);190 if (p Data->pConnector)191 p Data->pConnector->pfnNotifyLinkChanged(pData->pConnector, enmLinkState);153 PDRVNETSNIFFER pThis = PDMINETWORKCONNECTOR_2_DRVNETSNIFFER(pInterface); 154 if (pThis->pConnector) 155 pThis->pConnector->pfnNotifyLinkChanged(pThis->pConnector, enmLinkState); 192 156 } 193 157 … … 203 167 static DECLCALLBACK(int) drvNetSnifferWaitReceiveAvail(PPDMINETWORKPORT pInterface, unsigned cMillies) 204 168 { 205 PDRVNETSNIFFER p Data= PDMINETWORKPORT_2_DRVNETSNIFFER(pInterface);206 return p Data->pPort->pfnWaitReceiveAvail(pData->pPort, cMillies);169 PDRVNETSNIFFER pThis = PDMINETWORKPORT_2_DRVNETSNIFFER(pInterface); 170 return pThis->pPort->pfnWaitReceiveAvail(pThis->pPort, cMillies); 207 171 } 208 172 … … 219 183 static DECLCALLBACK(int) drvNetSnifferReceive(PPDMINETWORKPORT pInterface, const void *pvBuf, size_t cb) 220 184 { 221 PDRVNETSNIFFER p Data= PDMINETWORKPORT_2_DRVNETSNIFFER(pInterface);185 PDRVNETSNIFFER pThis = PDMINETWORKPORT_2_DRVNETSNIFFER(pInterface); 222 186 223 187 /* output to sniffer */ 224 struct pcaprec_hdr Hdr; 225 uint64_t u64TS = RTTimeProgramNanoTS(); 226 Hdr.ts_sec = (uint32_t)(u64TS / 1000000000); 227 Hdr.ts_usec = (uint32_t)((u64TS / 1000) % 1000000); 228 Hdr.incl_len = cb; 229 Hdr.orig_len = cb; 230 RTCritSectEnter(&pData->Lock); 231 RTFileWrite(pData->File, &Hdr, sizeof(Hdr), NULL); 232 RTFileWrite(pData->File, pvBuf, cb, NULL); 233 RTCritSectLeave(&pData->Lock); 188 RTCritSectEnter(&pThis->Lock); 189 PcapFileFrame(pThis->File, pThis->StartNanoTS, pvBuf, cb, cb); 190 RTCritSectLeave(&pThis->Lock); 234 191 235 192 /* pass up */ 236 int rc = p Data->pPort->pfnReceive(pData->pPort, pvBuf, cb);193 int rc = pThis->pPort->pfnReceive(pThis->pPort, pvBuf, cb); 237 194 #if 0 238 RTCritSectEnter(&p Data->Lock);195 RTCritSectEnter(&pThis->Lock); 239 196 u64TS = RTTimeProgramNanoTS(); 240 197 Hdr.ts_sec = (uint32_t)(u64TS / 1000000000); 241 198 Hdr.ts_usec = (uint32_t)((u64TS / 1000) % 1000000); 242 199 Hdr.incl_len = 0; 243 RTFileWrite(p Data->File, &Hdr, sizeof(Hdr), NULL);244 RTCritSectLeave(&p Data->Lock);200 RTFileWrite(pThis->File, &Hdr, sizeof(Hdr), NULL); 201 RTCritSectLeave(&pThis->Lock); 245 202 #endif 246 203 return rc; … … 258 215 static DECLCALLBACK(int) drvNetSnifferGetMac(PPDMINETWORKCONFIG pInterface, PPDMMAC pMac) 259 216 { 260 PDRVNETSNIFFER p Data= PDMINETWORKCONFIG_2_DRVNETSNIFFER(pInterface);261 return p Data->pConfig->pfnGetMac(pData->pConfig, pMac);217 PDRVNETSNIFFER pThis = PDMINETWORKCONFIG_2_DRVNETSNIFFER(pInterface); 218 return pThis->pConfig->pfnGetMac(pThis->pConfig, pMac); 262 219 } 263 220 … … 271 228 static DECLCALLBACK(PDMNETWORKLINKSTATE) drvNetSnifferGetLinkState(PPDMINETWORKCONFIG pInterface) 272 229 { 273 PDRVNETSNIFFER p Data= PDMINETWORKCONFIG_2_DRVNETSNIFFER(pInterface);274 return p Data->pConfig->pfnGetLinkState(pData->pConfig);230 PDRVNETSNIFFER pThis = PDMINETWORKCONFIG_2_DRVNETSNIFFER(pInterface); 231 return pThis->pConfig->pfnGetLinkState(pThis->pConfig); 275 232 } 276 233 … … 285 242 static DECLCALLBACK(int) drvNetSnifferSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) 286 243 { 287 PDRVNETSNIFFER p Data= PDMINETWORKCONFIG_2_DRVNETSNIFFER(pInterface);288 return p Data->pConfig->pfnSetLinkState(pData->pConfig, enmState);244 PDRVNETSNIFFER pThis = PDMINETWORKCONFIG_2_DRVNETSNIFFER(pInterface); 245 return pThis->pConfig->pfnSetLinkState(pThis->pConfig, enmState); 289 246 } 290 247 … … 302 259 { 303 260 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface); 304 PDRVNETSNIFFER p Data= PDMINS2DATA(pDrvIns, PDRVNETSNIFFER);261 PDRVNETSNIFFER pThis = PDMINS2DATA(pDrvIns, PDRVNETSNIFFER); 305 262 switch (enmInterface) 306 263 { … … 308 265 return &pDrvIns->IBase; 309 266 case PDMINTERFACE_NETWORK_CONNECTOR: 310 return &p Data->INetworkConnector;267 return &pThis->INetworkConnector; 311 268 case PDMINTERFACE_NETWORK_PORT: 312 return &p Data->INetworkPort;269 return &pThis->INetworkPort; 313 270 case PDMINTERFACE_NETWORK_CONFIG: 314 return &p Data->INetworkConfig;271 return &pThis->INetworkConfig; 315 272 default: 316 273 return NULL; … … 329 286 static DECLCALLBACK(void) drvNetSnifferDestruct(PPDMDRVINS pDrvIns) 330 287 { 331 PDRVNETSNIFFER p Data= PDMINS2DATA(pDrvIns, PDRVNETSNIFFER);332 333 if (RTCritSectIsInitialized(&p Data->Lock))334 RTCritSectDelete(&p Data->Lock);335 336 if (p Data->File != NIL_RTFILE)337 { 338 RTFileClose(p Data->File);339 p Data->File = NIL_RTFILE;288 PDRVNETSNIFFER pThis = PDMINS2DATA(pDrvIns, PDRVNETSNIFFER); 289 290 if (RTCritSectIsInitialized(&pThis->Lock)) 291 RTCritSectDelete(&pThis->Lock); 292 293 if (pThis->File != NIL_RTFILE) 294 { 295 RTFileClose(pThis->File); 296 pThis->File = NIL_RTFILE; 340 297 } 341 298 } … … 354 311 static DECLCALLBACK(int) drvNetSnifferConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle) 355 312 { 356 PDRVNETSNIFFER p Data= PDMINS2DATA(pDrvIns, PDRVNETSNIFFER);313 PDRVNETSNIFFER pThis = PDMINS2DATA(pDrvIns, PDRVNETSNIFFER); 357 314 LogFlow(("drvNetSnifferConstruct:\n")); 358 315 … … 366 323 * Init the static parts. 367 324 */ 368 pData->pDrvIns = pDrvIns; 369 pData->File = NIL_RTFILE; 325 pThis->pDrvIns = pDrvIns; 326 pThis->File = NIL_RTFILE; 327 pThis->StartNanoTS = /*RTTimeProgramNanoTS() - */ RTTimeNanoTS(); 370 328 /* IBase */ 371 329 pDrvIns->IBase.pfnQueryInterface = drvNetSnifferQueryInterface; 372 330 /* INetworkConnector */ 373 p Data->INetworkConnector.pfnSend = drvNetSnifferSend;374 p Data->INetworkConnector.pfnSetPromiscuousMode = drvNetSnifferSetPromiscuousMode;375 p Data->INetworkConnector.pfnNotifyLinkChanged = drvNetSnifferNotifyLinkChanged;331 pThis->INetworkConnector.pfnSend = drvNetSnifferSend; 332 pThis->INetworkConnector.pfnSetPromiscuousMode = drvNetSnifferSetPromiscuousMode; 333 pThis->INetworkConnector.pfnNotifyLinkChanged = drvNetSnifferNotifyLinkChanged; 376 334 /* INetworkPort */ 377 p Data->INetworkPort.pfnWaitReceiveAvail = drvNetSnifferWaitReceiveAvail;378 p Data->INetworkPort.pfnReceive = drvNetSnifferReceive;335 pThis->INetworkPort.pfnWaitReceiveAvail = drvNetSnifferWaitReceiveAvail; 336 pThis->INetworkPort.pfnReceive = drvNetSnifferReceive; 379 337 /* INetworkConfig */ 380 p Data->INetworkConfig.pfnGetMac = drvNetSnifferGetMac;381 p Data->INetworkConfig.pfnGetLinkState = drvNetSnifferGetLinkState;382 p Data->INetworkConfig.pfnSetLinkState = drvNetSnifferSetLinkState;338 pThis->INetworkConfig.pfnGetMac = drvNetSnifferGetMac; 339 pThis->INetworkConfig.pfnGetLinkState = drvNetSnifferGetLinkState; 340 pThis->INetworkConfig.pfnSetLinkState = drvNetSnifferSetLinkState; 383 341 384 342 /* 385 343 * Get the filename. 386 344 */ 387 int rc = CFGMR3QueryString(pCfgHandle, "File", p Data->szFilename, sizeof(pData->szFilename));345 int rc = CFGMR3QueryString(pCfgHandle, "File", pThis->szFilename, sizeof(pThis->szFilename)); 388 346 if (rc == VERR_CFGM_VALUE_NOT_FOUND) 389 RTStrPrintf(p Data->szFilename, sizeof(pData->szFilename), "./VBox-%x.pcap", RTProcSelf());347 RTStrPrintf(pThis->szFilename, sizeof(pThis->szFilename), "./VBox-%x.pcap", RTProcSelf()); 390 348 else if (VBOX_FAILURE(rc)) 391 349 { … … 397 355 * Query the network port interface. 398 356 */ 399 p Data->pPort = (PPDMINETWORKPORT)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMINTERFACE_NETWORK_PORT);400 if (!p Data->pPort)357 pThis->pPort = (PPDMINETWORKPORT)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMINTERFACE_NETWORK_PORT); 358 if (!pThis->pPort) 401 359 { 402 360 AssertMsgFailed(("Configuration error: the above device/driver didn't export the network port interface!\n")); … … 407 365 * Query the network config interface. 408 366 */ 409 p Data->pConfig = (PPDMINETWORKCONFIG)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMINTERFACE_NETWORK_CONFIG);410 if (!p Data->pConfig)367 pThis->pConfig = (PPDMINETWORKCONFIG)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMINTERFACE_NETWORK_CONFIG); 368 if (!pThis->pConfig) 411 369 { 412 370 AssertMsgFailed(("Configuration error: the above device/driver didn't export the network config interface!\n")); … … 420 378 rc = pDrvIns->pDrvHlp->pfnAttach(pDrvIns, &pBaseDown); 421 379 if (rc == VERR_PDM_NO_ATTACHED_DRIVER) 422 p Data->pConnector = NULL;380 pThis->pConnector = NULL; 423 381 else if (VBOX_SUCCESS(rc)) 424 382 { 425 p Data->pConnector = (PPDMINETWORKCONNECTOR)pBaseDown->pfnQueryInterface(pBaseDown, PDMINTERFACE_NETWORK_CONNECTOR);426 if (!p Data->pConnector)383 pThis->pConnector = (PPDMINETWORKCONNECTOR)pBaseDown->pfnQueryInterface(pBaseDown, PDMINTERFACE_NETWORK_CONNECTOR); 384 if (!pThis->pConnector) 427 385 { 428 386 AssertMsgFailed(("Configuration error: the driver below didn't export the network connector interface!\n")); … … 439 397 * Create the lock. 440 398 */ 441 rc = RTCritSectInit(&p Data->Lock);399 rc = RTCritSectInit(&pThis->Lock); 442 400 if (VBOX_FAILURE(rc)) 443 401 return rc; … … 446 404 * Open output file / pipe. 447 405 */ 448 rc = RTFileOpen(&p Data->File, pData->szFilename,406 rc = RTFileOpen(&pThis->File, pThis->szFilename, 449 407 RTFILE_O_WRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_WRITE); 450 408 if (VBOX_FAILURE(rc)) 451 409 { 452 AssertMsgFailed(("Failed to create file '%s' for writing. rc=%Vrc\n", p Data->szFilename, rc));410 AssertMsgFailed(("Failed to create file '%s' for writing. rc=%Vrc\n", pThis->szFilename, rc)); 453 411 return rc; 454 412 } … … 457 415 * Write pcap header. 458 416 */ 459 #ifdef LOG_ENABLED 460 pcaprec_hdr_init Hdr = 461 { 462 PCAP_MAGIC, 463 { 2, 4, 0, 0, 0xffff, 1 }, 464 { 0, 1, 0, 60} 465 }; /* force ethereal to start at 0.000000. */ 466 #else 467 pcaprec_hdr_init Hdr = 468 { 469 PCAP_MAGIC, 470 { 2, 4, 0, 0, 0xffff, 1 } 471 }; /* this is just to make it happy, not to be correct. */ 472 #endif 473 474 RTFileWrite(pData->File, &Hdr, sizeof(Hdr), NULL); 417 PcapFileHdr(pThis->File, pThis->StartNanoTS); 475 418 476 419 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.