65697a26b524640b83828b715160c798c43a0424vboxsync/* $Id$ */
65697a26b524640b83828b715160c798c43a0424vboxsync/** @file
65697a26b524640b83828b715160c798c43a0424vboxsync * Virtual SCSI driver: VPD page pool
65697a26b524640b83828b715160c798c43a0424vboxsync */
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync/*
65697a26b524640b83828b715160c798c43a0424vboxsync * Copyright (C) 2011 Oracle Corporation
65697a26b524640b83828b715160c798c43a0424vboxsync *
65697a26b524640b83828b715160c798c43a0424vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
65697a26b524640b83828b715160c798c43a0424vboxsync * available from http://www.virtualbox.org. This file is free software;
65697a26b524640b83828b715160c798c43a0424vboxsync * you can redistribute it and/or modify it under the terms of the GNU
65697a26b524640b83828b715160c798c43a0424vboxsync * General Public License (GPL) as published by the Free Software
65697a26b524640b83828b715160c798c43a0424vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
65697a26b524640b83828b715160c798c43a0424vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
65697a26b524640b83828b715160c798c43a0424vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
65697a26b524640b83828b715160c798c43a0424vboxsync */
65697a26b524640b83828b715160c798c43a0424vboxsync/*******************************************************************************
65697a26b524640b83828b715160c798c43a0424vboxsync* Header Files *
65697a26b524640b83828b715160c798c43a0424vboxsync*******************************************************************************/
65697a26b524640b83828b715160c798c43a0424vboxsync#define LOG_GROUP LOG_GROUP_VSCSI
65697a26b524640b83828b715160c798c43a0424vboxsync#include <VBox/log.h>
65697a26b524640b83828b715160c798c43a0424vboxsync#include <VBox/err.h>
65697a26b524640b83828b715160c798c43a0424vboxsync#include <iprt/mem.h>
65697a26b524640b83828b715160c798c43a0424vboxsync#include <iprt/assert.h>
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync#include "VSCSIInternal.h"
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync/*******************************************************************************
65697a26b524640b83828b715160c798c43a0424vboxsync* Structures and Typedefs *
65697a26b524640b83828b715160c798c43a0424vboxsync*******************************************************************************/
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync/**
65697a26b524640b83828b715160c798c43a0424vboxsync * A VSCSI VPD page.
65697a26b524640b83828b715160c798c43a0424vboxsync */
65697a26b524640b83828b715160c798c43a0424vboxsynctypedef struct VSCSIVPDPAGE
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync /** List node. */
65697a26b524640b83828b715160c798c43a0424vboxsync RTLISTNODE NodePages;
65697a26b524640b83828b715160c798c43a0424vboxsync /** Page size. */
65697a26b524640b83828b715160c798c43a0424vboxsync size_t cbPage;
65697a26b524640b83828b715160c798c43a0424vboxsync /** Page data - variable size. */
65697a26b524640b83828b715160c798c43a0424vboxsync uint8_t abPage[1];
65697a26b524640b83828b715160c798c43a0424vboxsync} VSCSIVPDPAGE;
65697a26b524640b83828b715160c798c43a0424vboxsync/** Pointer to a VPD page. */
65697a26b524640b83828b715160c798c43a0424vboxsynctypedef VSCSIVPDPAGE *PVSCSIVPDPAGE;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync/*******************************************************************************
65697a26b524640b83828b715160c798c43a0424vboxsync* Internal Functions *
65697a26b524640b83828b715160c798c43a0424vboxsync*******************************************************************************/
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsyncint vscsiVpdPagePoolInit(PVSCSIVPDPOOL pVScsiVpdPool)
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync RTListInit(&pVScsiVpdPool->ListPages);
65697a26b524640b83828b715160c798c43a0424vboxsync return VINF_SUCCESS;
65697a26b524640b83828b715160c798c43a0424vboxsync}
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsyncvoid vscsiVpdPagePoolDestroy(PVSCSIVPDPOOL pVScsiVpdPool)
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync PVSCSIVPDPAGE pIt, pItNext;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync RTListForEachSafe(&pVScsiVpdPool->ListPages, pIt, pItNext, VSCSIVPDPAGE, NodePages)
65697a26b524640b83828b715160c798c43a0424vboxsync {
65697a26b524640b83828b715160c798c43a0424vboxsync RTListNodeRemove(&pIt->NodePages);
65697a26b524640b83828b715160c798c43a0424vboxsync RTMemFree(pIt);
65697a26b524640b83828b715160c798c43a0424vboxsync }
65697a26b524640b83828b715160c798c43a0424vboxsync}
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsyncint vscsiVpdPagePoolAllocNewPage(PVSCSIVPDPOOL pVScsiVpdPool, uint8_t uPage, size_t cbPage, uint8_t **ppbPage)
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync int rc = VINF_SUCCESS;
65697a26b524640b83828b715160c798c43a0424vboxsync PVSCSIVPDPAGE pPage;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync /* Check that the page doesn't exist already. */
65697a26b524640b83828b715160c798c43a0424vboxsync RTListForEach(&pVScsiVpdPool->ListPages, pPage, VSCSIVPDPAGE, NodePages)
65697a26b524640b83828b715160c798c43a0424vboxsync {
65697a26b524640b83828b715160c798c43a0424vboxsync if (pPage->abPage[1] == uPage)
65697a26b524640b83828b715160c798c43a0424vboxsync return VERR_ALREADY_EXISTS;
65697a26b524640b83828b715160c798c43a0424vboxsync }
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync pPage = (PVSCSIVPDPAGE)RTMemAllocZ(RT_OFFSETOF(VSCSIVPDPAGE, abPage[cbPage]));
65697a26b524640b83828b715160c798c43a0424vboxsync if (pPage)
65697a26b524640b83828b715160c798c43a0424vboxsync {
65697a26b524640b83828b715160c798c43a0424vboxsync pPage->cbPage = cbPage;
65697a26b524640b83828b715160c798c43a0424vboxsync pPage->abPage[1] = uPage;
65697a26b524640b83828b715160c798c43a0424vboxsync RTListAppend(&pVScsiVpdPool->ListPages, &pPage->NodePages);
65697a26b524640b83828b715160c798c43a0424vboxsync *ppbPage = &pPage->abPage[0];
65697a26b524640b83828b715160c798c43a0424vboxsync }
65697a26b524640b83828b715160c798c43a0424vboxsync else
65697a26b524640b83828b715160c798c43a0424vboxsync rc = VERR_NO_MEMORY;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync return rc;
65697a26b524640b83828b715160c798c43a0424vboxsync}
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsyncint vscsiVpdPagePoolQueryPage(PVSCSIVPDPOOL pVScsiVpdPool, PVSCSIREQINT pVScsiReq, uint8_t uPage)
65697a26b524640b83828b715160c798c43a0424vboxsync{
65697a26b524640b83828b715160c798c43a0424vboxsync PVSCSIVPDPAGE pPage;
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync /* Check that the page doesn't exist already. */
65697a26b524640b83828b715160c798c43a0424vboxsync RTListForEach(&pVScsiVpdPool->ListPages, pPage, VSCSIVPDPAGE, NodePages)
65697a26b524640b83828b715160c798c43a0424vboxsync {
65697a26b524640b83828b715160c798c43a0424vboxsync if (pPage->abPage[1] == uPage)
65697a26b524640b83828b715160c798c43a0424vboxsync {
65697a26b524640b83828b715160c798c43a0424vboxsync RTSgBufCopyFromBuf(&pVScsiReq->SgBuf, &pPage->abPage[0], pPage->cbPage);
65697a26b524640b83828b715160c798c43a0424vboxsync return VINF_SUCCESS;
65697a26b524640b83828b715160c798c43a0424vboxsync }
65697a26b524640b83828b715160c798c43a0424vboxsync }
65697a26b524640b83828b715160c798c43a0424vboxsync
65697a26b524640b83828b715160c798c43a0424vboxsync return VERR_NOT_FOUND;
65697a26b524640b83828b715160c798c43a0424vboxsync}
65697a26b524640b83828b715160c798c43a0424vboxsync