Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more
Diff: core/uip/NyLPC_cTcpSocket.c
- Revision:
- 37:fc4b4fd6a649
- Parent:
- 20:3b0b444b4deb
- Child:
- 43:a182f2b5ff41
--- a/core/uip/NyLPC_cTcpSocket.c Thu May 16 16:06:46 2013 +0000
+++ b/core/uip/NyLPC_cTcpSocket.c Wed Jun 19 09:33:01 2013 +0000
@@ -44,6 +44,12 @@
#define DEBUG_RTO_LOG(i_inst)
#endif
+
+//#define lockResource(i_inst) NyLPC_cMutex_lock(&((i_inst)->_smutex))
+//#define unlockResource(i_inst) NyLPC_cMutex_unlock(&((i_inst)->_smutex))
+#define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_smutex))
+#define unlockResource(i_inst) NyLPC_cMutex_unlock(((i_inst)->_smutex))
+
static void sendRst(NyLPC_TcTcpSocket_t* i_inst);
@@ -139,7 +145,7 @@
}
i_inst->txbuf.rp=i_inst->txbuf.wp=0;
//ロック解除
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//セーブしたバッファを開放
for(i=0;i<l;i++){
NyLPC_cUipService_releaseTxBuf(dlist[i]);
@@ -272,11 +278,11 @@
//キューの空きをチェック。wp+1==rpなら、キューがいっぱい。rp==wpなら、キューが空。
if(((i_inst->txbuf.wp+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ)==i_inst->txbuf.rp){
//一時的なアンロック
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//タスクスイッチ
NyLPC_cThread_yield();
//ロック
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
continue;
}
i=i_inst->txbuf.wp;
@@ -296,23 +302,24 @@
* public 関数
**********************************************************************/
-
NyLPC_TBool NyLPC_cTcpSocket_initialize(NyLPC_TcTcpSocket_t* i_inst,void* i_rbuf,NyLPC_TUInt16 i_rbuf_len)
{
int i;
NyLPC_TcUipService_t* srv=_NyLPC_TcUipService_inst;
+ NyLPC_cBaseSocket_initialize(&(i_inst->_super),NyLPC_TcBaseSocket_TYPEID_TCP_SOCK);
//uipサービスは初期化済であること。
NyLPC_Assert(NyLPC_TcUipService_isInitService());
NyLPC_cFifoBuffer_initialize(&(i_inst->rxbuf),i_rbuf,i_rbuf_len);
- NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));
+ // NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));//個別Mutex
+ i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));//共有Mutex
i_inst->tcpstateflags=UIP_CLOSED;
i_inst->txbuf.rp=i_inst->txbuf.wp=0;
for(i=0;i<NyLPC_TcTcpSocket_NUMBER_OF_TXQ;i++){
NyLPC_cIPv4Payload_initialize(&(i_inst->txbuf.txq[i].data));
}
//管理リストへ登録。
- return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),i_inst);
+ return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));
}
void NyLPC_cTcpSocket_finalize(NyLPC_TcTcpSocket_t* i_inst)
{
@@ -320,49 +327,44 @@
NyLPC_TcUipService_t* srv=_NyLPC_TcUipService_inst;
NyLPC_Assert(NyLPC_TcUipService_isInitService());
//uipサービスは初期化済であること。
- if(!NyLPC_cIPv4_removeSocket(&(srv->_tcpv4),i_inst)){
+ if(!NyLPC_cIPv4_removeSocket(&(srv->_tcpv4),&(i_inst->_super))){
//削除失敗、それは死を意味する。
NyLPC_Abort();
}
//開放漏れの保険
if(i_inst->txbuf.rp!=i_inst->txbuf.wp){
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
resetTxQWithUnlock(i_inst);
}
for(i=0;i<NyLPC_TcTcpSocket_NUMBER_OF_TXQ;i++){
NyLPC_cIPv4Payload_finalize(&(i_inst->txbuf.txq[i].data));
}
NyLPC_cFifoBuffer_finalize(&(i_inst->rxbuf));
- NyLPC_cMutex_finalize(&(i_inst->_smutex));
-
+// NyLPC_cMutex_finalize(&(i_inst->_smutex));
+ NyLPC_cBaseSocket_finalize(&(i_inst->_super));
return;
}
-/**
- * この関数は、cIPv4Tcpが呼び出すシステムAPIです。
- * uipコアタスクが実行します。
- * ソケットを、SYNパケットで初期化して、UIP_SYN_RECV状態にします。
- * @return
- * 遷移に成功すると、TRUEを返します。
- */
-NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config,const NyLPC_TcIPv4Payload_t* i_ipp)
+
+NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Payload_t* i_ipp)
{
NyLPC_TUInt16 tmp16;
+// NyLPC_Assert(NyLPC_cMutex_isLocked(i_inst->_smutex));
+ lockResource(i_inst);
//ソケットが無効であること。
- NyLPC_cMutex_lock(&(i_inst->_smutex));
if(i_inst->tcpstateflags==UIP_CLOSED)
{
+ //localipとdefault_mmsは別枠で設定
/* Fill in the necessary fields for the new connection. */
i_inst->uip_connr.current_rto32 = UIP_IP_RTOP_INITIAL;
i_inst->uip_connr.lport = i_ipp->payload.tcp->destport;
i_inst->uip_connr.rport = i_ipp->payload.tcp->srcport;
i_inst->uip_connr.ripaddr=i_ipp->header->srcipaddr;
i_inst->uip_connr.snd_nxt32=iss32;
- i_inst->uip_connr.lipaddr=&(i_config->ip_addr);
/* rcv_nxt should be the seqno from the incoming packet + 1. */
i_inst->uip_connr.rcv_nxt32= NyLPC_ntohl(i_ipp->payload.tcp->seqno32)+1;
//MSSの設定
- i_inst->uip_connr.default_mss=i_inst->uip_connr.peer_mss=i_config->default_mss;
+ i_inst->uip_connr.peer_mss=i_inst->uip_connr.default_mss;
if(NyLPC_TTcpHeader_getTcpMmsOpt(i_ipp->payload.tcp,&tmp16)){
i_inst->uip_connr.peer_mss=tmp16;
}
@@ -372,13 +374,13 @@
if(i_inst->txbuf.rp!=i_inst->txbuf.wp){
resetTxQWithUnlock(i_inst);
}else{
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}
//ここでステータスがかわる。
i_inst->tcpstateflags = UIP_SYN_RCVD;
return NyLPC_TBool_TRUE;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
return NyLPC_TBool_FALSE;
}
/**
@@ -400,22 +402,22 @@
static NyLPC_TBool waitForTxRemove(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt32 i_sq,NyLPC_TcStopwatch_t* i_timer)
{
NyLPC_TUInt8 f;
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
while(!NyLPC_cStopwatch_isExpired(i_timer)){
//パケットが送信中か調べる。
if(!isPacketAcked(i_inst,i_sq)){
//まだある場合は、タスクスイッチを繰り返して消失を待つ。
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cThread_yield();
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
continue;
}
//なくなった場合は、原因を調べる。
f=i_inst->tcpstateflags;
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
return (f==UIP_CLOSED)?NyLPC_TBool_FALSE:NyLPC_TBool_TRUE;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
return NyLPC_TBool_FALSE;
}
@@ -452,17 +454,17 @@
return -1;
}
};
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
//ペイロードがある場合のみ、相手のwindowサイズが0以上になるのを待つ。
if(i_len>0){
while(i_inst->uip_connr.peer_win==0){
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//時間切れならエラー。
if(NyLPC_cStopwatch_isExpired(i_timer)){
return -1;
}
NyLPC_cThread_yield();
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
}
}
//送信キューの取得
@@ -470,7 +472,7 @@
//送信キューが取れなかった。
if(txq==NULL){
//シーケンス番号をロールバックできないので、エラーとする。
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cUipService_releaseTxBuf(buf);
return -1;
}
@@ -504,7 +506,7 @@
i_inst->uip_connr.peer_win-=s;
//ACK番号の返却
*o_ack=txq->ackno=NyLPC_HTONL(next_ack);
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cUipService_sendIPv4Tx(buf);
return s;
}
@@ -528,11 +530,11 @@
do{
buf=NyLPC_cUipService_allocTxBuf((SIZE_OF_IPv4_TCPIP_HEADER)+5,&s);
}while(buf==NULL);
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
NyLPC_cIPv4Payload_setTxBuf(&ipv4,buf);
i_inst->uip_connr.snd_nxt32++;
setPacket(i_inst,&ipv4,TCP_RST|TCP_ACK,buf,0);
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cUipService_sendIPv4Tx(buf);
NyLPC_cUipService_releaseTxBuf(buf);
@@ -543,7 +545,7 @@
/**
- * 受信データを排他処理してバッファに書き込む。
+ * 受信データをバッファに書き込む。
* 十分な空き領域がない場合、失敗する。
* この関数は、ロックして実行してください。
*/
@@ -605,12 +607,12 @@
}
}
//ロックして、強制的なステータス遷移
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
f=i_inst->tcpstateflags;
if(f!=UIP_CLOSED){
i_inst->tcpstateflags=UIP_CLOSED;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//もし、強制CLOSE遷移であれば、RSTも送信。
if(f!=UIP_CLOSED){
sendRst(i_inst);
@@ -639,12 +641,12 @@
//読み出しバッファ情報のコピー
//MUTEX LOCK
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
st=i_inst->tcpstateflags;
rlen=NyLPC_cFifoBuffer_getLength(&(i_inst->rxbuf));
*o_buf_ptr=NyLPC_cFifoBuffer_getPtr(&(i_inst->rxbuf));
//MUTEX UNLOCK
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//バッファが空の場合は、ステータスチェック。ESTABLISHEDでなければ、エラー(PASVCLOSE等の場合)
switch(st){
@@ -697,14 +699,14 @@
}while(buf==NULL);
//MUTEX LOCK
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
//受信バッファを読み出しシーク
NyLPC_cFifoBuffer_pop(&(i_inst->rxbuf),i_seek);
//ACKパケットの生成
NyLPC_cIPv4Payload_setTxBuf(&ipv4payload,buf);
setPacket(i_inst,&ipv4payload,TCP_ACK,buf,0);
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//ACK送信
NyLPC_cUipService_sendIPv4Tx(buf);
NyLPC_cUipService_releaseTxBuf(buf);
@@ -727,21 +729,28 @@
//送信バッファを取得
//@bug バッファが取れるまで通信がブロックするの。ここはなんとかしないと。
for(;;){
- //ESTABLISHED以外に非同期遷移 orタイムアウト確認
- if(NyLPC_cStopwatch_isExpired(&sw)||(i_inst->tcpstateflags!=UIP_ESTABLISHED)){
+ //ESTABLISHED以外に非同期遷移
+ if(i_inst->tcpstateflags!=UIP_ESTABLISHED){
+ NyLPC_cStopwatch_finalize(&sw);
return NULL;
}
buf=NyLPC_cUipService_allocTxBuf(i_hint+(SIZE_OF_IPv4_TCPIP_HEADER),&s);
if(buf!=NULL){
break;
}
+ //タイムアウト時もエラー
+ if(NyLPC_cStopwatch_isExpired(&sw)){
+ NyLPC_cStopwatch_finalize(&sw);
+ return NULL;
+ }
}
-//ここ、要求サイズとpeerのwinのうち、小さいほうを割り当てたほうが良くない?
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+//@todo 前段処理と順番を入れ替えて、要求サイズとpeerのwinのうち、小さいほうを割り当てたほうが良くない?
+//ここで相手のwin待ちをする理由は、相手に確実に受け取れるサイズを決定する為。
+ lockResource(i_inst);
//ペイロードがある場合のみ、相手のwindowサイズが0以上になるのを待つ。
while(i_inst->uip_connr.peer_win==0){
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//ESTABLISHED以外に非同期遷移 orタイムアウト確認
if(NyLPC_cStopwatch_isExpired(&sw)||(i_inst->tcpstateflags!=UIP_ESTABLISHED)){
NyLPC_cUipService_releaseTxBuf(buf);
@@ -749,7 +758,7 @@
return NULL;
}
NyLPC_cThread_yield();
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
}
//送信バッファを基準とした送信サイズを計算
s-=SIZE_OF_IPv4_TCPIP_HEADER;
@@ -761,7 +770,7 @@
if(i_inst->uip_connr.peer_win<s){
s=i_inst->uip_connr.peer_win;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//バッファサイズ確定。
*o_buf_size=s;
NyLPC_cStopwatch_finalize(&sw);
@@ -804,13 +813,13 @@
//先頭ポインタは、i_buf-sizeof(SIZE_OF_IPv4_TCPIP_HEADER)固定
buf=(NyLPC_TUInt8*)i_buf_ptr-SIZE_OF_IPv4_TCPIP_HEADER;
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
//送信キューの取得
txq=getTxQ(i_inst,&sw);
//送信キューが取れなかった。
if(txq==NULL){
//シーケンス番号をロールバックできないので、エラーとする。
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cStopwatch_finalize(&sw);
return NyLPC_TBool_FALSE;
}
@@ -833,7 +842,7 @@
i_inst->uip_connr.peer_win-=i_len;
//ACK番号の返却
txq->ackno=NyLPC_HTONL(i_inst->uip_connr.snd_nxt32);
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cUipService_sendIPv4Tx(buf);
NyLPC_cStopwatch_finalize(&sw);
return NyLPC_TBool_TRUE;
@@ -860,6 +869,7 @@
memcpy(buf,i_buf_ptr,s);
if(!NyLPC_cTcpSocket_psend(i_inst,buf,s,i_wait_in_msec)){
NyLPC_cTcpSocket_releaseSendBuf(i_inst,buf);
+ return -1;//error
}
return s;
}
@@ -872,7 +882,7 @@
NyLPC_TUInt32 sq;
NyLPC_cStopwatch_initialize(&sw);
NyLPC_cStopwatch_startExpire(&sw,i_wait_in_msec);
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
f=i_inst->tcpstateflags;
//ステータスチェック
@@ -885,7 +895,7 @@
//アクティブクローズ。
i_inst->tcpstateflags=UIP_FIN_WAIT_1;
//送信のために一旦解除
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//FINの送信
if(sendWithRetransmit(i_inst,TCP_FIN|TCP_ACK,NULL,0,&sw,&sq)==0){
//ちょっと待つ。
@@ -893,7 +903,7 @@
//TXの消去待ち
if(waitForTxRemove(i_inst,sq,&sw)){
//再ロック
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
//タイムアウトするか、UIP_CLOSED、もしくはTIME_WAITに遷移するのを待つ。(遷移はRxprocで自動的に実行。)
while(!NyLPC_cStopwatch_isExpired(&sw)){
switch(i_inst->tcpstateflags)
@@ -908,14 +918,14 @@
case UIP_FIN_WAIT_2:
case UIP_CLOSING:
//一時的なアンロック
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cThread_yield();
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
default:
break;
}
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}
}
break;
@@ -923,41 +933,41 @@
//LAST_ACKへ遷移
i_inst->tcpstateflags=UIP_LAST_ACK;
//送信のために一旦解除
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
if(sendWithRetransmit(i_inst,TCP_FIN|TCP_ACK,NULL,0,&sw,&sq)==0){
//ちょっと待つ。
NyLPC_cThread_yield();
//TXの消去待ち
if(waitForTxRemove(i_inst,sq,&sw)){
//再ロック
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
//TX消去後にCLOSEDに遷移していればOK
if(i_inst->tcpstateflags==UIP_CLOSED)
{
NyLPC_Assert(i_inst->txbuf.rp==i_inst->txbuf.wp);
goto ReturnWithUnlock;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}
}
//エラー。RSTで切断。
break;
default:
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_Warning();
break;
}
- if(i_inst->_smutex._lock_count>0){
- NyLPC_Warning();
- }
+// if(i_inst->_smutex._lock_count>0){
+// NyLPC_Warning();
+// }
//このパスに到達するのは、FIN送信/ACKに成功したにも拘らず、規定時間内にCLOSEDに遷移しなかった場合。
//コネクションを強制遷移して、RST
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
f=i_inst->tcpstateflags;
if(f!=UIP_CLOSED){
i_inst->tcpstateflags=UIP_CLOSED;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//もし、強制CLOSE遷移であれば、RSTも送信。
if(f!=UIP_CLOSED){
sendRst(i_inst);
@@ -965,14 +975,14 @@
NyLPC_cStopwatch_finalize(&sw);
return;
ReturnWithUnlock:
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_cStopwatch_finalize(&sw);
return;
}
/**
+ * uipサービスタスクが実行する関数です。
* 定期的に実行する関数。最低でも1s単位で実行してください。
- * 動作
*/
void NyLPC_cTcpSocket_periodic(
NyLPC_TcTcpSocket_t* i_inst)
@@ -985,17 +995,17 @@
NyLPC_cStopwatch_initialize(&sw);
now=NyLPC_cStopwatch_now();
//MUTEX LOCK
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
if(i_inst->tcpstateflags==UIP_CLOSED)
{
//CLOSEDなら、バッファ開放。
resetTxQWithUnlock(i_inst);
}else if(i_inst->txbuf.rp==i_inst->txbuf.wp){
//再送信パケットがなければ何もしないよ。
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}else if(i_inst->uip_connr.peer_win==0){
//peer_winが0の場合は何もしない。
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}else{
//再送信処理
rp=i_inst->txbuf.rp;
@@ -1017,16 +1027,46 @@
for(i=rp;i!=i_inst->txbuf.wp;i=(i+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ){
NyLPC_cUipService_sendIPv4Tx(NyLPC_cIPv4Payload_getBuf(&(q[i].data)));
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}
}else{
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
}
}
NyLPC_cStopwatch_finalize(&sw);
return;
}
-
+void led(int i);
+/**
+ * uipサービスタスクが実行する関数です。
+ * サービスの開始を通知します。
+ */
+void NyLPC_cTcpSocket_startService(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)
+{
+ NyLPC_Assert(i_inst->tcpstateflags==UIP_CLOSED);//閉じてなければおかしい。
+ i_inst->uip_connr.lipaddr=&(i_config->ip_addr);
+ i_inst->uip_connr.default_mss=i_config->default_mss;
+ //NyLPC_cTcpSocket_setSynPayload関数でも実行するけど、IFのリセット時なのでここでもやる。
+ NyLPC_cFifoBuffer_clear(&(i_inst->rxbuf));
+ return;
+}
+/**
+ * uipサービスタスクが実行する関数です。
+ * サービスの停止を通知します。
+ */
+void NyLPC_cTcpSocket_stopService(NyLPC_TcTcpSocket_t* i_inst)
+{
+ lockResource(i_inst);
+ if(i_inst->tcpstateflags==UIP_CLOSED)
+ {
+ unlockResource(i_inst);
+ }else{
+ i_inst->tcpstateflags=UIP_CLOSED;
+ resetTxQWithUnlock(i_inst);
+ sendRst(i_inst);
+ }
+ return;
+}
/**
* この関数は、rxパケットを処理して、ソケットの状態を更新します。
@@ -1057,7 +1097,7 @@
tcp_data_offset=o_ipp->payload.rawbuf+tmp16;
//インスタンスをロックする。
- NyLPC_cMutex_lock(&(i_inst->_smutex));
+ lockResource(i_inst);
//RSTのチェック。RST受信時は、状態にかかわらず、CLOSEDステータスに移行する。
if (in_tcpflag & TCP_RST)
@@ -1194,7 +1234,7 @@
}else{
ret=NyLPC_TBool_FALSE;
}
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
//取り外したTXメモリの開放
for(i=0;i<s;i++){
//取り外したTXメモリを開放
@@ -1204,7 +1244,7 @@
return ret;
DROP:
//ACKしたパケットを送信キューから削除
- NyLPC_cMutex_unlock(&(i_inst->_smutex));
+ unlockResource(i_inst);
NyLPC_Trace();
return NyLPC_TBool_FALSE;
}
@@ -1214,3 +1254,5 @@
+
+
MiMic Webservice library