#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
}\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
//初回だけ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
* 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
//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
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
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
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
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
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
}\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
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
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
#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
{\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
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
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
#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
{\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
\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
}\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
//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
unlockResource(i_inst);\r
return NyLPC_TBool_FALSE;\r
}\r
+\r
+\r
/**\r
* sq番のTxがキューから消え去るのを待ちます。\r
* この関数は、アンロック状態でコールしてください。\r
\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
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
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