patch: Remove veth driver.
[sliver-openvswitch.git] / lib / netdev-provider.h
index 1eb1b1e..024b1fb 100644 (file)
@@ -52,6 +52,7 @@ 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 *,
@@ -175,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
@@ -196,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
@@ -205,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' */
@@ -228,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
@@ -242,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);
@@ -361,6 +399,7 @@ 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