Changeset 66164 in vbox
- Timestamp:
- Mar 20, 2017 10:47:58 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 114073
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp
r66065 r66164 31 31 32 32 #include "VSCSIInternal.h" 33 34 /********************************************************************************************************************************* 35 * Structures and Typedefs * 36 *********************************************************************************************************************************/ 33 37 34 38 /** … … 79 83 } VSCSILUNMMC, *PVSCSILUNMMC; 80 84 85 86 /** 87 * Callback to fill a feature for a GET CONFIGURATION request. 88 * 89 * @returns Number of bytes used for this feature in the buffer. 90 * @param pbBuf The buffer to use. 91 * @param cbBuf Size of the buffer. 92 */ 93 typedef DECLCALLBACK(size_t) FNVSCSILUNMMCFILLFEATURE(uint8_t *pbBuf, size_t cbBuf); 94 /** Pointer to a fill feature callback. */ 95 typedef FNVSCSILUNMMCFILLFEATURE *PFNVSCSILUNMMCFILLFEATURE; 96 97 /** 98 * VSCSI MMC feature descriptor. 99 */ 100 typedef struct VSCSILUNMMCFEATURE 101 { 102 /** The feature number. */ 103 uint16_t u16Feat; 104 /** The callback to call for this feature. */ 105 PFNVSCSILUNMMCFILLFEATURE pfnFeatureFill; 106 } VSCSILUNMMCFEATURE; 107 /** Pointer to a VSCSI MMC feature descriptor. */ 108 typedef VSCSILUNMMCFEATURE *PVSCSILUNMMCFEATURE; 109 /** Pointer to a const VSCSI MMC feature descriptor. */ 110 typedef const VSCSILUNMMCFEATURE *PCVSCSILUNMMCFEATURE; 111 112 113 114 /********************************************************************************************************************************* 115 * Internal Functions * 116 *********************************************************************************************************************************/ 117 RT_C_DECLS_BEGIN 118 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureListProfiles(uint8_t *pbBuf, size_t cbBuf); 119 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCore(uint8_t *pbBuf, size_t cbBuf); 120 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureMorphing(uint8_t *pbBuf, size_t cbBuf); 121 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(uint8_t *pbBuf, size_t cbBuf); 122 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRandomReadable(uint8_t *pbBuf, size_t cbBuf); 123 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCDRead(uint8_t *pbBuf, size_t cbBuf); 124 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeaturePowerManagement(uint8_t *pbBuf, size_t cbBuf); 125 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureTimeout(uint8_t *pbBuf, size_t cbBuf); 126 RT_C_DECLS_END 127 128 /** 129 * List of supported MMC features. 130 */ 131 static const VSCSILUNMMCFEATURE g_aVScsiMmcFeatures[] = 132 { 133 { 0x0000, vscsiLunMmcGetConfigurationFillFeatureListProfiles}, 134 { 0x0001, vscsiLunMmcGetConfigurationFillFeatureCore}, 135 { 0x0002, vscsiLunMmcGetConfigurationFillFeatureMorphing}, 136 { 0x0003, vscsiLunMmcGetConfigurationFillFeatureRemovableMedium}, 137 { 0x0010, vscsiLunMmcGetConfigurationFillFeatureRandomReadable}, 138 { 0x001e, vscsiLunMmcGetConfigurationFillFeatureCDRead}, 139 { 0x0100, vscsiLunMmcGetConfigurationFillFeaturePowerManagement}, 140 { 0x0105, vscsiLunMmcGetConfigurationFillFeatureTimeout} 141 }; 81 142 82 143 /* Fabricate normal TOC information. */ … … 264 325 } 265 326 266 static size_tvscsiLunMmcGetConfigurationFillFeatureListProfiles(uint8_t *pbBuf, size_t cbBuf)327 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureListProfiles(uint8_t *pbBuf, size_t cbBuf) 267 328 { 268 329 if (cbBuf < 3*4) … … 282 343 } 283 344 284 static size_tvscsiLunMmcGetConfigurationFillFeatureCore(uint8_t *pbBuf, size_t cbBuf)345 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCore(uint8_t *pbBuf, size_t cbBuf) 285 346 { 286 347 if (cbBuf < 12) … … 297 358 } 298 359 299 static size_tvscsiLunMmcGetConfigurationFillFeatureMorphing(uint8_t *pbBuf, size_t cbBuf)360 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureMorphing(uint8_t *pbBuf, size_t cbBuf) 300 361 { 301 362 if (cbBuf < 8) … … 311 372 } 312 373 313 static size_tvscsiLunMmcGetConfigurationFillFeatureRemovableMedium(uint8_t *pbBuf, size_t cbBuf)374 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(uint8_t *pbBuf, size_t cbBuf) 314 375 { 315 376 if (cbBuf < 8) … … 326 387 } 327 388 328 static size_tvscsiLunMmcGetConfigurationFillFeatureRandomReadable(uint8_t *pbBuf, size_t cbBuf)389 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureRandomReadable(uint8_t *pbBuf, size_t cbBuf) 329 390 { 330 391 if (cbBuf < 12) … … 342 403 } 343 404 344 static size_tvscsiLunMmcGetConfigurationFillFeatureCDRead(uint8_t *pbBuf, size_t cbBuf)405 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureCDRead(uint8_t *pbBuf, size_t cbBuf) 345 406 { 346 407 if (cbBuf < 8) … … 356 417 } 357 418 358 static size_tvscsiLunMmcGetConfigurationFillFeaturePowerManagement(uint8_t *pbBuf, size_t cbBuf)419 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeaturePowerManagement(uint8_t *pbBuf, size_t cbBuf) 359 420 { 360 421 if (cbBuf < 4) … … 368 429 } 369 430 370 static size_tvscsiLunMmcGetConfigurationFillFeatureTimeout(uint8_t *pbBuf, size_t cbBuf)431 static DECLCALLBACK(size_t) vscsiLunMmcGetConfigurationFillFeatureTimeout(uint8_t *pbBuf, size_t cbBuf) 371 432 { 372 433 if (cbBuf < 8) … … 395 456 size_t cbBuf = sizeof(aReply); 396 457 size_t cbCopied = 0; 397 398 /* Accept valid request types only, and only starting feature 0. */ 399 if ((pVScsiReq->pbCDB[1] & 0x03) == 3 || scsiBE2H_U16(&pVScsiReq->pbCDB[2]) != 0) 458 uint16_t u16Sfn = scsiBE2H_U16(&pVScsiReq->pbCDB[2]); 459 uint8_t u8Rt = pVScsiReq->pbCDB[1] & 0x03; 460 461 /* Accept valid request types only. */ 462 if (u8Rt == 3) 400 463 return vscsiLunReqSenseErrorSet(&pVScsiLunMmc->Core, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, 401 464 SCSI_ASC_INV_FIELD_IN_CMD_PACKET, 0x00); … … 410 473 pbBuf += 8; 411 474 412 cbCopied = vscsiLunMmcGetConfigurationFillFeatureListProfiles(pbBuf, cbBuf); 413 cbBuf -= cbCopied; 414 pbBuf += cbCopied; 415 416 cbCopied = vscsiLunMmcGetConfigurationFillFeatureCore(pbBuf, cbBuf); 417 cbBuf -= cbCopied; 418 pbBuf += cbCopied; 419 420 cbCopied = vscsiLunMmcGetConfigurationFillFeatureMorphing(pbBuf, cbBuf); 421 cbBuf -= cbCopied; 422 pbBuf += cbCopied; 423 424 cbCopied = vscsiLunMmcGetConfigurationFillFeatureRemovableMedium(pbBuf, cbBuf); 425 cbBuf -= cbCopied; 426 pbBuf += cbCopied; 427 428 cbCopied = vscsiLunMmcGetConfigurationFillFeatureRandomReadable(pbBuf, cbBuf); 429 cbBuf -= cbCopied; 430 pbBuf += cbCopied; 431 432 cbCopied = vscsiLunMmcGetConfigurationFillFeatureCDRead(pbBuf, cbBuf); 433 cbBuf -= cbCopied; 434 pbBuf += cbCopied; 435 436 cbCopied = vscsiLunMmcGetConfigurationFillFeaturePowerManagement(pbBuf, cbBuf); 437 cbBuf -= cbCopied; 438 pbBuf += cbCopied; 439 440 cbCopied = vscsiLunMmcGetConfigurationFillFeatureTimeout(pbBuf, cbBuf); 441 cbBuf -= cbCopied; 442 pbBuf += cbCopied; 475 if (u8Rt == 0x2) 476 { 477 for (uint32_t i = 0; i < RT_ELEMENTS(g_aVScsiMmcFeatures); i++) 478 { 479 if (g_aVScsiMmcFeatures[i].u16Feat == u16Sfn) 480 { 481 cbCopied = g_aVScsiMmcFeatures[i].pfnFeatureFill(pbBuf, cbBuf); 482 cbBuf -= cbCopied; 483 pbBuf += cbCopied; 484 break; 485 } 486 } 487 } 488 else 489 { 490 for (uint32_t i = 0; i < RT_ELEMENTS(g_aVScsiMmcFeatures); i++) 491 { 492 if (g_aVScsiMmcFeatures[i].u16Feat > u16Sfn) 493 { 494 cbCopied = g_aVScsiMmcFeatures[i].pfnFeatureFill(pbBuf, cbBuf); 495 cbBuf -= cbCopied; 496 pbBuf += cbCopied; 497 } 498 } 499 } 443 500 444 501 /* Set data length now. */
Note:
See TracChangeset
for help on using the changeset viewer.