HelenOS sources
This source file includes following definitions.
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
#include <errno.h>
#include <inet/endpoint.h>
#include <pcut/pcut.h>
#include "../conn.h"
#include "../segment.h"
#include "../seq_no.h"
PCUT_INIT;
PCUT_TEST_SUITE(seq_no);
PCUT_TEST(ack_acceptable)
{
tcp_conn_t *conn;
inet_ep2_t epp;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
conn->snd_una = 10;
conn->snd_nxt = 30;
PCUT_ASSERT_FALSE(seq_no_ack_acceptable(conn, 9));
PCUT_ASSERT_FALSE(seq_no_ack_acceptable(conn, 10));
PCUT_ASSERT_TRUE(seq_no_ack_acceptable(conn, 11));
PCUT_ASSERT_TRUE(seq_no_ack_acceptable(conn, 29));
PCUT_ASSERT_TRUE(seq_no_ack_acceptable(conn, 30));
PCUT_ASSERT_FALSE(seq_no_ack_acceptable(conn, 31));
conn->snd_una = 30;
conn->snd_nxt = 10;
PCUT_ASSERT_FALSE(seq_no_ack_acceptable(conn, 29));
PCUT_ASSERT_FALSE(seq_no_ack_acceptable(conn, 30));
PCUT_ASSERT_TRUE(seq_no_ack_acceptable(conn, 31));
PCUT_ASSERT_TRUE(seq_no_ack_acceptable(conn, 9));
PCUT_ASSERT_TRUE(seq_no_ack_acceptable(conn, 10));
PCUT_ASSERT_FALSE(seq_no_ack_acceptable(conn, 11));
tcp_conn_delete(conn);
}
PCUT_TEST(ack_duplicate)
{
tcp_conn_t *conn;
inet_ep2_t epp;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
conn->snd_una = 10;
PCUT_ASSERT_TRUE(seq_no_ack_duplicate(conn, 9));
PCUT_ASSERT_TRUE(seq_no_ack_duplicate(conn, 10));
PCUT_ASSERT_FALSE(seq_no_ack_duplicate(conn, 11));
conn->snd_una = (uint32_t) -10;
PCUT_ASSERT_TRUE(seq_no_ack_duplicate(conn, (uint32_t) -11));
PCUT_ASSERT_TRUE(seq_no_ack_duplicate(conn, (uint32_t) -10));
PCUT_ASSERT_FALSE(seq_no_ack_duplicate(conn, (uint32_t) -9));
tcp_conn_delete(conn);
}
PCUT_TEST(in_rcv_wnd)
{
tcp_conn_t *conn;
inet_ep2_t epp;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
conn->rcv_nxt = 10;
conn->rcv_wnd = 20;
PCUT_ASSERT_FALSE(seq_no_in_rcv_wnd(conn, 9));
PCUT_ASSERT_TRUE(seq_no_in_rcv_wnd(conn, 10));
PCUT_ASSERT_TRUE(seq_no_in_rcv_wnd(conn, 11));
PCUT_ASSERT_TRUE(seq_no_in_rcv_wnd(conn, 29));
PCUT_ASSERT_FALSE(seq_no_in_rcv_wnd(conn, 30));
PCUT_ASSERT_FALSE(seq_no_in_rcv_wnd(conn, 31));
conn->rcv_nxt = 20;
conn->rcv_wnd = (uint32_t) -10;
PCUT_ASSERT_FALSE(seq_no_in_rcv_wnd(conn, 19));
PCUT_ASSERT_TRUE(seq_no_in_rcv_wnd(conn, 20));
PCUT_ASSERT_TRUE(seq_no_in_rcv_wnd(conn, 21));
PCUT_ASSERT_TRUE(seq_no_in_rcv_wnd(conn, 9));
PCUT_ASSERT_FALSE(seq_no_in_rcv_wnd(conn, 10));
PCUT_ASSERT_FALSE(seq_no_in_rcv_wnd(conn, 11));
tcp_conn_delete(conn);
}
PCUT_TEST(new_wnd_update)
{
tcp_conn_t *conn;
inet_ep2_t epp;
tcp_segment_t *seg;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
conn->rcv_nxt = 10;
conn->rcv_wnd = 20;
conn->snd_una = 30;
conn->snd_wnd = 40;
conn->snd_wl1 = 15;
conn->snd_wl2 = 60;
seg = tcp_segment_make_ctrl(CTL_ACK);
PCUT_ASSERT_NOT_NULL(seg);
seg->seq = 14;
seg->ack = 80;
PCUT_ASSERT_FALSE(seq_no_new_wnd_update(conn, seg));
seg->seq = 15;
seg->ack = 59;
PCUT_ASSERT_FALSE(seq_no_new_wnd_update(conn, seg));
seg->seq = 15;
seg->ack = 60;
PCUT_ASSERT_TRUE(seq_no_new_wnd_update(conn, seg));
seg->seq = 16;
seg->ack = 50;
PCUT_ASSERT_TRUE(seq_no_new_wnd_update(conn, seg));
tcp_segment_delete(seg);
tcp_conn_delete(conn);
}
PCUT_TEST(segment_acked)
{
tcp_conn_t *conn;
inet_ep2_t epp;
tcp_segment_t *seg;
uint8_t *data;
size_t dsize;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
dsize = 15;
data = calloc(dsize, 1);
PCUT_ASSERT_NOT_NULL(data);
seg = tcp_segment_make_data(0, data, dsize);
PCUT_ASSERT_NOT_NULL(seg);
seg->seq = 10;
PCUT_ASSERT_INT_EQUALS(dsize, seg->len);
PCUT_ASSERT_FALSE(seq_no_segment_acked(conn, seg, 24));
PCUT_ASSERT_TRUE(seq_no_segment_acked(conn, seg, 25));
tcp_segment_delete(seg);
tcp_conn_delete(conn);
free(data);
}
PCUT_TEST(syn_acked)
{
tcp_conn_t *conn;
inet_ep2_t epp;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
conn->iss = 1;
conn->snd_una = 1;
conn->snd_nxt = 2;
PCUT_ASSERT_FALSE(seq_no_syn_acked(conn));
conn->snd_una = 2;
PCUT_ASSERT_TRUE(seq_no_syn_acked(conn));
tcp_conn_delete(conn);
}
PCUT_TEST(segment_ready)
{
tcp_conn_t *conn;
inet_ep2_t epp;
tcp_segment_t *seg;
uint8_t *data;
size_t dsize;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
dsize = 15;
data = calloc(dsize, 1);
PCUT_ASSERT_NOT_NULL(data);
seg = tcp_segment_make_data(0, data, dsize);
PCUT_ASSERT_NOT_NULL(seg);
conn->rcv_nxt = 30;
conn->rcv_wnd = 20;
PCUT_ASSERT_INT_EQUALS(dsize, seg->len);
seg->seq = 16;
PCUT_ASSERT_TRUE(seq_no_segment_ready(conn, seg));
seg->seq = 17;
PCUT_ASSERT_TRUE(seq_no_segment_ready(conn, seg));
seg->seq = 29;
PCUT_ASSERT_TRUE(seq_no_segment_ready(conn, seg));
seg->seq = 30;
PCUT_ASSERT_TRUE(seq_no_segment_ready(conn, seg));
seg->seq = 31;
PCUT_ASSERT_FALSE(seq_no_segment_ready(conn, seg));
tcp_segment_delete(seg);
tcp_conn_delete(conn);
free(data);
}
PCUT_TEST(segment_acceptable)
{
tcp_conn_t *conn;
inet_ep2_t epp;
tcp_segment_t *seg;
uint8_t *data;
size_t dsize;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
dsize = 15;
data = calloc(dsize, 1);
PCUT_ASSERT_NOT_NULL(data);
seg = tcp_segment_make_data(0, data, dsize);
PCUT_ASSERT_NOT_NULL(seg);
conn->rcv_nxt = 30;
conn->rcv_wnd = 20;
PCUT_ASSERT_INT_EQUALS(dsize, seg->len);
seg->seq = 10;
PCUT_ASSERT_FALSE(seq_no_segment_acceptable(conn, seg));
seg->seq = 15;
PCUT_ASSERT_FALSE(seq_no_segment_acceptable(conn, seg));
seg->seq = 16;
PCUT_ASSERT_TRUE(seq_no_segment_acceptable(conn, seg));
seg->seq = 49;
PCUT_ASSERT_TRUE(seq_no_segment_acceptable(conn, seg));
seg->seq = 50;
PCUT_ASSERT_FALSE(seq_no_segment_acceptable(conn, seg));
conn->rcv_nxt = 30;
conn->rcv_wnd = 10;
PCUT_ASSERT_INT_EQUALS(dsize, seg->len);
seg->seq = 10;
PCUT_ASSERT_FALSE(seq_no_segment_acceptable(conn, seg));
seg->seq = 15;
PCUT_ASSERT_FALSE(seq_no_segment_acceptable(conn, seg));
seg->seq = 16;
PCUT_ASSERT_TRUE(seq_no_segment_acceptable(conn, seg));
seg->seq = 39;
PCUT_ASSERT_TRUE(seq_no_segment_acceptable(conn, seg));
seg->seq = 40;
PCUT_ASSERT_FALSE(seq_no_segment_acceptable(conn, seg));
tcp_segment_delete(seg);
tcp_conn_delete(conn);
free(data);
}
PCUT_TEST(seg_trim_calc)
{
tcp_conn_t *conn;
inet_ep2_t epp;
tcp_segment_t *seg;
uint8_t *data;
size_t dsize;
uint32_t ltrim, rtrim;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
dsize = 15;
data = calloc(dsize, 1);
PCUT_ASSERT_NOT_NULL(data);
seg = tcp_segment_make_data(0, data, dsize);
PCUT_ASSERT_NOT_NULL(seg);
conn->rcv_nxt = 30;
conn->rcv_wnd = 20;
PCUT_ASSERT_INT_EQUALS(dsize, seg->len);
seg->seq = 16;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(14, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 17;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(13, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 29;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(1, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 30;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 31;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 35;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 36;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(1, rtrim);
seg->seq = 37;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(2, rtrim);
seg->seq = 48;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(13, rtrim);
seg->seq = 49;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(0, ltrim);
PCUT_ASSERT_INT_EQUALS(14, rtrim);
conn->rcv_nxt = 30;
conn->rcv_wnd = 10;
PCUT_ASSERT_INT_EQUALS(dsize, seg->len);
seg->seq = 16;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(14, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 17;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(13, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 24;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(6, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 25;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(5, ltrim);
PCUT_ASSERT_INT_EQUALS(0, rtrim);
seg->seq = 26;
seq_no_seg_trim_calc(conn, seg, <rim, &rtrim);
PCUT_ASSERT_INT_EQUALS(4, ltrim);
PCUT_ASSERT_INT_EQUALS(1, rtrim);
tcp_segment_delete(seg);
tcp_conn_delete(conn);
free(data);
}
PCUT_TEST(seg_cmp)
{
tcp_conn_t *conn;
inet_ep2_t epp;
tcp_segment_t *seg1, *seg2;
uint8_t *data;
size_t dsize;
inet_ep2_init(&epp);
conn = tcp_conn_new(&epp);
PCUT_ASSERT_NOT_NULL(conn);
dsize = 15;
data = calloc(dsize, 1);
PCUT_ASSERT_NOT_NULL(data);
seg1 = tcp_segment_make_data(0, data, dsize);
PCUT_ASSERT_NOT_NULL(seg1);
seg2 = tcp_segment_make_data(0, data, dsize);
PCUT_ASSERT_NOT_NULL(seg2);
conn->rcv_nxt = 10;
conn->rcv_wnd = 20;
PCUT_ASSERT_INT_EQUALS(dsize, seg1->len);
PCUT_ASSERT_INT_EQUALS(dsize, seg2->len);
seg1->seq = 5;
seg2->seq = 6;
PCUT_ASSERT_INT_EQUALS(-1, seq_no_seg_cmp(conn, seg1, seg2));
seg1->seq = 6;
seg2->seq = 6;
PCUT_ASSERT_INT_EQUALS(0, seq_no_seg_cmp(conn, seg1, seg2));
seg1->seq = 6;
seg2->seq = 5;
PCUT_ASSERT_INT_EQUALS(1, seq_no_seg_cmp(conn, seg1, seg2));
tcp_segment_delete(seg1);
tcp_segment_delete(seg2);
tcp_conn_delete(conn);
free(data);
}
PCUT_TEST(control_len)
{
PCUT_ASSERT_INT_EQUALS(0, seq_no_control_len(0));
PCUT_ASSERT_INT_EQUALS(0, seq_no_control_len(CTL_ACK));
PCUT_ASSERT_INT_EQUALS(0, seq_no_control_len(CTL_RST));
PCUT_ASSERT_INT_EQUALS(0, seq_no_control_len(CTL_ACK | CTL_RST));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_SYN));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_FIN));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_SYN | CTL_ACK));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_FIN | CTL_ACK));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_SYN | CTL_RST));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_FIN | CTL_RST));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_SYN | CTL_ACK |
CTL_RST));
PCUT_ASSERT_INT_EQUALS(1, seq_no_control_len(CTL_FIN | CTL_ACK |
CTL_RST));
PCUT_ASSERT_INT_EQUALS(2, seq_no_control_len(CTL_SYN | CTL_FIN));
PCUT_ASSERT_INT_EQUALS(2, seq_no_control_len(CTL_SYN | CTL_FIN |
CTL_ACK));
PCUT_ASSERT_INT_EQUALS(2, seq_no_control_len(CTL_SYN | CTL_FIN |
CTL_RST));
PCUT_ASSERT_INT_EQUALS(2, seq_no_control_len(CTL_SYN | CTL_FIN |
CTL_ACK | CTL_RST));
}
PCUT_EXPORT(seq_no);
HelenOS homepage, sources at GitHub