tcp: Split init and ns cases for tcp_sock_refill()
With the creation of the tcp_sock_refill_pool() helper, the ns==true and ns==false paths for tcp_sock_refill() now have almost nothing in common. Split the two versions into tcp_sock_refill_init() and tcp_sock_refill_ns() functions. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
e456c1ccdc
commit
c8993476d5
1 changed files with 21 additions and 32 deletions
53
tcp.c
53
tcp.c
|
@ -3038,40 +3038,33 @@ static void tcp_sock_refill_pool(const struct ctx *c, int pool[], int af)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct tcp_sock_refill_arg - Arguments for tcp_sock_refill()
|
* tcp_sock_refill_init() - Refill pools of pre-opened sockets in init ns
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
* @ns: Set to refill pool of sockets created in namespace
|
|
||||||
*/
|
*/
|
||||||
struct tcp_sock_refill_arg {
|
static void tcp_sock_refill_init(const struct ctx *c)
|
||||||
struct ctx *c;
|
{
|
||||||
int ns;
|
if (c->ifi4)
|
||||||
};
|
tcp_sock_refill_pool(c, init_sock_pool4, AF_INET);
|
||||||
|
if (c->ifi6)
|
||||||
|
tcp_sock_refill_pool(c, init_sock_pool6, AF_INET6);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tcp_sock_refill() - Refill pool of pre-opened sockets
|
* tcp_sock_refill_ns() - Refill pools of pre-opened sockets in namespace
|
||||||
* @arg: See @tcp_sock_refill_arg
|
* @arg: Execution context cast to void *
|
||||||
*
|
*
|
||||||
* Return: 0
|
* Return: 0
|
||||||
*/
|
*/
|
||||||
static int tcp_sock_refill(void *arg)
|
static int tcp_sock_refill_ns(void *arg)
|
||||||
{
|
{
|
||||||
struct tcp_sock_refill_arg *a = (struct tcp_sock_refill_arg *)arg;
|
const struct ctx *c = (const struct ctx *)arg;
|
||||||
int *p4, *p6;
|
|
||||||
|
|
||||||
if (a->ns) {
|
ns_enter(c);
|
||||||
ns_enter(a->c);
|
|
||||||
p4 = ns_sock_pool4;
|
|
||||||
p6 = ns_sock_pool6;
|
|
||||||
} else {
|
|
||||||
p4 = init_sock_pool4;
|
|
||||||
p6 = init_sock_pool6;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (a->c->ifi4)
|
if (c->ifi4)
|
||||||
tcp_sock_refill_pool(a->c, p4, AF_INET);
|
tcp_sock_refill_pool(c, ns_sock_pool4, AF_INET);
|
||||||
|
if (c->ifi6)
|
||||||
if (a->c->ifi6)
|
tcp_sock_refill_pool(c, ns_sock_pool6, AF_INET6);
|
||||||
tcp_sock_refill_pool(a->c, p6, AF_INET6);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3084,7 +3077,6 @@ static int tcp_sock_refill(void *arg)
|
||||||
*/
|
*/
|
||||||
int tcp_init(struct ctx *c)
|
int tcp_init(struct ctx *c)
|
||||||
{
|
{
|
||||||
struct tcp_sock_refill_arg refill_arg = { c, 0 };
|
|
||||||
int i;
|
int i;
|
||||||
#ifndef HAS_GETRANDOM
|
#ifndef HAS_GETRANDOM
|
||||||
int dev_random = open("/dev/random", O_RDONLY);
|
int dev_random = open("/dev/random", O_RDONLY);
|
||||||
|
@ -3130,15 +3122,14 @@ int tcp_init(struct ctx *c)
|
||||||
memset(tcp_sock_init_ext, 0xff, sizeof(tcp_sock_init_ext));
|
memset(tcp_sock_init_ext, 0xff, sizeof(tcp_sock_init_ext));
|
||||||
memset(tcp_sock_ns, 0xff, sizeof(tcp_sock_ns));
|
memset(tcp_sock_ns, 0xff, sizeof(tcp_sock_ns));
|
||||||
|
|
||||||
tcp_sock_refill(&refill_arg);
|
tcp_sock_refill_init(c);
|
||||||
|
|
||||||
if (c->mode == MODE_PASTA) {
|
if (c->mode == MODE_PASTA) {
|
||||||
tcp_splice_init(c);
|
tcp_splice_init(c);
|
||||||
|
|
||||||
NS_CALL(tcp_ns_socks_init, c);
|
NS_CALL(tcp_ns_socks_init, c);
|
||||||
|
|
||||||
refill_arg.ns = 1;
|
NS_CALL(tcp_sock_refill_ns, c);
|
||||||
NS_CALL(tcp_sock_refill, &refill_arg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3258,7 +3249,6 @@ static int tcp_port_rebind(void *arg)
|
||||||
*/
|
*/
|
||||||
void tcp_timer(struct ctx *c, const struct timespec *ts)
|
void tcp_timer(struct ctx *c, const struct timespec *ts)
|
||||||
{
|
{
|
||||||
struct tcp_sock_refill_arg refill_arg = { c, 0 };
|
|
||||||
union tcp_conn *conn;
|
union tcp_conn *conn;
|
||||||
|
|
||||||
(void)ts;
|
(void)ts;
|
||||||
|
@ -3291,12 +3281,11 @@ void tcp_timer(struct ctx *c, const struct timespec *ts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tcp_sock_refill(&refill_arg);
|
tcp_sock_refill_init(c);
|
||||||
if (c->mode == MODE_PASTA) {
|
if (c->mode == MODE_PASTA) {
|
||||||
refill_arg.ns = 1;
|
|
||||||
if ((c->ifi4 && ns_sock_pool4[TCP_SOCK_POOL_TSH] < 0) ||
|
if ((c->ifi4 && ns_sock_pool4[TCP_SOCK_POOL_TSH] < 0) ||
|
||||||
(c->ifi6 && ns_sock_pool6[TCP_SOCK_POOL_TSH] < 0))
|
(c->ifi6 && ns_sock_pool6[TCP_SOCK_POOL_TSH] < 0))
|
||||||
NS_CALL(tcp_sock_refill, &refill_arg);
|
NS_CALL(tcp_sock_refill_ns, c);
|
||||||
|
|
||||||
tcp_splice_pipe_refill(c);
|
tcp_splice_pipe_refill(c);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue