OSDN Git Service

1.TCP listenerへSYNキュー追加
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Tue, 9 Jul 2013 08:46:28 +0000 (08:46 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Tue, 9 Jul 2013 08:46:28 +0000 (08:46 +0000)
2.HTTP 持続性接続の挙動修正

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@274 47198e57-cb75-475f-84c4-a814cd6f29e0

16 files changed:
lib/src/NyLPC_cMiMicEnv.h
lib/src/net/httpd/NyLPC_cHttpdConnection.c
lib/src/net/httpd/NyLPC_cHttpdConnection_protected.h
lib/src/net/httpd/NyLPC_cHttpdThread.c
lib/src/net/httpd/mod/NyLPC_cModFileIoBaseClass.c
lib/src/net/httpd/mod/NyLPC_cModMiMicSetting.c
lib/src/net/httpd/mod/NyLPC_cModRemoteMcu.c
lib/src/net/httpd/mod/NyLPC_cModRomFiles.c
lib/src/net/httpd/mod/NyLPC_cModUrl.c
lib/src/uip/NyLPC_cIPv4.c
lib/src/uip/NyLPC_cTcpListener.c
lib/src/uip/NyLPC_cTcpListener.h
lib/src/uip/NyLPC_cTcpListener_protected.h
lib/src/uip/NyLPC_cTcpSocket.c
lib/src/uip/NyLPC_cTcpSocket.h
lib/src/uip/NyLPC_cTcpSocket_protected.h

index 28ac7c5..4b2556d 100644 (file)
@@ -13,7 +13,7 @@ extern "C" {
 #endif /* __cplusplus */\r
 \r
 \r
-#define NyLPC_cMiMicEnv_VERSION "MiMic/1.4.15"\r
+#define NyLPC_cMiMicEnv_VERSION "MiMic/1.4.21"\r
 \r
 \r
 #ifdef __cplusplus\r
index d920529..d796714 100644 (file)
@@ -209,10 +209,6 @@ NyLPC_TBool NyLPC_cHttpdConnection_closeResponse(NyLPC_TcHttpdConnection_t* i_in
        }\r
        return NyLPC_TBool_TRUE;\r
 }\r
-void NyLPC_cHttpdConnection_setConnectionMode(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TcHttpdConnection_CONNECTION_MODE i_mode)\r
-{\r
-       i_inst->_connection_message_mode=i_mode;\r
-}\r
 \r
 /**\r
  * コネクションのプリフェッチデータをヘッダパーサへpushします。\r
@@ -271,7 +267,7 @@ NyLPC_TBool NyLPC_cHttpdConnection_acceptSocket(NyLPC_TcHttpdConnection_t* i_ins
        //初回だけHEADに遷移\r
        i_inst->_res_status=NyLPC_cHttpdConnection_ResStatus_HEAD;\r
        i_inst->_req_status=NyLPC_cHttpdConnection_ReqStatus_PREFETCH;\r
-       i_inst->_connection_message_mode=NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE;\r
+       i_inst->_connection_message_mode=NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE;\r
        return NyLPC_TBool_TRUE;\r
 Error_Connected:\r
        NyLPC_cTcpSocket_close(&(i_inst->_socket),NyLPC_cHttpdConnection_TIMEOUT_CLOSE);\r
index 5b0e96e..2571ed9 100644 (file)
@@ -94,8 +94,7 @@ void NyLPC_cHttpdConnection_requestParsed(NyLPC_TcHttpdConnection_t* i_inst);
  * HTTPリクエストのバージョンが1.1かつconnectionがCLOSEで無い場合、CONTINUEを指定することで持続性接続に設定できる。\r
  * 関数は、NyLPC_cHttpdConnection_sendResponseHeaderをコールする前に実行すること。\r
  */\r
-void NyLPC_cHttpdConnection_setConnectionMode(NyLPC_TcHttpdConnection_t* i_inst,NyLPC_TcHttpdConnection_CONNECTION_MODE i_mode);\r
-\r
+#define NyLPC_cHttpdConnection_setConnectionMode(i_inst,i_mode)        (i_inst)->_connection_message_mode=(i_mode)\r
 \r
 NyLPC_TUInt16 NyLPC_cHttpd_incNumOfConnection(NyLPC_TcHttpd_t* i_inst);\r
 NyLPC_TUInt16 NyLPC_cHttpd_decNumOfConnection(NyLPC_TcHttpd_t* i_inst);\r
index d6ad43d..6042151 100644 (file)
@@ -56,16 +56,14 @@ static int server(void* p)
                        //Prefetch出来ないならループ終了。\r
                        break;\r
                }\r
-               //コネクションをクローズにリセット\r
-               NyLPC_cHttpdConnection_setConnectionMode(inst,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
-\r
-               {//handler\r
-                       (inst->_parent_httpd->function.onRequest)(inst);\r
-               }\r
-               //@bug onRequest後だとHTTPヘッダには効果がない。強制的にConnectionModeをCloseにするフラグが必要。\r
-               //コネクションが増えすぎたら持続性接続を停止するためにCLOSEDにする。\r
+               //持続性接続の初期モードを設定\r
                if(NyLPC_cHttpd_getNumOfConnection(inst->_parent_httpd)>LIMIT_OF_PERSISTENT_CONNECTION){\r
                        NyLPC_cHttpdConnection_setConnectionMode(inst,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+               }else{\r
+                       NyLPC_cHttpdConnection_setConnectionMode(inst,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
+               }\r
+               {//handler\r
+                       (inst->_parent_httpd->function.onRequest)(inst);\r
                }\r
                //HTTP層のクローズ\r
                if(!NyLPC_cHttpdConnection_closeResponse(inst)){\r
index b1caa95..84d5149 100644 (file)
@@ -273,10 +273,10 @@ NyLPC_TBool NyLPC_cModFileIoBaseClass_execute(NyLPC_TcModFileIoBaseClass_t* i_in
                NyLPC_cUrlEncode_finalize(&single_header.urlencode);\r
                NyLPC_cStr_finalize(&single_header._tstr);\r
        }\r
-       //Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
-       if(single_header.super.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && single_header.super.startline.req.version==NyLPC_THttpVersion_11)\r
+       //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+       if(single_header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || single_header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
        {\r
-               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
+               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
        }\r
        //返答フェーズ\r
        {\r
index d31dace..cc7abab 100644 (file)
@@ -351,10 +351,10 @@ NyLPC_TBool NyLPC_cModMiMicSetting_execute(NyLPC_TcModMiMicSetting_t* i_inst,NyL
                NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
                NyLPC_OnErrorGoto(Error2);\r
        }\r
-       //Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
-       if(header.super.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && header.super.startline.req.version==NyLPC_THttpVersion_11)\r
+       //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+       if(header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
        {\r
-               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
+               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
        }\r
        //CGIの実行\r
        switch(header._content_id)\r
index 199ed15..52fecd7 100644 (file)
@@ -379,10 +379,10 @@ NyLPC_TBool NyLPC_cModRemoteMcu_execute(NyLPC_TcModRemoteMcu_t* i_inst,NyLPC_TcH
                NyLPC_cHttpdUtils_sendErrorResponse(i_connection,405);\r
                NyLPC_OnErrorGoto(Error1);\r
        }\r
-       //Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
-       if(single_header.super.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && single_header.super.startline.req.version==NyLPC_THttpVersion_11)\r
+       //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+       if(single_header.super.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || single_header.super.startline.req.version!=NyLPC_THttpVersion_11)\r
        {\r
-               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
+               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
        }\r
        //CGIの実行\r
        switch(single_header._content_id)\r
index f573f74..843ba13 100644 (file)
@@ -110,10 +110,10 @@ NyLPC_TBool NyLPC_cModRomFiles_execute(NyLPC_TcModRomFiles_t* i_inst,NyLPC_TcHtt
                if(strcmp(url,i_inst->_data[i].name)!=0){\r
                        continue;\r
                }\r
-               //Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
-               if(i_inst->super._header.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE && i_inst->super._header.startline.req.version==NyLPC_THttpVersion_11)\r
+               //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+               if(i_inst->super._header.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || i_inst->super._header.startline.req.version!=NyLPC_THttpVersion_11)\r
                {\r
-                       NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
+                       NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
                }\r
                return NyLPC_cHttpdUtils_sendFixedContentBatch(i_connection,i_inst->_data[i].content_type,i_inst->_data[i].data,i_inst->_data[i].size>0?i_inst->_data[i].size:strlen(i_inst->_data[i].data));\r
        }\r
index e5921eb..1702243 100644 (file)
@@ -146,18 +146,19 @@ NyLPC_TBool NyLPC_cModUrl_execute2(NyLPC_TcModUrl_t* i_inst,NyLPC_TcHttpdConnect
        if(!NyLPC_cHttpBasicHeaderParser_parseFinish(&parser.super,&(i_inst->_header))){\r
                NyLPC_OnErrorGoto(Error2);\r
        }\r
+       //@todo http/1.1 && POSTの場合はcontinueを送る。\r
        if(i_inst->_header.startline.req.version==NyLPC_THttpVersion_11){\r
-               //Connection Modeの設定 1.1 && !closeの場合はCONTINUE\r
-               if(i_inst->_header.connection!=NyLPC_THttpMessgeHeader_Connection_CLOSE)\r
-               {\r
-                       NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CONTINUE);\r
-               }\r
-               //@todo http/1.1 && POSTの場合はcontinueを送る。\r
                if(i_inst->_header.startline.req.method==NyLPC_THttpMethodType_POST)\r
                {\r
                        NyLPC_cHttpdConnection_send100Continue(i_connection);\r
                }\r
        }\r
+       //Request::ConnectionがClose設定,又はHTTP1.1では無い場合,CLOSE\r
+       if(i_inst->_header.connection==NyLPC_THttpMessgeHeader_Connection_CLOSE || i_inst->_header.startline.req.version!=NyLPC_THttpVersion_11)\r
+       {\r
+               NyLPC_cHttpdConnection_setConnectionMode(i_connection,NyLPC_TcHttpdConnection_CONNECTION_MODE_CLOSE);\r
+       }\r
+\r
        NyLPC_cHttpBasicHeaderParser_finalize(&parser);\r
        //BodyParserの初期化\r
        if(NyLPC_cHttpBodyParser_getState(&i_inst->_body_parser)!=NyLPC_TcHttpBasicBodyParser_ST_NULL){\r
index bd3058c..22de251 100644 (file)
@@ -151,9 +151,9 @@ static NyLPC_TcUdpSocket_t* cSocketTbl_getMatchMulticastUdpSocket(
 }\r
 \r
 /**\r
- * i_peer番号に一致するリスナを返します。\r
+ * i_port番号に一致するリスナを返します。\r
  */\r
-static NyLPC_TcTcpListener_t* cSocketTbl_getListenerByPeerPort(NyLPC_TcPtrTbl_t* i_inst,NyLPC_TUInt16 i_peer_port)\r
+static NyLPC_TcTcpListener_t* cSocketTbl_getListenerByPeerPort(NyLPC_TcPtrTbl_t* i_inst,NyLPC_TUInt16 i_port)\r
 {\r
        NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);\r
        NyLPC_TcTcpListener_t* lp;\r
@@ -164,7 +164,7 @@ static NyLPC_TcTcpListener_t* cSocketTbl_getListenerByPeerPort(NyLPC_TcPtrTbl_t*
                        continue;\r
                }\r
                lp=(NyLPC_TcTcpListener_t*)p[i];\r
-               if(lp->_port!=i_peer_port){\r
+               if(lp->_port!=i_port){\r
                        continue;\r
                }\r
                return lp;\r
@@ -449,11 +449,7 @@ static NyLPC_TBool tcp_rx(
                        return NyLPC_TBool_TRUE;\r
                }\r
                //リスナにソケットのバインドを依頼する。\r
-               sock=NyLPC_cTcpListener_makeSynRcvdSocket(listener,i_ipp);\r
-               if(sock==NULL){\r
-                       //Listen失敗。ドロップ\r
-                       goto DROP;\r
-               }\r
+               NyLPC_cTcpListener_synPacket(listener,i_ipp);\r
                return NyLPC_TBool_FALSE;//LISTEN成功。送信データなし\r
        }\r
        return NyLPC_TBool_TRUE;\r
index 6f6ed1b..7b87126 100644 (file)
 #include "NyLPC_cUipService_protected.h"\r
 #include "NyLPC_cIPv4.h"\r
 #include "NyLPC_stdlib.h"\r
+#include <stdio.h>\r
+/**\r
+ * NyLPC_TTcpListenerListenQ\r
+ */\r
+\r
+void NyLPC_TTcpListenerListenQ_init(struct NyLPC_TTcpListenerListenQ* i_struct)\r
+{\r
+       i_struct->wp=0;\r
+       int i;\r
+       for(i=NyLPC_TcTcpListener_NUMBER_OF_Q-1;i>=0;i--){\r
+               i_struct->item[i].rport=0;\r
+       }\r
+}\r
+\r
+/**\r
+ * ListenQへSYNパケットの情報を追加する。\r
+ */\r
+void NyLPC_TTcpListenerListenQ_add(struct NyLPC_TTcpListenerListenQ* i_struct,const NyLPC_TcIPv4Payload_t* i_payload)\r
+{\r
+       struct NyLPC_TTcpSocketSynParam* item=&i_struct->item[i_struct->wp];\r
+       //未処理のものがあれば登録しない。\r
+       if(item->rport!=0){\r
+               return;\r
+       }\r
+\r
+       //SYNリングバッファにセット\r
+       item->rport = i_payload->payload.tcp->srcport;\r
+       item->srcaddr=i_payload->header->srcipaddr;\r
+       item->rcv_nxt32=NyLPC_ntohl(i_payload->payload.tcp->seqno32)+1;\r
+       //MSSの設定\r
+       if(!NyLPC_TTcpHeader_getTcpMmsOpt(i_payload->payload.tcp,&item->mss)){\r
+               item->mss=0;\r
+       }\r
+       //書込み位置の進行\r
+       i_struct->wp=(i_struct->wp+1)%NyLPC_TcTcpListener_NUMBER_OF_Q;\r
+}\r
+\r
+/**\r
+ * 最も古いSYNパケット情報のインデクスをキューから返す。\r
+ * @return\r
+ * 見つからない場合-1である。\r
+ */\r
+int NyLPC_TTcpListenerListenQ_getLastIndex(struct NyLPC_TTcpListenerListenQ* i_struct)\r
+{\r
+       int i,t;\r
+       //古いものから順に返す\r
+       for(i=1;i<=NyLPC_TcTcpListener_NUMBER_OF_Q;i++){\r
+               t=(i_struct->wp+i)%NyLPC_TcTcpListener_NUMBER_OF_Q;\r
+               //有効なデータ?\r
+               if(i_struct->item[t].rport!=0){\r
+                       return t;\r
+               }\r
+       }\r
+       return -1;\r
+}\r
+\r
+/**\r
+ * ListenQのN番目を削除する。\r
+ */\r
+void NyLPC_TTcpListenerListenQ_remove(struct NyLPC_TTcpListenerListenQ* i_struct,int i_idx)\r
+{\r
+       i_struct->item[i_idx].rport=0;\r
+       return;\r
+}\r
+\r
+\r
+\r
+\r
+\r
 \r
 \r
 #define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_mutex))\r
@@ -41,14 +110,13 @@ NyLPC_TBool NyLPC_cTcpListener_initialize(NyLPC_TcTcpListener_t* i_inst,NyLPC_TU
 {\r
        NyLPC_TcUipService_t* srv=_NyLPC_TcUipService_inst;\r
        NyLPC_cBaseSocket_initialize(&(i_inst->_super),NyLPC_TcBaseSocket_TYPEID_TCP_LISTENER);\r
-\r
+       NyLPC_TTcpListenerListenQ_init(&i_inst->_listen_q);\r
        //uipサービスは初期化済であること。\r
        NyLPC_Assert(NyLPC_TcUipService_isInitService());\r
        //初期化\r
        //      NyLPC_cMutex_initialize(&(i_inst->_mutex));\r
        i_inst->_mutex=NyLPC_cIPv4_getListenerMutex(&srv->_tcpv4);//    NyLPC_cMutex_initialize(&(i_inst->_mutex));\r
        i_inst->_port=NyLPC_htons(i_port);\r
-       i_inst->_ref_sock=NULL;\r
        //管理リストへ登録。\r
        return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));\r
 }\r
@@ -66,10 +134,14 @@ void NyLPC_cTcpListener_finaize(NyLPC_TcTcpListener_t* i_inst)
        return;\r
 }\r
 \r
+\r
+\r
+\r
 NyLPC_TBool NyLPC_cTcpListener_listen(NyLPC_TcTcpListener_t* i_inst,NyLPC_TcTcpSocket_t* i_sock,NyLPC_TUInt32 i_wait_msec)\r
 {\r
+       int qi;\r
        NyLPC_TcStopwatch_t sw;\r
-       NyLPC_TBool ret;\r
+       NyLPC_TBool ret=NyLPC_TBool_FALSE;\r
        //サービスは稼働中であること。\r
        NyLPC_Assert(NyLPC_cUipService_isRun());\r
 \r
@@ -77,64 +149,62 @@ NyLPC_TBool NyLPC_cTcpListener_listen(NyLPC_TcTcpListener_t* i_inst,NyLPC_TcTcpS
        if(i_sock->tcpstateflags!=UIP_CLOSED){\r
                return NyLPC_TBool_FALSE;\r
        }\r
-       //Listenerのリソースロック\r
-       lockResource(i_inst);\r
-       //listenターゲットのセット\r
-       i_inst->_ref_sock=i_sock;\r
-       //Listenerのリソースアンロック\r
-       unlockResource(i_inst);\r
-\r
 \r
-       //一定時間待つ。\r
+       //ストップウォッチを起動\r
        NyLPC_cStopwatch_initialize(&sw);\r
        NyLPC_cStopwatch_setNow(&sw);\r
-       while(NyLPC_cStopwatch_elapseInMsec(&sw)<i_wait_msec){\r
-               NyLPC_cThread_yield();\r
-               //ステータス遷移が実行されていたら、ブレーク\r
-               if(i_inst->_ref_sock->tcpstateflags==UIP_SYN_RCVD){\r
-                       break;\r
-               }\r
-       }\r
-       NyLPC_cStopwatch_finalize(&sw);\r
+\r
 \r
        //Listenerのリソースロック\r
        lockResource(i_inst);\r
-       //受領確認と戻り値の決定\r
-       if(i_inst->_ref_sock->tcpstateflags==UIP_SYN_RCVD){\r
-               ret=NyLPC_TBool_TRUE;\r
-       }else{\r
-               ret=NyLPC_TBool_FALSE;\r
+\r
+       while(NyLPC_cStopwatch_elapseInMsec(&sw)<i_wait_msec){\r
+               qi=NyLPC_TTcpListenerListenQ_getLastIndex(&i_inst->_listen_q);\r
+               if(qi>=0){\r
+                       //SYN処理要求がある\r
+                       if(!NyLPC_cTcpSocket_listenSyn(i_sock,&i_inst->_listen_q.item[qi],i_inst->_port)){\r
+                               ret=NyLPC_TBool_FALSE;\r
+                       }else{\r
+                               //成功\r
+                               ret=NyLPC_TBool_TRUE;\r
+                       }\r
+                       //処理したSYNの削除\r
+                       NyLPC_TTcpListenerListenQ_remove(&i_inst->_listen_q,qi);\r
+                       break;\r
+               }else{\r
+                       //SYN処理要求は無い(しばらくまつ)\r
+                       unlockResource(i_inst);\r
+                       NyLPC_cThread_yield();\r
+                       lockResource(i_inst);\r
+               }\r
        }\r
-       //バインドしてあるソケットを解除\r
-       i_inst->_ref_sock=NULL;\r
-       //Listenerのリソースアンロック\r
+       //タイムアウト\r
        unlockResource(i_inst);\r
+       NyLPC_cStopwatch_finalize(&sw);\r
        return ret;\r
 }\r
 \r
 /**\r
  * この関数は、Uip受信タスクから実行します。
  */\r
-NyLPC_TcTcpSocket_t* NyLPC_cTcpListener_makeSynRcvdSocket(NyLPC_TcTcpListener_t* i_inst,const NyLPC_TcIPv4Payload_t* i_payload)\r
+NyLPC_TBool NyLPC_cTcpListener_synPacket(NyLPC_TcTcpListener_t* i_inst,const NyLPC_TcIPv4Payload_t* i_payload)\r
 {\r
-       NyLPC_TcTcpSocket_t* sock=NULL;\r
        //パケットチェック。SYN設定されてる?\r
        if(!(i_payload->payload.tcp->flags & TCP_SYN)){\r
                //SYNない\r
-               return NULL;\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       //peer port==0は受け取らない。\r
+       if(i_payload->payload.tcp->srcport==0){\r
+               return NyLPC_TBool_FALSE;\r
        }\r
        //Listenerのリソースロック\r
        lockResource(i_inst);\r
-       if(i_inst->_ref_sock!=NULL){\r
-               //listenターゲットが指定されていたら、ソケットステータスの遷移。CLOSED->SYN_RCVD\r
-               if(NyLPC_cTcpSocket_setSynPayload(i_inst->_ref_sock,i_payload))\r
-               {\r
-                       sock=i_inst->_ref_sock;\r
-               }\r
-       }\r
+       //ListenQへ追加\r
+       NyLPC_TTcpListenerListenQ_add(&(i_inst->_listen_q),i_payload);\r
        //Listenerのリソースアンロック\r
        unlockResource(i_inst);\r
-       return sock;\r
+       return NyLPC_TBool_TRUE;\r
 }\r
 \r
 \r
index b36c9ed..b0ae477 100644 (file)
 #ifndef NYLPC_CTCPLISTENER_H_\r
 #define NYLPC_CTCPLISTENER_H_\r
 \r
-typedef struct NyLPC_TcTcpListener NyLPC_TcTcpListener_t;\r
-\r
 \r
 #include "NyLPC_stdlib.h"\r
 #include "NyLPC_os.h"\r
 #include "NyLPC_cBaseSocket.h"\r
 #include "NyLPC_cTcpSocket.h"\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif /* __cplusplus */\r
+\r
+typedef struct NyLPC_TcTcpListener NyLPC_TcTcpListener_t;\r
+\r
+/**********************************************************************\r
+ *\r
+ * NyLPC_TTcpListenerListenQ struct\r
+ *\r
+ **********************************************************************/\r
+\r
+#define NyLPC_TcTcpListener_NUMBER_OF_Q 10\r
+\r
+struct NyLPC_TTcpListenerListenQ\r
+{\r
+       struct NyLPC_TTcpSocketSynParam item[NyLPC_TcTcpListener_NUMBER_OF_Q];\r
+       NyLPC_TUInt16 wp;\r
+};\r
+\r
+\r
 /**********************************************************************\r
  *\r
  * NyLPC_TcTcpListener class\r
  *\r
  **********************************************************************/\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif /* __cplusplus */\r
 \r
 /**\r
  * TCP listenerクラス型です。\r
@@ -49,12 +65,15 @@ struct NyLPC_TcTcpListener
 {\r
        NyLPC_TcBaseSocket_t _super;\r
        NyLPC_TUInt16 _port;                            /**<ネットワークオーダーのポート番号*/\r
-       /** バインドするためのソケット*/\r
-       NyLPC_TcTcpSocket_t* _ref_sock;\r
-       /** タスク間の調停用Mutex\r
+       /**\r
+        * タスク間の調停用Mutex\r
         * Listener用の共通Mutexポインタ\r
         */\r
        NyLPC_TcMutex_t* _mutex;\r
+       /**\r
+        * SYNパケットのキュー\r
+        */\r
+       struct NyLPC_TTcpListenerListenQ _listen_q;\r
 };\r
 /**\r
  * この関数は、TCPのリスナーを初期化します。\r
index 59ecfdb..105643c 100644 (file)
@@ -47,8 +47,12 @@ extern "C" {
 \r
 \r
 \r
-\r
-NyLPC_TcTcpSocket_t* NyLPC_cTcpListener_makeSynRcvdSocket(NyLPC_TcTcpListener_t* i_inst,const NyLPC_TcIPv4Payload_t* i_payload);\r
+/**\r
+ * ListenerへSYNパケットを通知します。\r
+ * @return\r
+ * 常にTRUE\r
+ */\r
+NyLPC_TBool NyLPC_cTcpListener_synPacket(NyLPC_TcTcpListener_t* i_inst,const NyLPC_TcIPv4Payload_t* i_payload);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 0398d18..e849ac2 100644 (file)
@@ -346,9 +346,9 @@ void NyLPC_cTcpSocket_finalize(NyLPC_TcTcpSocket_t* i_inst)
 }\r
 \r
 \r
-NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Payload_t* i_ipp)\r
+\r
+NyLPC_TBool NyLPC_cTcpSocket_listenSyn(NyLPC_TcTcpSocket_t* i_inst,const struct NyLPC_TTcpSocketSynParam* i_lq,NyLPC_TUInt16 i_lport)\r
 {\r
-       NyLPC_TUInt16 tmp16;\r
 //     NyLPC_Assert(NyLPC_cMutex_isLocked(i_inst->_smutex));\r
        lockResource(i_inst);\r
        //ソケットが無効であること。\r
@@ -357,16 +357,16 @@ NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyL
                //localipとdefault_mmsは別枠で設定\r
                /* Fill in the necessary fields for the new connection. */\r
                i_inst->uip_connr.current_rto32 = UIP_IP_RTOP_INITIAL;\r
-               i_inst->uip_connr.lport = i_ipp->payload.tcp->destport;\r
-               i_inst->uip_connr.rport = i_ipp->payload.tcp->srcport;\r
-               i_inst->uip_connr.ripaddr=i_ipp->header->srcipaddr;\r
+               i_inst->uip_connr.lport = i_lport;\r
+               i_inst->uip_connr.rport = i_lq->rport;\r
+               i_inst->uip_connr.ripaddr=i_lq->srcaddr;\r
                i_inst->uip_connr.snd_nxt32=iss32;\r
                /* rcv_nxt should be the seqno from the incoming packet + 1. */\r
-               i_inst->uip_connr.rcv_nxt32= NyLPC_ntohl(i_ipp->payload.tcp->seqno32)+1;\r
+               i_inst->uip_connr.rcv_nxt32= i_lq->rcv_nxt32;\r
                //MSSの設定\r
                i_inst->uip_connr.peer_mss=i_inst->uip_connr.default_mss;\r
-               if(NyLPC_TTcpHeader_getTcpMmsOpt(i_ipp->payload.tcp,&tmp16)){\r
-                       i_inst->uip_connr.peer_mss=tmp16;\r
+               if(i_lq->mss!=0){\r
+                       i_inst->uip_connr.peer_mss=i_lq->mss;\r
                }\r
                i_inst->uip_connr.peer_win=0;\r
                NyLPC_cFifoBuffer_clear(&(i_inst->rxbuf));\r
@@ -383,6 +383,8 @@ NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyL
        unlockResource(i_inst);\r
        return NyLPC_TBool_FALSE;\r
 }\r
+\r
+\r
 /**\r
  * sq番のTxがキューから消え去るのを待ちます。\r
  * この関数は、アンロック状態でコールしてください。\r
index 33a4426..e133df7 100644 (file)
@@ -41,6 +41,29 @@ extern "C" {
 \r
 typedef struct NyLPC_TcTcpSocket NyLPC_TcTcpSocket_t;\r
 \r
+\r
+/**********************************************************************\r
+ *\r
+ * NyLPC_TTcpListenerSynInfo struct\r
+ *\r
+ **********************************************************************/\r
+\r
+\r
+struct NyLPC_TTcpSocketSynParam\r
+{\r
+       struct NyLPC_TIPv4Addr srcaddr;\r
+       NyLPC_TUInt16 rport;\r
+       NyLPC_TUInt16 mss;\r
+       NyLPC_TUInt32 rcv_nxt32;\r
+};\r
+\r
+\r
+/**********************************************************************\r
+ *\r
+ * NyLPC_TcTcpSocket_TxQItem struct\r
+ *\r
+ **********************************************************************/\r
+\r
 /**\r
  * TXキューの数。この値は8未満にしてください。\r
  */\r
@@ -57,6 +80,12 @@ struct NyLPC_TcTcpSocket_TxQItem
        NyLPC_TUInt32 ackno;\r
 };\r
 \r
+/**********************************************************************\r
+ *\r
+ * uip_conn struct\r
+ *\r
+ **********************************************************************/\r
+\r
 struct uip_conn\r
 {\r
        struct NyLPC_TIPv4Addr        ripaddr;  /**< The IP address of the remote host. */\r
index a472363..4eab2af 100644 (file)
@@ -79,14 +79,13 @@ void NyLPC_cTcpSocket_periodic(
        NyLPC_TcTcpSocket_t* i_inst);\r
 \r
 /**\r
- * uipサービスタスクが実行する関数です。\r
- * uipコアタスクが実行します。\r
- * コール前に共有MUTEXにロックをかけてください。\r
- * ソケットを、SYNパケットで初期化して、UIP_SYN_RECV状態にします。\r
+ * CLOSEステータスのソケットを、SYN情報の内容でSYNRECV状態にします。\r
+ * この関数は、NyLPC_TcTcpListenerクラスからコールされます。\r
  * @return\r
  * 遷移に成功すると、TRUEを返します。\r
  */\r
-NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Payload_t* i_ipp);\r
+NyLPC_TBool NyLPC_cTcpSocket_listenSyn(NyLPC_TcTcpSocket_t* i_inst,const struct NyLPC_TTcpSocketSynParam* i_lq,NyLPC_TUInt16 i_lport);\r
+\r
 \r
 /**\r
  * uipサービスタスクが実行する関数です。\r