OSDN Git Service

NyLPC_cTcpSocketへTCP送信パケットライタを統合
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Wed, 28 May 2014 12:19:44 +0000 (12:19 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Wed, 28 May 2014 12:19:44 +0000 (12:19 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@348 47198e57-cb75-475f-84c4-a814cd6f29e0

lib/src/uip/NyLPC_cIPv4Payload.c
lib/src/uip/NyLPC_cIPv4Payload_protected.h
lib/src/uip/NyLPC_cTcpSocket.c
lib/src/uip/NyLPC_cTcpSocket.h
lib/src/uip/NyLPC_uip.h

index f392680..1a6fe73 100644 (file)
@@ -81,23 +81,7 @@ static void writeTxIpHeader(
        i_struct->ipoffset=NyLPC_htons(0|0x4000);\r
        i_struct->ipchksum = 0;\r
 }\r
-/**\r
- * TCPヘッダに値をセットする。checksum,wndは0初期化する。\r
- */\r
-static void setTcpTxHeader(struct NyLPC_TTcpHeader* i_struct,NyLPC_TUInt8 i_flag,const struct uip_conn* i_conn)\r
-{\r
-       i_struct->flags    = i_flag;\r
-       //sorce & destination port\r
-       i_struct->srcport  = i_conn->lport;\r
-       i_struct->destport = i_conn->rport;\r
-       //ACK number\r
-       i_struct->ackno32  = NyLPC_htonl(i_conn->rcv_nxt32);\r
-       //Seq Number\r
-       i_struct->seqno32  = NyLPC_htonl(i_conn->snd_nxt32);\r
-       //uip_func_tcp_send_noconn(BUF);\r
-       i_struct->urgp[0]  = i_struct->urgp[1] = 0;\r
-       i_struct->tcpchksum= 0;\r
-}\r
+\r
 /**\r
  * UDPヘッダに値をセットする。checksumは0初期化する。\r
  */\r
@@ -180,19 +164,7 @@ void* NyLPC_cIPv4Payload_initTcpTx(NyLPC_TcIPv4Payload_t* i_inst,NyLPC_TUInt8 i_
        return i_inst->payload.rawbuf+(i_tcph_word*4);\r
 }\r
 \r
-/**\r
- * コネクション情報から、TCPのコントロールヘッダをセットします。\r
- */\r
-void NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(NyLPC_TcIPv4Payload_t* i_inst,const struct uip_conn* i_conn,NyLPC_TUInt8 i_flag)\r
-{\r
-       //IPv4のTxヘッダを書き込む。\r
-       i_inst->header->destipaddr=i_conn->ripaddr;\r
-       i_inst->header->srcipaddr =*(i_conn->lipaddr);\r
-       writeTxIpHeader(i_inst->header,UIP_PROTO_TCP);\r
-       //TCPのTxヘッダを書き込む\r
-       setTcpTxHeader(i_inst->payload.tcp,i_flag,i_conn);\r
-       return;\r
-}\r
+\r
 \r
 /**\r
  * 送信バッファをセットする。\r
@@ -211,44 +183,7 @@ void* NyLPC_cIPv4Payload_detachBuf(NyLPC_TcIPv4Payload_t* i_inst)
        return r;\r
 }\r
 \r
-/**\r
- * 入力したTCP/IPペイロードをRSTレスポンスに変換する。\r
- */\r
-void NyLPC_cIPv4Payload_setTcpReverseRstAck(\r
-       NyLPC_TcIPv4Payload_t* i_inst)\r
-{\r
-       struct NyLPC_TIPv4Addr src_addr,dest_addr;\r
-       NyLPC_TUInt32 ack,seq;\r
-       NyLPC_TUInt16 src_port,dest_port;\r
-       struct NyLPC_TTcpHeader* tcp=i_inst->payload.tcp;\r
-\r
-       //送信元IP,Portを退避\r
-       src_addr=i_inst->header->srcipaddr;\r
-       dest_addr=i_inst->header->destipaddr;\r
-       dest_port=tcp->destport;\r
-       src_port=tcp->srcport;\r
-       //送信元sq,ackを退避\r
-       ack=tcp->ackno32;\r
-       seq=tcp->seqno32;\r
-       //パケットマップの設定\r
-       NyLPC_cIPv4Payload_initTcpTx(i_inst,0x05,((UIP_TCPH_LEN) / 4),0);\r
-       //ipの設定\r
-       i_inst->header->destipaddr=src_addr;\r
-       i_inst->header->srcipaddr=dest_addr;\r
-       writeTxIpHeader(i_inst->header,UIP_PROTO_TCP);\r
-       //TCP設定\r
-       tcp->flags = TCP_RST | TCP_ACK;\r
-       tcp->tcpoffset = 5<<4;\r
-       tcp->seqno32=ack;\r
-       tcp->ackno32=NyLPC_htonl(NyLPC_ntohl(seq)+1);\r
-       tcp->srcport=dest_port;\r
-       tcp->destport=src_port;\r
-       tcp->urgp[0] = tcp->urgp[1] = 0;\r
-       tcp->wnd16=0;\r
-       i_inst->header->ipchksum = ~(NyLPC_TIPv4Header_makeIpChecksum(i_inst->header));\r
-       i_inst->payload.tcp->tcpchksum=~(NyLPC_TIPv4Header_makeTcpChecksum(i_inst->header));\r
-       return;\r
-}\r
+\r
 void NyLPC_cIPv4Payload_setTcpReverseRstAck2(\r
        NyLPC_TcIPv4Payload_t* i_inst,\r
        const NyLPC_TcIPv4Payload_t* i_src)\r
@@ -276,21 +211,6 @@ void NyLPC_cIPv4Payload_setTcpReverseRstAck2(
 }\r
 \r
 \r
-void NyLPC_cIPv4Payload_setTcpWnd(\r
-       NyLPC_TcIPv4Payload_t* i_inst,\r
-       NyLPC_TUInt16 i_wnd)\r
-{\r
-       i_inst->payload.tcp->wnd16=NyLPC_htons(i_wnd);\r
-}\r
-/**\r
- * パケットを閉じで完成させる。
- */\r
-void NyLPC_cIPv4Payload_closeTcpTxPacket(\r
-       NyLPC_TcIPv4Payload_t* i_inst)\r
-{\r
-       i_inst->payload.tcp->tcpchksum=~(NyLPC_TIPv4Header_makeTcpChecksum(i_inst->header));\r
-       i_inst->header->ipchksum = ~(NyLPC_TIPv4Header_makeIpChecksum(i_inst->header));\r
-}\r
 /* なんだっけっこれ?\r
 //1の補数v1にv2を加算する。\r
 static NyLPC_TUInt16 add16c(NyLPC_TUInt16 i_v1,NyLPC_TUInt16 i_v2)\r
@@ -309,47 +229,7 @@ static NyLPC_TUInt16 sub16c(NyLPC_TUInt16 i_v1,NyLPC_TUInt16 i_v2)
 */\r
 \r
 \r
-/**\r
- * ACK番号を更新する。\r
- * @param i_ackno\r
- * ネットワークオーダーのACK番号\r
- */\r
-void NyLPC_cIPv4Payload_updateAckNo(\r
-       NyLPC_TcIPv4Payload_t* i_inst,\r
-       NyLPC_TUInt32 i_ackno)\r
-{\r
-       NyLPC_Assert(i_inst->header!=NULL);\r
-\r
-\r
-/*     union{\r
-               NyLPC_TUInt32 l;\r
-               NyLPC_TUInt8 b[4];\r
-       }old_ack,new_ack;\r
-       NyLPC_TUInt16 v1;\r
-       //checksumの計算\r
-       old_ack.l=i_inst->payload.tcp->ackno32;//古いACK番号\r
-       new_ack.l=i_ackno;//新しいACK番号\r
-       v1=NyLPC_ntohs(~(i_inst->payload.tcp->tcpchksum));//1の補数を取って、ホストオーダーに戻す。\r
-       //減算\r
-       v1=sub16c(v1,(old_ack.b[0]<<8)+old_ack.b[1]);\r
-       v1=sub16c(v1,(old_ack.b[2]<<8)+old_ack.b[3]);\r
-       //加算\r
-       v1=add16c(v1,(new_ack.b[0]<<8)+new_ack.b[1]);\r
-       v1=add16c(v1,(new_ack.b[2]<<8)+new_ack.b[3]);\r
-       v1=~NyLPC_htons(v1);*/\r
-NyLPC_Trace();\r
-       i_inst->payload.tcp->ackno32=i_ackno;\r
-NyLPC_Trace();\r
-       i_inst->payload.tcp->tcpchksum = 0;\r
-NyLPC_Trace();\r
-       i_inst->payload.tcp->tcpchksum = ~(NyLPC_TIPv4Header_makeTcpChecksum(i_inst->header));\r
-NyLPC_Trace();\r
 \r
-/*\r
-       if((i_inst->payload.tcp->tcpchksum!=v1)){\r
-               NyLPC_Warning();\r
-       }*/\r
-}\r
 \r
 ///////////////UDP//////////////\r
 \r
index 9e9d260..b6805b4 100644 (file)
@@ -89,29 +89,13 @@ void NyLPC_cIPv4Payload_initialize(NyLPC_TcIPv4Payload_t* i_inst);
 void NyLPC_cIPv4Payload_attachTxBuf(NyLPC_TcIPv4Payload_t* i_inst,void* i_buf);\r
 void* NyLPC_cIPv4Payload_detachBuf(NyLPC_TcIPv4Payload_t* i_inst);\r
 \r
-/**\r
- * ペーロードサイズゼロ、オプションなしのTCPコントロールパケットをセットします。
- */\r
-void NyLPC_cIPv4Payload_setTcpCtrl(NyLPC_TcIPv4Payload_t* i_inst,const NyLPC_TcTcpSocket_t* i_conn,NyLPC_TUInt8 i_tcp_flag);\r
-void* NyLPC_cIPv4Payload_initTcpTx(NyLPC_TcIPv4Payload_t* i_inst,NyLPC_TUInt8 i_iph_word,NyLPC_TUInt8 i_tcph_word,NyLPC_TUInt16 i_tcp_payload_size);\r
 NyLPC_TBool NyLPC_cIPv4Payload_attachRxBuf(NyLPC_TcIPv4Payload_t* i_inst,void* i_buf,NyLPC_TUInt16 i_flagment_size);\r
 void NyLPC_cIPv4Payload_setTcpReverseRstAck(\r
        NyLPC_TcIPv4Payload_t* i_inst);\r
 void NyLPC_cIPv4Payload_setTcpReverseRstAck2(\r
        NyLPC_TcIPv4Payload_t* i_inst,\r
        const NyLPC_TcIPv4Payload_t* i_src);\r
-void NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(NyLPC_TcIPv4Payload_t* i_inst,const struct uip_conn* i_conn,NyLPC_TUInt8 i_flag);\r
-\r
-void NyLPC_cIPv4Payload_setTcpWnd(\r
-       NyLPC_TcIPv4Payload_t* i_inst,\r
-       NyLPC_TUInt16 i_wnd);\r
 \r
-void NyLPC_cIPv4Payload_closeTcpTxPacket(\r
-       NyLPC_TcIPv4Payload_t* i_inst);\r
-\r
-void NyLPC_cIPv4Payload_updateAckNo(\r
-       NyLPC_TcIPv4Payload_t* i_inst,\r
-       NyLPC_TUInt32 i_ackno);\r
 \r
 \r
 \r
index 776fef3..f749a23 100644 (file)
@@ -75,64 +75,160 @@ static NyLPC_TUInt32 iss32=3939;
 static void sendRst(NyLPC_TcTcpSocket_t* i_inst);\r
 \r
 \r
+\r
+\r
+\r
+\r
+\r
 /**\r
- * ソケットステータスを元に、IPパケットを構成します。\r
- * この関数は、ロック状態でコールしてください。\r
+ * IPヘッダを送信パケット用に設定する。\r
+ * ipcecksumには0を設定する。\r
+ * この関数は、パケットサイズ,ローカルIP/リモートIPの設定はしない。\r
  */\r
-static void setPacket(const NyLPC_TcTcpSocket_t* i_inst,NyLPC_TcIPv4Payload_t* i_payload,NyLPC_TUInt8 i_tcpf,const void* i_buf,NyLPC_TUInt16 i_len)\r
+static void writeTxIpHeader(\r
+       struct NyLPC_TIPv4Header* i_struct,\r
+       NyLPC_TUInt8 i_proto)\r
 {\r
-       void* buf;\r
-       switch(i_tcpf){\r
-       case TCP_PSH|TCP_ACK:\r
-               buf=NyLPC_cIPv4Payload_initTcpTx(i_payload,0x05,((UIP_TCPH_LEN) / 4),i_len);\r
-               NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(i_payload,&(i_inst->uip_connr),TCP_ACK|TCP_PSH);\r
-               //bufの書き込み\r
-               memcpy(buf,i_buf,i_len);\r
-               break;\r
-       case TCP_ACK:\r
-       case TCP_FIN|TCP_ACK:\r
-       case TCP_RST|TCP_ACK:\r
-               NyLPC_cIPv4Payload_initTcpTx(i_payload,0x05,((UIP_TCPH_LEN) / 4),0);\r
-               NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(i_payload,&(i_inst->uip_connr),i_tcpf);\r
-               break;\r
-       case TCP_SYN|TCP_ACK:\r
-               NyLPC_cIPv4Payload_initTcpTx(i_payload,0x05,((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4),0);\r
-               NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(i_payload,&(i_inst->uip_connr),i_tcpf);\r
-               //MSSの設定(OPTION領域のアドレス0)\r
-               NyLPC_TTcpHeader_setMmsOpt((NyLPC_TUInt8*)(i_payload->payload.tcp+1),i_inst->uip_connr.default_mss);\r
-               break;\r
-       case TCP_SYN:\r
-               NyLPC_cIPv4Payload_initTcpTx(i_payload,0x05,((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4),0);\r
-               NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(i_payload,&(i_inst->uip_connr),i_tcpf);\r
-               //MSSの設定(OPTION領域のアドレス0)\r
-               NyLPC_TTcpHeader_setMmsOpt((NyLPC_TUInt8*)(i_payload->payload.tcp+1),i_inst->uip_connr.default_mss);\r
-               break;\r
-       default:\r
-               NyLPC_Abort();\r
+       //IPパケットのセット\r
+       i_struct->proto=i_proto;\r
+       i_struct->ttl = UIP_DEFAULT_IP_TTL;\r
+       i_struct->tos = 0;\r
+       i_struct->ipid16=0;\r
+       i_struct->ipoffset=NyLPC_htons(0|0x4000);\r
+       i_struct->ipchksum = 0;\r
+}\r
+\r
+/**\r
+ * TCPヘッダに値をセットする。checksum,wndは0初期化する。\r
+ */\r
+static void setTcpTxHeader(struct NyLPC_TTcpHeader* i_struct,NyLPC_TUInt8 i_flag,const struct uip_conn* i_conn)\r
+{\r
+       i_struct->flags    = i_flag;\r
+       //sorce & destination port\r
+       i_struct->srcport  = i_conn->lport;\r
+       i_struct->destport = i_conn->rport;\r
+       //ACK number\r
+       i_struct->ackno32  = NyLPC_htonl(i_conn->rcv_nxt32);\r
+       //Seq Number\r
+       i_struct->seqno32  = NyLPC_htonl(i_conn->snd_nxt32);\r
+       //uip_func_tcp_send_noconn(BUF);\r
+       i_struct->urgp[0]  = i_struct->urgp[1] = 0;\r
+       i_struct->tcpchksum= 0;\r
+}\r
+\r
+static void setTxPacket(const NyLPC_TcTcpSocket_t* i_inst,void* i_tx_buf,NyLPC_TUInt8 i_tcpf,const void* i_buf,NyLPC_TUInt16 i_len)\r
+{\r
+       struct NyLPC_TIPv4Header*       iph;\r
+       struct NyLPC_TTcpHeader*        tcph;\r
+       NyLPC_TUInt8 iph_word=0x05;\r
+       NyLPC_TUInt8 tcph_word=(UIP_TCPH_LEN) / 4;\r
+       //IPヘッダの更新\r
+       iph=(struct NyLPC_TIPv4Header*)i_tx_buf;\r
+       iph->vhl=0x40|(0x0f&iph_word);\r
+       iph->destipaddr=i_inst->uip_connr.ripaddr;\r
+       iph->srcipaddr =*(i_inst->uip_connr.lipaddr);\r
+       writeTxIpHeader(iph,UIP_PROTO_TCP);\r
+\r
+       //TCPヘッダの更新\r
+       tcph=(struct NyLPC_TTcpHeader*)(((NyLPC_TUInt8*)i_tx_buf)+NyLPC_TIPv4Header_getHeaderLength(iph));\r
+\r
+\r
+       //SYNが有るならMSSの書き込み\r
+       if((TCP_SYN & i_tcpf)){\r
+               tcph_word+=((TCP_OPT_MSS_LEN) / 4);\r
+               NyLPC_TTcpHeader_setMmsOpt(((NyLPC_TUInt8*)(tcph+1)),i_inst->uip_connr.default_mss);\r
        }\r
-       NyLPC_cIPv4Payload_setTcpWnd(i_payload,NyLPC_cFifoBuffer_getSpace(&(i_inst->rxbuf)));\r
-       NyLPC_cIPv4Payload_closeTcpTxPacket(i_payload);\r
+       tcph->tcpoffset=(tcph_word<<4);\r
+       setTcpTxHeader(tcph,i_tcpf,&(i_inst->uip_connr));\r
+\r
+       //最終的なパケットサイズと必要ならペイロードを書き込み\r
+       if(i_buf!=NULL){\r
+               iph->len16=NyLPC_htons(i_len+(iph_word+tcph_word)*4);\r
+               memcpy(((NyLPC_TUInt8*)i_tx_buf)+((iph_word+tcph_word)*4),i_buf,i_len);\r
+       }else{\r
+               iph->len16=NyLPC_htons((iph_word+tcph_word)*4);\r
+       }\r
+       //WND設定\r
+       tcph->wnd16=NyLPC_htons(NyLPC_cFifoBuffer_getSpace(&(i_inst->rxbuf)));\r
+       //Checksumの生成\r
+       tcph->tcpchksum=~(NyLPC_TIPv4Header_makeTcpChecksum(iph));\r
+       iph->ipchksum = ~(NyLPC_TIPv4Header_makeIpChecksum(iph));\r
        return;\r
 }\r
 \r
 /**\r
- * 現在のSOCKETのPureACKを生成して返します。\r
- * setPacket(i_inst,i_payload,TCP_ACK,NULL,0)とほぼ同じ。\r
+ * IP/TCPヘッダが40バイト固定として、i_tx_buf+40の位置にあるペイロードに対するIP/TCPヘッダを書き込みます。\r
  */\r
-static void* allocPureACK(const NyLPC_TcTcpSocket_t* i_inst)\r
+static void setTxPacketHeader(const NyLPC_TcTcpSocket_t* i_inst,void* i_tx_buf,NyLPC_TUInt8 i_tcpf,NyLPC_TUInt16 i_len)\r
 {\r
-       NyLPC_TcIPv4Payload_t payload;\r
-       void* b=NyLPC_cUipService_allocSysTxBuf();\r
-       NyLPC_cIPv4Payload_initialize(&payload);\r
-       NyLPC_cIPv4Payload_attachTxBuf(&payload,b);\r
-       NyLPC_cIPv4Payload_initTcpTx(&payload,0x05,((UIP_TCPH_LEN) / 4),0);\r
-       NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(&payload,&(i_inst->uip_connr),TCP_ACK);\r
-       NyLPC_cIPv4Payload_setTcpWnd(&payload,NyLPC_cFifoBuffer_getSpace(&(i_inst->rxbuf)));\r
-       NyLPC_cIPv4Payload_closeTcpTxPacket(&payload);\r
-       NyLPC_cIPv4Payload_finalize(&payload);\r
-       return b;\r
+       struct NyLPC_TIPv4Header*       iph;\r
+       struct NyLPC_TTcpHeader*        tcph;\r
+       NyLPC_TUInt8 iph_word=0x05;\r
+       NyLPC_TUInt8 tcph_word=(UIP_TCPH_LEN) / 4;\r
+       //IPヘッダの更新\r
+       iph=(struct NyLPC_TIPv4Header*)i_tx_buf;\r
+       iph->vhl=0x40|(0x0f&iph_word);\r
+       iph->destipaddr=i_inst->uip_connr.ripaddr;\r
+       iph->srcipaddr =*(i_inst->uip_connr.lipaddr);\r
+       writeTxIpHeader(iph,UIP_PROTO_TCP);\r
+\r
+       //TCPヘッダの更新\r
+       tcph=(struct NyLPC_TTcpHeader*)(((NyLPC_TUInt8*)i_tx_buf)+NyLPC_TIPv4Header_getHeaderLength(iph));\r
+       tcph->tcpoffset=(tcph_word<<4);\r
+       setTcpTxHeader(tcph,i_tcpf,&(i_inst->uip_connr));\r
+\r
+       //最終的なパケットサイズと必要ならペイロードを書き込み\r
+       iph->len16=NyLPC_htons(i_len+(iph_word+tcph_word)*4);\r
+       //WND設定\r
+       tcph->wnd16=NyLPC_htons(NyLPC_cFifoBuffer_getSpace(&(i_inst->rxbuf)));\r
+       //Checksumの生成\r
+       tcph->tcpchksum=~(NyLPC_TIPv4Header_makeTcpChecksum(iph));\r
+       iph->ipchksum = ~(NyLPC_TIPv4Header_makeIpChecksum(iph));\r
+       return;\r
 }\r
 /**\r
+ * ACK番号を更新する。\r
+ * @param i_ackno\r
+ * ネットワークオーダーのACK番号\r
+ */\r
+static void updateAckNo(void* i_tx_buf,NyLPC_TUInt32 i_ackno)\r
+{\r
+       struct NyLPC_TIPv4Header*       iph=(struct NyLPC_TIPv4Header*)i_tx_buf;\r
+       struct NyLPC_TTcpHeader*        tcph=(struct NyLPC_TTcpHeader*)(((NyLPC_TUInt8*)i_tx_buf)+NyLPC_TIPv4Header_getHeaderLength(iph));\r
+\r
+/*     union{\r
+               NyLPC_TUInt32 l;\r
+               NyLPC_TUInt8 b[4];\r
+       }old_ack,new_ack;\r
+       NyLPC_TUInt16 v1;\r
+       //checksumの計算\r
+       old_ack.l=i_inst->payload.tcp->ackno32;//古いACK番号\r
+       new_ack.l=i_ackno;//新しいACK番号\r
+       v1=NyLPC_ntohs(~(i_inst->payload.tcp->tcpchksum));//1の補数を取って、ホストオーダーに戻す。\r
+       //減算\r
+       v1=sub16c(v1,(old_ack.b[0]<<8)+old_ack.b[1]);\r
+       v1=sub16c(v1,(old_ack.b[2]<<8)+old_ack.b[3]);\r
+       //加算\r
+       v1=add16c(v1,(new_ack.b[0]<<8)+new_ack.b[1]);\r
+       v1=add16c(v1,(new_ack.b[2]<<8)+new_ack.b[3]);\r
+       v1=~NyLPC_htons(v1);*/\r
+NyLPC_Trace();\r
+       tcph->ackno32=i_ackno;\r
+NyLPC_Trace();\r
+       tcph->tcpchksum = 0;\r
+NyLPC_Trace();\r
+       tcph->tcpchksum = ~(NyLPC_TIPv4Header_makeTcpChecksum(iph));\r
+NyLPC_Trace();\r
+\r
+/*\r
+       if((i_inst->payload.tcp->tcpchksum!=v1)){\r
+               NyLPC_Warning();\r
+       }*/\r
+}\r
+\r
+\r
+\r
+/**\r
  * 指定した送信パケットがACK済であるか調べる。\r
  */\r
 static NyLPC_TBool isPacketAcked(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt32 i_sq)\r
@@ -179,7 +275,7 @@ static void resetTxQWithUnlock(NyLPC_TcTcpSocket_t* i_inst)
 \r
        l=0;\r
        while(i_inst->txbuf.rp!=i_inst->txbuf.wp){\r
-               dlist[l]=q[i_inst->txbuf.rp].data.header;\r
+               dlist[l]=q[i_inst->txbuf.rp].packet;\r
                l++;\r
                i_inst->txbuf.rp=(i_inst->txbuf.rp+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ;\r
        }\r
@@ -200,15 +296,12 @@ static void resetTxQWithUnlock(NyLPC_TcTcpSocket_t* i_inst)
  */\r
 static void updateTxAck(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt32 i_ackno)\r
 {\r
-       NyLPC_TcIPv4Payload_t ppl;\r
        NyLPC_TUInt8 rp;\r
        struct NyLPC_TcTcpSocket_TxQItem* q=i_inst->txbuf.txq;\r
        NyLPC_ArgAssert(i_inst!=NULL);\r
        rp=i_inst->txbuf.rp;\r
        while(rp!=i_inst->txbuf.wp){\r
-NyLPC_cIPv4Payload_initialize(&ppl);\r
-NyLPC_cIPv4Payload_attachTxBuf(&ppl,q[rp].data.header);ppl.payload.rawbuf=(q[rp].data.header+1);\r
-               NyLPC_cIPv4Payload_updateAckNo(&ppl,i_ackno);\r
+               updateAckNo(q[rp].packet,i_ackno);\r
                rp=(rp+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ;\r
        }\r
 }\r
@@ -290,7 +383,7 @@ static int updateTxQByIndex(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt32 i_sq,void*
        DEBUG_RTO_LOG(i_inst);\r
 \r
        while(rp!=i_inst->txbuf.wp){\r
-               o_dlist[n]=q[rp].data.header;\r
+               o_dlist[n]=q[rp].packet;\r
                if(q[rp].ackno==i_sq){\r
                        //i_inst->txbuf.rp->rpのパケットのRTOからbaseRTOの値を再計算。\r
                        estimateRTO(i_inst,i_inst->txbuf.rp,n+1);\r
@@ -359,7 +452,7 @@ NyLPC_TBool NyLPC_cTcpSocket_initialize(NyLPC_TcTcpSocket_t* i_inst,void* i_rbuf
        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
-               NyLPC_cIPv4Payload_initialize(&(i_inst->txbuf.txq[i].data));\r
+               i_inst->txbuf.txq[i].packet=NULL;\r
        }\r
        //管理リストへ登録。\r
        return NyLPC_cIPv4_addSocket(&(srv->_tcpv4),&(i_inst->_super));\r
@@ -380,7 +473,7 @@ void NyLPC_cTcpSocket_finalize(NyLPC_TcTcpSocket_t* i_inst)
                resetTxQWithUnlock(i_inst);\r
        }\r
        for(i=0;i<NyLPC_TcTcpSocket_NUMBER_OF_TXQ;i++){\r
-               NyLPC_cIPv4Payload_finalize(&(i_inst->txbuf.txq[i].data));\r
+               i_inst->txbuf.txq[i].packet=NULL;\r
        }\r
        NyLPC_cFifoBuffer_finalize(&(i_inst->rxbuf));\r
 //     NyLPC_cMutex_finalize(&(i_inst->_smutex));\r
@@ -480,14 +573,12 @@ static NyLPC_TBool waitForTxRemove(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt32 i_s
  */\r
 static NyLPC_TInt32 sendWithRetransmit(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt8 i_tcpf,const void* i_buf,NyLPC_TUInt16 i_len,NyLPC_TcStopwatch_t* i_timer,NyLPC_TUInt32* o_ack)\r
 {\r
-       NyLPC_TcIPv4Payload_t ppl;\r
        struct NyLPC_TcTcpSocket_TxQItem* txq;\r
        NyLPC_TUInt16 s;\r
        void* buf;\r
        NyLPC_TUInt32 next_ack;\r
-NyLPC_cIPv4Payload_initialize(&ppl);\r
        //送信バッファを取得\r
-       //@bug ã\83\90ã\83\83ã\83\95ã\82¡ã\81\8cå\8f\96ã\82\8cã\82\8bã\81¾ã\81§é\80\9aä¿¡ã\81\8cã\83\96ã\83­ã\83\83ã\82¯ã\81\99ã\82\8bã\81®ã\80\82ã\81\93ã\81\93ã\81¯ã\81ªã\82\93ã\81¨ã\81\8bã\81\97ã\81ªã\81\84ã\81¨\r
+       //@bug ã\82ªã\83\96ã\82·ã\83§ã\83³ã\83\91ã\82±ã\83\83ã\83\88é\80\81ä¿¡æ\99\82ã\81«4ã\83\90ã\82¤ã\83\88足ã\82\8aã\81ªã\81\84ã\83¡ã\83¢ã\83ªè¦\81æ±\82ã\81\97ã\81ªã\81\84ï¼\9få\95\8fé¡\8cã\81«ã\81ªã\81£ã\81¦ã\81ªã\81\84ã\81\91ã\81©\r
        for(;;){\r
                buf=NyLPC_cUipService_allocTxBuf(i_len+(SIZE_OF_IPv4_TCPIP_HEADER),&s);\r
                if(buf!=NULL){\r
@@ -520,9 +611,6 @@ NyLPC_cIPv4Payload_initialize(&ppl);
                NyLPC_cUipService_releaseTxBuf(buf);\r
                return -1;\r
        }\r
-       //IPv4ペイロードの書き込み\r
-NyLPC_cIPv4Payload_attachTxBuf(&ppl,buf);\r
-//     NyLPC_cIPv4Payload_attachTxBuf(&(txq->data),buf);\r
 \r
        //送信バッファを基準とした送信サイズを計算\r
        s-=SIZE_OF_IPv4_TCPIP_HEADER;\r
@@ -544,9 +632,8 @@ NyLPC_cIPv4Payload_attachTxBuf(&ppl,buf);
        txq->tick_of_sent=NyLPC_cStopwatch_now();\r
 \r
        //パケットの書き込み\r
-       setPacket(i_inst,&ppl,i_tcpf,i_buf,s);\r
-txq->data.header=ppl.header;\r
-txq->data.payload.rawbuf=(ppl.header+1);\r
+       setTxPacket(i_inst,buf,i_tcpf,i_buf,s);\r
+       txq->packet=buf;\r
 \r
        //シーケンス番号の更新\r
        i_inst->uip_connr.snd_nxt32=next_ack;\r
@@ -565,25 +652,17 @@ txq->data.payload.rawbuf=(ppl.header+1);
  */\r
 static void sendRst(NyLPC_TcTcpSocket_t* i_inst)\r
 {\r
-       NyLPC_TcIPv4Payload_t ipv4;\r
-       NyLPC_TUInt16 s;\r
        void* buf;\r
 \r
        NyLPC_Assert(i_inst->tcpstateflags==UIP_CLOSED);\r
        //ペイロードライタの初期化\r
-       NyLPC_cIPv4Payload_initialize(&ipv4);\r
 \r
-       //IPヘッダ+10バイトくらい。\r
        //@bug バッファが取れるまで通信がブロックするの。ここはなんとかしないと。\r
-       do{\r
-               buf=NyLPC_cUipService_allocTxBuf((SIZE_OF_IPv4_TCPIP_HEADER)+5,&s);\r
-       }while(buf==NULL);\r
+       buf=NyLPC_cUipService_allocSysTxBuf();\r
        lockResource(i_inst);\r
-       NyLPC_cIPv4Payload_attachTxBuf(&ipv4,buf);\r
        i_inst->uip_connr.snd_nxt32++;\r
-       setPacket(i_inst,&ipv4,TCP_RST|TCP_ACK,buf,0);\r
        unlockResource(i_inst);\r
-\r
+       setTxPacket(i_inst,buf,TCP_RST|TCP_ACK,NULL,0);\r
        NyLPC_cUipService_sendIPv4Tx(buf);\r
        NyLPC_cUipService_releaseTxBuf(buf);\r
        NyLPC_cIPv4Payload_finalize(&ipv4);\r
@@ -800,21 +879,14 @@ NyLPC_TInt32 NyLPC_cTcpSocket_precv(NyLPC_TcTcpSocket_t* i_inst,const void** o_b
  */\r
 void NyLPC_cTcpSocket_pseek(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt16 i_seek)\r
 {\r
-       NyLPC_TcIPv4Payload_t ipv4payload;\r
        void* buf;\r
-       NyLPC_TUInt16 s;\r
        NyLPC_ArgAssert(i_seek<=NyLPC_cFifoBuffer_getLength(&(i_inst->rxbuf)));\r
        if(i_seek==0){\r
                return;\r
        }\r
-       //ペイロードライタの初期化\r
-       NyLPC_cIPv4Payload_initialize(&ipv4payload);\r
 \r
        //ACK送信バッファの取得\r
-       //@bug バッファが取れるまで通信がブロックするの。ここはなんとかしないと。\r
-       do{\r
-               buf=NyLPC_cUipService_allocTxBuf((SIZE_OF_IPv4_TCPIP_HEADER)+5,&s);\r
-       }while(buf==NULL);\r
+       buf=NyLPC_cUipService_allocSysTxBuf();\r
 \r
        //MUTEX LOCK\r
        lockResource(i_inst);\r
@@ -822,14 +894,12 @@ void NyLPC_cTcpSocket_pseek(NyLPC_TcTcpSocket_t* i_inst,NyLPC_TUInt16 i_seek)
        //受信バッファを読み出しシーク\r
        NyLPC_cFifoBuffer_pop(&(i_inst->rxbuf),i_seek);\r
        //ACKパケットの生成\r
-       NyLPC_cIPv4Payload_attachTxBuf(&ipv4payload,buf);\r
-       setPacket(i_inst,&ipv4payload,TCP_ACK,buf,0);\r
+       setTxPacket(i_inst,buf,TCP_ACK,NULL,0);\r
        unlockResource(i_inst);\r
        //ACK送信\r
        NyLPC_cUipService_sendIPv4Tx(buf);\r
        NyLPC_cUipService_releaseTxBuf(buf);\r
-       //ペイロードライタの破棄\r
-       NyLPC_cIPv4Payload_finalize(&ipv4payload);\r
+\r
 }\r
 \r
 /**\r
@@ -913,7 +983,6 @@ void NyLPC_cTcpSocket_releaseSendBuf(NyLPC_TcTcpSocket_t* i_inst,void* i_buf_ptr
  */\r
 NyLPC_TBool NyLPC_cTcpSocket_psend(NyLPC_TcTcpSocket_t* i_inst,void* i_buf_ptr,int i_len,NyLPC_TUInt32 i_wait_in_msec)\r
 {\r
-NyLPC_TcIPv4Payload_t ppl;\r
        struct NyLPC_TcTcpSocket_TxQItem* txq;\r
        void* buf;\r
        NyLPC_TcStopwatch_t sw;\r
@@ -945,18 +1014,15 @@ NyLPC_TcIPv4Payload_t ppl;
        //ここから先はi_bufの所有権はインスタンスになってる。\r
 \r
        //IPv4ペイロードの書き込み\r
-NyLPC_cIPv4Payload_initialize(&ppl);\r
-       NyLPC_cIPv4Payload_attachTxBuf(&ppl,buf);\r
+\r
        //allocをした時点でwin,mssは考慮されているので、そのままそうしんしる。\r
+\r
        //ACK番号の計算\r
        txq->rto32=i_inst->uip_connr.current_rto32;\r
        txq->tick_of_sent=NyLPC_cStopwatch_now();\r
-       //パケットヘッダの生成\r
-       NyLPC_cIPv4Payload_initTcpTx(&ppl,0x05,((UIP_TCPH_LEN) / 4),i_len);\r
-       NyLPC_cIPv4Payload_setTcpTxHeaderByConnection(&ppl,&(i_inst->uip_connr),TCP_ACK|TCP_PSH);\r
-       NyLPC_cIPv4Payload_setTcpWnd(&ppl,NyLPC_cFifoBuffer_getSpace(&(i_inst->rxbuf)));\r
-       NyLPC_cIPv4Payload_closeTcpTxPacket(&ppl);\r
-txq->data.header=ppl.header;\r
+       //パケットヘッダの生成(ヘッダ長はpreadで定義した値(4+6)*4=40です。)\r
+       setTxPacketHeader(i_inst,buf,TCP_ACK|TCP_PSH,i_len);\r
+       txq->packet=buf;\r
 \r
        //シーケンス番号の更新\r
        i_inst->uip_connr.snd_nxt32=i_inst->uip_connr.snd_nxt32+i_len;\r
@@ -1148,7 +1214,7 @@ void NyLPC_cTcpSocket_periodic(
                                //規定時間内なら、再送処理\r
                                for(i=rp;i!=i_inst->txbuf.wp;i=(i+1)%NyLPC_TcTcpSocket_NUMBER_OF_TXQ){\r
 //                                     NyLPC_cUipService_sendIPv4Tx(NyLPC_cIPv4Payload_getBuf(&(q[i].data)));\r
-                                       NyLPC_cUipService_sendIPv4Tx(q[i].data.header);\r
+                                       NyLPC_cUipService_sendIPv4Tx(q[i].packet);\r
                                }\r
                                unlockResource(i_inst);\r
                        }\r
@@ -1358,7 +1424,8 @@ void* NyLPC_cTcpSocket_parseRx(
                ((!is_new_packet) && (data_size>0)))\r
        {\r
                //ソケットからPureACKを生成 as setPacket(i_inst,i_ipp,TCP_ACK,NULL,0);\r
-               ret=allocPureACK(i_inst);\r
+               ret=NyLPC_cUipService_allocSysTxBuf();\r
+               setTxPacket(i_inst,ret,TCP_ACK,NULL,0);\r
        }else{\r
                ret=NULL;\r
        }\r
index 6dc06af..2f08609 100644 (file)
@@ -75,7 +75,7 @@ struct NyLPC_TcTcpSocket_TxQItem
        NyLPC_TUInt32 tick_of_sent;\r
        //このパケットのRTO(秒間隔)\r
        NyLPC_TUInt32 rto32;\r
-       NyLPC_TcIPv4Payload_t data;\r
+       void* packet;\r
        //パケットのACK番号。この番号を受信できれば、再送パケットは消去可能である。\r
        NyLPC_TUInt32 ackno;\r
 };\r
index 85ff27a..ed36601 100644 (file)
@@ -256,7 +256,7 @@ NyLPC_TUInt16 NyLPC_TIPv4Header_makeTcpChecksum(
 /**\r
  * IPヘッダの長さを返す。\r
  */\r
-#define NyLPC_TIPv4Header_getHeaderLength(i_iph) ((i_iph->vhl & 0x0f)*4)\r
+#define NyLPC_TIPv4Header_getHeaderLength(i_iph) (((i_iph)->vhl & 0x0f)*4)\r
 /**\r
  * IPパケット全体の長さを返す。
  */\r