chiark / gitweb /
Add DEPLOYMENT to hostnamectl
[elogind.git] / src / network / networkd-netdev.c
index cc85e5348bfee3dd8716bed7dc5370ee91b3f783..88b692fbabf5cff75a3e6171bf1323854efe9606 100644 (file)
@@ -48,6 +48,7 @@ static const char* const netdev_kind_table[_NETDEV_KIND_MAX] = {
 DEFINE_STRING_TABLE_LOOKUP(netdev_kind, NetDevKind);
 DEFINE_CONFIG_PARSE_ENUM(config_parse_netdev_kind, netdev_kind, NetDevKind, "Failed to parse netdev kind");
 
+
 static void netdev_cancel_callbacks(NetDev *netdev) {
         _cleanup_rtnl_message_unref_ sd_rtnl_message *m = NULL;
         netdev_enslave_callback *callback;
@@ -244,34 +245,6 @@ static int netdev_create_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userda
         return 1;
 }
 
-int config_parse_tunnel_address(const char *unit,
-                                const char *filename,
-                                unsigned line,
-                                const char *section,
-                                unsigned section_line,
-                                const char *lvalue,
-                                int ltype,
-                                const char *rvalue,
-                                void *data,
-                                void *userdata) {
-        NetDev *n = data;
-        unsigned char family = AF_INET;
-        int r;
-
-        assert(filename);
-        assert(lvalue);
-        assert(rvalue);
-        assert(data);
-
-        r = net_parse_inaddr(rvalue, &family, n);
-        if (r < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, EINVAL,
-                           "Tunnel address is invalid, ignoring assignment: %s", rvalue);
-                return 0;
-        }
-       return 0;
-}
-
 static int netdev_create(NetDev *netdev) {
         _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
         const char *kind;
@@ -593,13 +566,14 @@ static int netdev_load_one(Manager *manager, const char *filename) {
         netdev->state = _NETDEV_STATE_INVALID;
         netdev->kind = _NETDEV_KIND_INVALID;
         netdev->macvlan_mode = _NETDEV_MACVLAN_MODE_INVALID;
+        netdev->bond_mode = _NETDEV_BOND_MODE_INVALID;
         netdev->vlanid = VLANID_MAX + 1;
         netdev->vxlanid = VXLAN_VID_MAX + 1;
         netdev->tunnel_pmtudisc = true;
         netdev->learning = true;
 
         r = config_parse(NULL, filename, file,
-                         "Match\0NetDev\0VLAN\0MACVLAN\0VXLAN\0Tunnel\0Peer\0Tun\0Tap\0",
+                         "Match\0NetDev\0VLAN\0MACVLAN\0VXLAN\0Tunnel\0Peer\0Tun\0Tap\0Bond\0",
                          config_item_perf_lookup, (void*) network_netdev_gperf_lookup,
                          false, false, netdev);
         if (r < 0) {
@@ -607,9 +581,41 @@ static int netdev_load_one(Manager *manager, const char *filename) {
                 return r;
         }
 
-        if (netdev->kind == _NETDEV_KIND_INVALID) {
+        switch (netdev->kind) {
+        case _NETDEV_KIND_INVALID:
                 log_warning("NetDev without Kind configured in %s. Ignoring", filename);
                 return 0;
+        case NETDEV_KIND_VLAN:
+                if (netdev->vlanid > VLANID_MAX) {
+                        log_warning("VLAN without valid Id configured in %s. Ignoring", filename);
+                        return 0;
+                }
+                break;
+        case NETDEV_KIND_VXLAN:
+                if (netdev->vxlanid > VXLAN_VID_MAX) {
+                        log_warning("VXLAN without valid Id configured in %s. Ignoring", filename);
+                        return 0;
+                }
+                break;
+        case NETDEV_KIND_IPIP:
+        case NETDEV_KIND_GRE:
+        case NETDEV_KIND_SIT:
+        case NETDEV_KIND_VTI:
+                if (netdev->local.in.s_addr == INADDR_ANY) {
+                        log_warning("Tunnel without local address configured in %s. Ignoring", filename);
+                        return 0;
+                }
+                if (netdev->remote.in.s_addr == INADDR_ANY) {
+                        log_warning("Tunnel without remote address configured in %s. Ignoring", filename);
+                        return 0;
+                }
+                if (netdev->family != AF_INET) {
+                        log_warning("Tunnel with invalid address family configured in %s. Ignoring", filename);
+                        return 0;
+                }
+                break;
+        default:
+                break;
         }
 
         if (!netdev->ifname) {
@@ -617,16 +623,6 @@ static int netdev_load_one(Manager *manager, const char *filename) {
                 return 0;
         }
 
-        if (netdev->kind == NETDEV_KIND_VLAN && netdev->vlanid > VLANID_MAX) {
-                log_warning("VLAN without valid Id configured in %s. Ignoring", filename);
-                return 0;
-        }
-
-        if (netdev->kind == NETDEV_KIND_VXLAN && netdev->vxlanid > VXLAN_VID_MAX) {
-                log_warning("VXLAN without valid Id configured in %s. Ignoring", filename);
-                return 0;
-        }
-
         if (netdev->kind != NETDEV_KIND_VLAN && netdev->vlanid <= VLANID_MAX) {
                 log_warning("VLAN Id configured for a %s in %s. Ignoring",
                             netdev_kind_to_string(netdev->kind), filename);
@@ -700,19 +696,15 @@ static int netdev_load_one(Manager *manager, const char *filename) {
 
                 break;
         case NETDEV_KIND_BRIDGE:
-        case NETDEV_KIND_BOND:
                 r = netdev_create(netdev);
                 if (r < 0)
                         return r;
                 break;
-
-        case NETDEV_KIND_TUN:
-        case NETDEV_KIND_TAP:
-                r = netdev_create_tuntap(netdev);
+        case NETDEV_KIND_BOND:
+                r = netdev_create_bond(netdev, netdev_create_handler);
                 if (r < 0)
                         return r;
                 break;
-
         default:
                 break;
         }