- Timestamp:
- Oct 15, 2014 12:09:51 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 96562
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/USB/VUSBSniffer.cpp
r53014 r53060 221 221 typedef DumpFileUsbHeaderLnxMmapped *PDumpFileUsbHeaderLnxMmapped; 222 222 223 AssertCompileSize(DumpFileUsbHeaderLnxMmapped, 64); 224 223 225 /** 224 226 * USB packet isochronous descriptor. … … 291 293 292 294 /** 295 * Adds new data to the current block. 296 * 297 * @returns VBox status code. 298 * @param pThis The VUSB sniffer instance. 299 * @param pvData The data to add. 300 * @param cbData Amount of data to add. 301 */ 302 static int vusbSnifferBlockAddData(PVUSBSNIFFERINT pThis, const void *pvData, uint32_t cbData) 303 { 304 int rc = VINF_SUCCESS; 305 306 Assert(pThis->cbBlockCur); 307 AssertPtr(pThis->pBlockHdr); 308 309 void *pv = vusbSnifferBlockAllocSpace(pThis, cbData); 310 if (pv) 311 memcpy(pv, pvData, cbData); 312 else 313 rc = VERR_NO_MEMORY; 314 315 return rc; 316 } 317 318 /** 293 319 * Commits the current block to the capture file. 294 320 * … … 302 328 AssertPtr(pThis->pBlockHdr); 303 329 304 /* Update the block total length field. */ 305 uint32_t *pcbTotalLength = (uint32_t *)vusbSnifferBlockAllocSpace(pThis, 4); 306 if (pcbTotalLength) 307 { 308 *pcbTotalLength = pThis->cbBlockCur; 309 pThis->pBlockHdr->u32BlockTotalLength = pThis->cbBlockCur; 310 311 /* Write the data. */ 312 rc = RTFileWrite(pThis->hFile, pThis->pbBlockData, pThis->cbBlockCur, NULL); 313 pThis->cbBlockCur = 0; 314 pThis->pBlockHdr = NULL; 315 } 316 else 317 rc = VERR_NO_MEMORY; 330 /* Pad to 32bits. */ 331 uint8_t abPad[3] = { 0 }; 332 uint32_t cbPad = RT_ALIGN_32(pThis->cbBlockCur, 4) - pThis->cbBlockCur; 333 334 Assert(cbPad <= 3); 335 if (cbPad) 336 rc = vusbSnifferBlockAddData(pThis, abPad, cbPad); 337 338 if (RT_SUCCESS(rc)) 339 { 340 /* Update the block total length field. */ 341 uint32_t *pcbTotalLength = (uint32_t *)vusbSnifferBlockAllocSpace(pThis, 4); 342 if (pcbTotalLength) 343 { 344 *pcbTotalLength = pThis->cbBlockCur; 345 pThis->pBlockHdr->u32BlockTotalLength = pThis->cbBlockCur; 346 347 /* Write the data. */ 348 rc = RTFileWrite(pThis->hFile, pThis->pbBlockData, pThis->cbBlockCur, NULL); 349 pThis->cbBlockCur = 0; 350 pThis->pBlockHdr = NULL; 351 } 352 else 353 rc = VERR_NO_MEMORY; 354 } 318 355 319 356 return rc; … … 338 375 if (pThis->pBlockHdr) 339 376 memcpy(pThis->pBlockHdr, pBlockHdr, cbData); 340 else341 rc = VERR_NO_MEMORY;342 343 return rc;344 }345 346 /**347 * Adds new data to the current block.348 *349 * @returns VBox status code.350 * @param pThis The VUSB sniffer instance.351 * @param pvData The data to add.352 * @param cbData Amount of data to add.353 */354 static int vusbSnifferBlockAddData(PVUSBSNIFFERINT pThis, const void *pvData, uint32_t cbData)355 {356 int rc = VINF_SUCCESS;357 358 Assert(pThis->cbBlockCur);359 AssertPtr(pThis->pBlockHdr);360 361 void *pv = vusbSnifferBlockAllocSpace(pThis, cbData);362 if (pv)363 memcpy(pv, pvData, cbData);364 377 else 365 378 rc = VERR_NO_MEMORY; … … 562 575 Epb.u32TimestampHigh = (u64TimestampEvent >> 32) & UINT32_C(0xffffffff); 563 576 Epb.u32TimestampLow = u64TimestampEvent & UINT32_C(0xffffffff); 564 Epb.u32CapturedLen = sizeof(UsbHdr) + pUrb->cbData;565 Epb.u32PacketLen = sizeof(UsbHdr) + pUrb->cbData;566 577 567 578 UsbHdr.u64Id = (uint64_t)pUrb; /** @todo: check whether the pointer is a good ID. */ … … 601 612 602 613 bool fRecordData = false; 614 size_t cbUrbLength = 0; 603 615 604 616 if ( pUrb->cbData … … 609 621 || ( pUrb->enmDir == VUSBDIRECTION_IN 610 622 && enmEvent == VUSBSNIFFEREVENT_COMPLETE))) 623 { 624 Epb.u32CapturedLen = sizeof(UsbHdr) + pUrb->cbData; 625 Epb.u32PacketLen = sizeof(UsbHdr) + pUrb->cbData; 611 626 fRecordData = true; 612 613 UsbHdr.u8EndpointNumber = pUrb->EndPt | pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0x00; 627 } 628 else 629 { 630 Epb.u32CapturedLen = sizeof(UsbHdr); 631 Epb.u32PacketLen = sizeof(UsbHdr); 632 } 633 634 if (pUrb->enmType == VUSBXFERTYPE_MSG || pUrb->enmType == VUSBXFERTYPE_CTRL) 635 { 636 PVUSBSETUP pSetup = (PVUSBSETUP)pUrb->abData; 637 cbUrbLength = pSetup->wLength; 638 } 639 else 640 cbUrbLength = pUrb->cbData; 641 642 UsbHdr.u8EndpointNumber = pUrb->EndPt | (pUrb->enmDir == VUSBDIRECTION_IN ? 0x80 : 0x00); 614 643 UsbHdr.u8DeviceAddress = pUrb->DstAddress; 615 644 UsbHdr.u16BusId = 0; 616 UsbHdr.u8SetupFlag = pUrb->enmType == VUSBXFERTYPE_MSG || pUrb->enmType == VUSBXFERTYPE_CTRL ? 0 : 1;617 645 UsbHdr.u8DataFlag = fRecordData ? 0 : 1; 618 646 UsbHdr.u64TimestampSec = u64TimestampEvent / RT_NS_1SEC_64;; 619 647 UsbHdr.u32TimestampUSec = u64TimestampEvent / RT_NS_1US_64 - UsbHdr.u64TimestampSec * RT_US_1SEC; 620 648 UsbHdr.i32Status = pUrb->enmStatus; 621 UsbHdr.u32UrbLength = pUrb->cbData;649 UsbHdr.u32UrbLength = cbUrbLength; 622 650 UsbHdr.u32DataLength = fRecordData ? pUrb->cbData : 0; 623 651 UsbHdr.i32Interval = 0; 624 652 UsbHdr.i32StartFrame = 0; 625 653 UsbHdr.u32XferFlags = 0; 626 UsbHdr.u32NumDesc = pUrb->enmType == VUSBXFERTYPE_ISOC ? : 0;627 628 if ( pUrb->enmType == VUSBXFERTYPE_CTRL629 || pUrb->enmType == VUSBXFERTYPE_MSG)654 UsbHdr.u32NumDesc = pUrb->enmType == VUSBXFERTYPE_ISOC ? pUrb->cIsocPkts : 0; 655 656 if ( (pUrb->enmType == VUSBXFERTYPE_MSG || pUrb->enmType == VUSBXFERTYPE_CTRL) 657 && enmEvent == VUSBSNIFFEREVENT_SUBMIT) 630 658 { 631 659 PVUSBSETUP pSetup = (PVUSBSETUP)pUrb->abData; … … 636 664 UsbHdr.u.UsbSetup.wIndex = pSetup->wIndex; 637 665 UsbHdr.u.UsbSetup.wLength = pSetup->wLength; 638 } 666 UsbHdr.u8SetupFlag = 0; 667 } 668 else 669 UsbHdr.u8SetupFlag = '-'; /* Follow usbmon source here. */ 639 670 640 671 rc = vusbSnifferBlockNew(pThis, &Epb.Hdr, sizeof(Epb)); … … 642 673 rc = vusbSnifferBlockAddData(pThis, &UsbHdr, sizeof(UsbHdr)); 643 674 644 /* Add Isochronous descriptors now. */ 645 for (unsigned i = 0; i < pUrb->cIsocPkts && RT_SUCCESS(rc); i++) 646 { 647 DumpFileUsbIsoDesc IsoDesc; 648 IsoDesc.i32Status = pUrb->aIsocPkts[i].enmStatus; 649 IsoDesc.u32Offset = pUrb->aIsocPkts[i].off; 650 IsoDesc.u32Len = pUrb->aIsocPkts[i].cb; 651 rc = vusbSnifferBlockAddData(pThis, &IsoDesc, sizeof(IsoDesc)); 675 if (pUrb->enmType == VUSBXFERTYPE_ISOC) 676 { 677 /* Add Isochronous descriptors now. */ 678 for (unsigned i = 0; i < pUrb->cIsocPkts && RT_SUCCESS(rc); i++) 679 { 680 DumpFileUsbIsoDesc IsoDesc; 681 IsoDesc.i32Status = pUrb->aIsocPkts[i].enmStatus; 682 IsoDesc.u32Offset = pUrb->aIsocPkts[i].off; 683 IsoDesc.u32Len = pUrb->aIsocPkts[i].cb; 684 rc = vusbSnifferBlockAddData(pThis, &IsoDesc, sizeof(IsoDesc)); 685 } 652 686 } 653 687 … … 658 692 659 693 if (RT_SUCCESS(rc)) 694 rc = vusbSnifferAddOption(pThis, DUMPFILE_OPTION_CODE_END, NULL, 0); 695 696 if (RT_SUCCESS(rc)) 660 697 rc = vusbSnifferBlockCommit(pThis); 661 698
Note:
See TracChangeset
for help on using the changeset viewer.