2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 07:45:30 +00:00

netdev: Pass class structure, instead of type, to "create" function.

This opens up the possibility of storing private data at a relative offset
to the class structure, instead of having to keep a separate table.
This commit is contained in:
Ben Pfaff
2010-09-24 10:54:42 -07:00
parent 6fcfff1b11
commit b8dcf5e9c5
5 changed files with 20 additions and 22 deletions

View File

@@ -487,8 +487,9 @@ netdev_linux_cache_cb(const struct rtnetlink_change *change,
/* Creates the netdev device of 'type' with 'name'. */
static int
netdev_linux_create_system(const char *name, const char *type OVS_UNUSED,
const struct shash *args, struct netdev_dev **netdev_devp)
netdev_linux_create_system(const struct netdev_class *class OVS_UNUSED,
const char *name, const struct shash *args,
struct netdev_dev **netdev_devp)
{
struct netdev_dev_linux *netdev_dev;
int error;
@@ -520,8 +521,9 @@ netdev_linux_create_system(const char *name, const char *type OVS_UNUSED,
* buffers, across all readers. Therefore once data is read it will
* be unavailable to other reads for tap devices. */
static int
netdev_linux_create_tap(const char *name, const char *type OVS_UNUSED,
const struct shash *args, struct netdev_dev **netdev_devp)
netdev_linux_create_tap(const struct netdev_class *class OVS_UNUSED,
const char *name, const struct shash *args,
struct netdev_dev **netdev_devp)
{
struct netdev_dev_linux *netdev_dev;
struct tap_state *state;

View File

@@ -85,8 +85,9 @@ parse_config(const char *name, const struct shash *args,
}
static int
netdev_patch_create(const char *name, const char *type OVS_UNUSED,
const struct shash *args, struct netdev_dev **netdev_devp)
netdev_patch_create(const struct netdev_class *class OVS_UNUSED,
const char *name, const struct shash *args,
struct netdev_dev **netdev_devp)
{
int err;
struct odp_vport_add ova;

View File

@@ -129,11 +129,11 @@ struct netdev_class {
* to be called. May be null if nothing is needed here. */
void (*wait)(void);
/* Attempts to create a network device of 'type' with 'name'.
* 'type' corresponds to the 'type' field used in the netdev_class
* structure. On success sets 'netdev_devp' to the newly created device. */
int (*create)(const char *name, const char *type, const struct shash *args,
struct netdev_dev **netdev_devp);
/* Attempts to create a network device named 'name' with initial 'args' in
* 'netdev_class'. On success sets 'netdev_devp' to the newly created
* device. */
int (*create)(const struct netdev_class *netdev_class, const char *name,
const struct shash *args, struct netdev_dev **netdev_devp);
/* Destroys 'netdev_dev'.
*

View File

@@ -39,7 +39,7 @@ struct netdev_tunnel {
struct netdev netdev;
};
static int netdev_tunnel_create(const char *name, const char *type,
static int netdev_tunnel_create(const struct netdev_class *, const char *name,
const struct shash *args, struct netdev_dev **);
static struct netdev_dev_tunnel *
@@ -155,7 +155,7 @@ parse_config(const char *name, const char *type, const struct shash *args,
}
static int
netdev_tunnel_create(const char *name, const char *type,
netdev_tunnel_create(const struct netdev_class *class, const char *name,
const struct shash *args, struct netdev_dev **netdev_devp)
{
int err;
@@ -163,11 +163,11 @@ netdev_tunnel_create(const char *name, const char *type,
struct tnl_port_config port_config;
struct netdev_dev_tunnel *netdev_dev;
ovs_strlcpy(ova.port_type, type, sizeof ova.port_type);
ovs_strlcpy(ova.port_type, class->type, sizeof ova.port_type);
ovs_strlcpy(ova.devname, name, sizeof ova.devname);
ova.config = &port_config;
err = parse_config(name, type, args, &port_config);
err = parse_config(name, class->type, args, &port_config);
if (err) {
return err;
}
@@ -190,12 +190,7 @@ netdev_tunnel_create(const char *name, const char *type,
netdev_dev = xmalloc(sizeof *netdev_dev);
if (!strcmp(type, "gre")) {
netdev_dev_init(&netdev_dev->netdev_dev, name, &netdev_gre_class);
} else {
netdev_dev_init(&netdev_dev->netdev_dev, name, &netdev_capwap_class);
}
netdev_dev_init(&netdev_dev->netdev_dev, name, class);
*netdev_devp = &netdev_dev->netdev_dev;
return 0;
}

View File

@@ -276,7 +276,7 @@ create_device(struct netdev_options *options, struct netdev_dev **netdev_devp)
return EAFNOSUPPORT;
}
return netdev_class->create(options->name, options->type, options->args,
return netdev_class->create(netdev_class, options->name, options->args,
netdev_devp);
}