netdev: Allow get_ifindex and get_features to be null.
[sliver-openvswitch.git] / lib / netdev-provider.h
index 43a330c..5ec14d7 100644 (file)
 #include "list.h"
 #include "shash.h"
 
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
 struct arg {
     char *key;
     char *value;
@@ -36,7 +40,8 @@ struct arg {
  * 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. */
     struct arg *args;                   /* Argument list from last config. */
@@ -47,15 +52,16 @@ 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.
@@ -75,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.
@@ -170,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
@@ -191,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
@@ -200,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' */
@@ -223,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
@@ -239,7 +271,10 @@ struct netdev_class {
 
     /* 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);
@@ -357,5 +392,10 @@ 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_gre_class;
+extern const struct netdev_class netdev_patch_class;
+
+#ifdef  __cplusplus
+}
+#endif
 
 #endif /* netdev.h */