htontcp4()

htontcp4()

概要

引数

実装

 1003: Block *
 1004: htontcp4(Tcp *tcph, Block *data, Tcp4hdr *ph, Tcpctl *tcb)
 1005: {
 1006:         int dlen;
 1007:         Tcp4hdr *h;
 1008:         ushort csum;
 1009:         ushort hdrlen, optpad = 0;
 1010:         uchar *opt;
 1011: 
 1012:         hdrlen = TCP4_HDRSIZE;
 1013:         if(tcph->flags & SYN){
 1014:                 if(tcph->mss)
 1015:                         hdrlen += MSS_LENGTH;
 1016:                 if(tcph->ws)
 1017:                         hdrlen += WS_LENGTH;
 1018:                 optpad = hdrlen & 3;
 1019:                 if(optpad)
 1020:                         optpad = 4 - optpad;
 1021:                 hdrlen += optpad;
 1022:         }
  • TCPヘッダサイズを求める.
 1023: 
 1024:         if(data) {
 1025:                 dlen = blocklen(data);
 1026:                 data = padblock(data, hdrlen + TCP4_PKT);
  • データが存在する場合は,TCPヘッダサイズ+TCP4_PKT(IPヘッダサイズ+データリンクヘッダサイズ)のパディングをブロック前方に確保する.
  • 詳細はblocklen()を参照
  • 詳細はpadblock()を参照
 1027:                 if(data == nil)
 1028:                         return nil;
 1029:         }
 1030:         else {
  • データが存在しない場合は,最小限のブロックを確保する.
 1031:                 dlen = 0;
 1032:                 data = allocb(hdrlen + TCP4_PKT + 64);        /* the 64 pad is to meet mintu's */
 1033:                 if(data == nil)
 1034:                         return nil;
 1035:                 data->wp += hdrlen + TCP4_PKT;
 1036:         }
 1037: 
 1038:         /* copy in pseudo ip header plus port numbers */
 1039:         h = (Tcp4hdr *)(data->rp);
 1040:         memmove(h, ph, TCP4_TCBPHDRSZ);
  • 疑似ヘッダの内容をコピーする.
 1041: 
 1042:         /* copy in variable bits */
 1043:         hnputs(h->tcplen, hdrlen + dlen);
 1044:         hnputl(h->tcpseq, tcph->seq);
 1045:         hnputl(h->tcpack, tcph->ack);
 1046:         hnputs(h->tcpflag, (hdrlen<<10) | tcph->flags);
 1047:         hnputs(h->tcpwin, tcph->wnd>>(tcb != nil ? tcb->snd.scale : 0));
 1048:         hnputs(h->tcpurg, tcph->urg);
  • 詳細はhnputs?を参照
  • 詳細はhnputlを参照
 1049: 
 1050:         if(tcph->flags & SYN){
 1051:                 opt = h->tcpopt;
 1052:                 if(tcph->mss != 0){
 1053:                         *opt++ = MSSOPT;
 1054:                         *opt++ = MSS_LENGTH;
 1055:                         hnputs(opt, tcph->mss);
 1056:                         opt += 2;
 1057:                 }
 1058:                 if(tcph->ws != 0){
 1059:                         *opt++ = WSOPT;
 1060:                         *opt++ = WS_LENGTH;
 1061:                         *opt++ = tcph->ws;
 1062:                 }
 1063:                 while(optpad-- > 0)
 1064:                         *opt++ = NOOPOPT;
 1065:         }
 1066: 
 1067:         if(tcb != nil && tcb->nochecksum){
 1068:                 h->tcpcksum[0] = h->tcpcksum[1] = 0;
 1069:         } else {
 1070:                 csum = ptclcsum(data, TCP4_IPLEN, hdrlen+dlen+TCP4_PHDRSIZE);
 1071:                 hnputs(h->tcpcksum, csum);
 1072:         }
 1073: 
 1074:         return data;
 1075: }