size_t requestOpArgsSize;
HgfsInternalStatus parseStatus = HGFS_ERROR_SUCCESS;
- request = HSPU_GetMetaPacket(packet, &requestSize, transportSession);
+ request = HSPU_GetMetaPacket(packet, &requestSize, transportSession->channelCbTable);
ASSERT_DEVEL(request);
if (NULL == request) {
replyTotalSize = replySize;
reply = HSPU_GetReplyPacket(input->packet, &replyTotalSize,
- input->transportSession);
+ input->transportSession->channelCbTable);
ASSERT_DEVEL(reply && (replySize <= replyTotalSize));
if (!HgfsPackReplyHeader(status, replyPayloadSize, input->sessionEnabled, replySessionId,
if (!input->request) {
input->request = HSPU_GetMetaPacket(input->packet,
&input->requestSize,
- input->transportSession);
+ input->transportSession->channelCbTable);
}
input->payload = (char *)input->request + input->payloadOffset;
* Asynchronous processing is supported by the transport.
* We can release mappings here and reacquire when needed.
*/
- HSPU_PutMetaPacket(packet, transportSession);
+ HSPU_PutMetaPacket(packet, transportSession->channelCbTable);
input->request = NULL;
Atomic_Inc(&gHgfsAsyncCounter);
HgfsTransportSessionInfo *transportSession = clientData;
if (packet->guestInitiated) {
- HSPU_PutMetaPacket(packet, transportSession);
- HSPU_PutReplyPacket(packet, transportSession);
- HSPU_PutDataPacketBuf(packet, transportSession);
+ HSPU_PutMetaPacket(packet, transportSession->channelCbTable);
+ HSPU_PutReplyPacket(packet, transportSession->channelCbTable);
+ HSPU_PutDataPacketBuf(packet, transportSession->channelCbTable);
} else {
free(packet->metaPacket);
free(packet);
headerSize = sizeof(HgfsReply);
}
replyPacketSize = headerSize + replyDataSize;
- replyHeader = HSPU_GetReplyPacket(packet, &replyPacketSize, session->transportSession);
+ replyHeader = HSPU_GetReplyPacket(packet,
+ &replyPacketSize,
+ session->transportSession->channelCbTable);
ASSERT_DEVEL(replyHeader && (replyPacketSize >= headerSize + replyDataSize));
payload = &reply->payload[0];
} else {
payload = HSPU_GetDataPacketBuf(input->packet, BUF_WRITEABLE,
- input->transportSession);
+ input->transportSession->channelCbTable);
}
if (payload) {
status = HgfsPlatformReadFile(file, input->session, offset,
if (NULL == dataToWrite) {
/* No inline data to write, get it from the transport shared memory. */
dataToWrite = HSPU_GetDataPacketBuf(input->packet, BUF_READABLE,
- input->transportSession);
+ input->transportSession->channelCbTable);
if (NULL == dataToWrite) {
LOG(4, ("%s: Error: Op %d mapping write data buffer\n", __FUNCTION__, input->op));
status = HGFS_ERROR_PROTOCOL;
if (inlineDataSize == 0) {
info.replyPayload = HSPU_GetDataPacketBuf(input->packet, BUF_WRITEABLE,
- input->transportSession);
+ input->transportSession->channelCbTable);
} else {
info.replyPayload = (char *)info.reply + baseReplySize;
}
fileDesc *newHandle); // OUT: Handle to the file
void *
-HSPU_GetMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- size_t *metaPacketSize, // OUT: Size of metaPacket
- HgfsTransportSessionInfo *transportSession); // IN: Session Info
+HSPU_GetMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ size_t *metaPacketSize, // OUT: Size of metaPacket
+ HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
void *
-HSPU_GetDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- MappingType mappingType, // IN: Readable/ Writeable ?
- HgfsTransportSessionInfo *transportSession); // IN: Session Info
+HSPU_GetDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ MappingType mappingType, // IN: Readable/ Writeable ?
+ HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
void
-HSPU_PutDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- HgfsTransportSessionInfo *transportSession); // IN: Session Info
+HSPU_PutDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
void
-HSPU_PutMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- HgfsTransportSessionInfo *transportSession); // IN: Session Info
+HSPU_PutMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
void *
-HSPU_GetReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- size_t *replyPacketSize, //IN/OUT: Size of reply Packet
- HgfsTransportSessionInfo *transportSession); // IN: Session Info
+HSPU_GetReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ size_t *replyPacketSize, //IN/OUT: Size of reply Packet
+ HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
void
-HSPU_PutReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- HgfsTransportSessionInfo *transportSession); // IN: Session Info
+HSPU_PutReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ HgfsServerChannelCallbacks *chanCb); // IN: Channel callbacks
#endif /* __HGFS_SERVER_INT_H__ */
size_t bufSize,
Bool *isAllocated,
MappingType mappingType,
- HgfsTransportSessionInfo *transportSession);
+ HgfsServerChannelCallbacks *chanCb);
static void HSPUPutBuf(HgfsPacket *packet,
uint32 startIndex,
void **buf,
size_t *bufSize,
Bool *isAllocated,
MappingType mappingType,
- HgfsTransportSessionInfo *transportSession);
+ HgfsServerChannelCallbacks *chanCb);
static void HSPUCopyBufToIovec(HgfsPacket *packet,
uint32 startIndex,
void *buf,
size_t bufSize,
- HgfsTransportSessionInfo *transportSession);
+ HgfsServerChannelCallbacks *chanCb);
*/
void *
-HSPU_GetReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- size_t *replyPacketSize, // IN/OUT: Size of reply Packet
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPU_GetReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ size_t *replyPacketSize, // IN/OUT: Size of reply Packet
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
- ASSERT(transportSession);
if (packet->replyPacket) {
/*
* When we are transferring packets over backdoor, reply packet
LOG(4, ("Existing reply packet %s %"FMTSZ"u %"FMTSZ"u\n", __FUNCTION__,
*replyPacketSize, packet->replyPacketSize));
ASSERT_DEVEL(*replyPacketSize <= packet->replyPacketSize);
- } else if (transportSession->channelCbTable && transportSession->channelCbTable->getWriteVa) {
+ } else if (chanCb && chanCb->getWriteVa) {
/* Can we write directly into guest memory? */
ASSERT_DEVEL(packet->metaPacket);
if (packet->metaPacket) {
*/
void
-HSPU_PutReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPU_PutReplyPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
/*
* If there wasn't an allocated buffer for the reply, there is nothing to
*/
void *
-HSPU_GetMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- size_t *metaPacketSize, // OUT: Size of metaPacket
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPU_GetMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ size_t *metaPacketSize, // OUT: Size of metaPacket
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
*metaPacketSize = packet->metaPacketSize;
return HSPUGetBuf(packet, 0, &packet->metaPacket,
packet->metaPacketSize,
&packet->metaPacketIsAllocated,
- BUF_READWRITEABLE, transportSession);
+ BUF_READWRITEABLE, chanCb);
}
*/
void *
-HSPU_GetDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- MappingType mappingType, // IN: Writeable/Readable
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPU_GetDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ MappingType mappingType, // IN: Writeable/Readable
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
packet->dataMappingType = mappingType;
return HSPUGetBuf(packet, packet->dataPacketIovIndex,
&packet->dataPacket, packet->dataPacketSize,
- &packet->dataPacketIsAllocated, mappingType, transportSession);
+ &packet->dataPacketIsAllocated, mappingType,
+ chanCb);
}
*/
static void *
-HSPUGetBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- uint32 startIndex, // IN: start index of iov
- void **buf, // OUT: Contigous buffer
- size_t bufSize, // IN: Size of buffer
- Bool *isAllocated, // OUT: Was buffer allocated ?
- MappingType mappingType, // IN: Readable/Writeable ?
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPUGetBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ uint32 startIndex, // IN: start index of iov
+ void **buf, // OUT: Contigous buffer
+ size_t bufSize, // IN: Size of buffer
+ Bool *isAllocated, // OUT: Was buffer allocated ?
+ MappingType mappingType, // IN: Readable/Writeable ?
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
uint32 iovCount;
uint32 iovMapped = 0;
return NULL;
}
- if (!transportSession->channelCbTable) {
+ if (chanCb == NULL) {
return NULL;
}
if (mappingType == BUF_WRITEABLE ||
mappingType == BUF_READWRITEABLE) {
- getVa = transportSession->channelCbTable->getWriteVa;
+ getVa = chanCb->getWriteVa;
} else {
ASSERT(mappingType == BUF_READABLE);
- getVa = transportSession->channelCbTable->getReadVa;
+ getVa = chanCb->getReadVa;
}
/* Looks like we are in the middle of poweroff. */
freeMem:
for (i = startIndex; i < iovCount; i++) {
- transportSession->channelCbTable->putVa(&packet->iov[i].context);
+ chanCb->putVa(&packet->iov[i].context);
packet->iov[i].va = NULL;
}
*/
void
-HSPU_PutMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPU_PutMetaPacket(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
LOG(4, ("%s Hgfs Putting Meta packet\n", __FUNCTION__));
HSPUPutBuf(packet, 0, &packet->metaPacket,
&packet->metaPacketSize,
&packet->metaPacketIsAllocated,
- BUF_WRITEABLE, transportSession);
+ BUF_WRITEABLE, chanCb);
}
*/
void
-HSPU_PutDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPU_PutDataPacketBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
LOG(4, ("%s Hgfs Putting Data packet\n", __FUNCTION__));
HSPUPutBuf(packet, packet->dataPacketIovIndex,
&packet->dataPacket, &packet->dataPacketSize,
&packet->dataPacketIsAllocated,
- packet->dataMappingType, transportSession);
+ packet->dataMappingType, chanCb);
}
*/
void
-HSPUPutBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- uint32 startIndex, // IN: Start of iov
- void **buf, // IN/OUT: Buffer to be freed
- size_t *bufSize, // IN: Size of the buffer
- Bool *isAllocated, // IN: Was buffer allocated ?
- MappingType mappingType, // IN: Readable / Writeable ?
- HgfsTransportSessionInfo *transportSession) // IN: Session info
+HSPUPutBuf(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ uint32 startIndex, // IN: Start of iov
+ void **buf, // IN/OUT: Buffer to be freed
+ size_t *bufSize, // IN: Size of the buffer
+ Bool *isAllocated, // IN: Was buffer allocated ?
+ MappingType mappingType, // IN: Readable / Writeable ?
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
uint32 iovCount = 0;
int size = *bufSize;
ASSERT(buf);
- if (!transportSession->channelCbTable) {
+ if (chanCb == NULL) {
return;
}
- if (!transportSession->channelCbTable->putVa || *buf == NULL) {
+ if (chanCb->putVa == NULL || *buf == NULL) {
return;
}
if (*isAllocated) {
if (mappingType == BUF_WRITEABLE) {
- HSPUCopyBufToIovec(packet, startIndex, *buf, *bufSize, transportSession);
+ HSPUCopyBufToIovec(packet, startIndex, *buf, *bufSize, chanCb);
}
LOG(10, ("%s: Hgfs Freeing buffer \n", __FUNCTION__));
free(*buf);
iovCount < packet->iovCount && size > 0;
iovCount++) {
ASSERT_DEVEL(packet->iov[iovCount].context);
- transportSession->channelCbTable->putVa(&packet->iov[iovCount].context);
+ chanCb->putVa(&packet->iov[iovCount].context);
size -= packet->iov[iovCount].len;
}
LOG(10, ("%s: Hgfs bufSize = %d \n", __FUNCTION__, size));
*/
static void
-HSPUCopyBufToIovec(HgfsPacket *packet, // IN/OUT: Hgfs Packet
- uint32 startIndex, // IN: start index into iov
- void *buf, // IN: Contigous Buffer
- size_t bufSize, // IN: Size of buffer
- HgfsTransportSessionInfo *transportSession) // IN: Session Info
+HSPUCopyBufToIovec(HgfsPacket *packet, // IN/OUT: Hgfs Packet
+ uint32 startIndex, // IN: start index into iov
+ void *buf, // IN: Contigous Buffer
+ size_t bufSize, // IN: Size of buffer
+ HgfsServerChannelCallbacks *chanCb) // IN: Channel callbacks
{
uint32 iovCount;
size_t remainingSize = bufSize;
ASSERT(packet);
ASSERT(buf);
- if (!transportSession->channelCbTable) {
+ if (chanCb == NULL) {
return;
}
- ASSERT_DEVEL(transportSession->channelCbTable->getWriteVa);
- if (!transportSession->channelCbTable->getWriteVa) {
+ ASSERT_DEVEL(chanCb->getWriteVa != NULL);
+ if (chanCb->getWriteVa == NULL) {
return;
}
ASSERT_DEVEL(packet->iov[iovCount].len <=
(PAGE_SIZE - PAGE_OFFSET(packet->iov[iovCount].pa)));
- packet->iov[iovCount].va =
- transportSession->channelCbTable->getWriteVa(packet->iov[iovCount].pa,
- packet->iov[iovCount].len,
- &packet->iov[iovCount].context);
+ packet->iov[iovCount].va = chanCb->getWriteVa(packet->iov[iovCount].pa,
+ packet->iov[iovCount].len,
+ &packet->iov[iovCount].context);
ASSERT_DEVEL(packet->iov[iovCount].va);
if (packet->iov[iovCount].va != NULL) {
memcpy(packet->iov[iovCount].va, (char *)buf + copiedAmount, copyAmount);
- transportSession->channelCbTable->putVa(&packet->iov[iovCount].context);
+ chanCb->putVa(&packet->iov[iovCount].context);
remainingSize -= copyAmount;
copiedAmount += copyAmount;
} else {