tcp: Have tcp_seq_init() take its parameters from struct tcp_conn
tcp_seq_init() takes a number of parameters for the connection, but at every call site, these are already populated in the tcp_conn structure. Likewise we always store the result into the @seq_to_tap field. Use this to simplify tcp_seq_init(). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
a93bfada5b
commit
e7bae5bafd
1 changed files with 10 additions and 26 deletions
36
tcp.c
36
tcp.c
|
@ -1930,17 +1930,11 @@ static void tcp_clamp_window(const struct ctx *c, struct tcp_tap_conn *conn,
|
||||||
/**
|
/**
|
||||||
* tcp_seq_init() - Calculate initial sequence number according to RFC 6528
|
* tcp_seq_init() - Calculate initial sequence number according to RFC 6528
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
* @af: Address family, AF_INET or AF_INET6
|
* @conn: TCP connection, with addr, sock_port and tap_port populated
|
||||||
* @addr: Remote address, pointer to in_addr or in6_addr
|
|
||||||
* @dstport: Destination port, connection-wise, network order
|
|
||||||
* @srcport: Source port, connection-wise, network order
|
|
||||||
* @now: Current timestamp
|
* @now: Current timestamp
|
||||||
*
|
|
||||||
* Return: initial TCP sequence
|
|
||||||
*/
|
*/
|
||||||
static uint32_t tcp_seq_init(const struct ctx *c, int af, const void *addr,
|
static void tcp_seq_init(const struct ctx *c, struct tcp_tap_conn *conn,
|
||||||
in_port_t dstport, in_port_t srcport,
|
const struct timespec *now)
|
||||||
const struct timespec *now)
|
|
||||||
{
|
{
|
||||||
union inany_addr aany;
|
union inany_addr aany;
|
||||||
struct {
|
struct {
|
||||||
|
@ -1949,14 +1943,13 @@ static uint32_t tcp_seq_init(const struct ctx *c, int af, const void *addr,
|
||||||
union inany_addr dst;
|
union inany_addr dst;
|
||||||
in_port_t dstport;
|
in_port_t dstport;
|
||||||
} __attribute__((__packed__)) in = {
|
} __attribute__((__packed__)) in = {
|
||||||
.srcport = srcport,
|
.src = conn->addr,
|
||||||
.dstport = dstport,
|
.srcport = conn->tap_port,
|
||||||
|
.dstport = conn->sock_port,
|
||||||
};
|
};
|
||||||
uint32_t ns, seq = 0;
|
uint32_t ns, seq = 0;
|
||||||
|
|
||||||
inany_from_af(&aany, af, addr);
|
if (CONN_V4(conn))
|
||||||
in.src = aany;
|
|
||||||
if (af == AF_INET)
|
|
||||||
inany_from_af(&aany, AF_INET, &c->ip4.addr);
|
inany_from_af(&aany, AF_INET, &c->ip4.addr);
|
||||||
else
|
else
|
||||||
inany_from_af(&aany, AF_INET6, &c->ip6.addr);
|
inany_from_af(&aany, AF_INET6, &c->ip6.addr);
|
||||||
|
@ -1967,7 +1960,7 @@ static uint32_t tcp_seq_init(const struct ctx *c, int af, const void *addr,
|
||||||
ns = now->tv_sec * 1E9;
|
ns = now->tv_sec * 1E9;
|
||||||
ns += now->tv_nsec >> 5; /* 32ns ticks, overflows 32 bits every 137s */
|
ns += now->tv_nsec >> 5; /* 32ns ticks, overflows 32 bits every 137s */
|
||||||
|
|
||||||
return seq + ns;
|
conn->seq_to_tap = seq + ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2127,7 +2120,7 @@ static void tcp_conn_from_tap(struct ctx *c, int af, const void *addr,
|
||||||
conn->seq_from_tap = conn->seq_init_from_tap + 1;
|
conn->seq_from_tap = conn->seq_init_from_tap + 1;
|
||||||
conn->seq_ack_to_tap = conn->seq_from_tap;
|
conn->seq_ack_to_tap = conn->seq_from_tap;
|
||||||
|
|
||||||
conn->seq_to_tap = tcp_seq_init(c, af, addr, th->dest, th->source, now);
|
tcp_seq_init(c, conn, now);
|
||||||
conn->seq_ack_from_tap = conn->seq_to_tap + 1;
|
conn->seq_ack_from_tap = conn->seq_to_tap + 1;
|
||||||
|
|
||||||
tcp_hash_insert(c, conn);
|
tcp_hash_insert(c, conn);
|
||||||
|
@ -2774,11 +2767,6 @@ static void tcp_tap_conn_from_sock(struct ctx *c, union epoll_ref ref,
|
||||||
|
|
||||||
conn->sock_port = ntohs(sa6.sin6_port);
|
conn->sock_port = ntohs(sa6.sin6_port);
|
||||||
conn->tap_port = ref.r.p.tcp.tcp.index;
|
conn->tap_port = ref.r.p.tcp.tcp.index;
|
||||||
|
|
||||||
conn->seq_to_tap = tcp_seq_init(c, AF_INET6, &sa6.sin6_addr,
|
|
||||||
conn->sock_port,
|
|
||||||
conn->tap_port,
|
|
||||||
now);
|
|
||||||
} else {
|
} else {
|
||||||
struct sockaddr_in sa4;
|
struct sockaddr_in sa4;
|
||||||
|
|
||||||
|
@ -2793,13 +2781,9 @@ static void tcp_tap_conn_from_sock(struct ctx *c, union epoll_ref ref,
|
||||||
|
|
||||||
conn->sock_port = ntohs(sa4.sin_port);
|
conn->sock_port = ntohs(sa4.sin_port);
|
||||||
conn->tap_port = ref.r.p.tcp.tcp.index;
|
conn->tap_port = ref.r.p.tcp.tcp.index;
|
||||||
|
|
||||||
conn->seq_to_tap = tcp_seq_init(c, AF_INET, &sa4.sin_addr,
|
|
||||||
conn->sock_port,
|
|
||||||
conn->tap_port,
|
|
||||||
now);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tcp_seq_init(c, conn, now);
|
||||||
tcp_hash_insert(c, conn);
|
tcp_hash_insert(c, conn);
|
||||||
|
|
||||||
conn->seq_ack_from_tap = conn->seq_to_tap + 1;
|
conn->seq_ack_from_tap = conn->seq_to_tap + 1;
|
||||||
|
|
Loading…
Reference in a new issue