From: Yu Watanabe Date: Fri, 12 Aug 2022 22:35:21 +0000 (+0900) Subject: network/tuntap: code cleanups X-Git-Tag: v252-rc1~432^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8f388c4e4607f7e8ce1807e8c7dfcc17d68b9c55;p=thirdparty%2Fsystemd.git network/tuntap: code cleanups - merge unnecessarily split functions, - drop unnecessary initializations, - tighten variable scopes, - introduce TUNTAP() helper function. --- diff --git a/src/network/netdev/tuntap.c b/src/network/netdev/tuntap.c index 6f099a14481..8e9c1ca9b3f 100644 --- a/src/network/netdev/tuntap.c +++ b/src/network/netdev/tuntap.c @@ -16,111 +16,88 @@ #define TUN_DEV "/dev/net/tun" -static int netdev_fill_tuntap_message(NetDev *netdev, struct ifreq *ifr) { - TunTap *t; - +static TunTap* TUNTAP(NetDev *netdev) { assert(netdev); - assert(netdev->ifname); - assert(ifr); - - if (netdev->kind == NETDEV_KIND_TAP) { - t = TAP(netdev); - ifr->ifr_flags |= IFF_TAP; - } else { - t = TUN(netdev); - ifr->ifr_flags |= IFF_TUN; - } - - if (!t->packet_info) - ifr->ifr_flags |= IFF_NO_PI; - - if (t->multi_queue) - ifr->ifr_flags |= IFF_MULTI_QUEUE; - - if (t->vnet_hdr) - ifr->ifr_flags |= IFF_VNET_HDR; - strncpy(ifr->ifr_name, netdev->ifname, IFNAMSIZ-1); - - return 0; + switch (netdev->kind) { + case NETDEV_KIND_TAP: + return TAP(netdev); + case NETDEV_KIND_TUN: + return TUN(netdev); + default: + return NULL; + } } -static int netdev_tuntap_add(NetDev *netdev, struct ifreq *ifr) { +static int netdev_create_tuntap(NetDev *netdev) { _cleanup_close_ int fd = -1; - TunTap *t = NULL; - const char *user; - const char *group; - uid_t uid; - gid_t gid; + struct ifreq ifr = {}; + TunTap *t; int r; assert(netdev); - assert(ifr); + t = TUNTAP(netdev); + assert(t); fd = open(TUN_DEV, O_RDWR|O_CLOEXEC); if (fd < 0) - return log_netdev_error_errno(netdev, errno, "Failed to open tun dev: %m"); - - if (ioctl(fd, TUNSETIFF, ifr) < 0) - return log_netdev_error_errno(netdev, errno, "TUNSETIFF failed on tun dev: %m"); + return log_netdev_error_errno(netdev, errno, "Failed to open " TUN_DEV ": %m"); if (netdev->kind == NETDEV_KIND_TAP) - t = TAP(netdev); + ifr.ifr_flags |= IFF_TAP; else - t = TUN(netdev); + ifr.ifr_flags |= IFF_TUN; - assert(t); + if (!t->packet_info) + ifr.ifr_flags |= IFF_NO_PI; + + if (t->multi_queue) + ifr.ifr_flags |= IFF_MULTI_QUEUE; + + if (t->vnet_hdr) + ifr.ifr_flags |= IFF_VNET_HDR; + + strncpy(ifr.ifr_name, netdev->ifname, IFNAMSIZ-1); + + if (ioctl(fd, TUNSETIFF, &ifr) < 0) + return log_netdev_error_errno(netdev, errno, "TUNSETIFF failed: %m"); if (t->user_name) { - user = t->user_name; + const char *user = t->user_name; + uid_t uid; r = get_user_creds(&user, &uid, NULL, NULL, NULL, USER_CREDS_ALLOW_MISSING); if (r < 0) return log_netdev_error_errno(netdev, r, "Cannot resolve user name %s: %m", t->user_name); if (ioctl(fd, TUNSETOWNER, uid) < 0) - return log_netdev_error_errno(netdev, errno, "TUNSETOWNER failed on tun dev: %m"); + return log_netdev_error_errno(netdev, errno, "TUNSETOWNER failed: %m"); } if (t->group_name) { - group = t->group_name; + const char *group = t->group_name; + gid_t gid; r = get_group_creds(&group, &gid, USER_CREDS_ALLOW_MISSING); if (r < 0) return log_netdev_error_errno(netdev, r, "Cannot resolve group name %s: %m", t->group_name); if (ioctl(fd, TUNSETGROUP, gid) < 0) - return log_netdev_error_errno(netdev, errno, "TUNSETGROUP failed on tun dev: %m"); + return log_netdev_error_errno(netdev, errno, "TUNSETGROUP failed: %m"); } if (ioctl(fd, TUNSETPERSIST, 1) < 0) - return log_netdev_error_errno(netdev, errno, "TUNSETPERSIST failed on tun dev: %m"); + return log_netdev_error_errno(netdev, errno, "TUNSETPERSIST failed: %m"); return 0; } -static int netdev_create_tuntap(NetDev *netdev) { - struct ifreq ifr = {}; - int r; - - r = netdev_fill_tuntap_message(netdev, &ifr); - if (r < 0) - return r; - - return netdev_tuntap_add(netdev, &ifr); -} - static void tuntap_done(NetDev *netdev) { - TunTap *t = NULL; + TunTap *t; assert(netdev); - - if (netdev->kind == NETDEV_KIND_TUN) - t = TUN(netdev); - else - t = TAP(netdev); - + t = TUNTAP(netdev); assert(t); t->user_name = mfree(t->user_name);