diff options
Diffstat (limited to 'mobicore/MobiCoreDriverLib/ClientLib/Session.h')
-rw-r--r-- | mobicore/MobiCoreDriverLib/ClientLib/Session.h | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/mobicore/MobiCoreDriverLib/ClientLib/Session.h b/mobicore/MobiCoreDriverLib/ClientLib/Session.h new file mode 100644 index 0000000..1f3529e --- /dev/null +++ b/mobicore/MobiCoreDriverLib/ClientLib/Session.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2013-2014 TRUSTONIC LIMITED + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the TRUSTONIC LIMITED nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SESSION_H_ +#define SESSION_H_ + +#include <stdint.h> +#include <list> + +#include "mc_linux.h" +#include "Connection.h" +#include "CMcKMod.h" +#include "CMutex.h" + + +class BulkBufferDescriptor +{ +public: + addr_t virtAddr; /**< The virtual address of the Bulk buffer*/ + uint32_t sVirtualAddr; /**< The secure virtual address of the Bulk buffer*/ + uint32_t len; /**< Length of the Bulk buffer*/ + uint32_t handle; + + BulkBufferDescriptor( + addr_t virtAddr, + uint32_t sVirtAddr, + uint32_t len, + uint32_t handle + ) : + virtAddr(virtAddr), + sVirtualAddr(sVirtAddr), + len(len), + handle(handle) + {}; + +}; + +typedef std::list<BulkBufferDescriptor *> bulkBufferDescrList_t; +typedef bulkBufferDescrList_t::iterator bulkBufferDescrIterator_t; + + +/** Session states. + * At the moment not used !!. + */ +typedef enum { + SESSION_STATE_INITIAL, + SESSION_STATE_OPEN, + SESSION_STATE_TRUSTLET_DEAD +} sessionState_t; + +#define SESSION_ERR_NO 0 /**< No session error */ + +/** Session information structure. + * The information structure is used to hold the state of the session, which will limit further actions for the session. + * Also the last error code will be stored till it's read. + */ +typedef struct { + sessionState_t state; /**< Session state */ + int32_t lastErr; /**< Last error of session */ +} sessionInformation_t; + + +class Session +{ +private: + CMcKMod *mcKMod; + CMutex workLock; + bulkBufferDescrList_t bulkBufferDescriptors; /**< Descriptors of additional bulk buffer of a session */ + sessionInformation_t sessionInfo; /**< Informations about session */ +public: + uint32_t sessionId; + Connection *notificationConnection; + + Session(uint32_t sessionId, CMcKMod *mcKMod, Connection *connection); + + virtual ~Session(void); + + /** + * Add address information of additional bulk buffer memory to session and + * register virtual memory in kernel module. + * + * @attention The virtual address can only be added one time. If the virtual address already exist, MC_DRV_ERR_BUFFER_ALREADY_MAPPED is returned. + * + * @param buf The virtual address of bulk buffer. + * @param len Length of bulk buffer. + * @param blkBuf pointer of the actual Bulk buffer descriptor with all address information. + * + * @return MC_DRV_OK on success + * @return MC_DRV_ERR_BUFFER_ALREADY_MAPPED + */ + mcResult_t addBulkBuf(addr_t buf, uint32_t len, BulkBufferDescriptor **blkBuf); + + /** + * Just register the buffer previously created to the session + * + * @attention The virtual address can only be added one time. If the virtual address already exist, MC_DRV_ERR_BUFFER_ALREADY_MAPPED is returned. + * + * @param blkBuf pointer of the actual Bulk buffer descriptor with all address information. + * + */ + void addBulkBuf(BulkBufferDescriptor *blkBuf); + + /** + * Remove address information of additional bulk buffer memory from session and + * unregister virtual memory in kernel module + * + * @param buf The virtual address of the bulk buffer. + * + * @return true on success. + */ + mcResult_t removeBulkBuf(addr_t buf); + + /** + * Return the Kmod handle of the bulk buff + * + * @param buf The secure virtual address of the bulk buffer. + * + * @return the Handle or 0 for failure + */ + uint32_t getBufHandle(uint32_t sVirtAddr, uint32_t sVirtualLen); + + /** + * Set additional error information of the last error that occured. + * + * @param errorCode The actual error. + */ + void setErrorInfo(int32_t err); + + /** + * Get additional error information of the last error that occured. + * + * @attention After request the information is set to SESSION_ERR_NO. + * + * @return Last stored error code or SESSION_ERR_NO. + */ + int32_t getLastErr(void); + + /** + * Lock session for operation + */ + void lock() { + workLock.lock(); + } + + /** + * Unlock session for operation + */ + void unlock() { + workLock.unlock(); + } +}; + +typedef std::list<Session *> sessionList_t; +typedef sessionList_t::iterator sessionIterator_t; + +#endif /* SESSION_H_ */ + |