1 /******************************************************************************* 2 * Copyright (C) 2004-2008 Intel Corp. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * 7 * - Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * 10 * - Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 14 * - Neither the name of Intel Corp. nor the names of its 15 * contributors may be used to endorse or promote products derived from this 16 * software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS 22 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 *******************************************************************************/ 30 31 #ifndef _CHANNEL_H_ 32 #define _CHANNEL_H_ 33 34 #include "PortForwardRequest.h" 35 36 #ifdef _LINUX 37 #ifndef SOCKET 38 #define SOCKET int 39 #endif 40 #endif 41 42 class Channel 43 { 44 public: 45 enum CHANNEL_STATUS { 46 NOT_OPENED, 47 OPEN, 48 WAITING_CLOSE, 49 CLOSED 50 }; 51 52 static const unsigned int LMS_WINDOW_SIZE = 4095; 53 Channel(PortForwardRequest * portForwardRequest,SOCKET socket)54 Channel(PortForwardRequest *portForwardRequest, SOCKET socket) : 55 _recipientChannel(0), 56 _senderChannel((unsigned int)socket), 57 _socket(socket), 58 _txWindow(0), 59 _rxWindow(LMS_WINDOW_SIZE), 60 _status(NOT_OPENED), 61 _portForwardRequest(portForwardRequest) {} 62 GetRecipientChannel()63 unsigned int GetRecipientChannel() const { return _recipientChannel; } GetSenderChannel()64 unsigned int GetSenderChannel() const { return _senderChannel; } SetRecipientChannel(unsigned int recipientChannel)65 bool SetRecipientChannel(unsigned int recipientChannel) { _recipientChannel = recipientChannel; return true; } GetTxWindow()66 unsigned int GetTxWindow() const { return _txWindow; } GetRxWindow()67 unsigned int GetRxWindow() const { return _rxWindow; } 68 AddBytesTxWindow(const int bytesToAdd)69 bool AddBytesTxWindow(const int bytesToAdd) 70 { 71 if (_txWindow + bytesToAdd < 0) { 72 _txWindow = 0; 73 return true; 74 } 75 _txWindow += bytesToAdd; 76 return true; 77 } 78 AddBytesRxWindow(const int bytesToAdd)79 bool AddBytesRxWindow(const int bytesToAdd) 80 { 81 if (_rxWindow + bytesToAdd < 0) { 82 _rxWindow = 0; 83 return true; 84 } 85 _rxWindow = (_rxWindow + bytesToAdd > LMS_WINDOW_SIZE) ? 86 (LMS_WINDOW_SIZE) : 87 (_rxWindow + bytesToAdd); 88 return true; 89 } 90 GetSocket()91 SOCKET GetSocket() const { return _socket; } GetStatus()92 CHANNEL_STATUS GetStatus() const { return _status; } SetStatus(const CHANNEL_STATUS newStatus)93 bool SetStatus(const CHANNEL_STATUS newStatus) { _status = newStatus; return true; } GetPortForwardRequest()94 PortForwardRequest * GetPortForwardRequest() const { return _portForwardRequest; } 95 96 97 private: 98 unsigned int _recipientChannel; 99 const unsigned int _senderChannel; 100 const SOCKET _socket; 101 unsigned int _txWindow; 102 unsigned int _rxWindow; 103 CHANNEL_STATUS _status; 104 PortForwardRequest *_portForwardRequest; 105 }; 106 107 #endif 108