diff --git a/entry/src/kni_entry.cpp b/entry/src/kni_entry.cpp index ead666a..be41d72 100644 --- a/entry/src/kni_entry.cpp +++ b/entry/src/kni_entry.cpp @@ -160,6 +160,7 @@ struct traceid2pme_search_cb_args{ struct keepalive_replay_htable_value{ int has_replayed; uint32_t first_data_len; + uint16_t window; }; struct keepalive_replay_search_cb_args{ @@ -553,12 +554,15 @@ static unsigned char* kni_cmsg_serialize_header_new(struct pme_info *pmeinfo, st //server mss 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; - //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; - //server wscale - ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_TCP_RESTORE_WSACLE_SERVER, (const unsigned char*)&(pmeinfo->server_tcpopt->wscale), 1, pmeinfo->stream_traceid); - if(ret < 0) goto error_out; + //both = 1, send to tfe + if(pmeinfo->client_tcpopt->wscale && pmeinfo->server_tcpopt->wscale){ + //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; + //server wscale + ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_TCP_RESTORE_WSACLE_SERVER, (const unsigned char*)&(pmeinfo->server_tcpopt->wscale), 1, pmeinfo->stream_traceid); + if(ret < 0) goto error_out; + } //client sack ret = wrapped_kni_cmsg_set(cmsg, TFE_CMSG_TCP_RESTORE_SACK_CLIENT, (const unsigned char*)&(pmeinfo->client_tcpopt->sack), 1, pmeinfo->stream_traceid); if(ret < 0) goto error_out; @@ -759,6 +763,7 @@ int keepalive_replay_htable_add(const struct streaminfo *stream, struct pme_info int key_size =0, ret; struct keepalive_replay_htable_value *c2s_value = ALLOC(struct keepalive_replay_htable_value, 1); //c2s_value->first_data_len = pktinfo->data_len; + c2s_value->window = pmeinfo->server_window; struct stream_tuple4_v4 *c2s_key_v4 = NULL; struct stream_tuple4_v6 *c2s_key_v6 = NULL; if(pmeinfo->addr_type == ADDR_TYPE_IPV6){ @@ -790,6 +795,7 @@ int keepalive_replay_htable_add(const struct streaminfo *stream, struct pme_info //s2c struct keepalive_replay_htable_value *s2c_value = ALLOC(struct keepalive_replay_htable_value, 1); s2c_value->first_data_len = pktinfo->data_len; + s2c_value->window = pmeinfo->client_window; if(pmeinfo->addr_type == ADDR_TYPE_IPV6){ struct stream_tuple4_v6 s2c_key_v6; key_size = sizeof(s2c_key_v6); @@ -1237,6 +1243,7 @@ static long keepalive_replay_search_cb(void *data, const uchar *key, uint size, replay_pktinfo.tcphdr->dest = raw_pktinfo.tcphdr->source; replay_pktinfo.tcphdr->seq = htonl(ntohl(raw_pktinfo.tcphdr->ack_seq) + value->first_data_len); replay_pktinfo.tcphdr->ack_seq = htonl(ntohl(raw_pktinfo.tcphdr->seq) + 1); + replay_pktinfo.tcphdr->window = htons(value->window); replay_pktinfo.tcphdr->check = 0; replay_pktinfo.tcphdr->check = kni_tcp_checksum_v6((void*)replay_pktinfo.tcphdr, tot_len - replay_pktinfo.iphdr_len, replay_pktinfo.iphdr.v6->ip6_src, replay_pktinfo.iphdr.v6->ip6_dst); @@ -1258,6 +1265,7 @@ static long keepalive_replay_search_cb(void *data, const uchar *key, uint size, replay_packet_tcphdr->dest = raw_packet_tcphdr->source; replay_packet_tcphdr->seq = htonl(ntohl(raw_packet_tcphdr->ack_seq) + value->first_data_len); //seq = ack + first_data_len replay_packet_tcphdr->ack_seq = htonl(ntohl(raw_packet_tcphdr->seq) + 1); //ack = seq + 1 + replay_packet_tcphdr->window = htons(value->window); replay_packet_iphdr->check = 0; replay_packet_iphdr->check = kni_ip_checksum((void*)replay_packet_iphdr, iphdr_len); replay_packet_tcphdr->check = 0;