64
compat_mutex_lock(&channel->connLock);
65
switch (channel->status) {
66
case HGFS_CHANNEL_UNINITIALIZED:
69
case HGFS_CHANNEL_CONNECTED:
62
ASSERT(channel->status == HGFS_CHANNEL_NOTCONNECTED);
64
if (HgfsBd_OpenBackdoor((RpcOut **)&channel->priv)) {
65
LOG(8, ("VMware hgfs: %s: backdoor opened.\n", __func__));
72
case HGFS_CHANNEL_NOTCONNECTED:
73
if (HgfsBd_OpenBackdoor((RpcOut **)&channel->priv)) {
74
LOG(8, ("VMware hgfs: %s: backdoor opened.\n", __func__));
75
bdChannel.status = HGFS_CHANNEL_CONNECTED;
77
ASSERT(channel->priv != NULL);
83
ASSERT(0); /* Not reached. */
67
ASSERT(channel->priv != NULL);
86
compat_mutex_unlock(&channel->connLock);
108
91
HgfsBdChannelClose(HgfsTransportChannel *channel) // IN: Channel
110
compat_mutex_lock(&channel->connLock);
111
if (channel->status == HGFS_CHANNEL_CONNECTED) {
112
ASSERT(channel->priv != NULL);
113
HgfsBd_CloseBackdoor((RpcOut **)&channel->priv);
114
ASSERT(channel->priv == NULL);
115
channel->status = HGFS_CHANNEL_NOTCONNECTED;
117
compat_mutex_unlock(&channel->connLock);
93
ASSERT(channel->priv != NULL);
95
HgfsBd_CloseBackdoor((RpcOut **)&channel->priv);
96
ASSERT(channel->priv == NULL);
118
98
LOG(8, ("VMware hgfs: %s: backdoor closed.\n", __func__));
103
*-----------------------------------------------------------------------------
105
* HgfsBdChannelAllocate --
107
* Allocate request uin the way that is suitable for sending through
111
* NULL on failure; otherwise address of the new request.
116
*-----------------------------------------------------------------------------
120
HgfsBdChannelAllocate(size_t payloadSize) // IN: size of requests payload
124
req = kmalloc(sizeof(*req) + HGFS_SYNC_REQREP_CLIENT_CMD_LEN + payloadSize,
127
/* Setup the packet prefix. */
128
memcpy(req->buffer, HGFS_SYNC_REQREP_CLIENT_CMD,
129
HGFS_SYNC_REQREP_CLIENT_CMD_LEN);
131
req->payload = req->buffer + HGFS_SYNC_REQREP_CLIENT_CMD_LEN;
123
139
*----------------------------------------------------------------------
125
141
* HgfsBdChannelSend --
147
163
ASSERT(req->state == HGFS_REQ_STATE_UNSENT);
148
164
ASSERT(req->payloadSize <= HGFS_PACKET_MAX);
150
compat_mutex_lock(&channel->connLock);
152
if (channel->status != HGFS_CHANNEL_CONNECTED) {
153
LOG(6, (KERN_DEBUG "VMware hgfs: %s: Backdoor not opened\n", __func__));
154
compat_mutex_unlock(&channel->connLock);
166
LOG(8, ("VMware hgfs: %s: backdoor sending.\n", __func__));
158
167
payloadSize = req->payloadSize;
159
LOG(8, ("VMware hgfs: %s: backdoor sending.\n", __func__));
160
168
ret = HgfsBd_Dispatch(channel->priv, HGFS_REQ_PAYLOAD(req), &payloadSize,
163
171
LOG(8, ("VMware hgfs: %s: Backdoor reply received.\n", __func__));
164
172
/* Request sent successfully. Copy the reply and wake the client. */
165
173
ASSERT(replyPacket);
166
HgfsCompleteReq(req, replyPacket, payloadSize);
168
channel->priv = NULL;
169
channel->status = HGFS_CHANNEL_NOTCONNECTED;
174
ASSERT(payloadSize <= req->bufferSize);
175
memcpy(HGFS_REQ_PAYLOAD(req), replyPacket, payloadSize);
176
req->payloadSize = payloadSize;
177
HgfsCompleteReq(req);
171
compat_mutex_unlock(&channel->connLock);
178
185
*----------------------------------------------------------------------
180
* HgfsBdChannelExit --
182
* Tear down the channel.
190
*----------------------------------------------------------------------
194
HgfsBdChannelExit(HgfsTransportChannel *channel) // IN
196
compat_mutex_lock(&channel->connLock);
197
if (channel->priv != NULL) {
198
HgfsBd_CloseBackdoor((RpcOut **)&channel->priv);
199
ASSERT(channel->priv == NULL);
201
channel->status = HGFS_CHANNEL_UNINITIALIZED;
202
compat_mutex_unlock(&channel->connLock);
207
*----------------------------------------------------------------------
209
187
* HgfsGetBdChannel --
211
189
* Initialize backdoor channel.
222
200
HgfsTransportChannel*
223
201
HgfsGetBdChannel(void)
225
bdChannel.name = "backdoor";
226
bdChannel.ops.open = HgfsBdChannelOpen;
227
bdChannel.ops.close = HgfsBdChannelClose;
228
bdChannel.ops.send = HgfsBdChannelSend;
229
bdChannel.ops.recv = NULL;
230
bdChannel.ops.exit = HgfsBdChannelExit;
231
bdChannel.priv = NULL;
232
compat_mutex_init(&bdChannel.connLock);
233
bdChannel.status = HGFS_CHANNEL_NOTCONNECTED;
203
static HgfsTransportChannel channel;
205
channel.name = "backdoor";
206
channel.ops.open = HgfsBdChannelOpen;
207
channel.ops.close = HgfsBdChannelClose;
208
channel.ops.allocate = HgfsBdChannelAllocate;
209
channel.ops.send = HgfsBdChannelSend;
211
channel.status = HGFS_CHANNEL_NOTCONNECTED;