xref: /titanic_41/usr/src/cmd/lms/Channel.h (revision d2b5b2d357ee3172eacb6860be1891259902203d)
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 
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 
63 	unsigned int GetRecipientChannel() const { return _recipientChannel; }
64 	unsigned int GetSenderChannel() const { return _senderChannel; }
65 	bool SetRecipientChannel(unsigned int recipientChannel) { _recipientChannel = recipientChannel; return true; }
66 	unsigned int GetTxWindow() const { return _txWindow; }
67 	unsigned int GetRxWindow() const { return _rxWindow; }
68 
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 
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 
91 	SOCKET GetSocket() const { return _socket; }
92 	CHANNEL_STATUS GetStatus() const { return _status; }
93 	bool SetStatus(const CHANNEL_STATUS newStatus) { _status = newStatus; return true; }
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