From: Ben Pfaff Date: Fri, 24 Sep 2010 17:54:42 +0000 (-0700) Subject: netdev: Pass class structure, instead of type, to "create" function. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8dcf5e9c554e2c5fc35a68a086d304fc0cea59a;p=openvswitch 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. --- diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 2ea411dc..abfbe6ef 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -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; diff --git a/lib/netdev-patch.c b/lib/netdev-patch.c index 7e8b1990..5a0eea71 100644 --- a/lib/netdev-patch.c +++ b/lib/netdev-patch.c @@ -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; diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h index c0ed4ef6..8502da6b 100644 --- a/lib/netdev-provider.h +++ b/lib/netdev-provider.h @@ -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'. * diff --git a/lib/netdev-tunnel.c b/lib/netdev-tunnel.c index 079830e6..a2383a47 100644 --- a/lib/netdev-tunnel.c +++ b/lib/netdev-tunnel.c @@ -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; } diff --git a/lib/netdev.c b/lib/netdev.c index d516ff21..6d997e0e 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -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); }