patch: Remove veth driver.
[sliver-openvswitch.git] / lib / netdev-provider.h
index 4148c6c..024b1fb 100644 (file)
 #include "list.h"
 #include "shash.h"
 
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+struct arg {
+    char *key;
+    char *value;
+};
+
 /* A network device (e.g. an Ethernet device).
  *
  * This structure should be treated as opaque by network device
  * implementations. */
 struct netdev_dev {
     char *name;                         /* Name of network device. */
-    const struct netdev_class *class;   /* Functions to control this device. */
+    const struct netdev_class *netdev_class; /* Functions to control 
+                                                this device. */
     int ref_cnt;                        /* Times this devices was opened. */
     struct shash_node *node;            /* Pointer to element in global map. */
-    uint32_t args_hash;                 /* Hash of arguments for the device. */
+    struct arg *args;                   /* Argument list from last config. */
+    int n_args;                         /* Number of arguments in 'args'. */
 };
 
 void netdev_dev_init(struct netdev_dev *, const char *name,
                      const struct netdev_class *);
 void netdev_dev_uninit(struct netdev_dev *, bool destroy);
 const char *netdev_dev_get_type(const struct netdev_dev *);
+const struct netdev_class *netdev_dev_get_class(const struct netdev_dev *);
 const char *netdev_dev_get_name(const struct netdev_dev *);
+struct netdev_dev *netdev_dev_from_name(const char *name);
+void netdev_dev_get_devices(const struct netdev_class *,
+                            struct shash *device_list);
 
 static inline void netdev_dev_assert_class(const struct netdev_dev *netdev_dev,
-                                           const struct netdev_class *class)
+                                           const struct netdev_class *class_)
 {
-    assert(netdev_dev->class == class);
+    assert(netdev_dev->netdev_class == class_);
 }
 
 /* A instance of an open network device.
@@ -66,9 +81,9 @@ void netdev_uninit(struct netdev *, bool close);
 struct netdev_dev *netdev_get_dev(const struct netdev *);
 
 static inline void netdev_assert_class(const struct netdev *netdev,
-                                       const struct netdev_class *class)
+                                       const struct netdev_class *netdev_class)
 {
-    netdev_dev_assert_class(netdev_get_dev(netdev), class);
+    netdev_dev_assert_class(netdev_get_dev(netdev), netdev_class);
 }
 
 /* A network device notifier.
@@ -98,12 +113,12 @@ struct netdev_class {
      * the system. */
     const char *type;
 
-    /* Called only once, at program startup.  Returning an error from this
-     * function will prevent any network device in this class from being
-     * opened.
+    /* Called when the netdev provider is registered, typically at program
+     * startup.  Returning an error from this function will prevent any network
+     * device in this class from being opened.
      *
      * This function may be set to null if a network device class needs no
-     * initialization at program startup. */
+     * initialization at registration time. */
     int (*init)(void);
 
     /* Performs periodic work needed by netdevs of this class.  May be null if
@@ -161,15 +176,28 @@ struct netdev_class {
     /* Attempts to receive a packet from 'netdev' into the 'size' bytes in
      * 'buffer'.  If successful, returns the number of bytes in the received
      * packet, otherwise a negative errno value.  Returns -EAGAIN immediately
-     * if no packet is ready to be received. */
+     * if no packet is ready to be received.
+     *
+     * May return -EOPNOTSUPP if a network device does not implement packet
+     * reception through this interface.  This function may be set to null if
+     * it would always return -EOPNOTSUPP anyhow.  (This will disable the OVS
+     * integrated DHCP client and OpenFlow controller discovery, and prevent
+     * the network device from being usefully used by the netdev-based
+     * "userspace datapath".) */
     int (*recv)(struct netdev *netdev, void *buffer, size_t size);
 
     /* Registers with the poll loop to wake up from the next call to
      * poll_block() when a packet is ready to be received with netdev_recv() on
-     * 'netdev'. */
+     * 'netdev'.
+     *
+     * May be null if not needed, such as for a network device that does not
+     * implement packet reception through the 'recv' member function. */
     void (*recv_wait)(struct netdev *netdev);
 
-    /* Discards all packets waiting to be received from 'netdev'. */
+    /* Discards all packets waiting to be received from 'netdev'.
+     *
+     * May be null if not needed, such as for a network device that does not
+     * implement packet reception through the 'recv' member function. */
     int (*drain)(struct netdev *netdev);
 
     /* Sends the 'size'-byte packet in 'buffer' on 'netdev'.  Returns 0 if
@@ -182,7 +210,14 @@ struct netdev_class {
      *
      * The network device is expected to maintain a packet transmission queue,
      * so that the caller does not ordinarily have to do additional queuing of
-     * packets. */
+     * packets.
+     *
+     * May return EOPNOTSUPP if a network device does not implement packet
+     * transmission through this interface.  This function may be set to null
+     * if it would always return EOPNOTSUPP anyhow.  (This will disable the OVS
+     * integrated DHCP client and OpenFlow controller discovery, and prevent
+     * the network device from being usefully used by the netdev-based
+     * "userspace datapath".) */
     int (*send)(struct netdev *netdev, const void *buffer, size_t size);
 
     /* Registers with the poll loop to wake up from the next call to
@@ -191,7 +226,10 @@ struct netdev_class {
      *
      * The network device is expected to maintain a packet transmission queue,
      * so that the caller does not ordinarily have to do additional queuing of
-     * packets.  Thus, this function is unlikely to ever be useful. */
+     * packets.  Thus, this function is unlikely to ever be useful.
+     *
+     * May be null if not needed, such as for a network device that does not
+     * implement packet transmission through the 'send' member function. */
     void (*send_wait)(struct netdev *netdev);
 
     /* Sets 'netdev''s Ethernet address to 'mac' */
@@ -214,7 +252,10 @@ struct netdev_class {
      * specified by POSIX for if_nametoindex() and by SNMP for ifIndex.  An
      * ifindex value should be unique within a host and remain stable at least
      * until reboot.  SNMP says an ifindex "ranges between 1 and the value of
-     * ifNumber" but many systems do not follow this rule anyhow. */
+     * ifNumber" but many systems do not follow this rule anyhow.
+     *
+     * This function may be set to null if it would always return -EOPNOTSUPP.
+     */
     int (*get_ifindex)(const struct netdev *netdev);
 
     /* Sets 'carrier' to true if carrier is active (link light is on) on
@@ -228,9 +269,20 @@ struct netdev_class {
      * (UINT64_MAX). */
     int (*get_stats)(const struct netdev *netdev, struct netdev_stats *);
 
+    /* Sets the device stats for 'netdev' to 'stats'.
+     *
+     * Most network devices won't support this feature and will set this
+     * function pointer to NULL, which is equivalent to returning EOPNOTSUPP.
+     *
+     * Some network devices might only allow setting their stats to 0. */
+    int (*set_stats)(struct netdev *netdev, const struct netdev_stats *);
+
     /* Stores the features supported by 'netdev' into each of '*current',
      * '*advertised', '*supported', and '*peer'.  Each value is a bitmap of
-     * "enum ofp_port_features" bits, in host byte order. */
+     * "enum ofp_port_features" bits, in host byte order.
+     *
+     * This function may be set to null if it would always return EOPNOTSUPP.
+     */
     int (*get_features)(struct netdev *netdev,
                         uint32_t *current, uint32_t *advertised,
                         uint32_t *supported, uint32_t *peer);
@@ -347,6 +399,11 @@ struct netdev_class {
 
 extern const struct netdev_class netdev_linux_class;
 extern const struct netdev_class netdev_tap_class;
+extern const struct netdev_class netdev_patch_class;
 extern const struct netdev_class netdev_gre_class;
 
+#ifdef  __cplusplus
+}
+#endif
+
 #endif /* netdev.h */