Skip to content
Snippets Groups Projects
Commit 2580a3d5 authored by Libor Peltan's avatar Libor Peltan Committed by Daniel Salzman
Browse files

XDP-TCP: better handling of not-yet-ACKed ackno

parent 577cbd51
Branches
Tags
1 merge request!1300Basic implementation of TCP over XDP for Knot server
......@@ -170,7 +170,15 @@ dynarray_define(tcp_relay, knot_tcp_relay_t, DYNARRAY_VISIBILITY_PUBLIC)
static bool check_seq_ack(const knot_xdp_msg_t *msg, const knot_tcp_conn_t *conn)
{
return (conn != NULL && conn->seqno == msg->seqno && conn->ackno == msg->ackno);
if (conn == NULL || conn->seqno != msg->seqno) {
return false;
}
if (conn->acked <= conn->ackno) { // ackno does not wrap around uint32
return (msg->ackno >= conn->acked && msg->ackno <= conn->ackno);
} else { // this is more tricky
return (msg->ackno >= conn->acked || msg->ackno <= conn->ackno);
}
}
_public_
......@@ -217,6 +225,9 @@ int knot_xdp_tcp_relay(knot_xdp_socket_t *socket, knot_xdp_msg_t msgs[], uint32_
memcpy((*conn)->last_eth_rem, msg->eth_from, sizeof((*conn)->last_eth_rem));
memcpy((*conn)->last_eth_loc, msg->eth_to, sizeof((*conn)->last_eth_loc));
(*conn)->last_active = get_timestamp();
if (msg->flags & KNOT_XDP_MSG_ACK) {
(*conn)->acked = msg->ackno;
}
}
knot_tcp_relay_t relay = { .msg = msg, .conn = *conn };
......@@ -234,7 +245,8 @@ int knot_xdp_tcp_relay(knot_xdp_socket_t *socket, knot_xdp_msg_t msgs[], uint32_
relay.conn->state = XDP_TCP_ESTABLISHING;
relay.conn->seqno++;
if (!synack) {
relay.conn->ackno = acks[n_acks - 1].seqno + 1;
relay.conn->acked = acks[n_acks - 1].seqno;
relay.conn->ackno = relay.conn->acked + 1;
}
} else {
resp_ack(msg, KNOT_XDP_MSG_RST); // TODO consider resetting the OLD conn and accepting new one
......
......@@ -55,6 +55,7 @@ typedef struct knot_xdp_tcp_conn {
uint8_t last_eth_loc[ETH_ALEN];
uint32_t seqno;
uint32_t ackno;
uint32_t acked;
uint32_t last_active;
knot_tcp_state_t state;
struct knot_xdp_tcp_conn *next;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment