From 8243ae620a55e59284d3acf261e6a259efb3405b Mon Sep 17 00:00:00 2001 From: Marius Tomaschewski Date: Wed, 11 Dec 2013 09:05:31 +0100 Subject: [PATCH] macvlan: initial refactoring to use link.lowerdev --- include/wicked/macvlan.h | 1 - include/wicked/system.h | 4 +- src/dbus-objects/macvlan.c | 113 ++++++++++++++++++++++++++++++------- src/ifconfig.c | 31 +++++----- src/iflist.c | 10 ++-- src/macvlan.c | 4 -- 6 files changed, 117 insertions(+), 46 deletions(-) diff --git a/include/wicked/macvlan.h b/include/wicked/macvlan.h index 4a090db2e..a21a995d1 100644 --- a/include/wicked/macvlan.h +++ b/include/wicked/macvlan.h @@ -41,7 +41,6 @@ enum { struct ni_macvlan { unsigned int mode; uint16_t flags; - ni_netdev_ref_t parent; }; extern ni_macvlan_t * ni_macvlan_new(void); diff --git a/include/wicked/system.h b/include/wicked/system.h index d53b30143..edfc6d3eb 100644 --- a/include/wicked/system.h +++ b/include/wicked/system.h @@ -28,8 +28,8 @@ extern int ni_system_infiniband_child_delete(ni_netdev_t *); extern int ni_system_vlan_create(ni_netconfig_t *, const ni_netdev_t *, ni_netdev_t **); extern int ni_system_vlan_delete(ni_netdev_t *); -extern int ni_system_macvlan_create(ni_netconfig_t *, const char *, - const ni_macvlan_t *, ni_netdev_t **); +extern int ni_system_macvlan_create(ni_netconfig_t *, + const ni_netdev_t *, ni_netdev_t **); extern int ni_system_macvlan_delete(ni_netdev_t *); extern int ni_system_bridge_create(ni_netconfig_t *, const char *, const ni_bridge_t *, ni_netdev_t **); diff --git a/src/dbus-objects/macvlan.c b/src/dbus-objects/macvlan.c index 8f1935cf2..8c1dbf80a 100644 --- a/src/dbus-objects/macvlan.c +++ b/src/dbus-objects/macvlan.c @@ -88,21 +88,27 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE const char *err; int rv; - if (!ifname) { - dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, - "Unable to create macvlan interface - name argument missed"); - goto out; - } else if(!ni_string_eq(cfg_ifp->name, ifname)) { - ni_string_dup(&cfg_ifp->name, ifname); - } - macvlan = ni_netdev_get_macvlan(cfg_ifp); if ((err = ni_macvlan_validate(macvlan))) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "%s", err); goto out; } - if ((rv = ni_system_macvlan_create(nc, cfg_ifp->name, macvlan, &new_ifp)) < 0) { + if (ni_string_empty(ifname)) { + if (ni_string_empty(cfg_ifp->name) && + (ifname = ni_netdev_make_name(nc, "macvlan"))) { + ni_string_dup(&cfg_ifp->name, ifname); + } else { + dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, + "Unable to create macvlan interface - name argument missed"); + goto out; + } + ifname = NULL; + } else if(!ni_string_eq(cfg_ifp->name, ifname)) { + ni_string_dup(&cfg_ifp->name, ifname); + } + + if ((rv = ni_system_macvlan_create(nc, cfg_ifp, &new_ifp)) < 0) { if (rv != -NI_ERROR_DEVICE_EXISTS || new_ifp == NULL || (ifname && new_ifp && !ni_string_eq(new_ifp->name, ifname))) { dbus_set_error(error, DBUS_ERROR_FAILED, @@ -157,9 +163,16 @@ ni_objectmodel_macvlan_delete(ni_dbus_object_t *object, const ni_dbus_method_t * * Helper function to obtain macvlan config from dbus object */ static void * -ni_objectmodel_get_macvlan(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error) +ni_objectmodel_get_netdev(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error) +{ + return ni_objectmodel_unwrap_netif(object, error); +} + +static ni_macvlan_t * +ni_objectmodel_macvlan_handle(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error) { ni_netdev_t *dev; + ni_macvlan_t *macvlan; if (!(dev = ni_objectmodel_unwrap_netif(object, error))) return NULL; @@ -167,20 +180,80 @@ ni_objectmodel_get_macvlan(const ni_dbus_object_t *object, ni_bool_t write_acces if (!write_access) return dev->macvlan; - return ni_netdev_get_macvlan(dev); + if (!(macvlan = ni_netdev_get_macvlan(dev))) { + dbus_set_error(error, DBUS_ERROR_FAILED, + "Error getting macvlan handle for interface"); + return NULL; + } + return macvlan; +} + +static dbus_bool_t +__ni_objectmodel_macvlan_get_mode(const ni_dbus_object_t *object, + const ni_dbus_property_t *property, + ni_dbus_variant_t *result, DBusError *error) +{ + ni_macvlan_t *macvlan; + + if (!(macvlan = ni_objectmodel_macvlan_handle(object, FALSE, error))) + return FALSE; + + ni_dbus_variant_set_uint32(result, macvlan->mode); + return TRUE; +} + +static dbus_bool_t +__ni_objectmodel_macvlan_get_flags(const ni_dbus_object_t *object, + const ni_dbus_property_t *property, + ni_dbus_variant_t *result, DBusError *error) +{ + ni_macvlan_t *macvlan; + + if (!(macvlan = ni_objectmodel_macvlan_handle(object, FALSE, error))) + return FALSE; + + ni_dbus_variant_set_uint16(result, macvlan->flags); + return TRUE; +} + +static dbus_bool_t +__ni_objectmodel_macvlan_set_mode(ni_dbus_object_t *object, + const ni_dbus_property_t *property, + const ni_dbus_variant_t *result, DBusError *error) +{ + ni_macvlan_t *macvlan; + + if (!(macvlan = ni_objectmodel_macvlan_handle(object, TRUE, error))) + return FALSE; + + return ni_dbus_variant_get_uint32(result, &macvlan->mode); } -#define MACVLAN_STRING_PROPERTY(dbus_type, type, rw) \ - NI_DBUS_GENERIC_STRING_PROPERTY(macvlan, dbus_type, type, rw) -#define MACVLAN_UINT32_PROPERTY(dbus_type, type, rw) \ - NI_DBUS_GENERIC_UINT_PROPERTY(macvlan, dbus_type, type, rw) -#define MACVLAN_UINT16_PROPERTY(dbus_type, type, rw) \ - NI_DBUS_GENERIC_UINT16_PROPERTY(macvlan, dbus_type, type, rw) +static dbus_bool_t +__ni_objectmodel_macvlan_set_flags(ni_dbus_object_t *object, + const ni_dbus_property_t *property, + const ni_dbus_variant_t *result, DBusError *error) +{ + ni_macvlan_t *macvlan; + + if (!(macvlan = ni_objectmodel_macvlan_handle(object, TRUE, error))) + return FALSE; + + return ni_dbus_variant_get_uint16(result, &macvlan->flags); +} + + +#define MACVLAN_PROPERTY_SIGNATURE(signature, dbus_name, rw) \ + __NI_DBUS_PROPERTY(signature, dbus_name, __ni_objectmodel_macvlan, rw) +#define MACVLAN_UINT32_PROPERTY(dbus_name, rw) \ + MACVLAN_PROPERTY_SIGNATURE(DBUS_TYPE_UINT32_AS_STRING, dbus_name, rw) +#define MACVLAN_UINT16_PROPERTY(dbus_name, rw) \ + MACVLAN_PROPERTY_SIGNATURE(DBUS_TYPE_UINT16_AS_STRING, dbus_name, rw) const ni_dbus_property_t ni_objectmodel_macvlan_property_table[] = { - MACVLAN_STRING_PROPERTY(device, parent.name, RO), - MACVLAN_UINT32_PROPERTY(mode, mode, RO), - MACVLAN_UINT16_PROPERTY(flags, flags, RO), + NI_DBUS_GENERIC_STRING_PROPERTY(netdev, device, link.lowerdev.name, RO), + MACVLAN_UINT32_PROPERTY(mode, RO), + MACVLAN_UINT16_PROPERTY(flags, RO), { NULL } }; diff --git a/src/ifconfig.c b/src/ifconfig.c index 2ad330859..8e18037ff 100644 --- a/src/ifconfig.c +++ b/src/ifconfig.c @@ -352,14 +352,17 @@ ni_system_vlan_delete(ni_netdev_t *dev) * Create a macvlan interface */ int -ni_system_macvlan_create(ni_netconfig_t *nc, const char *ifname, - const ni_macvlan_t *cfg, ni_netdev_t **dev_ret) +ni_system_macvlan_create(ni_netconfig_t *nc, const ni_netdev_t *cfg, + ni_netdev_t **dev_ret) { - ni_netdev_t *dev, *phys_dev; + ni_netdev_t *dev, *lowerdev; + + if (!nc || !dev_ret || !cfg || !cfg->name + || !cfg->macvlan || !cfg->link.lowerdev.name) *dev_ret = NULL; - dev = ni_netdev_by_name(nc, ifname); + dev = ni_netdev_by_name(nc, cfg->name); if (dev != NULL) { /* This is not necessarily an error */ if (dev->link.type == NI_IFTYPE_MACVLAN) { @@ -373,31 +376,31 @@ ni_system_macvlan_create(ni_netconfig_t *nc, const char *ifname, return -NI_ERROR_DEVICE_EXISTS; } - phys_dev = ni_netdev_by_name(nc, cfg->parent.name); - if (!phys_dev || !phys_dev->link.ifindex) { - ni_error("Cannot create macvlan %s: cannot find base interface %s", - ifname, cfg->parent.name); + lowerdev = ni_netdev_by_name(nc, cfg->link.lowerdev.name); + if (!lowerdev || !lowerdev->link.ifindex) { + ni_error("Cannot create macvlan %s: cannot find lower interface %s", + cfg->name, cfg->link.lowerdev.name); return -NI_ERROR_DEVICE_NOT_KNOWN; } - ni_debug_ifconfig("%s: creating macvlan interface", ifname); - if (__ni_rtnl_link_create_macvlan(ifname, cfg, phys_dev->link.ifindex)) { - ni_error("unable to create macvlan interface %s", ifname); + ni_debug_ifconfig("%s: creating macvlan interface", cfg->name); + if (__ni_rtnl_link_create_macvlan(cfg->name, cfg->macvlan, lowerdev->link.ifindex)) { + ni_error("unable to create macvlan interface %s", cfg->name); return -1; } /* Refresh interface status */ __ni_system_refresh_interfaces(nc); - dev = ni_netdev_by_name(nc, ifname); + dev = ni_netdev_by_name(nc, cfg->name); if (dev == NULL) { - ni_error("tried to create interface %s; still not found", ifname); + ni_error("tried to create interface %s; still not found", cfg->name); return -1; } if (!ni_netdev_get_macvlan(dev)) { ni_error("found new interface name %s but with type %s", - ifname, ni_linktype_type_to_name(dev->link.type)); + cfg->name, ni_linktype_type_to_name(dev->link.type)); return -1; } diff --git a/src/iflist.c b/src/iflist.c index 3fd4e69fd..2c58a479d 100644 --- a/src/iflist.c +++ b/src/iflist.c @@ -987,17 +987,17 @@ __ni_discover_macvlan(ni_netdev_t *dev, struct nlattr **tb, ni_netconfig_t *nc) } if (tb[IFLA_LINK]) { - macvlan->parent.index = nla_get_u32(tb[IFLA_LINK]); - if (nc && ni_netdev_ref_bind_ifname(&macvlan->parent, nc) < 0) { + dev->link.lowerdev.index = nla_get_u32(tb[IFLA_LINK]); + if (nc && ni_netdev_ref_bind_ifname(&dev->link.lowerdev, nc) < 0) { ni_debug_ifconfig("%s: cannot bind macvlan bind interface %u", - dev->name, macvlan->parent.index); - ni_string_free(&macvlan->parent.name); + dev->name, dev->link.lowerdev.index); + ni_string_free(&dev->link.lowerdev.name); /* Ignore error and proceed */ } } else { ni_error("%s: cannot find macvlan interface base link reference", dev->name); - ni_netdev_ref_destroy(&macvlan->parent); + ni_netdev_ref_destroy(&dev->link.lowerdev); } if (nla_parse_nested(info_data, IFLA_MACVLAN_MAX, link_info[IFLA_INFO_DATA], NULL) < 0) { diff --git a/src/macvlan.c b/src/macvlan.c index 860f2e310..18c8ac91c 100644 --- a/src/macvlan.c +++ b/src/macvlan.c @@ -63,7 +63,6 @@ void ni_macvlan_free(ni_macvlan_t *macvlan) { if (macvlan) { - ni_netdev_ref_destroy(&macvlan->parent); free(macvlan); } } @@ -74,9 +73,6 @@ ni_macvlan_validate(const ni_macvlan_t *macvlan) if (!macvlan) return "Uninitialized macvlan configuration"; - if (ni_string_empty(macvlan->parent.name)) - return "Invalid macvlan parent name"; - switch (macvlan->mode) { default: return "Invalid/unsupported macvlan mode";