#define DEBUG_RTO_LOG(i_inst)\r
#endif\r
\r
+\r
+//#define lockResource(i_inst) NyLPC_cMutex_lock(&((i_inst)->_smutex))\r
+//#define unlockResource(i_inst) NyLPC_cMutex_unlock(&((i_inst)->_smutex))\r
+#define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_smutex))\r
+#define unlockResource(i_inst) NyLPC_cMutex_unlock(((i_inst)->_smutex))\r
+\r
static void sendRst(NyLPC_TcTcpSocket_t* i_inst);\r
\r
\r
}\r
i_inst->txbuf.rp=i_inst->txbuf.wp=0;\r
//ロック解除\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//セーブしたバッファを開放\r
for(i=0;i<l;i++){\r
NyLPC_cUipService_releaseTxBuf(dlist[i]);\r
//キューの空きをチェック。wp+1==rpなら、キューがいっぱい。rp==wpなら、キューが空。\r
if(((i_inst->txbuf.wp+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ)==i_inst->txbuf.rp){\r
//一時的なアンロック\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//タスクスイッチ\r
NyLPC_cThread_yield();\r
//ロック\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
continue;\r
}\r
i=i_inst->txbuf.wp;\r
* public 関数
**********************************************************************/\r
\r
-\r
NyLPC_TBool NyLPC_cTcpSocket_initialize(NyLPC_TcTcpSocket_t* i_inst,void* i_rbuf,NyLPC_TUInt16 i_rbuf_len)\r
{\r
int i;\r
NyLPC_Assert(NyLPC_TcUipService_isInitService());\r
\r
NyLPC_cFifoBuffer_initialize(&(i_inst->rxbuf),i_rbuf,i_rbuf_len);\r
- NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));\r
+ // NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));\r
+ i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));\r
i_inst->tcpstateflags=UIP_CLOSED;\r
i_inst->txbuf.rp=i_inst->txbuf.wp=0;\r
for(i=0;i<NyLPC_TcTcpSocket_NUMBER_OF_TXQ;i++){\r
}\r
//開放漏れの保険\r
if(i_inst->txbuf.rp!=i_inst->txbuf.wp){\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
resetTxQWithUnlock(i_inst);\r
}\r
for(i=0;i<NyLPC_TcTcpSocket_NUMBER_OF_TXQ;i++){\r
NyLPC_cIPv4Payload_finalize(&(i_inst->txbuf.txq[i].data));\r
}\r
NyLPC_cFifoBuffer_finalize(&(i_inst->rxbuf));\r
- NyLPC_cMutex_finalize(&(i_inst->_smutex));\r
+// NyLPC_cMutex_finalize(&(i_inst->_smutex));\r
NyLPC_cBaseSocket_finalize(&(i_inst->_super));\r
return;\r
}\r
{\r
NyLPC_TUInt16 tmp16;\r
//ソケットが無効であること。\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
if(i_inst->tcpstateflags==UIP_CLOSED)\r
{\r
/* Fill in the necessary fields for the new connection. */\r
if(i_inst->txbuf.rp!=i_inst->txbuf.wp){\r
resetTxQWithUnlock(i_inst);\r
}else{\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}\r
//ここでステータスがかわる。\r
i_inst->tcpstateflags = UIP_SYN_RCVD;\r
return NyLPC_TBool_TRUE;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
return NyLPC_TBool_FALSE;\r
}\r
/**\r
static NyLPC_TBool waitForTxRemove(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt32 i_sq,NyLPC_TcStopwatch_t* i_timer)\r
{\r
NyLPC_TUInt8 f;\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
while(!NyLPC_cStopwatch_isExpired(i_timer)){\r
//パケットが送信中か調べる。\r
if(!isPacketAcked(i_inst,i_sq)){\r
//まだある場合は、タスクスイッチを繰り返して消失を待つ。\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cThread_yield();\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
continue;\r
}\r
//なくなった場合は、原因を調べる。\r
f=i_inst->tcpstateflags;\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
return (f==UIP_CLOSED)?NyLPC_TBool_FALSE:NyLPC_TBool_TRUE;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
return NyLPC_TBool_FALSE;\r
}\r
\r
return -1;\r
}\r
};\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
//ペイロードがある場合のみ、相手のwindowサイズが0以上になるのを待つ。\r
if(i_len>0){\r
while(i_inst->uip_connr.peer_win==0){\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//時間切れならエラー。\r
if(NyLPC_cStopwatch_isExpired(i_timer)){\r
return -1;\r
}\r
NyLPC_cThread_yield();\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
}\r
}\r
//送信キューの取得\r
//送信キューが取れなかった。\r
if(txq==NULL){\r
//シーケンス番号をロールバックできないので、エラーとする。\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cUipService_releaseTxBuf(buf);\r
return -1;\r
}\r
i_inst->uip_connr.peer_win-=s;\r
//ACK番号の返却\r
*o_ack=txq->ackno=NyLPC_HTONL(next_ack);\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cUipService_sendIPv4Tx(buf);\r
return s;\r
}\r
do{\r
buf=NyLPC_cUipService_allocTxBuf((SIZE_OF_IPv4_TCPIP_HEADER)+5,&s);\r
}while(buf==NULL);\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
NyLPC_cIPv4Payload_setTxBuf(&ipv4,buf);\r
i_inst->uip_connr.snd_nxt32++;\r
setPacket(i_inst,&ipv4,TCP_RST|TCP_ACK,buf,0);\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
\r
NyLPC_cUipService_sendIPv4Tx(buf);\r
NyLPC_cUipService_releaseTxBuf(buf);\r
}\r
}\r
//ロックして、強制的なステータス遷移\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
f=i_inst->tcpstateflags;\r
if(f!=UIP_CLOSED){\r
i_inst->tcpstateflags=UIP_CLOSED;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//もし、強制CLOSE遷移であれば、RSTも送信。\r
if(f!=UIP_CLOSED){\r
sendRst(i_inst);\r
//読み出しバッファ情報のコピー\r
\r
//MUTEX LOCK\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
st=i_inst->tcpstateflags;\r
rlen=NyLPC_cFifoBuffer_getLength(&(i_inst->rxbuf));\r
*o_buf_ptr=NyLPC_cFifoBuffer_getPtr(&(i_inst->rxbuf));\r
//MUTEX UNLOCK\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
\r
//バッファが空の場合は、ステータスチェック。ESTABLISHEDでなければ、エラー(PASVCLOSE等の場合)\r
switch(st){\r
}while(buf==NULL);\r
\r
//MUTEX LOCK\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
\r
//受信バッファを読み出しシーク\r
NyLPC_cFifoBuffer_pop(&(i_inst->rxbuf),i_seek);\r
//ACKパケットの生成\r
NyLPC_cIPv4Payload_setTxBuf(&ipv4payload,buf);\r
setPacket(i_inst,&ipv4payload,TCP_ACK,buf,0);\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//ACK送信\r
NyLPC_cUipService_sendIPv4Tx(buf);\r
NyLPC_cUipService_releaseTxBuf(buf);\r
}\r
}\r
\r
-//ここ、要求サイズとpeerのwinのうち、小さいほうを割り当てたほうが良くない?\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+//@todo 前段処理と順番を入れ替えて、要求サイズとpeerのwinのうち、小さいほうを割り当てたほうが良くない?\r
+//ここで相手のwin待ちをする理由は、相手に確実に受け取れるサイズを決定する為。\r
+ lockResource(i_inst);\r
//ペイロードがある場合のみ、相手のwindowサイズが0以上になるのを待つ。\r
while(i_inst->uip_connr.peer_win==0){\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//ESTABLISHED以外に非同期遷移 orタイムアウト確認\r
if(NyLPC_cStopwatch_isExpired(&sw)||(i_inst->tcpstateflags!=UIP_ESTABLISHED)){\r
NyLPC_cUipService_releaseTxBuf(buf);\r
return NULL;\r
}\r
NyLPC_cThread_yield();\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
}\r
//送信バッファを基準とした送信サイズを計算\r
s-=SIZE_OF_IPv4_TCPIP_HEADER;\r
if(i_inst->uip_connr.peer_win<s){\r
s=i_inst->uip_connr.peer_win;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//バッファサイズ確定。\r
*o_buf_size=s;\r
NyLPC_cStopwatch_finalize(&sw);\r
\r
//先頭ポインタは、i_buf-sizeof(SIZE_OF_IPv4_TCPIP_HEADER)固定\r
buf=(NyLPC_TUInt8*)i_buf_ptr-SIZE_OF_IPv4_TCPIP_HEADER;\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
//送信キューの取得\r
txq=getTxQ(i_inst,&sw);\r
//送信キューが取れなかった。\r
if(txq==NULL){\r
//シーケンス番号をロールバックできないので、エラーとする。\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cStopwatch_finalize(&sw);\r
return NyLPC_TBool_FALSE;\r
}\r
i_inst->uip_connr.peer_win-=i_len;\r
//ACK番号の返却\r
txq->ackno=NyLPC_HTONL(i_inst->uip_connr.snd_nxt32);\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cUipService_sendIPv4Tx(buf);\r
NyLPC_cStopwatch_finalize(&sw);\r
return NyLPC_TBool_TRUE;\r
NyLPC_TUInt32 sq;\r
NyLPC_cStopwatch_initialize(&sw);\r
NyLPC_cStopwatch_startExpire(&sw,i_wait_in_msec);\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
\r
f=i_inst->tcpstateflags;\r
//ステータスチェック\r
//アクティブクローズ。\r
i_inst->tcpstateflags=UIP_FIN_WAIT_1;\r
//送信のために一旦解除\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//FINの送信\r
if(sendWithRetransmit(i_inst,TCP_FIN|TCP_ACK,NULL,0,&sw,&sq)==0){\r
//ちょっと待つ。\r
//TXの消去待ち\r
if(waitForTxRemove(i_inst,sq,&sw)){\r
//再ロック\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
//タイムアウトするか、UIP_CLOSED、もしくはTIME_WAITに遷移するのを待つ。(遷移はRxprocで自動的に実行。)\r
while(!NyLPC_cStopwatch_isExpired(&sw)){\r
switch(i_inst->tcpstateflags)\r
case UIP_FIN_WAIT_2:\r
case UIP_CLOSING:\r
//一時的なアンロック\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cThread_yield();\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
default:\r
break;\r
}\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}\r
}\r
break;\r
//LAST_ACKへ遷移\r
i_inst->tcpstateflags=UIP_LAST_ACK;\r
//送信のために一旦解除\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
if(sendWithRetransmit(i_inst,TCP_FIN|TCP_ACK,NULL,0,&sw,&sq)==0){\r
//ちょっと待つ。\r
NyLPC_cThread_yield();\r
//TXの消去待ち\r
if(waitForTxRemove(i_inst,sq,&sw)){\r
//再ロック\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
//TX消去後にCLOSEDに遷移していればOK\r
if(i_inst->tcpstateflags==UIP_CLOSED)\r
{\r
NyLPC_Assert(i_inst->txbuf.rp==i_inst->txbuf.wp);\r
goto ReturnWithUnlock;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}\r
}\r
//エラー。RSTで切断。\r
break;\r
default:\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_Warning();\r
break;\r
}\r
- if(i_inst->_smutex._lock_count>0){\r
- NyLPC_Warning();\r
- }\r
+// if(i_inst->_smutex._lock_count>0){\r
+// NyLPC_Warning();\r
+// }\r
//このパスに到達するのは、FIN送信/ACKに成功したにも拘らず、規定時間内にCLOSEDに遷移しなかった場合。\r
//コネクションを強制遷移して、RST\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
f=i_inst->tcpstateflags;\r
if(f!=UIP_CLOSED){\r
i_inst->tcpstateflags=UIP_CLOSED;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//もし、強制CLOSE遷移であれば、RSTも送信。\r
if(f!=UIP_CLOSED){\r
sendRst(i_inst);\r
NyLPC_cStopwatch_finalize(&sw);\r
return;\r
ReturnWithUnlock:\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_cStopwatch_finalize(&sw);\r
return;\r
}\r
\r
/**\r
* 定期的に実行する関数。最低でも1s単位で実行してください。\r
- * 動作\r
+ * uipサービスタスクが実行する関数です。\r
*/\r
void NyLPC_cTcpSocket_periodic(\r
NyLPC_TcTcpSocket_t* i_inst)\r
NyLPC_cStopwatch_initialize(&sw);\r
now=NyLPC_cStopwatch_now();\r
//MUTEX LOCK\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
if(i_inst->tcpstateflags==UIP_CLOSED)\r
{\r
//CLOSEDなら、バッファ開放。\r
resetTxQWithUnlock(i_inst);\r
}else if(i_inst->txbuf.rp==i_inst->txbuf.wp){\r
//再送信パケットがなければ何もしないよ。\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}else if(i_inst->uip_connr.peer_win==0){\r
//peer_winが0の場合は何もしない。\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}else{\r
//再送信処理\r
rp=i_inst->txbuf.rp;\r
for(i=rp;i!=i_inst->txbuf.wp;i=(i+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ){\r
NyLPC_cUipService_sendIPv4Tx(NyLPC_cIPv4Payload_getBuf(&(q[i].data)));\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}\r
}else{\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
}\r
}\r
NyLPC_cStopwatch_finalize(&sw);\r
tcp_data_offset=o_ipp->payload.rawbuf+tmp16;\r
\r
//インスタンスをロックする。\r
- NyLPC_cMutex_lock(&(i_inst->_smutex));\r
+ lockResource(i_inst);\r
\r
//RSTのチェック。RST受信時は、状態にかかわらず、CLOSEDステータスに移行する。\r
if (in_tcpflag & TCP_RST)\r
}else{\r
ret=NyLPC_TBool_FALSE;\r
}\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
//取り外したTXメモリの開放\r
for(i=0;i<s;i++){\r
//取り外したTXメモリを開放\r
return ret;\r
DROP:\r
//ACKしたパケットを送信キューから削除\r
- NyLPC_cMutex_unlock(&(i_inst->_smutex));\r
+ unlockResource(i_inst);\r
NyLPC_Trace();\r
return NyLPC_TBool_FALSE;\r
}\r