From 4d01ff5aadf1f3e99a94dbcb2511295bdbfbb8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B4=94=E4=B8=80=E9=B8=A3?= Date: Tue, 2 Jul 2019 18:47:48 +0600 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9wscale=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=9A=84=E5=88=A4=E6=96=AD=E6=9D=A1=E4=BB=B6,=20=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=9B=9E=E5=A4=8D=E6=8A=A5=E6=96=87=E7=9A=84window?= =?UTF-8?q?=E5=80=BC=E6=94=B9=E6=88=90=E7=BD=91=E7=BB=9C=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/include/kni_utils.h | 1 + common/src/kni_utils.cpp | 1 + entry/src/kni_entry.cpp | 6 +++--- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/common/include/kni_utils.h b/common/include/kni_utils.h index ca4ece5..802a8cc 100644 --- a/common/include/kni_utils.h +++ b/common/include/kni_utils.h @@ -55,6 +55,7 @@ do { \ #define KNI_MTU 3000 struct kni_tcpopt_info{ uint16_t mss; + uint8_t wscale_set; uint8_t wscale; uint8_t ts; uint8_t sack; diff --git a/common/src/kni_utils.cpp b/common/src/kni_utils.cpp index b3c05db..1d6ff23 100644 --- a/common/src/kni_utils.cpp +++ b/common/src/kni_utils.cpp @@ -180,6 +180,7 @@ struct kni_tcpopt_info* kni_get_tcpopt(struct tcphdr* tcphdr,int tcphdr_len){ break; case TCPOPT_WINDOW: + tcpopt->wscale_set = 1; if (opsize == TCPOLEN_WINDOW){ uint8_t snd_wscale = *(uint8_t *)ptr; // rfc7323 page9: Thus, the shift count MUST be limited to 14 (which allows windows of 2^30 = 1 GiB). diff --git a/entry/src/kni_entry.cpp b/entry/src/kni_entry.cpp index be41d72..a6617c9 100644 --- a/entry/src/kni_entry.cpp +++ b/entry/src/kni_entry.cpp @@ -555,7 +555,7 @@ static unsigned char* kni_cmsg_serialize_header_new(struct pme_info *pmeinfo, st ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_TCP_RESTORE_MSS_SERVER, (const unsigned char*)&server_mss, 2, pmeinfo->stream_traceid); if(ret < 0) goto error_out; //both = 1, send to tfe - if(pmeinfo->client_tcpopt->wscale && pmeinfo->server_tcpopt->wscale){ + if(pmeinfo->client_tcpopt->wscale_set && pmeinfo->server_tcpopt->wscale_set){ //client wscale ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_TCP_RESTORE_WSACLE_CLIENT, (const unsigned char*)&(pmeinfo->client_tcpopt->wscale), 1, pmeinfo->stream_traceid); if(ret < 0) goto error_out; @@ -753,7 +753,7 @@ static char pending_opstate(const struct streaminfo *stream, struct pme_info *pm pmeinfo->error = STREAM_ERROR_PENDING_NO_SYN; return APP_STATE_FAWPKT | APP_STATE_DROPME; } - pmeinfo->client_window = pktinfo.tcphdr->window; + pmeinfo->client_window = ntohs(pktinfo.tcphdr->window); pmeinfo->client_tcpopt = kni_get_tcpopt(pktinfo.tcphdr, pktinfo.tcphdr_len); return APP_STATE_FAWPKT | APP_STATE_GIVEME; } @@ -928,7 +928,7 @@ static char data_opstate(const struct streaminfo *stream, struct pme_info *pmein } // syn/ack if(pktinfo.tcphdr->syn && pktinfo.tcphdr->ack){ - pmeinfo->server_window = pktinfo.tcphdr->window; + pmeinfo->server_window = ntohs(pktinfo.tcphdr->window); pmeinfo->server_tcpopt = kni_get_tcpopt(pktinfo.tcphdr, pktinfo.tcphdr_len); return APP_STATE_FAWPKT | APP_STATE_GIVEME; }