aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp
AgeCommit message (Expand)AuthorFilesLines
2019-11-16tcp: close session on retransmit failureFlorin Coras1-0/+1
2019-11-11tcp: improve lost rxt heuristicFlorin Coras3-34/+55
2019-11-10tcp: avoid retransmits post resetFlorin Coras2-0/+6
2019-11-08tcp: fix ip check in lookup validationFlorin Coras1-11/+17
2019-11-07tcp: fix retransmit with no sacksFlorin Coras3-10/+18
2019-11-06tcp: validate the IP address while checking TCP connectionSrikanth Akula1-9/+31
2019-11-06tcp: IPv6 flow label supportTarun Gupta2-6/+11
2019-11-05session tcp: refactor pacer timeFlorin Coras3-18/+6
2019-11-05tcp: correct validity check return valueRyujiro Shibuya1-0/+1
2019-10-31tcp: track lost rxt segments in byte trackerFlorin Coras2-0/+5
2019-10-30tcp: rx fifo size is u32Dave Wallace1-2/+18
2019-10-29tcp: correct tcp connection lookup conditionRyujiro Shibuya1-7/+10
2019-10-23tcp: improve rate samples for retansmitted segmentsFlorin Coras3-77/+184
2019-10-23tcp: fix sack retransmit beyond snd_nxtFlorin Coras2-2/+13
2019-10-17session tcp: infra for transports to send buffersFlorin Coras2-60/+7
2019-10-17tcp: avoid sending acks when data availableFlorin Coras3-5/+24
2019-10-17tcp: Init cwnd from ssthresh.Sergey Ivanushkin2-2/+38
2019-10-17tcp: fix mss flag in option parsingFlorin Coras1-1/+1
2019-10-16tcp: avoid head retransmit if scoreboard has no holesFlorin Coras2-3/+2
2019-10-11tcp: refactor flags into cfg and conn flagsFlorin Coras4-31/+89
2019-10-10tcp: improve pacing after idle send periodsFlorin Coras3-70/+105
2019-10-10tcp: retry lost retransmitsFlorin Coras4-148/+179
2019-10-10tcp: custom checksum calculations for Ipv4/Ipv6Srikanth A2-22/+97
2019-10-10tcp: fix tso not work in single buffer issueSimon Zhang2-6/+9
2019-10-08tcp: rate sample for persist segmentsFlorin Coras1-0/+6
2019-10-01session: fix use-after-freeBenoƮt Ganne1-1/+1
2019-09-25tcp: use sacks for timer based recoveryFlorin Coras7-277/+311
2019-09-25session: fix cleanup in closing statesFlorin Coras1-0/+2
2019-09-23tcp: fix unformat cwnd multiplierFlorin Coras1-16/+18
2019-09-20tcp: refactor congestion event handlingFlorin Coras1-40/+36
2019-09-18tcp: compute snd time for rate sampleFlorin Coras2-6/+11
2019-09-16tcp: use rate sample rtt in recovery if possibleFlorin Coras1-6/+14
2019-09-12tcp: cleanup scoreboard after recoveryFlorin Coras1-0/+7
2019-09-11tcp: handle sack renegingFlorin Coras3-92/+126
2019-09-10tcp: enable gso in tcp hoststackSimon Zhang4-0/+83
2019-09-10tcp: validate connections in outputFlorin Coras1-9/+46
2019-09-04session: improve cliFlorin Coras1-0/+2
2019-09-04tcp: cc algos handle cwnd on congestion signalFlorin Coras3-12/+11
2019-09-03tcp: send rwnd update only if wnd is large enoughFlorin Coras3-7/+15
2019-09-02ipsec ip tcp l2: multiarch nodes cannot be declared as staticDamjan Marion1-2/+2
2019-08-31tcp: fix rx min/max fifo size parsingFlorin Coras1-13/+14
2019-08-30tcp: force zero window on full rx fifoFlorin Coras1-1/+4
2019-08-30tcp: improve mss computationFlorin Coras3-43/+48
2019-08-30tcp: track zero rwnd errorsFlorin Coras2-1/+9
2019-08-23tcp: fix byte tracker samples flushFlorin Coras1-0/+1
2019-08-21tcp: add option for always on event loggingFlorin Coras6-184/+369
2019-08-21tcp: default to debug disabledFlorin Coras1-1/+1
2019-08-20tcp: forward conn resets through tcp-outputFlorin Coras1-32/+20
2019-08-19session: add explicit reset apiFlorin Coras1-0/+13
2019-08-19tcp: set cc_algo on connection allocFlorin Coras3-6/+19
r0 = ip4_get_fragment_offset (ip[0]) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0; error1 = ip4_get_fragment_offset (ip[1]) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error1; error2 = ip4_get_fragment_offset (ip[2]) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error2; error3 = ip4_get_fragment_offset (ip[3]) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error3; /* Verify lengths. */ ip_len0 = clib_net_to_host_u16 (ip[0]->length); ip_len1 = clib_net_to_host_u16 (ip[1]->length); ip_len2 = clib_net_to_host_u16 (ip[2]->length); ip_len3 = clib_net_to_host_u16 (ip[3]->length); /* IP length must be at least minimal IP header. */ error0 = ip_len0 < sizeof (ip[0][0]) ? IP4_ERROR_TOO_SHORT : error0; error1 = ip_len1 < sizeof (ip[1][0]) ? IP4_ERROR_TOO_SHORT : error1; error2 = ip_len2 < sizeof (ip[2][0]) ? IP4_ERROR_TOO_SHORT : error2; error3 = ip_len3 < sizeof (ip[3][0]) ? IP4_ERROR_TOO_SHORT : error3; cur_len0 = vlib_buffer_length_in_chain (vm, p[0]); cur_len1 = vlib_buffer_length_in_chain (vm, p[1]); cur_len2 = vlib_buffer_length_in_chain (vm, p[2]); cur_len3 = vlib_buffer_length_in_chain (vm, p[3]); len_diff0 = cur_len0 - ip_len0; len_diff1 = cur_len1 - ip_len1; len_diff2 = cur_len2 - ip_len2; len_diff3 = cur_len3 - ip_len3; error0 = len_diff0 < 0 ? IP4_ERROR_BAD_LENGTH : error0; error1 = len_diff1 < 0 ? IP4_ERROR_BAD_LENGTH : error1; error2 = len_diff2 < 0 ? IP4_ERROR_BAD_LENGTH : error2; error3 = len_diff3 < 0 ? IP4_ERROR_BAD_LENGTH : error3; if (PREDICT_FALSE (error0 != IP4_ERROR_NONE)) { if (error0 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p[0], ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); next[0] = IP4_INPUT_NEXT_ICMP_ERROR; } else next[0] = error0 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p[0]->error = error_node->errors[error0]; } if (PREDICT_FALSE (error1 != IP4_ERROR_NONE)) { if (error1 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p[1], ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); next[1] = IP4_INPUT_NEXT_ICMP_ERROR; } else next[1] = error1 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p[1]->error = error_node->errors[error1]; } if (PREDICT_FALSE (error2 != IP4_ERROR_NONE)) { if (error2 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p[2], ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); next[2] = IP4_INPUT_NEXT_ICMP_ERROR; } else next[2] = error2 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p[2]->error = error_node->errors[error2]; } if (PREDICT_FALSE (error3 != IP4_ERROR_NONE)) { if (error3 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p[3], ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); next[3] = IP4_INPUT_NEXT_ICMP_ERROR; } else next[3] = error3 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p[3]->error = error_node->errors[error3]; } } always_inline void ip4_input_check_x2 (vlib_main_t * vm, vlib_node_runtime_t * error_node, vlib_buffer_t * p0, vlib_buffer_t * p1, ip4_header_t * ip0, ip4_header_t * ip1, u32 * next0, u32 * next1, int verify_checksum) { u8 error0, error1; u32 ip_len0, cur_len0; u32 ip_len1, cur_len1; i32 len_diff0, len_diff1; error0 = error1 = IP4_ERROR_NONE; check_ver_opt_csum (ip0, &error0, verify_checksum); check_ver_opt_csum (ip1, &error1, verify_checksum); if (PREDICT_FALSE (ip0->ttl < 1)) error0 = IP4_ERROR_TIME_EXPIRED; if (PREDICT_FALSE (ip1->ttl < 1)) error1 = IP4_ERROR_TIME_EXPIRED; /* Drop fragmentation offset 1 packets. */ error0 = ip4_get_fragment_offset (ip0) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0; error1 = ip4_get_fragment_offset (ip1) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error1; /* Verify lengths. */ ip_len0 = clib_net_to_host_u16 (ip0->length); ip_len1 = clib_net_to_host_u16 (ip1->length); /* IP length must be at least minimal IP header. */ error0 = ip_len0 < sizeof (ip0[0]) ? IP4_ERROR_TOO_SHORT : error0; error1 = ip_len1 < sizeof (ip1[0]) ? IP4_ERROR_TOO_SHORT : error1; cur_len0 = vlib_buffer_length_in_chain (vm, p0); cur_len1 = vlib_buffer_length_in_chain (vm, p1); len_diff0 = cur_len0 - ip_len0; len_diff1 = cur_len1 - ip_len1; error0 = len_diff0 < 0 ? IP4_ERROR_BAD_LENGTH : error0; error1 = len_diff1 < 0 ? IP4_ERROR_BAD_LENGTH : error1; if (PREDICT_FALSE (error0 != IP4_ERROR_NONE)) { if (error0 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p0, ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); *next0 = IP4_INPUT_NEXT_ICMP_ERROR; } else *next0 = error0 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p0->error = error_node->errors[error0]; } if (PREDICT_FALSE (error1 != IP4_ERROR_NONE)) { if (error1 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p1, ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); *next1 = IP4_INPUT_NEXT_ICMP_ERROR; } else *next1 = error1 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p1->error = error_node->errors[error1]; } } always_inline void ip4_input_check_x1 (vlib_main_t * vm, vlib_node_runtime_t * error_node, vlib_buffer_t * p0, ip4_header_t * ip0, u32 * next0, int verify_checksum) { u32 ip_len0, cur_len0; i32 len_diff0; u8 error0; error0 = IP4_ERROR_NONE; check_ver_opt_csum (ip0, &error0, verify_checksum); if (PREDICT_FALSE (ip0->ttl < 1)) error0 = IP4_ERROR_TIME_EXPIRED; /* Drop fragmentation offset 1 packets. */ error0 = ip4_get_fragment_offset (ip0) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0; /* Verify lengths. */ ip_len0 = clib_net_to_host_u16 (ip0->length); /* IP length must be at least minimal IP header. */ error0 = ip_len0 < sizeof (ip0[0]) ? IP4_ERROR_TOO_SHORT : error0; cur_len0 = vlib_buffer_length_in_chain (vm, p0); len_diff0 = cur_len0 - ip_len0; error0 = len_diff0 < 0 ? IP4_ERROR_BAD_LENGTH : error0; if (PREDICT_FALSE (error0 != IP4_ERROR_NONE)) { if (error0 == IP4_ERROR_TIME_EXPIRED) { icmp4_error_set_vnet_buffer (p0, ICMP4_time_exceeded, ICMP4_time_exceeded_ttl_exceeded_in_transit, 0); *next0 = IP4_INPUT_NEXT_ICMP_ERROR; } else *next0 = error0 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS; p0->error = error_node->errors[error0]; } } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */ #endif