From dd942eaa480a0744fd64844f34233900a0da6893 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Thu, 21 Oct 2021 04:26:08 +0200 Subject: passt: Fix build with gcc 7, use std=c99, enable some more Clang checkers Unions and structs, you all have names now. Take the chance to enable bugprone-reserved-identifier, cert-dcl37-c, and cert-dcl51-cpp checkers in clang-tidy. Provide a ffsl() weak declaration using gcc built-in. Start reordering includes, but that's not enough for the llvm-include-order checker yet. Signed-off-by: Stefano Brivio --- netlink.c | 81 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 36 deletions(-) (limited to 'netlink.c') diff --git a/netlink.c b/netlink.c index 2b6118b..ca18263 100644 --- a/netlink.c +++ b/netlink.c @@ -12,7 +12,6 @@ * Author: Stefano Brivio */ -#define _GNU_SOURCE #include #include #include @@ -24,7 +23,9 @@ #include #include #include -#include +#include + +#include #include #include @@ -38,12 +39,12 @@ static int nl_sock_ns = -1; static int nl_seq; /** - * __nl_sock_init() - Set up netlink sockets in init and target namespace + * nl_sock_init_do() - Set up netlink sockets in init and target namespace * @arg: Execution context * * Return: 0 */ -static int __nl_sock_init(void *arg) +static int nl_sock_init_do(void *arg) { struct sockaddr_nl addr = { .nl_family = AF_NETLINK, }; struct ctx *c = (struct ctx *)arg; @@ -65,7 +66,7 @@ ns: } /** - * nl_sock_init() - Call __nl_sock_init() and check for failures + * nl_sock_init() - Call nl_sock_init_do() and check for failures * @c: Execution context * * Return: -EIO if sockets couldn't be set up, 0 otherwise @@ -73,11 +74,11 @@ ns: int nl_sock_init(struct ctx *c) { if (c->mode == MODE_PASTA) { - NS_CALL(__nl_sock_init, c); + NS_CALL(nl_sock_init_do, c); if (nl_sock_ns == -1) return -EIO; } else { - __nl_sock_init(NULL); + nl_sock_init_do(NULL); } if (nl_sock == -1) @@ -267,7 +268,7 @@ void nl_route(int ns, unsigned int ifi, sa_family_t af, void *gw) uint32_t a; uint8_t end; } r4; - }; + } set; } req = { .nlh.nlmsg_type = set ? RTM_NEWROUTE : RTM_GETROUTE, .nlh.nlmsg_flags = NLM_F_REQUEST, @@ -290,29 +291,33 @@ void nl_route(int ns, unsigned int ifi, sa_family_t af, void *gw) if (set) { if (af == AF_INET6) { + size_t rta_len = RTA_LENGTH(sizeof(req.set.r6.d)); + req.nlh.nlmsg_len = sizeof(req); - req.r6.rta_dst.rta_type = RTA_DST; - req.r6.rta_dst.rta_len = RTA_LENGTH(sizeof(req.r6.d)); + req.set.r6.rta_dst.rta_type = RTA_DST; + req.set.r6.rta_dst.rta_len = rta_len; - memcpy(&req.r6.a, gw, sizeof(req.r6.a)); - req.r6.rta_gw.rta_type = RTA_GATEWAY; - req.r6.rta_gw.rta_len = RTA_LENGTH(sizeof(req.r6.a)); + memcpy(&req.set.r6.a, gw, sizeof(req.set.r6.a)); + req.set.r6.rta_gw.rta_type = RTA_GATEWAY; + req.set.r6.rta_gw.rta_len = rta_len; } else { - req.nlh.nlmsg_len = offsetof(struct req_t, r4.end); + size_t rta_len = RTA_LENGTH(sizeof(req.set.r4.d)); + + req.nlh.nlmsg_len = offsetof(struct req_t, set.r4.end); - req.r4.rta_dst.rta_type = RTA_DST; - req.r4.rta_dst.rta_len = RTA_LENGTH(sizeof(req.r4.d)); + req.set.r4.rta_dst.rta_type = RTA_DST; + req.set.r4.rta_dst.rta_len = rta_len; - req.r4.a = *(uint32_t *)gw; - req.r4.rta_gw.rta_type = RTA_GATEWAY; - req.r4.rta_gw.rta_len = RTA_LENGTH(sizeof(req.r4.a)); + req.set.r4.a = *(uint32_t *)gw; + req.set.r4.rta_gw.rta_type = RTA_GATEWAY; + req.set.r4.rta_gw.rta_len = rta_len; } req.rtm.rtm_protocol = RTPROT_BOOT; req.nlh.nlmsg_flags |= NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE; } else { - req.nlh.nlmsg_len = offsetof(struct req_t, r6); + req.nlh.nlmsg_len = offsetof(struct req_t, set.r6); req.nlh.nlmsg_flags |= NLM_F_DUMP; } @@ -376,7 +381,7 @@ void nl_addr(int ns, unsigned int ifi, sa_family_t af, struct rtattr rta_a; struct in6_addr a; } a6; - }; + } set; } req = { .nlh.nlmsg_type = set ? RTM_NEWADDR : RTM_GETADDR, .nlh.nlmsg_flags = NLM_F_REQUEST, @@ -395,22 +400,26 @@ void nl_addr(int ns, unsigned int ifi, sa_family_t af, if (set) { if (af == AF_INET6) { + size_t rta_len = sizeof(req.set.a6.l); + req.nlh.nlmsg_len = sizeof(req); - memcpy(&req.a6.l, addr, sizeof(req.a6.l)); - req.a6.rta_l.rta_len = RTA_LENGTH(sizeof(req.a6.l)); - req.a4.rta_l.rta_type = IFA_LOCAL; - memcpy(&req.a6.a, addr, sizeof(req.a6.a)); - req.a6.rta_a.rta_len = RTA_LENGTH(sizeof(req.a6.a)); - req.a6.rta_a.rta_type = IFA_ADDRESS; + memcpy(&req.set.a6.l, addr, sizeof(req.set.a6.l)); + req.set.a6.rta_l.rta_len = rta_len; + req.set.a4.rta_l.rta_type = IFA_LOCAL; + memcpy(&req.set.a6.a, addr, sizeof(req.set.a6.a)); + req.set.a6.rta_a.rta_len = rta_len; + req.set.a6.rta_a.rta_type = IFA_ADDRESS; } else { - req.nlh.nlmsg_len = offsetof(struct req_t, a4.end); + size_t rta_len = sizeof(req.set.a4.l); + + req.nlh.nlmsg_len = offsetof(struct req_t, set.a4.end); - req.a4.l = req.a4.a = *(uint32_t *)addr; - req.a4.rta_l.rta_len = RTA_LENGTH(sizeof(req.a4.l)); - req.a4.rta_l.rta_type = IFA_LOCAL; - req.a4.rta_a.rta_len = RTA_LENGTH(sizeof(req.a4.a)); - req.a4.rta_a.rta_type = IFA_ADDRESS; + req.set.a4.l = req.set.a4.a = *(uint32_t *)addr; + req.set.a4.rta_l.rta_len = rta_len; + req.set.a4.rta_l.rta_type = IFA_LOCAL; + req.set.a4.rta_a.rta_len = rta_len; + req.set.a4.rta_a.rta_type = IFA_ADDRESS; } req.ifa.ifa_scope = RT_SCOPE_UNIVERSE; @@ -475,7 +484,7 @@ void nl_link(int ns, unsigned int ifi, void *mac, int up, int mtu) union { unsigned char mac[ETH_ALEN]; unsigned int mtu; - }; + } set; } req = { .nlh.nlmsg_type = change ? RTM_NEWLINK : RTM_GETLINK, .nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)), @@ -494,7 +503,7 @@ void nl_link(int ns, unsigned int ifi, void *mac, int up, int mtu) if (!MAC_IS_ZERO(mac)) { req.nlh.nlmsg_len = sizeof(req); - memcpy(req.mac, mac, ETH_ALEN); + memcpy(req.set.mac, mac, ETH_ALEN); req.rta.rta_type = IFLA_ADDRESS; req.rta.rta_len = RTA_LENGTH(ETH_ALEN); nl_req(ns, buf, &req, req.nlh.nlmsg_len); @@ -503,7 +512,7 @@ void nl_link(int ns, unsigned int ifi, void *mac, int up, int mtu) if (mtu) { req.nlh.nlmsg_len = sizeof(req); - req.mtu = mtu; + req.set.mtu = mtu; req.rta.rta_type = IFLA_MTU; req.rta.rta_len = RTA_LENGTH(sizeof(unsigned int)); nl_req(ns, buf, &req, req.nlh.nlmsg_len); -- cgit v1.2.3