OSDN Git Service

TCP/IP開始・停止の強化
[mimic/MiMicSDK.git] / lib / src / uip / NyLPC_cTcpSocket.c
index 4342172..0398d18 100644 (file)
@@ -311,8 +311,8 @@ NyLPC_TBool NyLPC_cTcpSocket_initialize(NyLPC_TcTcpSocket_t* i_inst,void* i_rbuf
        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
-       i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));\r
+       //      NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));//個別Mutex\r
+       i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));//共有Mutex\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
@@ -345,18 +345,13 @@ void NyLPC_cTcpSocket_finalize(NyLPC_TcTcpSocket_t* i_inst)
        return;\r
 }\r
 \r
-/**\r
- * この関数は、NyLPC_cTcpListenerが呼び出すシステムAPIです。\r
- * uipコアタスクが実行します。\r
- * ソケットを、SYNパケットで初期化して、UIP_SYN_RECV状態にします。\r
- * @return\r
- * 遷移に成功すると、TRUEを返します。\r
- */\r
+\r
 NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Payload_t* i_ipp)\r
 {\r
        NyLPC_TUInt16 tmp16;\r
-       //ソケットが無効であること。\r
+//     NyLPC_Assert(NyLPC_cMutex_isLocked(i_inst->_smutex));\r
        lockResource(i_inst);\r
+       //ソケットが無効であること。\r
        if(i_inst->tcpstateflags==UIP_CLOSED)\r
        {\r
                //localipとdefault_mmsは別枠で設定\r
@@ -986,8 +981,8 @@ ReturnWithUnlock:
 }\r
 \r
 /**\r
- * 定期的に実行する関数。最低でも1s単位で実行してください。\r
  * uipサービスタスクが実行する関数です。\r
+ * 定期的に実行する関数。最低でも1s単位で実行してください。\r
  */\r
 void NyLPC_cTcpSocket_periodic(\r
        NyLPC_TcTcpSocket_t* i_inst)\r
@@ -1041,7 +1036,36 @@ void NyLPC_cTcpSocket_periodic(
        NyLPC_cStopwatch_finalize(&sw);\r
        return;\r
 }\r
-\r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの開始を通知します。\r
+ */\r
+void NyLPC_cTcpSocket_startService(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)\r
+{\r
+       NyLPC_Assert(i_inst->tcpstateflags==UIP_CLOSED);//閉じてなければおかしい。\r
+       i_inst->uip_connr.lipaddr=&(i_config->ip_addr);\r
+       i_inst->uip_connr.default_mss=i_config->default_mss;\r
+       //NyLPC_cTcpSocket_setSynPayload関数でも実行するけど、IFのリセット時なのでここでもやる。\r
+       NyLPC_cFifoBuffer_clear(&(i_inst->rxbuf));\r
+       return;\r
+}\r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの停止を通知します。\r
+ */\r
+void NyLPC_cTcpSocket_stopService(NyLPC_TcTcpSocket_t* i_inst)\r
+{\r
+       lockResource(i_inst);\r
+       if(i_inst->tcpstateflags==UIP_CLOSED)\r
+       {\r
+               unlockResource(i_inst);\r
+       }else{\r
+               i_inst->tcpstateflags=UIP_CLOSED;\r
+               resetTxQWithUnlock(i_inst);\r
+               sendRst(i_inst);\r
+       }\r
+       return;\r
+}\r
 \r
 /**\r
  * この関数は、rxパケットを処理して、ソケットの状態を更新します。\r
@@ -1224,12 +1248,7 @@ NyLPC_Trace();
        return NyLPC_TBool_FALSE;\r
 }\r
 \r
-void NyLPC_cTcpSocket_updateConfigulation(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)\r
-{\r
-       i_inst->uip_connr.lipaddr=&(i_config->ip_addr);\r
-       i_inst->uip_connr.default_mss=i_config->default_mss;\r
-       return;\r
-}\r
+\r
 \r
 \r
 \r