#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);
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",
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,
+};