1/*
2 * Copyright 2010 Andreas F��rber <andreas.faerber@web.de>
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef BOOT_NET_TCP_H
6#define BOOT_NET_TCP_H
7
8
9#include <boot/net/IP.h>
10
11
12class TCPPacket {
13public:
14	TCPPacket();
15	~TCPPacket();
16
17	status_t SetTo(const void* data, size_t size, ip_addr_t sourceAddress,
18		uint16 sourcePort, ip_addr_t destinationAddress,
19		uint16 destinationPort, uint32 sequenceNumber,
20		uint32 acknowledgmentNumber, uint8 flags);
21
22	ip_addr_t SourceAddress() const;
23	ip_addr_t DestinationAddress() const;
24	uint16 SourcePort() const;
25	uint16 DestinationPort() const;
26	uint32 SequenceNumber() const;
27	uint32 AcknowledgmentNumber() const;
28	const void* Data() const { return fData; }
29	size_t DataSize() const { return fSize; }
30	uint8 Flags() const { return fFlags; }
31
32	bool ProvidesSequenceNumber(uint32 sequenceNo) const;
33
34	TCPPacket* Next() const;
35	void SetNext(TCPPacket* packet);
36
37private:
38	ip_addr_t	fSourceAddress;
39	ip_addr_t	fDestinationAddress;
40	uint16		fSourcePort;
41	uint16		fDestinationPort;
42	uint32		fSequenceNumber;
43	uint32		fAcknowledgmentNumber;
44	void*		fData;
45	size_t		fSize;
46	uint8		fFlags;
47	TCPPacket*	fNext;
48};
49
50class TCPService;
51
52enum TCPSocketState {
53	TCP_SOCKET_STATE_INITIAL,
54	TCP_SOCKET_STATE_SYN_SENT,
55	TCP_SOCKET_STATE_SYN_RECEIVED,
56	TCP_SOCKET_STATE_OPEN,
57	TCP_SOCKET_STATE_FIN_SENT,
58	TCP_SOCKET_STATE_CLOSED
59};
60
61class TCPSocket {
62public:
63	TCPSocket();
64	~TCPSocket();
65
66	ip_addr_t Address() const	{ return fAddress; }
67	uint16 Port() const			{ return fPort; }
68	uint16 WindowSize() const;
69
70	status_t Connect(ip_addr_t address, uint16 port);
71	status_t Close();
72	status_t Read(void* buffer, size_t bufferSize, size_t* bytesRead, bigtime_t timeout = 0);
73	status_t Write(const void* buffer, size_t bufferSize);
74
75	void Acknowledge(uint32 number);
76	void ProcessPacket(TCPPacket* packet);
77
78private:
79	TCPPacket* _PeekPacket();
80	TCPPacket* _DequeuePacket();
81	status_t _Send(TCPPacket* packet, bool enqueue = true);
82	status_t _ResendQueue();
83	void _EnqueueOutgoingPacket(TCPPacket* packet);
84	inline void	_DumpQueue();
85	status_t _WaitForState(TCPSocketState state, bigtime_t timeout = 0);
86	status_t _Ack();
87
88	TCPService*	fTCPService;
89	ip_addr_t	fAddress;
90	uint16		fPort;
91	ip_addr_t	fRemoteAddress;
92	uint16		fRemotePort;
93	uint32		fSequenceNumber;
94	uint32		fAcknowledgeNumber;
95	uint32		fNextSequence;
96	TCPPacket*	fFirstPacket;
97	TCPPacket*	fLastPacket;
98	TCPPacket*	fFirstSentPacket;
99	TCPPacket*	fLastSentPacket;
100	TCPSocketState fState;
101	TCPSocketState fRemoteState;
102};
103
104class TCPService : public IPSubService {
105public:
106	TCPService(IPService* ipService);
107	virtual ~TCPService();
108
109	status_t Init();
110
111	virtual uint8 IPProtocol() const;
112
113	virtual void HandleIPPacket(IPService* ipService, ip_addr_t sourceIP,
114		ip_addr_t destinationIP, const void* data, size_t size);
115
116	status_t Send(uint16 sourcePort, ip_addr_t destinationAddress,
117		uint16 destinationPort, uint32 sequenceNumber,
118		uint32 acknowledgmentNumber, uint8 flags, uint16 windowSize,
119		ChainBuffer* buffer);
120
121	void ProcessIncomingPackets();
122
123	status_t BindSocket(TCPSocket* socket);
124	void UnbindSocket(TCPSocket* socket);
125
126private:
127	uint16 _ChecksumBuffer(ChainBuffer* buffer, ip_addr_t source,
128		ip_addr_t destination, uint16 length);
129	uint16 _ChecksumData(const void* data, uint16 length, ip_addr_t source,
130		ip_addr_t destination);
131
132	TCPSocket* _FindSocket(ip_addr_t address, uint16 port);
133
134	IPService*			fIPService;
135	Vector<TCPSocket*>	fSockets;
136};
137
138
139#endif
140