As we'll use nl_link_up() for more than just bringing up devices, it will become awkward to carry empty MTU values around whenever we call it. Signed-off-by: Stefano Brivio <sbrivio(a)redhat.com> Reviewed-by: David Gibson <david(a)gibson.dropbear.id.au> --- netlink.c | 35 +++++++++++++++++++++++++---------- netlink.h | 3 ++- pasta.c | 7 +++++-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/netlink.c b/netlink.c index e6a315e..e33765e 100644 --- a/netlink.c +++ b/netlink.c @@ -942,14 +942,14 @@ int nl_link_set_mac(int s, unsigned int ifi, const void *mac) } /** - * nl_link_up() - Bring link up + * nl_link_set_mtu() - Set link MTU * @s: Netlink socket * @ifi: Interface index - * @mtu: If non-zero, set interface MTU + * @mtu: Interface MTU * * Return: 0 on success, negative error code on failure */ -int nl_link_up(int s, unsigned int ifi, int mtu) +int nl_link_set_mtu(int s, unsigned int ifi, int mtu) { struct req_t { struct nlmsghdr nlh; @@ -959,17 +959,32 @@ int nl_link_up(int s, unsigned int ifi, int mtu) } req = { .ifm.ifi_family = AF_UNSPEC, .ifm.ifi_index = ifi, - .ifm.ifi_flags = IFF_UP, - .ifm.ifi_change = IFF_UP, .rta.rta_type = IFLA_MTU, .rta.rta_len = RTA_LENGTH(sizeof(unsigned int)), .mtu = mtu, }; - ssize_t len = sizeof(req); - if (!mtu) - /* Shorten request to drop MTU attribute */ - len = offsetof(struct req_t, rta); + return nl_do(s, &req, RTM_NEWLINK, 0, sizeof(req)); +} + +/** + * nl_link_up() - Bring link up + * @s: Netlink socket + * @ifi: Interface index + * + * Return: 0 on success, negative error code on failure + */ +int nl_link_up(int s, unsigned int ifi) +{ + struct req_t { + struct nlmsghdr nlh; + struct ifinfomsg ifm; + } req = { + .ifm.ifi_family = AF_UNSPEC, + .ifm.ifi_index = ifi, + .ifm.ifi_flags = IFF_UP, + .ifm.ifi_change = IFF_UP, + }; - return nl_do(s, &req, RTM_NEWLINK, 0, len); + return nl_do(s, &req, RTM_NEWLINK, 0, sizeof(req)); } diff --git a/netlink.h b/netlink.h index 3a1f0de..87d27ae 100644 --- a/netlink.h +++ b/netlink.h @@ -23,6 +23,7 @@ int nl_addr_dup(int s_src, unsigned int ifi_src, int s_dst, unsigned int ifi_dst, sa_family_t af); int nl_link_get_mac(int s, unsigned int ifi, void *mac); int nl_link_set_mac(int s, unsigned int ifi, const void *mac); -int nl_link_up(int s, unsigned int ifi, int mtu); +int nl_link_set_mtu(int s, unsigned int ifi, int mtu); +int nl_link_up(int s, unsigned int ifi); #endif /* NETLINK_H */ diff --git a/pasta.c b/pasta.c index 615ff7b..3a0652e 100644 --- a/pasta.c +++ b/pasta.c @@ -288,7 +288,7 @@ void pasta_ns_conf(struct ctx *c) { int rc = 0; - rc = nl_link_up(nl_sock_ns, 1 /* lo */, 0); + rc = nl_link_up(nl_sock_ns, 1 /* lo */); if (rc < 0) die("Couldn't bring up loopback interface in namespace: %s", strerror(-rc)); @@ -303,7 +303,10 @@ void pasta_ns_conf(struct ctx *c) strerror(-rc)); if (c->pasta_conf_ns) { - nl_link_up(nl_sock_ns, c->pasta_ifi, c->mtu); + if (c->mtu != -1) + nl_link_set_mtu(nl_sock_ns, c->pasta_ifi, c->mtu); + + nl_link_up(nl_sock_ns, c->pasta_ifi); if (c->ifi4) { if (c->ip4.no_copy_addrs) { -- 2.43.0