6 #include "NetTcpSocket.hpp"
11 uint32_t NetTcpSocket::sStartSequenceCounter = 0x80000000;
12 uint16_t NetTcpSocket::sAutomaticPort = 0xC070;
14 NetTcpSocket::NetTcpSocket() :
16 mState = STATE_CLOSED;
18 mMaxTxSegmentDataLen = 512;
19 mRxCurrentSegment = 0;
21 mTxCurrentSegment = 0;
22 mIsAutoListenAndAccept =
false;
25 NetTcpSocket::~NetTcpSocket() {
26 if (mState != STATE_CLOSED) {
31 bool NetTcpSocket::connect(NetDefs::IP_ADDR& remoteIpAddr, uint16_t remotePort, uint16_t localPort) {
32 if (!NetArp::resolve(remoteIpAddr, mRemoteMacAddr)) {
36 mRemoteIpAddr = remoteIpAddr;
37 mRemotePort = remotePort;
39 mLocalPort = sAutomaticPort++;
40 if (sAutomaticPort == 0) {
41 sAutomaticPort = 0xC000;
45 mLocalPort = localPort;
47 mState = STATE_SYN_SENT;
48 mRetries = NetTcp::MAX_RETRIES_SYN_SENT;
49 mTimer = NetTcp::TIMER_SYN_SENT;
50 mSentCount = sStartSequenceCounter;
51 sStartSequenceCounter -= 0x1000;
53 NetTcp::addSocket(*
this);
55 NetTcp::sendControlPacket(*
this, NetDefs::TCP_FLAG_SYN);
60 if (mState == STATE_EST) {
61 mIsRxDataFinished =
false;
68 void NetTcpSocket::listen(NetDefs::TCP_PORT localPort) {
69 if (mState != STATE_CLOSED) {
72 mState = STATE_LISTEN;
73 mLocalPort = localPort;
74 mSentCount = sStartSequenceCounter;
75 sStartSequenceCounter -= 0x1000;
77 NetTcp::addSocket(*
this);
81 bool NetTcpSocket::accept(
Rtos::TICK timeout) {
82 if (mSemaEvent.take(timeout)) {
83 mIsRxDataFinished =
false;
89 void NetTcpSocket::autoListenAndAccept(NetDefs::TCP_PORT localPort) {
90 mIsAutoListenAndAccept =
true;
94 bool NetTcpSocket::isConnected() {
95 return (mState == STATE_EST);
98 int NetTcpSocket::read(
void* buffer,
int len,
Rtos::TICK timeout) {
99 if (mIsRxDataFinished) {
105 if (mRxCurrentSegment == 0) {
106 if (!mRxMsgBox.take(mRxCurrentSegment, timeout)) {
109 if (mRxCurrentSegment == 0) {
110 mIsRxDataFinished =
true;
113 mRxCurrentSegment->hdr.index = 0;
116 uint16_t available = mRxCurrentSegment->hdr.dataLen - mRxCurrentSegment->hdr.index;
117 if (available < len) {
119 memcpy(&((uint8_t*) buffer)[dstIndex], &mRxCurrentSegment->data[mRxCurrentSegment->hdr.index], available);
122 dstIndex += available;
124 if (mWindowSize < 16) {
125 mWindowSize += mRxCurrentSegment->hdr.dataLen;
126 NetTcp::sendControlPacket(*
this, NetDefs::TCP_FLAG_ACK);
129 mWindowSize += mRxCurrentSegment->hdr.dataLen;
132 Net::freeFrame((NetDefs::FRAME&) *mRxCurrentSegment);
133 mRxCurrentSegment = 0;
135 else if (available == len) {
137 memcpy(&((uint8_t*) buffer)[dstIndex], &mRxCurrentSegment->data[mRxCurrentSegment->hdr.index], len);
140 if (mWindowSize < 16) {
141 mWindowSize += mRxCurrentSegment->hdr.dataLen;
142 NetTcp::sendControlPacket(*
this, NetDefs::TCP_FLAG_ACK);
145 mWindowSize += mRxCurrentSegment->hdr.dataLen;
148 Net::freeFrame((NetDefs::FRAME&) *mRxCurrentSegment);
149 mRxCurrentSegment = 0;
150 return dstIndex + len;
154 memcpy(&((uint8_t*) buffer)[dstIndex], &mRxCurrentSegment->data[mRxCurrentSegment->hdr.index], len);
156 mRxCurrentSegment->hdr.index += len;
157 return dstIndex + len;
162 int NetTcpSocket::skip(
int len,
Rtos::TICK timeout) {
163 return read(0, len, timeout);
166 int NetTcpSocket::write(
const void* buffer,
int len,
Rtos::TICK timeout) {
167 if (mState != STATE_EST) {
176 bool continueLoop =
true;
178 while (left && (continueLoop || !timer.
isEllapsed()) && (mState == STATE_EST)) {
183 if (mTxCurrentSegment == 0) {
186 int queuedSegments = 0;
187 for (TX_SEGMENT* iterator = mTxFirstSegment; iterator != 0; iterator = iterator->next) {
190 if (queuedSegments >= MAX_QUEUED_TX_SEGMENTS) {
193 continueLoop =
false;
199 TX_SEGMENT* segment = (TX_SEGMENT*) Net::allocFrame(
200 sizeof(tagTX_SEGMENT*) +
sizeof(TX_SEGMENT_HEADER) +
sizeof(NetDefs::MAC_HEADER) +
sizeof(NetDefs::IP_HEADER) +
sizeof(NetDefs::TCP_HEADER)
201 + mMaxTxSegmentDataLen);
206 continueLoop =
false;
211 segment->hdr.flushed =
false;
212 segment->hdr.len = 0;
213 segment->hdr.maxLen = mMaxTxSegmentDataLen;
214 segment->hdr.retries = NetTcp::MAX_RETRIES_SEGMENT_RETRY;
215 segment->hdr.timeout = NetTcp::TIMER_SEGMENT_FLUSH;
217 if (mTxFirstSegment == 0) {
218 mTxFirstSegment = segment;
219 segment->hdr.seq = mSentCount;
222 TX_SEGMENT* iterator;
223 for (iterator = mTxFirstSegment; iterator->next != 0; iterator = iterator->next)
225 iterator->next = segment;
226 segment->hdr.seq = iterator->hdr.seq + iterator->hdr.len;
228 mTxCurrentSegment = segment;
231 uint16_t writable = mTxCurrentSegment->hdr.maxLen - mTxCurrentSegment->hdr.len;
233 if (writable > left) {
237 memcpy(&mTxCurrentSegment->frame.types.tcp.data[mTxCurrentSegment->hdr.len], &((uint8_t*) buffer)[written], writable);
240 mTxCurrentSegment->hdr.len += writable;
241 if (mTxCurrentSegment->hdr.len >= mTxCurrentSegment->hdr.maxLen) {
242 NetTcp::flushSegment(*
this, *mTxCurrentSegment);
250 void NetTcpSocket::close() {
251 if (mState == STATE_CLOSED) {
263 NetTcp::sendControlPacket(*
this, NetDefs::TCP_FLAG_PSH | NetDefs::TCP_FLAG_RST);
266 discardAllRxSegments();
268 NetTcpSocket* socket =
new NetTcpSocket();
271 socket->mState = STATE_FIN_WAIT_1;
272 socket->mRetries = NetTcp::MAX_RETRIES_FIN_WAIT_1;
273 socket->mTimer = NetTcp::TIMER_FIN_WAIT_1;
274 NetTcp::addSocket(*socket);
275 NetTcp::sendControlPacket(*socket, NetDefs::TCP_FLAG_FIN | NetDefs::TCP_FLAG_ACK);
276 socket->mSentCount++;
279 NetTcp::sendControlPacket(*
this, NetDefs::TCP_FLAG_PSH | NetDefs::TCP_FLAG_RST);
280 discardAllTxSegments();
284 case STATE_CLOSE_WAIT: {
285 discardAllRxSegments();
286 NetTcpSocket* socket =
new NetTcpSocket();
289 socket->mState = STATE_LAST_ACK;
290 socket->mRetries = NetTcp::MAX_RETRIES_LAST_ACK;
291 socket->mTimer = NetTcp::TIMER_LAST_ACK;
292 NetTcp::addSocket(*socket);
293 NetTcp::sendControlPacket(*socket, NetDefs::TCP_FLAG_FIN | NetDefs::TCP_FLAG_ACK);
294 socket->mSentCount++;
297 NetTcp::sendControlPacket(*
this, NetDefs::TCP_FLAG_PSH | NetDefs::TCP_FLAG_RST);
298 discardAllTxSegments();
303 discardAllRxSegments();
309 NetTcp::removeSocket(*
this);
310 mState = STATE_CLOSED;
312 mTxCurrentSegment = 0;
313 mIsAutoListenAndAccept =
false;
317 void NetTcpSocket::setWindowSize(uint16_t windowsSize) {
318 mWindowSize = windowsSize;
321 void NetTcpSocket::setMaxTxSegmentDataLen(uint16_t maxTxSegmentDataLen) {
322 mMaxTxSegmentDataLen = maxTxSegmentDataLen;
325 void NetTcpSocket::flush() {
326 for (NetTcpSocket::TX_SEGMENT* segment = mTxFirstSegment; segment != 0; segment = segment->next) {
327 NetTcp::flushSegment(*
this, *segment);
331 void NetTcpSocket::discardAllTxSegments() {
332 for (NetTcpSocket::TX_SEGMENT* segment = mTxFirstSegment; segment != 0;) {
333 NetTcpSocket::TX_SEGMENT* next = segment->next;
334 Net::freeFrame((NetDefs::FRAME&) *segment);
337 mTxCurrentSegment = 0;
341 void NetTcpSocket::discardAllRxSegments() {
342 while (mRxMsgBox.take(mRxCurrentSegment, 0)) {
343 mWindowSize += mRxCurrentSegment->hdr.dataLen;
344 if (mRxCurrentSegment) {
345 Net::freeFrame((NetDefs::FRAME&) *mRxCurrentSegment);
348 mRxCurrentSegment = 0;