1*9203SMark.Logan@Sun.COM /*******************************************************************************
2*9203SMark.Logan@Sun.COM * Copyright (C) 2004-2008 Intel Corp. All rights reserved.
3*9203SMark.Logan@Sun.COM *
4*9203SMark.Logan@Sun.COM * Redistribution and use in source and binary forms, with or without
5*9203SMark.Logan@Sun.COM * modification, are permitted provided that the following conditions are met:
6*9203SMark.Logan@Sun.COM *
7*9203SMark.Logan@Sun.COM * - Redistributions of source code must retain the above copyright notice,
8*9203SMark.Logan@Sun.COM * this list of conditions and the following disclaimer.
9*9203SMark.Logan@Sun.COM *
10*9203SMark.Logan@Sun.COM * - Redistributions in binary form must reproduce the above copyright notice,
11*9203SMark.Logan@Sun.COM * this list of conditions and the following disclaimer in the documentation
12*9203SMark.Logan@Sun.COM * and/or other materials provided with the distribution.
13*9203SMark.Logan@Sun.COM *
14*9203SMark.Logan@Sun.COM * - Neither the name of Intel Corp. nor the names of its
15*9203SMark.Logan@Sun.COM * contributors may be used to endorse or promote products derived from this
16*9203SMark.Logan@Sun.COM * software without specific prior written permission.
17*9203SMark.Logan@Sun.COM *
18*9203SMark.Logan@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
19*9203SMark.Logan@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*9203SMark.Logan@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*9203SMark.Logan@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS
22*9203SMark.Logan@Sun.COM * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*9203SMark.Logan@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*9203SMark.Logan@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*9203SMark.Logan@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*9203SMark.Logan@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*9203SMark.Logan@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*9203SMark.Logan@Sun.COM * POSSIBILITY OF SUCH DAMAGE.
29*9203SMark.Logan@Sun.COM *******************************************************************************/
30*9203SMark.Logan@Sun.COM
31*9203SMark.Logan@Sun.COM #ifdef HAVE_CONFIG_H
32*9203SMark.Logan@Sun.COM #include "config.h"
33*9203SMark.Logan@Sun.COM #endif
34*9203SMark.Logan@Sun.COM #include <cerrno>
35*9203SMark.Logan@Sun.COM #include "types.h"
36*9203SMark.Logan@Sun.COM #include "LMEConnection.h"
37*9203SMark.Logan@Sun.COM #include "LMS_if_compat.h"
38*9203SMark.Logan@Sun.COM #include "Lock.h"
39*9203SMark.Logan@Sun.COM #include "glue.h"
40*9203SMark.Logan@Sun.COM
41*9203SMark.Logan@Sun.COM #ifdef _LINUX
42*9203SMark.Logan@Sun.COM #define _strnicmp strncasecmp
43*9203SMark.Logan@Sun.COM #endif
44*9203SMark.Logan@Sun.COM
45*9203SMark.Logan@Sun.COM extern glue plugin;
46*9203SMark.Logan@Sun.COM
47*9203SMark.Logan@Sun.COM const GUID LMEConnection::_guidCompat = {0x3d98d9b7, 0x1ce8, 0x4252, {0xb3, 0x37, 0x2e, 0xff, 0x10, 0x6e, 0xf2, 0x9f}};
48*9203SMark.Logan@Sun.COM
CompatSendMessage(UINT8 connID,UINT32 len,unsigned char * buffer)49*9203SMark.Logan@Sun.COM int LMEConnection::CompatSendMessage(UINT8 connID, UINT32 len, unsigned char *buffer)
50*9203SMark.Logan@Sun.COM {
51*9203SMark.Logan@Sun.COM if (!IsInitialized()) {
52*9203SMark.Logan@Sun.COM PRINT("[Compat]State: not connected to HECI.\n");
53*9203SMark.Logan@Sun.COM return -1;
54*9203SMark.Logan@Sun.COM }
55*9203SMark.Logan@Sun.COM
56*9203SMark.Logan@Sun.COM unsigned char sendBuf[1024 + sizeof(LMS_SEND_DATA_MESSAGE)];
57*9203SMark.Logan@Sun.COM LMS_SEND_DATA_MESSAGE *msg;
58*9203SMark.Logan@Sun.COM
59*9203SMark.Logan@Sun.COM if (len > 1024) {
60*9203SMark.Logan@Sun.COM return -1;
61*9203SMark.Logan@Sun.COM }
62*9203SMark.Logan@Sun.COM
63*9203SMark.Logan@Sun.COM msg = (LMS_SEND_DATA_MESSAGE *)sendBuf;
64*9203SMark.Logan@Sun.COM msg->MessageType = LMS_MESSAGE_TYPE_SEND_DATA;
65*9203SMark.Logan@Sun.COM msg->ConnectionId = connID;
66*9203SMark.Logan@Sun.COM msg->DataLength = htons(len);
67*9203SMark.Logan@Sun.COM memcpy(msg->Data, buffer, len);
68*9203SMark.Logan@Sun.COM
69*9203SMark.Logan@Sun.COM return _sendMessage(sendBuf, sizeof(LMS_SEND_DATA_MESSAGE) + len);
70*9203SMark.Logan@Sun.COM }
71*9203SMark.Logan@Sun.COM
CompatCloseConnection(int connID,int status)72*9203SMark.Logan@Sun.COM void LMEConnection::CompatCloseConnection(int connID, int status)
73*9203SMark.Logan@Sun.COM {
74*9203SMark.Logan@Sun.COM if (!IsInitialized()) {
75*9203SMark.Logan@Sun.COM PRINT("[Compat]State: not connected to HECI.\n");
76*9203SMark.Logan@Sun.COM return;
77*9203SMark.Logan@Sun.COM }
78*9203SMark.Logan@Sun.COM
79*9203SMark.Logan@Sun.COM LMS_CLOSE_CONNECTION_MESSAGE msg;
80*9203SMark.Logan@Sun.COM
81*9203SMark.Logan@Sun.COM msg.MessageType = LMS_MESSAGE_TYPE_CLOSE_CONNECTION;
82*9203SMark.Logan@Sun.COM msg.ConnectionId = connID;
83*9203SMark.Logan@Sun.COM msg.ClosingReason = status;
84*9203SMark.Logan@Sun.COM
85*9203SMark.Logan@Sun.COM _sendMessage((unsigned char *)&msg, sizeof(msg));
86*9203SMark.Logan@Sun.COM }
87*9203SMark.Logan@Sun.COM
CompatProtocolVersion()88*9203SMark.Logan@Sun.COM bool LMEConnection::CompatProtocolVersion()
89*9203SMark.Logan@Sun.COM {
90*9203SMark.Logan@Sun.COM if (!IsInitialized()) {
91*9203SMark.Logan@Sun.COM PRINT("[Compat]State: not connected to HECI.\n");
92*9203SMark.Logan@Sun.COM return false;
93*9203SMark.Logan@Sun.COM }
94*9203SMark.Logan@Sun.COM
95*9203SMark.Logan@Sun.COM LMS_PROTO_VERSION_MESSAGE msg;
96*9203SMark.Logan@Sun.COM
97*9203SMark.Logan@Sun.COM memset(&msg, 0, sizeof(msg));
98*9203SMark.Logan@Sun.COM msg.MessageType = LMS_MESSAGE_TYPE_PROTO_VERSION;
99*9203SMark.Logan@Sun.COM msg.ConnectionId = 0;
100*9203SMark.Logan@Sun.COM msg.Protocol = 0;
101*9203SMark.Logan@Sun.COM
102*9203SMark.Logan@Sun.COM PRINT("[Compat]Sending Protocol Version to LME\n");
103*9203SMark.Logan@Sun.COM int bytesWritten = _sendMessage((unsigned char *)&msg, sizeof(msg));
104*9203SMark.Logan@Sun.COM return (bytesWritten == sizeof(msg));
105*9203SMark.Logan@Sun.COM }
106*9203SMark.Logan@Sun.COM
CompatRequestIPFQDN()107*9203SMark.Logan@Sun.COM bool LMEConnection::CompatRequestIPFQDN()
108*9203SMark.Logan@Sun.COM {
109*9203SMark.Logan@Sun.COM if (!IsInitialized()) {
110*9203SMark.Logan@Sun.COM PRINT("[Compat]State: not connected to HECI.\n");
111*9203SMark.Logan@Sun.COM return false;
112*9203SMark.Logan@Sun.COM }
113*9203SMark.Logan@Sun.COM
114*9203SMark.Logan@Sun.COM LMS_IP_FQDN_REQUEST_MESSAGE msg;
115*9203SMark.Logan@Sun.COM
116*9203SMark.Logan@Sun.COM memset(&msg, 0, sizeof(msg));
117*9203SMark.Logan@Sun.COM msg.MessageType = LMS_MESSAGE_TYPE_IP_FQDN_REQUEST;
118*9203SMark.Logan@Sun.COM msg.ConnectionId = 0;
119*9203SMark.Logan@Sun.COM
120*9203SMark.Logan@Sun.COM PRINT("[Compat]Sending IP_FQDN request to LME\n");
121*9203SMark.Logan@Sun.COM int bytesWritten = _sendMessage((unsigned char *)&msg, sizeof(msg));
122*9203SMark.Logan@Sun.COM return (bytesWritten == sizeof(msg));
123*9203SMark.Logan@Sun.COM }
124*9203SMark.Logan@Sun.COM
CompatOpenConnection(in_port_t mePort,ATAddress addr,unsigned int & connID)125*9203SMark.Logan@Sun.COM bool LMEConnection::CompatOpenConnection(in_port_t mePort, ATAddress addr, unsigned int &connID)
126*9203SMark.Logan@Sun.COM {
127*9203SMark.Logan@Sun.COM if (!IsInitialized()) {
128*9203SMark.Logan@Sun.COM PRINT("[Compat]State: not connected to HECI.\n");
129*9203SMark.Logan@Sun.COM return false;
130*9203SMark.Logan@Sun.COM }
131*9203SMark.Logan@Sun.COM
132*9203SMark.Logan@Sun.COM unsigned char currReqID = _reqID++;
133*9203SMark.Logan@Sun.COM bool ret = false;
134*9203SMark.Logan@Sun.COM LMS_OPEN_CONNECTION_EX_MESSAGE openConnectionExMsg;
135*9203SMark.Logan@Sun.COM LMS_OPEN_CONNECTION_MESSAGE openConnectionMsg;
136*9203SMark.Logan@Sun.COM unsigned char *msg = NULL;
137*9203SMark.Logan@Sun.COM int msgLen = 0;
138*9203SMark.Logan@Sun.COM size_t addrSize = 0;
139*9203SMark.Logan@Sun.COM const void *inAddr = addr.inAddr(addrSize);
140*9203SMark.Logan@Sun.COM
141*9203SMark.Logan@Sun.COM if (protocolVer == LMS_PROCOL_VERSION_COMPAT) {
142*9203SMark.Logan@Sun.COM memset(&openConnectionExMsg, 0, sizeof(openConnectionExMsg));
143*9203SMark.Logan@Sun.COM openConnectionExMsg.MessageType = LMS_MESSAGE_TYPE_OPEN_CONNECTION_EX;
144*9203SMark.Logan@Sun.COM openConnectionExMsg.ConnectionId = 0;
145*9203SMark.Logan@Sun.COM openConnectionExMsg.Protocol = LMS_PROTOCOL_TYPE_TCP_IPV4;
146*9203SMark.Logan@Sun.COM openConnectionExMsg.Flags = 0;
147*9203SMark.Logan@Sun.COM openConnectionExMsg.OpenRequestId = currReqID;
148*9203SMark.Logan@Sun.COM memcpy(openConnectionExMsg.Host, inAddr, addrSize);
149*9203SMark.Logan@Sun.COM openConnectionExMsg.HostPort = htons(addr.inPort());
150*9203SMark.Logan@Sun.COM openConnectionExMsg.MEPort = htons(mePort);
151*9203SMark.Logan@Sun.COM
152*9203SMark.Logan@Sun.COM msg = (unsigned char *)&openConnectionExMsg;
153*9203SMark.Logan@Sun.COM msgLen = sizeof(openConnectionExMsg);
154*9203SMark.Logan@Sun.COM PRINT("[Compat]OpenConnectionEx %x (%d) p=%d mp=%d\n",
155*9203SMark.Logan@Sun.COM *(int *)inAddr, addrSize, addr.inPort(), mePort);
156*9203SMark.Logan@Sun.COM }
157*9203SMark.Logan@Sun.COM else {
158*9203SMark.Logan@Sun.COM memset(&openConnectionMsg, 0, sizeof(openConnectionMsg));
159*9203SMark.Logan@Sun.COM openConnectionMsg.MessageType = LMS_MESSAGE_TYPE_OPEN_CONNECTION;
160*9203SMark.Logan@Sun.COM openConnectionMsg.ConnectionId = 0;
161*9203SMark.Logan@Sun.COM openConnectionMsg.Protocol = LMS_PROTOCOL_TYPE_TCP_IPV4;
162*9203SMark.Logan@Sun.COM openConnectionMsg.OpenRequestId = currReqID;
163*9203SMark.Logan@Sun.COM memcpy(openConnectionMsg.HostIPAddress, inAddr, addrSize);
164*9203SMark.Logan@Sun.COM openConnectionMsg.HostPort = htons(addr.inPort());
165*9203SMark.Logan@Sun.COM openConnectionMsg.MEPort = htons(mePort);
166*9203SMark.Logan@Sun.COM
167*9203SMark.Logan@Sun.COM msg = (unsigned char *)&openConnectionMsg;
168*9203SMark.Logan@Sun.COM msgLen = sizeof(openConnectionMsg);
169*9203SMark.Logan@Sun.COM PRINT("[Compat]OpenConnection %x (%d) p=%d mp=%d\n",
170*9203SMark.Logan@Sun.COM *(int *)inAddr, addrSize, addr.inPort(), mePort);
171*9203SMark.Logan@Sun.COM }
172*9203SMark.Logan@Sun.COM
173*9203SMark.Logan@Sun.COM // save as pending request
174*9203SMark.Logan@Sun.COM CompatConnection conn;
175*9203SMark.Logan@Sun.COM conn.event = new Event();
176*9203SMark.Logan@Sun.COM conn.status = LMS_CONNECTION_STATUS_FAILED;
177*9203SMark.Logan@Sun.COM conn.connID = 0;
178*9203SMark.Logan@Sun.COM
179*9203SMark.Logan@Sun.COM _compatMapLock.acquire();
180*9203SMark.Logan@Sun.COM _compatPendingConnections[currReqID] = conn;
181*9203SMark.Logan@Sun.COM _compatMapLock.release();
182*9203SMark.Logan@Sun.COM
183*9203SMark.Logan@Sun.COM int bytesWritten;
184*9203SMark.Logan@Sun.COM bytesWritten = _sendMessage(msg, msgLen);
185*9203SMark.Logan@Sun.COM if (bytesWritten != msgLen) {
186*9203SMark.Logan@Sun.COM goto out;
187*9203SMark.Logan@Sun.COM }
188*9203SMark.Logan@Sun.COM
189*9203SMark.Logan@Sun.COM if (conn.event->wait(10000) == false) {
190*9203SMark.Logan@Sun.COM // no response from FW
191*9203SMark.Logan@Sun.COM goto out;
192*9203SMark.Logan@Sun.COM }
193*9203SMark.Logan@Sun.COM
194*9203SMark.Logan@Sun.COM ret = true;
195*9203SMark.Logan@Sun.COM
196*9203SMark.Logan@Sun.COM out:
197*9203SMark.Logan@Sun.COM {
198*9203SMark.Logan@Sun.COM Lock ml(_compatMapLock);
199*9203SMark.Logan@Sun.COM
200*9203SMark.Logan@Sun.COM if (_compatPendingConnections[currReqID].status != LMS_CONNECTION_STATUS_OK) {
201*9203SMark.Logan@Sun.COM ret = false;
202*9203SMark.Logan@Sun.COM } else {
203*9203SMark.Logan@Sun.COM connID = _compatPendingConnections[currReqID].connID;
204*9203SMark.Logan@Sun.COM }
205*9203SMark.Logan@Sun.COM _compatPendingConnections.erase(currReqID);
206*9203SMark.Logan@Sun.COM }
207*9203SMark.Logan@Sun.COM
208*9203SMark.Logan@Sun.COM delete conn.event;
209*9203SMark.Logan@Sun.COM conn.event = NULL;
210*9203SMark.Logan@Sun.COM
211*9203SMark.Logan@Sun.COM return ret;
212*9203SMark.Logan@Sun.COM }
213*9203SMark.Logan@Sun.COM
_doRXCompat()214*9203SMark.Logan@Sun.COM void LMEConnection::_doRXCompat()
215*9203SMark.Logan@Sun.COM {
216*9203SMark.Logan@Sun.COM unsigned int bytesRead;
217*9203SMark.Logan@Sun.COM int status = 1;
218*9203SMark.Logan@Sun.COM
219*9203SMark.Logan@Sun.COM _threadStartedEvent.set();
220*9203SMark.Logan@Sun.COM
221*9203SMark.Logan@Sun.COM unsigned char *rxBuffer = new unsigned char[_heciCompat.GetBufferSize()];
222*9203SMark.Logan@Sun.COM
223*9203SMark.Logan@Sun.COM while (true) {
224*9203SMark.Logan@Sun.COM bytesRead = (unsigned int)_receiveMessage(rxBuffer, _heciCompat.GetBufferSize());
225*9203SMark.Logan@Sun.COM
226*9203SMark.Logan@Sun.COM if ((int)bytesRead < 0) {
227*9203SMark.Logan@Sun.COM PRINT("[Compat]Error receiving data from HECI\n");
228*9203SMark.Logan@Sun.COM Deinit();
229*9203SMark.Logan@Sun.COM break;
230*9203SMark.Logan@Sun.COM }
231*9203SMark.Logan@Sun.COM
232*9203SMark.Logan@Sun.COM if (bytesRead == 0) {
233*9203SMark.Logan@Sun.COM // ERROR
234*9203SMark.Logan@Sun.COM continue;
235*9203SMark.Logan@Sun.COM }
236*9203SMark.Logan@Sun.COM
237*9203SMark.Logan@Sun.COM PRINT("[Compat]Received from LME %d bytes (msg type %02d)\n", bytesRead, rxBuffer[0]);
238*9203SMark.Logan@Sun.COM
239*9203SMark.Logan@Sun.COM if (bytesRead < 2) {
240*9203SMark.Logan@Sun.COM // ERROR
241*9203SMark.Logan@Sun.COM continue;
242*9203SMark.Logan@Sun.COM }
243*9203SMark.Logan@Sun.COM
244*9203SMark.Logan@Sun.COM if (plugin.preprocess(rxBuffer, bytesRead) == LMS_DROPPED) {
245*9203SMark.Logan@Sun.COM continue;
246*9203SMark.Logan@Sun.COM }
247*9203SMark.Logan@Sun.COM
248*9203SMark.Logan@Sun.COM switch (rxBuffer[0]) {
249*9203SMark.Logan@Sun.COM case LMS_MESSAGE_TYPE_PROTO_VERSION_REPLY:
250*9203SMark.Logan@Sun.COM CompatRequestIPFQDN();
251*9203SMark.Logan@Sun.COM break;
252*9203SMark.Logan@Sun.COM
253*9203SMark.Logan@Sun.COM case LMS_MESSAGE_TYPE_CLOSE_CONNECTION:
254*9203SMark.Logan@Sun.COM case LMS_MESSAGE_TYPE_SEND_DATA:
255*9203SMark.Logan@Sun.COM case LMS_MESSAGE_TYPE_IP_FQDN:
256*9203SMark.Logan@Sun.COM _cb(_cbParam, rxBuffer, bytesRead, &status);
257*9203SMark.Logan@Sun.COM break;
258*9203SMark.Logan@Sun.COM
259*9203SMark.Logan@Sun.COM case LMS_MESSAGE_TYPE_OPEN_CONNECTION_REPLY:
260*9203SMark.Logan@Sun.COM {
261*9203SMark.Logan@Sun.COM LMS_OPEN_CONNECTION_REPLY_MESSAGE *repMsg =
262*9203SMark.Logan@Sun.COM (LMS_OPEN_CONNECTION_REPLY_MESSAGE *)rxBuffer;
263*9203SMark.Logan@Sun.COM
264*9203SMark.Logan@Sun.COM Lock ml(_compatMapLock);
265*9203SMark.Logan@Sun.COM
266*9203SMark.Logan@Sun.COM CompatConnMap::iterator itr;
267*9203SMark.Logan@Sun.COM itr = _compatPendingConnections.find(repMsg->OpenRequestId);
268*9203SMark.Logan@Sun.COM if (itr != _compatPendingConnections.end()) {
269*9203SMark.Logan@Sun.COM (*itr).second.connID = repMsg->ConnectionId;
270*9203SMark.Logan@Sun.COM (*itr).second.status = repMsg->Status;
271*9203SMark.Logan@Sun.COM (*itr).second.event->set();
272*9203SMark.Logan@Sun.COM PRINT("[Compat]Open connection reply %d %d =%d\n", repMsg->OpenRequestId, repMsg->ConnectionId, repMsg->Status);
273*9203SMark.Logan@Sun.COM }
274*9203SMark.Logan@Sun.COM }
275*9203SMark.Logan@Sun.COM break;
276*9203SMark.Logan@Sun.COM
277*9203SMark.Logan@Sun.COM case LMS_MESSAGE_TYPE_OPEN_CONNECTION_EX:
278*9203SMark.Logan@Sun.COM {
279*9203SMark.Logan@Sun.COM // report incoming connection request
280*9203SMark.Logan@Sun.COM _cb(_cbParam, rxBuffer, bytesRead, &status);
281*9203SMark.Logan@Sun.COM
282*9203SMark.Logan@Sun.COM if (IsInitialized() && (status == 1)) {
283*9203SMark.Logan@Sun.COM if (plugin.retry(rxBuffer, bytesRead) == LMS_DROPPED) {
284*9203SMark.Logan@Sun.COM continue;
285*9203SMark.Logan@Sun.COM } else {
286*9203SMark.Logan@Sun.COM _cb(_cbParam, rxBuffer, bytesRead, &status);
287*9203SMark.Logan@Sun.COM }
288*9203SMark.Logan@Sun.COM }
289*9203SMark.Logan@Sun.COM
290*9203SMark.Logan@Sun.COM LMS_OPEN_CONNECTION_EX_MESSAGE *msg =
291*9203SMark.Logan@Sun.COM (LMS_OPEN_CONNECTION_EX_MESSAGE *)rxBuffer;
292*9203SMark.Logan@Sun.COM
293*9203SMark.Logan@Sun.COM if ((msg->Flags & HOSTNAME_BIT) != 0) {
294*9203SMark.Logan@Sun.COM PRINT("[Compat]Got client connection request %d for host %s, port %d\n",
295*9203SMark.Logan@Sun.COM msg->ConnectionId, msg->Host, ntohs(msg->HostPort));
296*9203SMark.Logan@Sun.COM }
297*9203SMark.Logan@Sun.COM else {
298*9203SMark.Logan@Sun.COM PRINT("[Compat]Got client connection request %d for IP %s, port %d\n",
299*9203SMark.Logan@Sun.COM msg->ConnectionId, inet_ntoa(*((struct in_addr *)msg->Host)), ntohs(msg->HostPort));
300*9203SMark.Logan@Sun.COM }
301*9203SMark.Logan@Sun.COM
302*9203SMark.Logan@Sun.COM LMS_OPEN_CONNECTION_REPLY_MESSAGE repMsg;
303*9203SMark.Logan@Sun.COM memset(&repMsg, 0, sizeof(repMsg));
304*9203SMark.Logan@Sun.COM
305*9203SMark.Logan@Sun.COM repMsg.MessageType = LMS_MESSAGE_TYPE_OPEN_CONNECTION_REPLY;
306*9203SMark.Logan@Sun.COM repMsg.ConnectionId = msg->ConnectionId;
307*9203SMark.Logan@Sun.COM if (status == 0) {
308*9203SMark.Logan@Sun.COM repMsg.Status = LMS_CONNECTION_STATUS_OK;
309*9203SMark.Logan@Sun.COM } else {
310*9203SMark.Logan@Sun.COM repMsg.Status = LMS_CONNECTION_STATUS_FAILED;
311*9203SMark.Logan@Sun.COM }
312*9203SMark.Logan@Sun.COM
313*9203SMark.Logan@Sun.COM DWORD bytesWritten;
314*9203SMark.Logan@Sun.COM bytesWritten = _sendMessage((unsigned char *)&repMsg, sizeof(repMsg));
315*9203SMark.Logan@Sun.COM if (bytesWritten != sizeof(repMsg)) {
316*9203SMark.Logan@Sun.COM PRINT("[Compat]Send Open Connection Reply failed: bytesWritten: %lu\n", bytesWritten);
317*9203SMark.Logan@Sun.COM }
318*9203SMark.Logan@Sun.COM }
319*9203SMark.Logan@Sun.COM break;
320*9203SMark.Logan@Sun.COM
321*9203SMark.Logan@Sun.COM default:
322*9203SMark.Logan@Sun.COM // Uknown request. Ignore
323*9203SMark.Logan@Sun.COM break;
324*9203SMark.Logan@Sun.COM }
325*9203SMark.Logan@Sun.COM
326*9203SMark.Logan@Sun.COM if (IsInitialized()) {
327*9203SMark.Logan@Sun.COM plugin.postprocess(rxBuffer, bytesRead, status);
328*9203SMark.Logan@Sun.COM }
329*9203SMark.Logan@Sun.COM }
330*9203SMark.Logan@Sun.COM
331*9203SMark.Logan@Sun.COM if (rxBuffer != NULL) {
332*9203SMark.Logan@Sun.COM delete[] rxBuffer;
333*9203SMark.Logan@Sun.COM }
334*9203SMark.Logan@Sun.COM }
335*9203SMark.Logan@Sun.COM
336