test_cubic.c revision 06b2a236
106b2a236SDmitri Tikhonov/* Copyright (c) 2017 - 2021 LiteSpeed Technologies Inc. See LICENSE. */ 20e7c6aadSDmitri Tikhonov#include <assert.h> 30e7c6aadSDmitri Tikhonov#include <stdio.h> 40e7c6aadSDmitri Tikhonov#include <stdlib.h> 50e7c6aadSDmitri Tikhonov#include <string.h> 65392f7a3SLiteSpeed Tech#include <sys/queue.h> 7461e84d8SAmol Deshpande#ifndef WIN32 80e7c6aadSDmitri Tikhonov#include <unistd.h> 9461e84d8SAmol Deshpande#else 10461e84d8SAmol Deshpande#include <getopt.h> 11461e84d8SAmol Deshpande#endif 120e7c6aadSDmitri Tikhonov 130e7c6aadSDmitri Tikhonov#include "lsquic.h" 140e7c6aadSDmitri Tikhonov#include "lsquic_int_types.h" 155392f7a3SLiteSpeed Tech#include "lsquic_cong_ctl.h" 160e7c6aadSDmitri Tikhonov#include "lsquic_cubic.h" 170e7c6aadSDmitri Tikhonov#include "lsquic_logger.h" 185392f7a3SLiteSpeed Tech#include "lsquic_hash.h" 195392f7a3SLiteSpeed Tech#include "lsquic_conn.h" 205392f7a3SLiteSpeed Tech#include "lsquic_sfcw.h" 215392f7a3SLiteSpeed Tech#include "lsquic_conn_flow.h" 225392f7a3SLiteSpeed Tech#include "lsquic_varint.h" 235392f7a3SLiteSpeed Tech#include "lsquic_hq.h" 245392f7a3SLiteSpeed Tech#include "lsquic_stream.h" 255392f7a3SLiteSpeed Tech#include "lsquic_rtt.h" 265392f7a3SLiteSpeed Tech#include "lsquic_conn_public.h" 275392f7a3SLiteSpeed Tech#include "lsquic_packet_common.h" 285392f7a3SLiteSpeed Tech#include "lsquic_packet_out.h" 295392f7a3SLiteSpeed Tech 305392f7a3SLiteSpeed Techstatic const struct cong_ctl_if *const cci = &lsquic_cong_cubic_if; 310e7c6aadSDmitri Tikhonov 320e7c6aadSDmitri Tikhonovstatic void 330e7c6aadSDmitri Tikhonovtest_post_quiescence_explosion (void) 340e7c6aadSDmitri Tikhonov{ 350e7c6aadSDmitri Tikhonov struct lsquic_cubic cubic; 360e7c6aadSDmitri Tikhonov lsquic_time_t const rtt = 10000; 370e7c6aadSDmitri Tikhonov lsquic_time_t t = 12345600; 385392f7a3SLiteSpeed Tech struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 8); 395392f7a3SLiteSpeed Tech struct lsquic_conn_public conn_pub = { .lconn = &lconn, }; 400e7c6aadSDmitri Tikhonov int i; 41fb3e20e0SDmitri Tikhonov struct lsquic_packet_out packet_out; memset(&packet_out, 0, sizeof(packet_out)); 420e7c6aadSDmitri Tikhonov 435392f7a3SLiteSpeed Tech cci->cci_init(&cubic, &conn_pub, 0); 440e7c6aadSDmitri Tikhonov cubic.cu_ssthresh = cubic.cu_cwnd = 32 * 1370; 450e7c6aadSDmitri Tikhonov 460e7c6aadSDmitri Tikhonov for (i = 0; i < 10; ++i) 475392f7a3SLiteSpeed Tech { 485392f7a3SLiteSpeed Tech packet_out.po_sent = t - rtt; 495392f7a3SLiteSpeed Tech cci->cci_ack(&cubic, &packet_out, 1370, t, 0); 505392f7a3SLiteSpeed Tech } 510e7c6aadSDmitri Tikhonov 525392f7a3SLiteSpeed Tech assert(cci->cci_get_cwnd(&cubic) == 47026); 530e7c6aadSDmitri Tikhonov 540e7c6aadSDmitri Tikhonov t += 25 * 1000 * 1000; 555392f7a3SLiteSpeed Tech cci->cci_was_quiet(&cubic, t, 0 /* bytes in flight (unused) */); 565392f7a3SLiteSpeed Tech packet_out.po_sent = t - rtt; 575392f7a3SLiteSpeed Tech cci->cci_ack(&cubic, &packet_out, 1370, t, 0); 585392f7a3SLiteSpeed Tech assert(cci->cci_get_cwnd(&cubic) == 47060); 590e7c6aadSDmitri Tikhonov 600e7c6aadSDmitri Tikhonov t += 2 * 1000 * 1000; 615392f7a3SLiteSpeed Tech packet_out.po_sent = t - rtt; 625392f7a3SLiteSpeed Tech cci->cci_ack(&cubic, &packet_out, 1370, t, 0); 630e7c6aadSDmitri Tikhonov} 640e7c6aadSDmitri Tikhonov 650e7c6aadSDmitri Tikhonov 660e7c6aadSDmitri Tikhonovstatic void 670e7c6aadSDmitri Tikhonovtest_post_quiescence_explosion2 (void) 680e7c6aadSDmitri Tikhonov{ 690e7c6aadSDmitri Tikhonov struct lsquic_cubic cubic; 700e7c6aadSDmitri Tikhonov lsquic_time_t const rtt = 10000; 710e7c6aadSDmitri Tikhonov lsquic_time_t t = 12345600; 725392f7a3SLiteSpeed Tech struct lsquic_conn lconn = LSCONN_INITIALIZER_CIDLEN(lconn, 8); 735392f7a3SLiteSpeed Tech struct lsquic_conn_public conn_pub = { .lconn = &lconn, }; 740e7c6aadSDmitri Tikhonov int i; 75fb3e20e0SDmitri Tikhonov struct lsquic_packet_out packet_out; memset(&packet_out, 0, sizeof(packet_out)); 760e7c6aadSDmitri Tikhonov 775392f7a3SLiteSpeed Tech cci->cci_init(&cubic, &conn_pub, 0); 780e7c6aadSDmitri Tikhonov cubic.cu_ssthresh = cubic.cu_cwnd = 32 * 1370; 790e7c6aadSDmitri Tikhonov 800e7c6aadSDmitri Tikhonov for (i = 0; i < 10; ++i) 815392f7a3SLiteSpeed Tech { 825392f7a3SLiteSpeed Tech packet_out.po_sent = t - rtt; 835392f7a3SLiteSpeed Tech cci->cci_ack(&cubic, &packet_out, 1370, t, 1); 845392f7a3SLiteSpeed Tech } 850e7c6aadSDmitri Tikhonov 865392f7a3SLiteSpeed Tech assert(cci->cci_get_cwnd(&cubic) == 45300); 870e7c6aadSDmitri Tikhonov 880e7c6aadSDmitri Tikhonov t += 25 * 1000 * 1000; 895392f7a3SLiteSpeed Tech cci->cci_was_quiet(&cubic, t, 0 /* bytes in flight (unused) */); 905392f7a3SLiteSpeed Tech packet_out.po_sent = t - rtt; 915392f7a3SLiteSpeed Tech cci->cci_ack(&cubic, &packet_out, 1370, t, 0); 925392f7a3SLiteSpeed Tech assert(cci->cci_get_cwnd(&cubic) == 46754); 930e7c6aadSDmitri Tikhonov 940e7c6aadSDmitri Tikhonov t += 2 * 1000 * 1000; 955392f7a3SLiteSpeed Tech packet_out.po_sent = t - rtt; 965392f7a3SLiteSpeed Tech cci->cci_ack(&cubic, &packet_out, 1370, t, 1); 970e7c6aadSDmitri Tikhonov} 980e7c6aadSDmitri Tikhonov 990e7c6aadSDmitri Tikhonov 1000e7c6aadSDmitri Tikhonov 1010e7c6aadSDmitri Tikhonovint 1020e7c6aadSDmitri Tikhonovmain (int argc, char **argv) 1030e7c6aadSDmitri Tikhonov{ 1040e7c6aadSDmitri Tikhonov int opt; 1050e7c6aadSDmitri Tikhonov 1060e7c6aadSDmitri Tikhonov lsquic_log_to_fstream(stderr, LLTS_NONE); 1070e7c6aadSDmitri Tikhonov 1080e7c6aadSDmitri Tikhonov while (-1 != (opt = getopt(argc, argv, "l:"))) 1090e7c6aadSDmitri Tikhonov { 1100e7c6aadSDmitri Tikhonov switch (opt) 1110e7c6aadSDmitri Tikhonov { 1120e7c6aadSDmitri Tikhonov case 'l': 1130e7c6aadSDmitri Tikhonov lsquic_logger_lopt(optarg); 1140e7c6aadSDmitri Tikhonov break; 1150e7c6aadSDmitri Tikhonov default: 1160e7c6aadSDmitri Tikhonov exit(EXIT_FAILURE); 1170e7c6aadSDmitri Tikhonov break; 1180e7c6aadSDmitri Tikhonov } 1190e7c6aadSDmitri Tikhonov } 1200e7c6aadSDmitri Tikhonov 1210e7c6aadSDmitri Tikhonov test_post_quiescence_explosion(); 1220e7c6aadSDmitri Tikhonov test_post_quiescence_explosion2(); 1230e7c6aadSDmitri Tikhonov 1240e7c6aadSDmitri Tikhonov exit(EXIT_SUCCESS); 1250e7c6aadSDmitri Tikhonov} 126