1 /*--------------------------------------------------------------------------
2 Project: HorizonSDK
3 File: rdt_SenderImpl.cpp
4
5 Copyright 2009 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Date:: 2011-02-07#$
14 $Rev: 34174 $
15 $Author: okubata_ryoma $
16 *-------------------------------------------------------------------------*/
17
18 #include "stdafx.h"
19
20 #include "rdt_SenderImpl.h"
21
22 #include <nn/rdt/CTR/rdt_define.h>
23 #include <nn/rdt/CTR/rdt_Result.h>
24
25 #include "rdt_Stopwatch.h"
26
27 #include "Test.h"
28
29
30 namespace
31 {
32
33 } // end of anonymous namespace
34
35
36 namespace nn { namespace rdt { namespace CTR {
37
38
39 // 「状態」の基底クラス。
40 class SenderStateBase{
41 public:
~SenderStateBase(void)42 virtual ~SenderStateBase(void){}
43
44 virtual void initialize(SenderImpl *pSender); // この状態が開始されるときに呼ばれる
45 virtual void finalize (SenderImpl *pSender); // この状態が終了されるときに呼ばれる
46 void update (SenderImpl *pSender);
47 virtual void updatePrologue (SenderImpl *pSender);
48 virtual void updateCore (SenderImpl *pSender);
49 virtual void updateEpilogue (SenderImpl *pSender);
50 virtual enum SenderState getStatus(void) const = 0;
51
52 protected:
SenderStateBase(void)53 SenderStateBase(void){}
54 };
55
56
initialize(SenderImpl * pSender)57 void SenderStateBase::initialize(SenderImpl *pSender)
58 {
59 (void)pSender;
60 }
61
62
finalize(SenderImpl * pSender)63 void SenderStateBase::finalize(SenderImpl *pSender)
64 {
65 (void)pSender;
66 }
67
68
updatePrologue(SenderImpl * pSender)69 void SenderStateBase::updatePrologue(SenderImpl *pSender)
70 {
71 (void)pSender;
72 }
73
74
updateCore(SenderImpl * pSender)75 void SenderStateBase::updateCore(SenderImpl *pSender)
76 {
77 (void)pSender;
78 }
79
80
updateEpilogue(SenderImpl * pSender)81 void SenderStateBase::updateEpilogue(SenderImpl *pSender)
82 {
83 (void)pSender;
84 }
85
86
update(SenderImpl * pSender)87 void SenderStateBase::update(SenderImpl *pSender)
88 {
89 updatePrologue(pSender);
90 updateCore(pSender);
91 updateEpilogue(pSender);
92 }
93
94
95 class SenderStateOpenRequested : public SenderStateBase{
96 public:
97 static SenderStateBase* getInstance(void);
98
99 virtual void updateCore(SenderImpl *pSender);
100 virtual enum SenderState getStatus(void) const;
101
102 protected:
SenderStateOpenRequested(void)103 SenderStateOpenRequested(void){}
104 };
105
106
107 class SenderStateOpening : public SenderStateBase{
108 public:
109 static SenderStateBase* getInstance(void);
110
111 virtual void updateCore(SenderImpl *pSender);
112 virtual enum SenderState getStatus(void) const;
113
114 protected:
SenderStateOpening(void)115 SenderStateOpening(void){}
116 };
117
118
119 class SenderStateOpened : public SenderStateBase{
120 public:
121 static SenderStateBase* getInstance(void);
122
123 virtual void updateCore(SenderImpl *pSender);
124 virtual enum SenderState getStatus(void) const;
125
126 protected:
SenderStateOpened(void)127 SenderStateOpened(void){}
128 };
129
130
131 class SenderStateCloseRequested : public SenderStateBase{
132 public:
133 static SenderStateBase* getInstance(void);
134
135 virtual void updateCore(SenderImpl *pSender);
136 virtual enum SenderState getStatus(void) const;
137
138 protected:
SenderStateCloseRequested(void)139 SenderStateCloseRequested(void){}
140 };
141
142
143 class SenderStateClosing : public SenderStateBase{
144 public:
145 static SenderStateBase* getInstance(void);
146
147 virtual void updateCore(SenderImpl *pSender);
148 virtual enum SenderState getStatus(void) const;
149
150 protected:
SenderStateClosing(void)151 SenderStateClosing(void){}
152 };
153
154
155 class SenderStateClosed : public SenderStateBase{
156 public:
157 static SenderStateBase* getInstance(void);
158
159 virtual void initialize(SenderImpl *pSender);
160 virtual void updateCore(SenderImpl *pSender);
161 virtual enum SenderState getStatus(void) const;
162
163 protected:
SenderStateClosed(void)164 SenderStateClosed(void){}
165 };
166
167
168 // 以下、State派生クラスの実装。
getInstance(void)169 SenderStateBase* SenderStateClosed::getInstance(void)
170 {
171 static SenderStateClosed s_instance;
172 return &s_instance;
173 }
174
175
getStatus(void) const176 enum SenderState SenderStateClosed::getStatus(void) const
177 {
178 return SENDER_STATE_CLOSED;
179 }
180
181
initialize(SenderImpl * pSender)182 void SenderStateClosed::initialize(SenderImpl *pSender)
183 {
184 ASSERT(pSender!=NULL);
185
186 pSender->clear();
187 }
188
189
updateCore(SenderImpl * pSender)190 void SenderStateClosed::updateCore(SenderImpl *pSender)
191 {
192 ASSERT(pSender!=NULL);
193
194 // CLOSED状態の時に受信した(RSTを含まない)セグメントに対しては、RSTで返答
195 Segment seg;
196 if(pSender->pullSegment(&seg).IsSuccess() && !seg.IsRst())
197 {
198 #if 0
199 LOG("SenderはCLOSED状態ですが、セグメントが届いてしまったので、RSTで返答します。\n");
200 LOG("受信セグメントの内容は、\n");
201 seg.PrintDebugInfo();
202 LOG("です。\n");
203 const u32 SEQ = 0;
204 pSender->sendRstSegment(SEQ);
205 #else
206 LOG("Sender is in CLOSED state, but received segment. Ignored.\n");
207 #endif
208 }
209 }
210
211
getInstance(void)212 SenderStateBase* SenderStateOpenRequested::getInstance(void)
213 {
214 static SenderStateOpenRequested s_instance;
215 return &s_instance;
216 }
217
218
getStatus(void) const219 enum SenderState SenderStateOpenRequested::getStatus(void) const
220 {
221 return SENDER_STATE_OPEN_REQUESTED;
222 }
223
224
updateCore(SenderImpl * pSender)225 void SenderStateOpenRequested::updateCore(SenderImpl *pSender)
226 {
227 // 接続要求セグメントを送る
228 pSender->sendSynSegment();
229
230 // 次の状態へ。
231 pSender->setNextState(SenderStateOpening::getInstance());
232 }
233
234
getInstance(void)235 SenderStateBase* SenderStateOpening::getInstance(void)
236 {
237 static SenderStateOpening s_instance;
238 return &s_instance;
239 }
240
241
getStatus(void) const242 enum SenderState SenderStateOpening::getStatus(void) const
243 {
244 return SENDER_STATE_OPENING;
245 }
246
247
updateCore(SenderImpl * pSender)248 void SenderStateOpening::updateCore(SenderImpl *pSender)
249 {
250 ASSERT(pSender!=NULL);
251
252 // 受信したセグメントの内容を調べる。
253 Segment seg;
254 if(pSender->pullSegment(&seg).IsSuccess())
255 {
256 pSender->processReceivedSegment(seg);
257
258 if(seg.IsRst())
259 {
260 // こちらのSYNに対するRSTかどうかをチェック。SYNに対するものでなければ、セグメントは破棄。
261 if(seg.IsAck() && seg.GetAckNumber()==pSender->getInitialSequenceNumber()+1)
262 {
263 // SYNは拒否されたと見なす。CLOSEDへ。
264 LOG("SYN rejected. CLOSED... ack of segment = %u\n", seg.GetAckNumber());
265 pSender->setNextState(SenderStateClosed::getInstance());
266 pSender->errorHandling(ResultResetReceived());
267 return;
268 }
269 else
270 {
271 LOG("Ignored RST segment.\n");
272 }
273 }
274 else if(seg.IsAck())
275 {
276 if(seg.GetAckNumber()==pSender->getInitialSequenceNumber()+1)
277 {
278 // SYNに対するACKが返ってきたので、次の状態に移行。
279 pSender->setNextState(SenderStateOpened::getInstance());
280 }
281 else
282 {
283 LOG("ack : %u\n", seg.GetAckNumber());
284 LOG("una : %u\n", pSender->getUnacknowledgeNumber());
285 LOG("nxt : %u\n", pSender->getNextSequenceNumber());
286 LOG("It seems that it isn't ACK for SYN. Ignored\n");
287 }
288 }
289 }
290
291 // 再送処理。
292 pSender->processResending();
293 }
294
295
getInstance(void)296 SenderStateBase* SenderStateOpened::getInstance(void)
297 {
298 static SenderStateOpened s_instance;
299 return &s_instance;
300 }
301
302
getStatus(void) const303 enum SenderState SenderStateOpened::getStatus(void) const
304 {
305 return SENDER_STATE_OPENED;
306 }
307
308
updateCore(SenderImpl * pSender)309 void SenderStateOpened::updateCore(SenderImpl *pSender)
310 {
311 ASSERT(pSender!=NULL);
312
313 // 受信したセグメントの内容を調べる。
314 Segment seg;
315 if(pSender->pullSegment(&seg).IsSuccess())
316 {
317 pSender->processReceivedSegment(seg);
318
319 if(seg.IsRst())
320 {
321 // RSTだったので、CLOSEDへ。
322 pSender->setNextState(SenderStateClosed::getInstance());
323 pSender->errorHandling(ResultResetReceived());
324 return;
325 }
326 }
327
328 bool bSent = false; // 送信処理を実行したなら、trueにセットすること。
329
330 // 再送処理。
331 bSent = pSender->processResending();
332
333 // 送信処理が1回も無ければ、データ送信のチャンス。
334 if(!bSent)
335 {
336 if(!pSender->isSendBufferEmpty())
337 {
338 pSender->sendData();
339 bSent = true;
340 }
341 }
342 }
343
344
getInstance(void)345 SenderStateBase* SenderStateCloseRequested::getInstance(void)
346 {
347 static SenderStateCloseRequested s_instance;
348 return &s_instance;
349 }
350
351
getStatus(void) const352 enum SenderState SenderStateCloseRequested::getStatus(void) const
353 {
354 return SENDER_STATE_CLOSE_REQUESTED;
355 }
356
357
updateCore(SenderImpl * pSender)358 void SenderStateCloseRequested::updateCore(SenderImpl *pSender)
359 {
360 ASSERT(pSender!=NULL);
361
362 // 受信したセグメントの内容を調べる。このあたりはOpened状態と同様。
363 Segment seg;
364 if(pSender->pullSegment(&seg).IsSuccess())
365 {
366 pSender->processReceivedSegment(seg);
367
368 if(seg.IsRst())
369 {
370 // RSTだったので、CLOSEDへ。
371 pSender->setNextState(SenderStateClosed::getInstance());
372 pSender->errorHandling(ResultResetReceived());
373 return;
374 }
375 }
376
377 bool bSent = false; // 送信処理を実行したなら、trueにセットすること。
378
379 // 再送処理。
380 bSent = pSender->processResending();
381
382 if(pSender->isSendBufferEmpty())
383 {
384 // FINセグメントの送信
385 if(!bSent)
386 {
387 pSender->sendFinSegment();
388 bSent = true;
389
390 // CLOSING状態へ。
391 pSender->setNextState(SenderStateClosing::getInstance());
392 }
393 }
394 else
395 {
396 // 送信バッファのデータを掃き出し
397 if(!bSent)
398 {
399 pSender->sendData();
400 bSent = true;
401 }
402 }
403
404 // 送信処理が1回も無ければ、データ送信のチャンス。
405 if(!bSent)
406 {
407 if(!pSender->isSendBufferEmpty())
408 {
409 pSender->sendData();
410 bSent = true;
411 }
412 }
413 }
414
415
getInstance(void)416 SenderStateBase* SenderStateClosing::getInstance(void)
417 {
418 static SenderStateClosing s_instance;
419 return &s_instance;
420 }
421
422
getStatus(void) const423 enum SenderState SenderStateClosing::getStatus(void) const
424 {
425 return SENDER_STATE_CLOSING;
426 }
427
428
updateCore(SenderImpl * pSender)429 void SenderStateClosing::updateCore(SenderImpl *pSender)
430 {
431 ASSERT(pSender!=NULL);
432
433 // 再送処理。
434 pSender->processResending();
435
436 // 受信したセグメントの内容を調べる。
437 Segment seg;
438 if(pSender->pullSegment(&seg).IsSuccess())
439 {
440 pSender->processReceivedSegment(seg);
441
442 if(seg.IsRst())
443 {
444 // RSTだったので、CLOSEDへ。
445 pSender->setNextState(SenderStateClosed::getInstance());
446 pSender->errorHandling(ResultResetReceived());
447 return;
448 }
449 else if(seg.IsAck() && seg.GetAckNumber()==pSender->m_sendBuffer.GetCurrentSequenceNumber()+1)
450 {
451 // 受信したセグメントの内容を調べる。(FINチェック)
452 // FINに対するACKが返ってきたので、CLOSEDへ。
453 pSender->setNextState(SenderStateClosed::getInstance());
454 }
455 else
456 {
457 VERBOSE("セグメントは受信しましたが、FINへのACKセグメントではないようです。破棄します。\n");
458 }
459 }
460 }
461
462
463
464 ///< コンストラクタ
SenderImpl(void)465 SenderImpl::SenderImpl(void) throw()
466 :m_initialized(false)
467 {
468 }
469
470
471 ///< デストラクタ
~SenderImpl(void)472 SenderImpl::~SenderImpl(void)
473 {
474 Finalize();
475 }
476
477
478 #ifdef _WIN32
Initialize(SOCKET sock,void * pSendBuf,u16 sendBufSize)479 nn::Result SenderImpl::Initialize(SOCKET sock, void *pSendBuf, u16 sendBufSize)
480 #else
481 nn::Result SenderImpl::Initialize(u16 nodeId, u8 port, void *pSendBuf, u16 sendBufSize)
482 #endif
483 {
484 if(m_initialized)
485 {
486 return ResultAlreadyInitialized();
487 }
488 else
489 {
490 if(pSendBuf==NULL)
491 {
492 return ResultNullPointer();
493 }
494
495 if(sendBufSize==0)
496 {
497 return ResultInvalidSize();
498 }
499
500 #ifdef _WIN32
501 nn::Result result = HostBase::Initialize(sock);
502 #elif defined(NN_PLATFORM_CTR)
503 nn::Result result = HostBase::Initialize(nodeId, port);
504 #endif
505 if(result.IsFailure())
506 {
507 return result;
508 }
509 else
510 {
511 m_sendBuffer.Initialize(pSendBuf, sendBufSize);
512 m_pState = SenderStateClosed::getInstance();
513 m_pNextState = NULL;
514
515 clear();
516
517 m_initialized = true;
518 return ResultSuccess();
519 }
520 }
521 }
522
523
Finalize(void)524 void SenderImpl::Finalize(void)
525 {
526 if(m_initialized)
527 {
528 m_initialized = false;
529 m_sendBuffer.Finalize();
530 HostBase::Finalize();
531 }
532 else
533 {
534 // Do nothing.
535 }
536 }
537
538
Process(void)539 nn::Result SenderImpl::Process(void)
540 {
541 ASSERT(m_initialized);
542
543 // 状態に応じたupdate()
544 if(m_pState)
545 {
546 m_pState->update(this);
547 }
548
549 // 状態遷移
550 changeState();
551
552 // デバッグ用
553 // PrintDebugInfo();
554
555 // エラーはここで返る。
556 // 返したら、エラーはリセットする。
557 nn::Result ret = GetErrorCode();
558 errorHandling(ResultSuccess());
559 return ret;
560 }
561
562
Open(void)563 nn::Result SenderImpl::Open(void)
564 {
565 ASSERT(m_initialized);
566
567 if(GetStatus()==SENDER_STATE_CLOSED)
568 {
569 setNextState(SenderStateOpenRequested::getInstance());
570 changeState();
571 return ResultSuccess();
572 }
573 else
574 {
575 return ResultUntimelyFunctionCall();
576 }
577 }
578
579
Close(void)580 nn::Result SenderImpl::Close(void)
581 {
582 ASSERT(m_initialized);
583
584 if(GetStatus()==SENDER_STATE_OPENED)
585 {
586 setNextState(SenderStateCloseRequested::getInstance());
587 changeState();
588 return ResultSuccess();
589 }
590 else
591 {
592 // CLOSED状態の時にClose()が呼ばれたら、エラーにする。
593 // この挙動はTCPのRFCに準じているが、この挙動もここに含まれる。
594 return ResultUntimelyFunctionCall();
595 }
596 }
597
598
Send(const void * pBuf,size_t bufSize)599 nn::Result SenderImpl::Send(const void *pBuf, size_t bufSize)
600 {
601 ASSERT(m_initialized);
602
603 if(pBuf==NULL)
604 {
605 return ResultNullPointer();
606 }
607
608 if(bufSize==0)
609 {
610 return ResultDoNothing();
611 }
612
613 if(GetStatus()!=SENDER_STATE_OPENED)
614 {
615 return ResultUntimelyFunctionCall();
616 }
617
618 if(m_sendBuffer.Push(pBuf, bufSize))
619 {
620 return ResultSuccess();
621 }
622 else
623 {
624 return ResultSendBufferIsNotAvailable();
625 }
626 }
627
628
Cancel(void)629 void SenderImpl::Cancel(void)
630 {
631 ASSERT(m_initialized);
632
633 // キャンセル処理はProcess()を待たずに即座に実行することにする。
634 // エラーハンドリングを実装したサンプルプログラムを記述している最中、
635 // そのほうがアプリ側にとって使いやすいように思えたので。
636
637 // RST送信
638 sendRstSegment(m_sendBuffer.GetCurrentSequenceNumber());
639
640 // 即座にClosed状態へ。
641 setNextState(SenderStateClosed::getInstance());
642 changeState();
643 }
644
645
GetStatus(void) const646 enum SenderState SenderImpl::GetStatus(void) const
647 {
648 ASSERT(m_initialized);
649 ASSERT(m_pState!=NULL);
650
651 return m_pState->getStatus();
652 }
653
654
processResending(void)655 bool SenderImpl::processResending(void)
656 {
657 Segment seg;
658 // タイムアウトを迎えたセグメントがキューに見つかったか、
659 // あるいはいったんそういうセグメントが見つかり、残りの
660 // セグメントを送り終えるのを待っている状態か
661 if(m_resendQueue.IsResendMode())
662 {
663 bool ret = m_resendQueue.Front(&seg);
664 ASSERT(ret);
665 VERBOSE("新・再送処理を実行します。\n");
666 VERBOSE("送信セグメントのシーケンス番号は:%dです。\n", seg.GetSeqNumber());
667 putSegment(seg);
668
669 static detail::Stopwatch s_sp("ResendQueue::TryAgain()");
670 s_sp.Start();
671 m_resendQueue.TryAgain(); // キューの先頭要素を最後尾に回す
672 s_sp.Stop();
673 return true;
674 }
675 else
676 {
677 return false;
678 }
679 }
680
681
sendData(void)682 void SenderImpl::sendData(void)
683 {
684 if(m_sendBuffer.IsEmpty())
685 {
686 VERBOSE("送信バッファはカラッポでしたので、送信処理は行いません。\n");
687 return;
688 }
689
690 u32 unackDataSize = m_resendQueue.GetTotalDataSize();
691 if(unackDataSize >= m_remoteWindowSize)
692 {
693 VERBOSE("到達未確認のデータが受信ウィンドウサイズ以上なので、データ送信は見送ります。\n");
694 return;
695 }
696
697 if(m_resendQueue.IsFull())
698 {
699 VERBOSE("再送キューが満杯なので、送信処理は行いません。\n");
700 return;
701 }
702
703 size_t vacant = m_remoteWindowSize - unackDataSize;
704 size_t pullSize = min(Segment::PAYLOAD_SIZE, vacant); // 送信バッファから引き出す量
705 ASSERT(pullSize > 0);
706
707 // 以下、データ送信処理
708 Segment seg;
709 seg.ClearHeader();
710 u32 seq = 0;
711
712 // データをセグメントに詰める処理を実行。
713 size_t sz = m_sendBuffer.Pull(seg.payload, &seq, pullSize);
714 ASSERT(sz > 0);
715
716 // ここにくるまでに、再送処理が確実に行われること(再送キューに余裕があること)などを
717 // しっかり保証しておかないといけない。
718 seg.header.dataLength = sz;
719 seg.SetSeqNumber(seq);
720 putSegmentWithResend(seg);
721 }
722
723
sendSynSegment(void)724 void SenderImpl::sendSynSegment(void)
725 {
726 Segment seg;
727 seg.ClearHeader();
728 seg.SetSeqNumber(getInitialSequenceNumber());
729 seg.SetSyn();
730 putSegmentWithResend(seg);
731 }
732
733
sendFinSegment(void)734 void SenderImpl::sendFinSegment(void)
735 {
736 ASSERTMSG(m_sendBuffer.IsEmpty(), "You cannot request FIN if send buffer is not empty.");
737
738 VERBOSE("sendFinSegment() called.\n");
739
740 Segment seg;
741 seg.ClearHeader();
742 seg.SetFin();
743 seg.SetSeqNumber(m_sendBuffer.GetCurrentSequenceNumber());
744 putSegmentWithResend(seg);
745 }
746
747
clear(void)748 void SenderImpl::clear(void)
749 {
750 m_resendQueue.Clear();
751 m_remoteWindowSize = 0;
752 #if 1
753 m_iss = static_cast<u32>(0xffffffff & GetCurrentTimeAsMillisecond());
754 #else
755 m_iss = 0xffffffff - 100;
756 #endif
757 m_sendBuffer.Clear(m_iss);
758 m_una = m_iss;
759 m_nxt = m_iss;
760
761 m_arrivals = 0;
762 }
763
764
isValidAckNumber(u32 ack) const765 bool SenderImpl::isValidAckNumber(u32 ack) const
766 {
767 s32 s32_ack = static_cast<s32>(ack);
768 s32 s32_una = static_cast<s32>(getUnacknowledgeNumber());
769 s32 s32_nxt = static_cast<s32>(getNextSequenceNumber());
770
771 // 許容ACKの不等式、snd.una < seg.ack <= snd.nxtを表現する。
772 if((0 <= s32_una - s32_ack) || (0 < s32_ack - s32_nxt))
773 {
774 return false;
775 }
776 else
777 {
778 return true;
779 }
780 }
781
782
783
784 // 状態遷移。次の状態がセットされていないなら、特に何もしない。
changeState(void)785 void SenderImpl::changeState(void)
786 {
787 if(m_pNextState)
788 {
789 if(m_pState)
790 {
791 m_pState->finalize(this);
792 }
793 m_pState = m_pNextState;
794 m_pNextState = NULL;
795 m_pState->initialize(this);
796 }
797 }
798
799
setNextState(SenderStateBase * p)800 void SenderImpl::setNextState(SenderStateBase *p)
801 {
802 ASSERT(p!=NULL);
803 ASSERT(m_pNextState==NULL);
804
805 m_pNextState = p;
806 }
807
808
putSegmentWithResend(const Segment & seg)809 void SenderImpl::putSegmentWithResend(const Segment &seg)
810 {
811 // 再送キューが満杯では、信頼性のある通信が実現できない。
812 ASSERT(!m_resendQueue.IsFull());
813
814 putSegment(seg);
815
816 // 全てのセグメントは、再送対象であることに依存している。
817 // もし、SYNセグメントを再送対象から外してしまうと、
818 // うまくいかない。
819 m_nxt = seg.GetLastSeqNumber() + 1;
820
821 // 再送キューにセグメントを入れる。
822 // 基本的に送信側は、「届いた」ことが確認できなければ、再送しなければならない。
823 // 受信側は、自分の応答が相手に届くかどうか、あまり気にしないことにする。
824 // 届いていなかったら、相手の方から何か言ってくることを期待する。
825 bool ret = m_resendQueue.Push(seg);
826 if(!ret)
827 {
828 errorHandling(ResultResendQueueIsFull());
829 PANIC("It seems that resend queue in RDT library is full.");
830 }
831 }
832
833
processReceivedSegment(const Segment & seg)834 void SenderImpl::processReceivedSegment(const Segment &seg)
835 {
836 // セグメントが到着したときに、必ず実行される処理を
837 // ここにまとめる。
838
839 ++m_arrivals;
840
841 // ACKフィールドチェック
842 if(seg.IsAck())
843 {
844 const u32 ack = seg.GetAckNumber();
845 if(isValidAckNumber(ack))
846 {
847 m_una = ack;
848
849 // 配達の確認ができたパケットは、再送キューから除去できる。
850 VERBOSE("ACK番号 %d を受け取りました。\n", ack);
851 m_resendQueue.Remove(ack);
852
853 // ウィンドウサイズ更新
854 m_remoteWindowSize = seg.GetWindowSize();
855 }
856 else
857 {
858 VERBOSE("una : %d\n", getUnacknowledgeNumber());
859 VERBOSE("nxt : %d\n", getNextSequenceNumber());
860 VERBOSE("不正、あるいは受信済みのACK番号です。(%u)\n", ack);
861 }
862 }
863 }
864
865
PrintDebugInfo(void) const866 void SenderImpl::PrintDebugInfo(void) const
867 {
868 ASSERT(m_initialized);
869
870 m_resendQueue.PrintDebugInfo();
871 m_sendBuffer.PrintDebugInfo();
872 LOG("m_remoteWindowSize: %d\n", m_remoteWindowSize);
873 LOG("m_arrivals: %u\n", m_arrivals);
874 }
875
876
PrintProperty(void)877 void SenderImpl::PrintProperty(void)
878 {
879 LOG("m_sendBuffer: %d (%d)\n", offsetof(SenderImpl, m_sendBuffer), sizeof(SendBuffer));
880 LOG("m_remoteWindowSize: %d (%d)\n", offsetof(SenderImpl, m_remoteWindowSize), sizeof(u16));
881 LOG("m_resendQueue: %d (%d)\n", offsetof(SenderImpl, m_resendQueue), sizeof(ResendQueue));
882 LOG("m_pState: %d (%d)\n", offsetof(SenderImpl, m_pState), sizeof(SenderStateBase*));
883 LOG("m_pNextState: %d (%d)\n", offsetof(SenderImpl, m_pNextState), sizeof(SenderStateBase*));
884 LOG("m_arrivals: %d (%d)\n", offsetof(SenderImpl, m_arrivals), sizeof(u32));
885
886 LOG("sizeof(SenderImpl)=%ld\n", (long) sizeof(SenderImpl));
887 }
888
889
890 // この単体テストは、Receiver抜きで実行できるテスト…を目指していたのですが、
891 // ペンディング。
Test(void)892 void SenderImpl::Test(void)
893 {
894 /*
895 const int BUFSIZE = 1024;
896 char buf[BUFSIZE];
897 SenderImpl s;
898 const int SUCCESS = 0;
899
900 CU_ASSERT(s.GetStatus()==SENDER_STATE_CLOSED);
901
902 CU_ASSERT(s.Open()==SUCCESS);
903
904 for(int i=0; i<10; ++i)
905 {
906 CU_ASSERT(s.Process()==SUCCESS);
907 CU_ASSERT(s.GetStatus()==SENDER_STATE_OPENING);
908 SleepCurrentThread(50);
909 }
910
911 CU_ASSERT(s.Cancel()==SUCCESS);
912 while(1)
913 {
914 CU_ASSERT(s.Process()==SUCCESS);
915 CU_ASSERT(s.GetStatus()==SENDER_STATE_CLOSED);
916 SleepCurrentThread(50);
917 }
918 */
919 }
920
921
922 }}} // namespace nn::rdt::CTR
923