Skip to content

Commit

Permalink
macvlan: initial refactoring to use link.lowerdev
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Dec 11, 2013
1 parent 5077f15 commit 8243ae6
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 46 deletions.
1 change: 0 additions & 1 deletion include/wicked/macvlan.h
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions include/wicked/system.h
Expand Up @@ -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 **);
Expand Down
113 changes: 93 additions & 20 deletions src/dbus-objects/macvlan.c
Expand Up @@ -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,
Expand Down Expand Up @@ -157,30 +163,97 @@ 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;

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 }
};

Expand Down
31 changes: 17 additions & 14 deletions src/ifconfig.c
Expand Up @@ -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) {
Expand All @@ -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;
}

Expand Down
10 changes: 5 additions & 5 deletions src/iflist.c
Expand Up @@ -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) {
Expand Down
4 changes: 0 additions & 4 deletions src/macvlan.c
Expand Up @@ -63,7 +63,6 @@ void
ni_macvlan_free(ni_macvlan_t *macvlan)
{
if (macvlan) {
ni_netdev_ref_destroy(&macvlan->parent);
free(macvlan);
}
}
Expand All @@ -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";
Expand Down

0 comments on commit 8243ae6

Please sign in to comment.