Skip to content

Commit

Permalink
macvlan: reduce number of linktype function calls
Browse files Browse the repository at this point in the history
  • Loading branch information
kmroz committed Mar 26, 2014
1 parent f0aa682 commit d78d148
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 26 deletions.
42 changes: 22 additions & 20 deletions src/dbus-objects/macvlan.c
Expand Up @@ -119,8 +119,11 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE
ni_netdev_t *dev_ifp = NULL;
const ni_macvlan_t *macvlan;
const char *err;
const char *cfg_ifp_iftype = NULL;
int rv;

cfg_ifp_iftype = ni_linktype_type_to_name(cfg_ifp->link.type);

if (ni_string_empty(cfg_ifp->link.lowerdev.name)) {
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Incomplete arguments: need a lower device name");
Expand All @@ -129,7 +132,7 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE
if (ni_netdev_ref_bind_ifindex(&cfg_ifp->link.lowerdev, nc) < 0) {
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Unable to find %s lower device %s by name",
ni_linktype_type_to_name(cfg_ifp->link.type),
cfg_ifp_iftype,
cfg_ifp->link.lowerdev.name);
return NULL;
}
Expand All @@ -144,14 +147,14 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE
if (ni_string_empty(cfg_ifp->name) &&
(ifname = ni_netdev_make_name(
nc,
ni_linktype_type_to_name(cfg_ifp->link.type),
cfg_ifp_iftype,
0))) {
ni_string_dup(&cfg_ifp->name, ifname);
} else {
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Unable to create %s interface: "
"name argument missed",
ni_linktype_type_to_name(cfg_ifp->link.type));
cfg_ifp_iftype);
goto out;
}
ifname = NULL;
Expand All @@ -162,7 +165,7 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Cannot create %s interface: "
"macvlan name %s equal with lower device name",
ni_linktype_type_to_name(cfg_ifp->link.type),
cfg_ifp_iftype,
cfg_ifp->name);
return NULL;
}
Expand All @@ -175,7 +178,7 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Cannot create %s interface: "
"invalid ethernet address '%s'",
ni_linktype_type_to_name(cfg_ifp->link.type),
cfg_ifp_iftype,
ni_link_address_print(&cfg_ifp->link.hwaddr));
return NULL;
}
Expand All @@ -186,20 +189,20 @@ __ni_objectmodel_macvlan_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusE
|| (ifname && dev_ifp && !ni_string_eq(dev_ifp->name, ifname))) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"Unable to create %s interface: %s",
ni_linktype_type_to_name(cfg_ifp->link.type),
cfg_ifp_iftype,
ni_strerror(rv));
dev_ifp = NULL;
goto out;
}
ni_debug_dbus("%s interface exists (and name matches)",
ni_linktype_type_to_name(cfg_ifp->link.type));
cfg_ifp_iftype);
}

if (dev_ifp->link.type != cfg_ifp->link.type) {
dbus_set_error(error, DBUS_ERROR_FAILED,
"Unable to create %s interface: "
"new interface is of type %s",
ni_linktype_type_to_name(cfg_ifp->link.type),
cfg_ifp_iftype,
ni_linktype_type_to_name(dev_ifp->link.type));
dev_ifp = NULL;
}
Expand Down Expand Up @@ -259,6 +262,7 @@ __ni_objectmodel_macvlan_change(ni_netdev_t *cfg, ni_netdev_t *dev, DBusError *e
ni_netconfig_t *nc = ni_global_state_handle(0);
const char *err;
ni_macvlan_t *macvlan;
const char *dev_iftype = NULL;

macvlan = ni_netdev_get_macvlan(cfg);
if ((err = ni_macvlan_validate(macvlan))) {
Expand All @@ -270,16 +274,16 @@ __ni_objectmodel_macvlan_change(ni_netdev_t *cfg, ni_netdev_t *dev, DBusError *e
(cfg->link.lowerdev.index != dev->link.lowerdev.index)) ||
(cfg->link.lowerdev.name &&
!ni_string_eq(cfg->link.lowerdev.name, dev->link.lowerdev.name))) {
const char *cfg_iftype = ni_linktype_type_to_name(cfg->link.type);

if (cfg->link.lowerdev.name) {
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Cannot change %s lower device to %s",
ni_linktype_type_to_name(cfg->link.type),
cfg->link.lowerdev.name);
cfg_iftype, cfg->link.lowerdev.name);
} else {
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Cannot change %s lower device to %u",
ni_linktype_type_to_name(cfg->link.type),
cfg->link.lowerdev.index);
cfg_iftype, cfg->link.lowerdev.index);
}
return FALSE;
}
Expand All @@ -290,6 +294,8 @@ __ni_objectmodel_macvlan_change(ni_netdev_t *cfg, ni_netdev_t *dev, DBusError *e
if (ni_string_empty(cfg->name))
ni_string_dup(&cfg->name, dev->name);

dev_iftype = ni_linktype_type_to_name(dev->link.type);

if (!macvlan->mode) {
macvlan->mode = dev->macvlan->mode;
} else
Expand All @@ -298,34 +304,30 @@ __ni_objectmodel_macvlan_change(ni_netdev_t *cfg, ni_netdev_t *dev, DBusError *e
/* Passthrough mode can't be set or cleared dynamically */
dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
"Cannot change %s mode to %s",
ni_linktype_type_to_name(dev->link.type),
dev_iftype,
ni_macvlan_mode_to_name(macvlan->mode));
return FALSE;
}

if (ni_netdev_device_is_up(dev)) {
ni_debug_objectmodel("Skipping %s changeDevice call on %s: "
"device is up",
ni_linktype_type_to_name(dev->link.type),
dev->name);
"device is up", dev_iftype, dev->name);
return TRUE;
}

if (ni_system_macvlan_change(nc, dev, cfg) < 0) {
dbus_set_error(error,
DBUS_ERROR_FAILED,
"Unable to change %s properties on interface %s",
ni_linktype_type_to_name(dev->link.type),
dev->name);
dev_iftype, dev->name);
return FALSE;
}

if (cfg->link.hwaddr.type == ARPHRD_VOID)
cfg->link.hwaddr.type = ARPHRD_ETHER;
if (ni_system_hwaddr_change(nc, dev, &cfg->link.hwaddr) < 0) {
ni_error("Unable to change hwaddr on %s interface %s",
ni_linktype_type_to_name(dev->link.type),
dev->name);
dev_iftype, dev->name);
/* fail? */
}

Expand Down
14 changes: 8 additions & 6 deletions src/ifconfig.c
Expand Up @@ -383,6 +383,7 @@ ni_system_macvlan_create(ni_netconfig_t *nc, const ni_netdev_t *cfg,
ni_netdev_t **dev_ret)
{
ni_netdev_t *dev;
const char *cfg_iftype = NULL;

if (!nc || !dev_ret || !cfg || !cfg->name || !cfg->macvlan
|| !cfg->link.lowerdev.name || !cfg->link.lowerdev.index)
Expand All @@ -392,24 +393,25 @@ ni_system_macvlan_create(ni_netconfig_t *nc, const ni_netdev_t *cfg,

dev = ni_netdev_by_name(nc, cfg->name);
if (dev != NULL) {
const char *dev_iftype = ni_linktype_type_to_name(dev->link.type);
/* This is not necessarily an error */
if (dev->link.type == cfg->link.type) {
ni_debug_ifconfig("A %s interface %s already exists",
ni_linktype_type_to_name(dev->link.type),
dev->name);
dev_iftype, dev->name);
*dev_ret = dev;
} else {
ni_error("A %s interface with the name %s already exists",
ni_linktype_type_to_name(dev->link.type), dev->name);
dev_iftype, dev->name);
}
return -NI_ERROR_DEVICE_EXISTS;
}

ni_debug_ifconfig("%s: creating %s interface", cfg->name,
ni_linktype_type_to_name(cfg->link.type));
cfg_iftype = ni_linktype_type_to_name(cfg->link.type);
ni_debug_ifconfig("%s: creating %s interface", cfg->name, cfg_iftype);

if (__ni_rtnl_link_create(cfg)) {
ni_error("unable to create %s interface %s",
ni_linktype_type_to_name(cfg->link.type), cfg->name);
cfg_iftype, cfg->name);
return -1;
}

Expand Down

0 comments on commit d78d148

Please sign in to comment.