Merge branch 'bugfix-downstream-timeout-on-winscale-1' into 'master'
正确处理只有一方发送wscale option的情况,删除注释掉的代码。 See merge request tango/kni!4
This commit is contained in:
102
kni_comm.c
102
kni_comm.c
@@ -349,10 +349,10 @@ int kni_get_tcpinfo(struct kni_wndpro_reply_info* lastpkt_info,struct kni_tcp_hd
|
|||||||
|
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,
|
void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,
|
||||||
unsigned short* mss,unsigned char* winscale,unsigned char* scak,unsigned char* timestamps)
|
unsigned short* mss, unsigned char* wscale_perm, unsigned char* wscale, unsigned char* sack, unsigned char* timestamps)
|
||||||
{
|
{
|
||||||
*mss=KNI_DEFAULT_MSS;
|
*mss=KNI_DEFAULT_MSS;
|
||||||
*winscale=KNI_DEFAULT_WINSCLE;
|
*wscale=KNI_DEFAULT_WINSCLE;
|
||||||
|
|
||||||
const unsigned char *ptr = ((const unsigned char*)tcphdr+TCPHDR_DEFAULT_LEN);
|
const unsigned char *ptr = ((const unsigned char*)tcphdr+TCPHDR_DEFAULT_LEN);
|
||||||
int length = tcp_hdr_len - TCPHDR_DEFAULT_LEN;
|
int length = tcp_hdr_len - TCPHDR_DEFAULT_LEN;
|
||||||
@@ -388,7 +388,15 @@ void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,
|
|||||||
if (opsize == TCPOLEN_WINDOW)
|
if (opsize == TCPOLEN_WINDOW)
|
||||||
{
|
{
|
||||||
uint8_t snd_wscale = *(uint8_t *)ptr;
|
uint8_t snd_wscale = *(uint8_t *)ptr;
|
||||||
*winscale = snd_wscale;
|
// rfc7323 page9: Thus, the shift count MUST be limited to 14 (which allows windows of 2^30 = 1 GiB).
|
||||||
|
// If a Window Scale option is received with a shift.cnt value larger than 14,
|
||||||
|
// the TCP SHOULD log the error but MUST use 14 instead of the specified value. */
|
||||||
|
*wscale = snd_wscale;
|
||||||
|
if(*wscale>14)
|
||||||
|
{
|
||||||
|
*wscale=14;
|
||||||
|
}
|
||||||
|
*wscale_perm=1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TCPOPT_TIMESTAMP:
|
case TCPOPT_TIMESTAMP:
|
||||||
@@ -400,7 +408,7 @@ void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,
|
|||||||
case TCPOPT_SACK_PERMITTED:
|
case TCPOPT_SACK_PERMITTED:
|
||||||
if (opsize == TCPOLEN_SACK_PERMITTED)
|
if (opsize == TCPOLEN_SACK_PERMITTED)
|
||||||
{
|
{
|
||||||
*scak = 1;
|
*sack = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -412,92 +420,6 @@ void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
int kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,unsigned short* mss,unsigned char* winscale,unsigned char* scak,unsigned char* timestamps)
|
|
||||||
{
|
|
||||||
|
|
||||||
*mss=KNI_DEFAULT_MSS;
|
|
||||||
*winscale=KNI_DEFAULT_WINSCLE;
|
|
||||||
|
|
||||||
|
|
||||||
int remain_len=tcp_hdr_len;
|
|
||||||
struct kni_tcp_opt_format* tcp_opt=NULL;
|
|
||||||
|
|
||||||
if((tcp_hdr_len<=20)||(tcp_hdr_len>64))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcphdr+TCPHDR_DEFAULT_LEN);
|
|
||||||
remain_len-=TCPHDR_DEFAULT_LEN;
|
|
||||||
|
|
||||||
while(remain_len)
|
|
||||||
{
|
|
||||||
unsigned int tcp_opt_len;
|
|
||||||
if(tcp_opt->type == 0 || tcp_opt->type == 1)
|
|
||||||
{
|
|
||||||
tcp_opt_len = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tcp_opt_len = tcp_opt->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tcp_opt_len > remain_len)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tcp_opt->type==KNI_TCPOPT_MSS) //MSS
|
|
||||||
{
|
|
||||||
remain_len-=tcp_opt->len;
|
|
||||||
*mss=htons(*(unsigned short*)(tcp_opt->content));
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcp_opt+tcp_opt->len);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if(tcp_opt->type==KNI_TCPOPT_WINSCALE) //winscale
|
|
||||||
{
|
|
||||||
remain_len-=tcp_opt->len;
|
|
||||||
*winscale=*(unsigned char*)(tcp_opt->content);
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcp_opt+tcp_opt->len);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if(tcp_opt->type==KNI_TCPOPT_SACKOK) //scak
|
|
||||||
{
|
|
||||||
remain_len-=tcp_opt->len;
|
|
||||||
*scak=1;
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcp_opt+tcp_opt->len);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if(tcp_opt->type==KNI_TCPOPT_TIMESTAMP) //timestamp
|
|
||||||
{
|
|
||||||
remain_len-=tcp_opt->len;
|
|
||||||
*timestamps=1;
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcp_opt+tcp_opt->len);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if((tcp_opt->type==0)||(tcp_opt->type==1))
|
|
||||||
{
|
|
||||||
remain_len-=1;
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcp_opt+1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
remain_len-=tcp_opt->len;
|
|
||||||
tcp_opt=(struct kni_tcp_opt_format*)((char*)tcp_opt+tcp_opt->len);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
char* kni_get_payload(const struct streaminfo* pstream,int* datalen)
|
char* kni_get_payload(const struct streaminfo* pstream,int* datalen)
|
||||||
{
|
{
|
||||||
char* data=NULL;
|
char* data=NULL;
|
||||||
|
|||||||
@@ -88,7 +88,8 @@ int kni_get_ipaddr_v4(void* a_packet,struct stream_tuple4_v4* ipaddr);
|
|||||||
int kni_get_ipaddr_v6(void* a_packet,struct stream_tuple4_v6* ipaddr);
|
int kni_get_ipaddr_v6(void* a_packet,struct stream_tuple4_v6* ipaddr);
|
||||||
|
|
||||||
int kni_get_tcpinfo(struct kni_wndpro_reply_info* lastpkt_info,struct kni_tcp_hdr* tcphdr,int tcplen);
|
int kni_get_tcpinfo(struct kni_wndpro_reply_info* lastpkt_info,struct kni_tcp_hdr* tcphdr,int tcplen);
|
||||||
void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,unsigned short* mss,unsigned char* winscale,unsigned char* scak,unsigned char* timestamps);
|
void kni_get_tcpopt(struct kni_tcp_hdr* tcphdr,int tcp_hdr_len,
|
||||||
|
unsigned short* mss, unsigned char* wscale_perm, unsigned char* wscale, unsigned char* sack, unsigned char* timestamps);
|
||||||
char* kni_get_payload(const struct streaminfo* pstream,int* datalen);
|
char* kni_get_payload(const struct streaminfo* pstream,int* datalen);
|
||||||
|
|
||||||
int kni_filestate2_set(int thread_seq,enum kni_FS_COLUME colum_index,int bytes,int pktnum);
|
int kni_filestate2_set(int thread_seq,enum kni_FS_COLUME colum_index,int bytes,int pktnum);
|
||||||
|
|||||||
11
kni_entry.c
11
kni_entry.c
@@ -789,7 +789,10 @@ char kni_pending_opstate(const struct streaminfo* pstream,struct kni_pme_info* p
|
|||||||
|
|
||||||
if(protocol == PROTO_TYPE_TCP)
|
if(protocol == PROTO_TYPE_TCP)
|
||||||
{
|
{
|
||||||
kni_get_tcpopt(tcphdr,tcphdr_len,&(pmeinfo->tcpopt_info[pstream->curdir-1].mss),&(pmeinfo->tcpopt_info[pstream->curdir-1].wnscal),&(pmeinfo->tcpopt_info[pstream->curdir-1].sack),&(pmeinfo->tcpopt_info[pstream->curdir-1].timestamps));
|
kni_get_tcpopt(tcphdr, tcphdr_len,
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].mss),
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].wscale_perm), &(pmeinfo->tcpopt_info[pstream->curdir-1].wscale),
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].sack_perm), &(pmeinfo->tcpopt_info[pstream->curdir-1].timestamps));
|
||||||
kni_get_tcpinfo(&(pmeinfo->lastpkt_info[pstream->curdir-1]),tcphdr,datalen);
|
kni_get_tcpinfo(&(pmeinfo->lastpkt_info[pstream->curdir-1]),tcphdr,datalen);
|
||||||
|
|
||||||
if(datalen>0)//TODO:get link create mode from sapp
|
if(datalen>0)//TODO:get link create mode from sapp
|
||||||
@@ -886,7 +889,11 @@ char kni_data_opstate(const struct streaminfo* pstream,struct kni_pme_info* pmei
|
|||||||
{
|
{
|
||||||
if((tcphdr->th_flags&TH_SYN)&&(tcphdr->th_flags&TH_ACK))
|
if((tcphdr->th_flags&TH_SYN)&&(tcphdr->th_flags&TH_ACK))
|
||||||
{
|
{
|
||||||
kni_get_tcpopt(tcphdr,tcphdr_len,&(pmeinfo->tcpopt_info[pstream->curdir-1].mss),&(pmeinfo->tcpopt_info[pstream->curdir-1].wnscal),&(pmeinfo->tcpopt_info[pstream->curdir-1].sack),&(pmeinfo->tcpopt_info[pstream->curdir-1].timestamps));
|
kni_get_tcpopt(tcphdr, tcphdr_len,
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].mss),
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].wscale_perm), &(pmeinfo->tcpopt_info[pstream->curdir-1].wscale),
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].sack_perm),
|
||||||
|
&(pmeinfo->tcpopt_info[pstream->curdir-1].timestamps));
|
||||||
}
|
}
|
||||||
|
|
||||||
kni_get_tcpinfo(&(pmeinfo->lastpkt_info[pstream->curdir-1]),tcphdr,datalen);
|
kni_get_tcpinfo(&(pmeinfo->lastpkt_info[pstream->curdir-1]),tcphdr,datalen);
|
||||||
|
|||||||
@@ -337,9 +337,10 @@ struct kni_wndpro_reply_info
|
|||||||
|
|
||||||
struct kni_tcpopt_info
|
struct kni_tcpopt_info
|
||||||
{
|
{
|
||||||
unsigned short mss; //host order
|
unsigned short mss; //host order
|
||||||
unsigned char wnscal; //host order
|
unsigned char wscale_perm;
|
||||||
unsigned char sack;
|
unsigned char wscale; //host order
|
||||||
|
unsigned char sack_perm;
|
||||||
unsigned char timestamps;
|
unsigned char timestamps;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -403,6 +404,7 @@ struct kni_tcp_state
|
|||||||
unsigned short win;
|
unsigned short win;
|
||||||
unsigned short mss_src;
|
unsigned short mss_src;
|
||||||
unsigned short mss_dst;
|
unsigned short mss_dst;
|
||||||
|
unsigned char wscale_perm;
|
||||||
unsigned char wscale_src;
|
unsigned char wscale_src;
|
||||||
unsigned char wscale_dst;
|
unsigned char wscale_dst;
|
||||||
unsigned char sack_src;
|
unsigned char sack_src;
|
||||||
|
|||||||
@@ -322,8 +322,7 @@ int tun_alloc_mq(char *dev, int queues, int *fds,char* tun_path)
|
|||||||
int i=0;
|
int i=0;
|
||||||
int err=0;
|
int err=0;
|
||||||
int fd;
|
int fd;
|
||||||
int flag=0;
|
struct ifreq ifr;
|
||||||
struct ifreq ifr;
|
|
||||||
|
|
||||||
|
|
||||||
// char *clonedev = (char*)"/dev/net/tun";
|
// char *clonedev = (char*)"/dev/net/tun";
|
||||||
@@ -904,34 +903,10 @@ int tun_read_data(int fd, char* buffer, size_t size)
|
|||||||
{
|
{
|
||||||
int recv_len=0;
|
int recv_len=0;
|
||||||
|
|
||||||
int ret=0;
|
|
||||||
int max_fd = 0;
|
|
||||||
/*
|
|
||||||
if(g_kni_switch_info.write_listq_switch == 0)
|
|
||||||
{
|
|
||||||
fd_set alive_readfd;
|
|
||||||
struct timeval timeout;
|
|
||||||
memset(&timeout,0,sizeof(timeout));
|
|
||||||
|
|
||||||
|
|
||||||
FD_ZERO(&alive_readfd);
|
|
||||||
FD_SET(fd, &alive_readfd);
|
|
||||||
max_fd = fd;
|
|
||||||
|
|
||||||
// ret = select(max_fd + 1, &alive_readfd, NULL, NULL, &timeout);
|
|
||||||
ret = select(max_fd + 1, &alive_readfd, NULL, NULL, NULL);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
// MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL, "keep_alive_action function", "select function errno %d is %s!", errno, strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
recv_len = read(fd, buffer, size);
|
recv_len = read(fd, buffer, size);
|
||||||
if(recv_len <0)
|
if(recv_len <0)
|
||||||
{
|
{
|
||||||
// MESA_handle_runtime_log(g_kni_comminfo.logger, RLOG_LV_FATAL,KNI_MODULE_WRITETUN,"tun_read_data error %d, %s\n",errno,strerror(errno));
|
return -1;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1216,10 +1191,11 @@ int tcprepair_get_state(int curdir,const struct layer_addr* addr,struct kni_tcp_
|
|||||||
fake_client->ack=ntohl(tcphdr->th_ack);
|
fake_client->ack=ntohl(tcphdr->th_ack);
|
||||||
fake_client->mss_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].mss;
|
fake_client->mss_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].mss;
|
||||||
fake_client->mss_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].mss;
|
fake_client->mss_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].mss;
|
||||||
fake_client->wscale_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].wnscal;
|
fake_client->wscale_perm = pmeinfo->tcpopt_info[KNI_DIR_C2S].wscale_perm && pmeinfo->tcpopt_info[KNI_DIR_S2C].wscale_perm;
|
||||||
fake_client->wscale_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].wnscal;
|
fake_client->wscale_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].wscale;
|
||||||
fake_client->sack_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].sack;
|
fake_client->wscale_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].wscale;
|
||||||
fake_client->sack_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].sack;
|
fake_client->sack_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].sack_perm;
|
||||||
|
fake_client->sack_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].sack_perm;
|
||||||
fake_client->timestamps_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].timestamps;
|
fake_client->timestamps_src=pmeinfo->tcpopt_info[KNI_DIR_C2S].timestamps;
|
||||||
fake_client->timestamps_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].timestamps;
|
fake_client->timestamps_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].timestamps;
|
||||||
|
|
||||||
@@ -1227,10 +1203,11 @@ int tcprepair_get_state(int curdir,const struct layer_addr* addr,struct kni_tcp_
|
|||||||
fake_server->ack=ntohl(tcphdr->th_seq);
|
fake_server->ack=ntohl(tcphdr->th_seq);
|
||||||
fake_server->mss_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].mss;
|
fake_server->mss_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].mss;
|
||||||
fake_server->mss_dst=pmeinfo->tcpopt_info[KNI_DIR_C2S].mss;
|
fake_server->mss_dst=pmeinfo->tcpopt_info[KNI_DIR_C2S].mss;
|
||||||
fake_server->wscale_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].wnscal;
|
fake_server->wscale_perm=fake_client->wscale_perm;
|
||||||
fake_server->wscale_dst=pmeinfo->tcpopt_info[KNI_DIR_C2S].wnscal;
|
fake_server->wscale_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].wscale;
|
||||||
fake_server->sack_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].sack;
|
fake_server->wscale_dst=pmeinfo->tcpopt_info[KNI_DIR_C2S].wscale;
|
||||||
fake_server->sack_dst=pmeinfo->tcpopt_info[KNI_DIR_C2S].sack;
|
fake_server->sack_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].sack_perm;
|
||||||
|
fake_server->sack_dst=pmeinfo->tcpopt_info[KNI_DIR_C2S].sack_perm;
|
||||||
fake_server->timestamps_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].timestamps;
|
fake_server->timestamps_src=pmeinfo->tcpopt_info[KNI_DIR_S2C].timestamps;
|
||||||
fake_server->timestamps_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].timestamps;
|
fake_server->timestamps_dst=pmeinfo->tcpopt_info[KNI_DIR_S2C].timestamps;
|
||||||
|
|
||||||
@@ -1336,12 +1313,14 @@ int tcprepair_set_state(int sk,struct kni_tcp_state* tcp,struct sockaddr* client
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//rfc7323 page8: both sides MUST send Window Scale options in their <SYN> segments to enable window scaling in either direction.
|
||||||
|
//The value 'shift.cnt' MAY be zero (offering to scale, while applying a scale factor of 1 to the receive window).
|
||||||
opts[onr].opt_code = TCPOPT_WINDOW;
|
if(tcp->wscale_perm)
|
||||||
opts[onr].opt_val = tcp->wscale_dst+ (tcp->wscale_src<< 16);
|
{
|
||||||
onr++;
|
opts[onr].opt_code = TCPOPT_WINDOW;
|
||||||
|
opts[onr].opt_val = tcp->wscale_dst+ (tcp->wscale_src<< 16);
|
||||||
|
onr++;
|
||||||
|
}
|
||||||
|
|
||||||
opts[onr].opt_code = TCPOPT_MAXSEG;
|
opts[onr].opt_code = TCPOPT_MAXSEG;
|
||||||
opts[onr].opt_val = (tcp->mss_src<tcp->mss_dst)?tcp->mss_src:tcp->mss_dst;
|
opts[onr].opt_val = (tcp->mss_src<tcp->mss_dst)?tcp->mss_src:tcp->mss_dst;
|
||||||
|
|||||||
Reference in New Issue
Block a user