net: separate function for interface configuration
authorRobert Swiecki <robert@swiecki.net>
Fri, 1 Jun 2018 00:10:05 +0000 (02:10 +0200)
committerRobert Swiecki <robert@swiecki.net>
Fri, 1 Jun 2018 00:10:05 +0000 (02:10 +0200)
net.cc

diff --git a/net.cc b/net.cc
index 479911996f47efd6ff7b015bb93f46348c5432a9..5ee77fc0c9d78c90ab2a36a5228e7448374dc6a5 100644 (file)
--- a/net.cc
+++ b/net.cc
@@ -375,10 +375,11 @@ static bool ifaceUp(const char* ifacename) {
        return true;
 }
 
-static bool netConfigureVs(nsjconf_t* nsjconf) {
+static bool ifaceConfig(const std::string& iface, const std::string& ip, const std::string& mask,
+    const std::string& gw) {
        struct ifreq ifr;
        memset(&ifr, '\0', sizeof(ifr));
-       snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", IFACE_NAME);
+       snprintf(ifr.ifr_name, IF_NAMESIZE, "%s", iface.c_str());
        struct in_addr addr;
 
        int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
@@ -387,13 +388,13 @@ static bool netConfigureVs(nsjconf_t* nsjconf) {
                return false;
        }
 
-       if (inet_pton(AF_INET, nsjconf->iface_vs_ip.c_str(), &addr) != 1) {
-               PLOG_E("Cannot convert '%s' into an IPv4 address", nsjconf->iface_vs_ip.c_str());
+       if (inet_pton(AF_INET, ip.c_str(), &addr) != 1) {
+               PLOG_E("Cannot convert '%s' into an IPv4 address", ip.c_str());
                close(sock);
                return false;
        }
        if (addr.s_addr == INADDR_ANY) {
-               LOG_D("IPv4 address for interface '%s' not set", IFACE_NAME);
+               LOG_D("IPv4 address for interface '%s' not set", iface.c_str());
                close(sock);
                return true;
        }
@@ -402,38 +403,36 @@ static bool netConfigureVs(nsjconf_t* nsjconf) {
        sa->sin_family = AF_INET;
        sa->sin_addr = addr;
        if (ioctl(sock, SIOCSIFADDR, &ifr) == -1) {
-               PLOG_E("ioctl(iface='%s', SIOCSIFADDR, '%s')", IFACE_NAME,
-                   nsjconf->iface_vs_ip.c_str());
+               PLOG_E("ioctl(iface='%s', SIOCSIFADDR, '%s')", iface.c_str(), ip.c_str());
                close(sock);
                return false;
        }
 
-       if (inet_pton(AF_INET, nsjconf->iface_vs_nm.c_str(), &addr) != 1) {
-               PLOG_E("Cannot convert '%s' into a IPv4 netmask", nsjconf->iface_vs_nm.c_str());
+       if (inet_pton(AF_INET, mask.c_str(), &addr) != 1) {
+               PLOG_E("Cannot convert '%s' into a IPv4 netmask", mask.c_str());
                close(sock);
                return false;
        }
        sa->sin_family = AF_INET;
        sa->sin_addr = addr;
        if (ioctl(sock, SIOCSIFNETMASK, &ifr) == -1) {
-               PLOG_E("ioctl(iface='%s', SIOCSIFNETMASK, '%s')", IFACE_NAME,
-                   nsjconf->iface_vs_nm.c_str());
+               PLOG_E("ioctl(iface='%s', SIOCSIFNETMASK, '%s')", iface.c_str(), mask.c_str());
                close(sock);
                return false;
        }
 
-       if (!ifaceUp(IFACE_NAME)) {
+       if (!ifaceUp(iface.c_str())) {
                close(sock);
                return false;
        }
 
-       if (inet_pton(AF_INET, nsjconf->iface_vs_gw.c_str(), &addr) != 1) {
-               PLOG_E("Cannot convert '%s' into a IPv4 GW address", nsjconf->iface_vs_gw.c_str());
+       if (inet_pton(AF_INET, gw.c_str(), &addr) != 1) {
+               PLOG_E("Cannot convert '%s' into a IPv4 GW address", gw.c_str());
                close(sock);
                return false;
        }
        if (addr.s_addr == INADDR_ANY) {
-               LOG_D("Gateway address for '%s' is not set", IFACE_NAME);
+               LOG_D("Gateway address for '%s' is not set", iface.c_str());
                close(sock);
                return true;
        }
@@ -452,11 +451,12 @@ static bool netConfigureVs(nsjconf_t* nsjconf) {
        sgate->sin_addr = addr;
 
        rt.rt_flags = RTF_UP | RTF_GATEWAY;
-       char rt_dev[] = IFACE_NAME;
+       char rt_dev[IF_NAMESIZE];
+       snprintf(rt_dev, sizeof(rt_dev), "%s", iface.c_str());
        rt.rt_dev = rt_dev;
 
        if (ioctl(sock, SIOCADDRT, &rt) == -1) {
-               PLOG_E("ioctl(SIOCADDRT, '%s')", nsjconf->iface_vs_gw.c_str());
+               PLOG_E("ioctl(SIOCADDRT, '%s')", gw.c_str());
                close(sock);
                return false;
        }
@@ -469,15 +469,12 @@ bool initNsFromChild(nsjconf_t* nsjconf) {
        if (!nsjconf->clone_newnet) {
                return true;
        }
-       if (nsjconf->iface_lo) {
-               if (!ifaceUp("lo")) {
-                       return false;
-               }
+       if (nsjconf->iface_lo && !ifaceUp("lo")) {
+               return false;
        }
-       if (!nsjconf->iface_vs.empty()) {
-               if (!netConfigureVs(nsjconf)) {
-                       return false;
-               }
+       if (!nsjconf->iface_vs.empty() && !ifaceConfig(IFACE_NAME, nsjconf->iface_vs_ip,
+                                             nsjconf->iface_vs_nm, nsjconf->iface_vs_gw)) {
+               return false;
        }
        return true;
 }