netdev: Pass class structure, instead of type, to "create" function.
authorBen Pfaff <blp@nicira.com>
Fri, 24 Sep 2010 17:54:42 +0000 (10:54 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 6 Oct 2010 20:49:07 +0000 (13:49 -0700)
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.

lib/netdev-linux.c
lib/netdev-patch.c
lib/netdev-provider.h
lib/netdev-tunnel.c
lib/netdev.c

index 2ea411d..abfbe6e 100644 (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;
index 7e8b199..5a0eea7 100644 (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;
index c0ed4ef..8502da6 100644 (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'.
      *
index 079830e..a2383a4 100644 (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;
 }
index d516ff2..6d997e0 100644 (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);
 }