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
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
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
}\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
*/\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
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
\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
*/\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
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
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
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
*/\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
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
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
*/\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
*/\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
//受信バッファを読み出しシーク\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
*/\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
//ここから先は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
//規定時間内なら、再送処理\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
((!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