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 #ifndef _PROTOCOL_H_ 32*9203SMark.Logan@Sun.COM #define _PROTOCOL_H_ 33*9203SMark.Logan@Sun.COM 34*9203SMark.Logan@Sun.COM #include <map> 35*9203SMark.Logan@Sun.COM #include <vector> 36*9203SMark.Logan@Sun.COM #include <set> 37*9203SMark.Logan@Sun.COM #include <string> 38*9203SMark.Logan@Sun.COM #include "types.h" 39*9203SMark.Logan@Sun.COM #include "LMS_if.h" 40*9203SMark.Logan@Sun.COM #include "LMEConnection.h" 41*9203SMark.Logan@Sun.COM #include "PortForwardRequest.h" 42*9203SMark.Logan@Sun.COM #include "Channel.h" 43*9203SMark.Logan@Sun.COM #include "Semaphore.h" 44*9203SMark.Logan@Sun.COM 45*9203SMark.Logan@Sun.COM #if defined(__sun) || defined(_LINUX) 46*9203SMark.Logan@Sun.COM 47*9203SMark.Logan@Sun.COM #define SOCKET int 48*9203SMark.Logan@Sun.COM #define INVALID_SOCKET (SOCKET)(~0) 49*9203SMark.Logan@Sun.COM #define SOCKET_ERROR (-1) 50*9203SMark.Logan@Sun.COM #else 51*9203SMark.Logan@Sun.COM #include <windows.h> 52*9203SMark.Logan@Sun.COM #endif // __sun || _LINUX 53*9203SMark.Logan@Sun.COM 54*9203SMark.Logan@Sun.COM #ifdef _REMOTE_SUPPORT 55*9203SMark.Logan@Sun.COM #include "ConfigConnection.h" 56*9203SMark.Logan@Sun.COM #endif 57*9203SMark.Logan@Sun.COM 58*9203SMark.Logan@Sun.COM #define FQDN_MAX_SIZE 256 59*9203SMark.Logan@Sun.COM 60*9203SMark.Logan@Sun.COM typedef void (*EventLogCallback)(void *param, LPCTSTR message, WORD eventType); 61*9203SMark.Logan@Sun.COM 62*9203SMark.Logan@Sun.COM class Protocol 63*9203SMark.Logan@Sun.COM { 64*9203SMark.Logan@Sun.COM public: 65*9203SMark.Logan@Sun.COM 66*9203SMark.Logan@Sun.COM static const LMEProtocolVersionMessage MIN_PROT_VERSION; 67*9203SMark.Logan@Sun.COM static const LMEProtocolVersionMessage MAX_PROT_VERSION; 68*9203SMark.Logan@Sun.COM 69*9203SMark.Logan@Sun.COM enum SOCKET_STATUS { 70*9203SMark.Logan@Sun.COM ACTIVE = 0, 71*9203SMark.Logan@Sun.COM NOT_CREATED, 72*9203SMark.Logan@Sun.COM LINGER_ERROR, 73*9203SMark.Logan@Sun.COM NOT_BINDED, 74*9203SMark.Logan@Sun.COM NOT_EXCLUSIVE_ADDRESS, 75*9203SMark.Logan@Sun.COM NOT_LISTENED 76*9203SMark.Logan@Sun.COM }; 77*9203SMark.Logan@Sun.COM 78*9203SMark.Logan@Sun.COM Protocol(); 79*9203SMark.Logan@Sun.COM ~Protocol(); 80*9203SMark.Logan@Sun.COM 81*9203SMark.Logan@Sun.COM bool CreateSockets(); 82*9203SMark.Logan@Sun.COM void DestroySockets(); SocketsCreated()83*9203SMark.Logan@Sun.COM bool SocketsCreated() { return _sockets_active; } 84*9203SMark.Logan@Sun.COM bool IsDeInitialized(); 85*9203SMark.Logan@Sun.COM bool IsInitialized(); 86*9203SMark.Logan@Sun.COM bool Init(EventLogCallback cb, void *param); 87*9203SMark.Logan@Sun.COM int Select(); 88*9203SMark.Logan@Sun.COM void Deinit(); 89*9203SMark.Logan@Sun.COM void DeinitFull(); 90*9203SMark.Logan@Sun.COM 91*9203SMark.Logan@Sun.COM bool oldProtocolMode; 92*9203SMark.Logan@Sun.COM 93*9203SMark.Logan@Sun.COM private: 94*9203SMark.Logan@Sun.COM static void _LmeCallback(void *param, void *buffer, unsigned int len, int *status); 95*9203SMark.Logan@Sun.COM static int _isLocalCallback(void *const param, SOCKET s); 96*9203SMark.Logan@Sun.COM #ifdef _REMOTE_SUPPORT 97*9203SMark.Logan@Sun.COM static int _isRemoteCallback(void *const param, SOCKET s); 98*9203SMark.Logan@Sun.COM #endif 99*9203SMark.Logan@Sun.COM static char *_getErrMsg(DWORD err); 100*9203SMark.Logan@Sun.COM 101*9203SMark.Logan@Sun.COM bool _checkProtocolFlow(LMEMessage *message); 102*9203SMark.Logan@Sun.COM unsigned int _getMinMessageLen(LMEMessage *message); 103*9203SMark.Logan@Sun.COM unsigned int _getMinGlobalMsgLen(LMEGlobalRequestMessage *globalMessage); 104*9203SMark.Logan@Sun.COM bool _checkMessageAndProtocol(LMEMessage *message, unsigned int len); 105*9203SMark.Logan@Sun.COM void _closePortForwardRequest(PortForwardRequest *p); 106*9203SMark.Logan@Sun.COM void _apfGlobalRequest(LMEGlobalRequestMessage *globalMessage, unsigned int len, int *status); 107*9203SMark.Logan@Sun.COM void _apfTcpForwardRequest(LMETcpForwardRequestMessage *tcpFwdReqMsg, int *status); 108*9203SMark.Logan@Sun.COM void _apfTcpForwardCancel(LMETcpForwardCancelRequestMessage *tcpFwdCnclMsg); 109*9203SMark.Logan@Sun.COM void _aptSendUdp(LMEUdpSendToMessage *udpSendToMessage, int *status); 110*9203SMark.Logan@Sun.COM void _apfProtocolVersion(LMEProtocolVersionMessage *verMsg); 111*9203SMark.Logan@Sun.COM void _apfChannelOpen(LMEChannelOpenRequestMessage *chOpenMsg, int *status); 112*9203SMark.Logan@Sun.COM PortForwardRequest *_closeMChannel(Channel *c); 113*9203SMark.Logan@Sun.COM PortForwardRequest *_apfChannelOFail(LMEChannelOpenReplayFailureMessage *chFailMsg); 114*9203SMark.Logan@Sun.COM PortForwardRequest *_apfChannelClose(LMEChannelCloseMessage *chClMsg); 115*9203SMark.Logan@Sun.COM PortForwardRequest *_apfChannelData(LMEChannelDataMessage *chDMsg, int *status); 116*9203SMark.Logan@Sun.COM void _LmeReceive(void *buffer, unsigned int len, int *status); 117*9203SMark.Logan@Sun.COM void _LmeReceiveCompat(char *buffer, unsigned int len, int *status); 118*9203SMark.Logan@Sun.COM void _signalSelect(); 119*9203SMark.Logan@Sun.COM bool _acceptConnection(SOCKET s, unsigned int port); 120*9203SMark.Logan@Sun.COM int _rxFromSocket(SOCKET s); 121*9203SMark.Logan@Sun.COM int _handleFQDNChange(const char *fqdn); 122*9203SMark.Logan@Sun.COM int _updateIPFQDN(const char *fqdn); 123*9203SMark.Logan@Sun.COM #ifdef _REMOTE_SUPPORT 124*9203SMark.Logan@Sun.COM static bool _compareDNSSuffix(std::string AMTDNSSuffix, std::string suffix); 125*9203SMark.Logan@Sun.COM int _isRemote(SOCKET s) const; 126*9203SMark.Logan@Sun.COM bool _checkRemoteSupport(bool requestDnsFromAmt = false); 127*9203SMark.Logan@Sun.COM void _updateEnterpriseAccessStatus(const ATDomainMap &localDNSSuffixes); 128*9203SMark.Logan@Sun.COM #endif 129*9203SMark.Logan@Sun.COM ssize_t _send(int s, const void *buf, size_t len, int &senderr); 130*9203SMark.Logan@Sun.COM bool _checkListen(std::string address, in_port_t port, int &socket); 131*9203SMark.Logan@Sun.COM int _listenPort(in_port_t port, int &error); 132*9203SMark.Logan@Sun.COM bool _localListen(in_port_t port); 133*9203SMark.Logan@Sun.COM Channel *_getSockOpenChannel(SOCKET s); 134*9203SMark.Logan@Sun.COM 135*9203SMark.Logan@Sun.COM 136*9203SMark.Logan@Sun.COM struct Connection { 137*9203SMark.Logan@Sun.COM SOCKET s; 138*9203SMark.Logan@Sun.COM }; 139*9203SMark.Logan@Sun.COM 140*9203SMark.Logan@Sun.COM typedef std::vector<PortForwardRequest *> PortForwardRequestList; 141*9203SMark.Logan@Sun.COM typedef std::map<unsigned int, PortForwardRequestList> PortMap; 142*9203SMark.Logan@Sun.COM typedef std::map<unsigned int, Channel *> ChannelMap; 143*9203SMark.Logan@Sun.COM 144*9203SMark.Logan@Sun.COM LMEConnection _lme; 145*9203SMark.Logan@Sun.COM char *_rxSocketBuffer; 146*9203SMark.Logan@Sun.COM unsigned int _rxSocketBufferSize; 147*9203SMark.Logan@Sun.COM #ifdef _REMOTE_SUPPORT 148*9203SMark.Logan@Sun.COM ConfigConnection _cfg; 149*9203SMark.Logan@Sun.COM #endif 150*9203SMark.Logan@Sun.COM SOCKET _serverSignalSocket; 151*9203SMark.Logan@Sun.COM SOCKET _clientSignalSocket; // Used to notify Select() to check new available channels 152*9203SMark.Logan@Sun.COM bool _sockets_active; 153*9203SMark.Logan@Sun.COM PortMap _openPorts; 154*9203SMark.Logan@Sun.COM ChannelMap _openChannels; 155*9203SMark.Logan@Sun.COM Semaphore _portsLock; 156*9203SMark.Logan@Sun.COM Semaphore _channelsLock; 157*9203SMark.Logan@Sun.COM #ifdef _REMOTE_SUPPORT 158*9203SMark.Logan@Sun.COM std::list<std::string> _AMTDNSSuffixes; 159*9203SMark.Logan@Sun.COM mutable Semaphore _AMTDNSLock; 160*9203SMark.Logan@Sun.COM bool _remoteAccessEnabled; 161*9203SMark.Logan@Sun.COM mutable Semaphore _remoteAccessLock; 162*9203SMark.Logan@Sun.COM #endif 163*9203SMark.Logan@Sun.COM 164*9203SMark.Logan@Sun.COM enum VERSION_HANDSHAKING { 165*9203SMark.Logan@Sun.COM NOT_INITIATED, 166*9203SMark.Logan@Sun.COM INITIATED, 167*9203SMark.Logan@Sun.COM AGREED 168*9203SMark.Logan@Sun.COM }; 169*9203SMark.Logan@Sun.COM 170*9203SMark.Logan@Sun.COM enum SERVICE_STATUS { 171*9203SMark.Logan@Sun.COM NOT_STARTED, 172*9203SMark.Logan@Sun.COM STARTED 173*9203SMark.Logan@Sun.COM }; 174*9203SMark.Logan@Sun.COM 175*9203SMark.Logan@Sun.COM VERSION_HANDSHAKING _handshakingStatus; 176*9203SMark.Logan@Sun.COM SERVICE_STATUS _pfwdService; 177*9203SMark.Logan@Sun.COM LMEProtocolVersionMessage _AmtProtVersion; 178*9203SMark.Logan@Sun.COM Semaphore _versionLock; 179*9203SMark.Logan@Sun.COM 180*9203SMark.Logan@Sun.COM char _AMTFQDN[FQDN_MAX_SIZE]; 181*9203SMark.Logan@Sun.COM EventLogCallback _eventLog; 182*9203SMark.Logan@Sun.COM void *_eventLogParam; 183*9203SMark.Logan@Sun.COM 184*9203SMark.Logan@Sun.COM bool _deinitReq; 185*9203SMark.Logan@Sun.COM Semaphore _deinitLock; 186*9203SMark.Logan@Sun.COM 187*9203SMark.Logan@Sun.COM typedef std::set<unsigned int> listenPortSet; 188*9203SMark.Logan@Sun.COM listenPortSet _listenFailReported; 189*9203SMark.Logan@Sun.COM }; 190*9203SMark.Logan@Sun.COM 191*9203SMark.Logan@Sun.COM #endif 192