chiark / gitweb /
networkd: netdev - introduce vtable for netdev kinds
[elogind.git] / src / network / networkd-netdev-veth.c
similarity index 75%
rename from src/network/networkd-veth.c
rename to src/network/networkd-netdev-veth.c
index 50a5b676b1898f8223f8bc1e9bd6b837919f92da..aca8022f0052adc97901e1625b06cb1163ff4150 100644 (file)
 #include <linux/veth.h>
 
 #include "sd-rtnl.h"
-#include "networkd.h"
+#include "networkd-netdev-veth.h"
 
-
-static int netdev_fill_veth_rtnl_message(NetDev *netdev, sd_rtnl_message *m) {
+static int netdev_veth_fill_message_create(NetDev *netdev, sd_rtnl_message *m) {
         int r;
 
         assert(netdev);
+        assert(netdev->ifname);
         assert(m);
 
         r = sd_rtnl_message_append_string(m, IFLA_IFNAME, netdev->ifname);
@@ -60,8 +60,7 @@ static int netdev_fill_veth_rtnl_message(NetDev *netdev, sd_rtnl_message *m) {
                 return r;
         }
 
-        r = sd_rtnl_message_open_container_union(m, IFLA_INFO_DATA,
-                                                 netdev_kind_to_string(netdev->kind));
+        r = sd_rtnl_message_open_container_union(m, IFLA_INFO_DATA, "veth");
         if (r < 0) {
                 log_error_netdev(netdev,
                                  "Could not append IFLA_INFO_DATA attribute: %s",
@@ -114,41 +113,31 @@ static int netdev_fill_veth_rtnl_message(NetDev *netdev, sd_rtnl_message *m) {
         return r;
 }
 
-int netdev_create_veth(NetDev *netdev, sd_rtnl_message_handler_t callback) {
-        _cleanup_rtnl_message_unref_ sd_rtnl_message *m = NULL;
+static int netdev_veth_verify(NetDev *netdev, const char *filename) {
         int r;
 
         assert(netdev);
-        assert(netdev->ifname);
-        assert(netdev->manager);
-        assert(netdev->manager->rtnl);
-        assert(netdev->kind == NETDEV_KIND_VETH);
+        assert(filename);
 
-        r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0);
-        if (r < 0) {
-                log_error_netdev(netdev,
-                                 "Could not allocate RTM_NEWLINK message: %s",
-                                 strerror(-r));
-                return r;
+        if (!netdev->ifname_peer) {
+                log_warning("Veth NetDev without peer name configured in %s. Ignoring",
+                            filename);
+                return -EINVAL;
         }
 
-        r = netdev_fill_veth_rtnl_message(netdev, m);
-        if(r < 0)
-                return r;
-
-        r = sd_rtnl_call_async(netdev->manager->rtnl, m, callback, netdev, 0, NULL);
-        if (r < 0) {
-                log_error_netdev(netdev,
-                                 "Could not send rtnetlink message: %s", strerror(-r));
-                return r;
+        if (!netdev->mac_peer) {
+                r = netdev_get_mac(netdev->ifname_peer, &netdev->mac_peer);
+                if (r < 0) {
+                        log_warning("Failed to generate predictable MAC address for %s. Ignoring",
+                                  netdev->ifname_peer);
+                        return -EINVAL;
+                }
         }
 
-        netdev_ref(netdev);
-
-        log_debug_netdev(netdev, "Creating veth netdev: %s",
-                         netdev_kind_to_string(netdev->kind));
-
-        netdev->state = NETDEV_STATE_CREATING;
-
         return 0;
 }
+
+const NetDevVTable veth_vtable = {
+        .fill_message_create = netdev_veth_fill_message_create,
+        .config_verify = netdev_veth_verify,
+};