Ryo Iizuka / libMiMic

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

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 @@
 
 
 
+
+