netlink: Use correct interface index in NL_SET mode

nl_addr() and nl_route() take an 'op' selector which affects a number of
parameters to the netlink call.  Unfortunately when we introduced this
option a bug was introduced so that we always use the interface index for
the host side, rather than the one for the pasta namespace.

Really, the entire interface to nl_addr() and nl_route() is pretty bad:
it's tightly coupled with the use cases of its callers.  This is a minimal
fix which doesn't address that, but also doesn't make it significantly
worse.

Link: https://bugs.passt.top/show_bug.cgi?id=59
Fixes: 2fe0461856 ("netlink: Add functionality to copy routes from outer namespace")
Fixes: e89da3cf03 ("netlink: Add functionality to copy addresses from outer namespace")
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-06-27 20:22:33 +10:00 committed by Stefano Brivio
parent 32660cea04
commit 289301b39c

View file

@ -226,7 +226,7 @@ void nl_route(enum nl_op op, unsigned int ifi, unsigned int ifi_ns,
.rta.rta_type = RTA_OIF, .rta.rta_type = RTA_OIF,
.rta.rta_len = RTA_LENGTH(sizeof(unsigned int)), .rta.rta_len = RTA_LENGTH(sizeof(unsigned int)),
.ifi = ifi, .ifi = op == NL_SET ? ifi_ns : ifi,
}; };
unsigned dup_routes = 0; unsigned dup_routes = 0;
ssize_t n, nlmsgs_size; ssize_t n, nlmsgs_size;
@ -370,7 +370,7 @@ void nl_addr(enum nl_op op, unsigned int ifi, unsigned int ifi_ns,
.nlh.nlmsg_seq = nl_seq++, .nlh.nlmsg_seq = nl_seq++,
.ifa.ifa_family = af, .ifa.ifa_family = af,
.ifa.ifa_index = ifi, .ifa.ifa_index = op == NL_SET ? ifi_ns : ifi,
.ifa.ifa_prefixlen = op == NL_SET ? *prefix_len : 0, .ifa.ifa_prefixlen = op == NL_SET ? *prefix_len : 0,
}; };
ssize_t n, nlmsgs_size; ssize_t n, nlmsgs_size;