Fix misspellings in comments and docs.
[sliver-openvswitch.git] / lib / netdev-provider.h
index 00799b1..137b659 100644 (file)
@@ -30,9 +30,8 @@ extern "C" {
 
 /* A network device (e.g. an Ethernet device).
  *
- * This structure should be treated as opaque by network device
- * implementations. */
-struct netdev_dev {
+ * Network device implementations should treat this structure as opaque. */
+struct netdev {
     char *name;                         /* Name of network device. */
     const struct netdev_class *netdev_class; /* Functions to control
                                                 this device. */
@@ -41,39 +40,20 @@ struct netdev_dev {
     struct list saved_flags_list; /* Contains "struct netdev_saved_flags". */
 };
 
-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_)
-{
-    ovs_assert(netdev_dev->netdev_class == class_);
-}
-
-/* A instance of an open network device.
- *
- * This structure should be treated as opaque by network device
- * implementations. */
-struct netdev {
-    struct netdev_dev *netdev_dev;   /* Parent netdev_dev. */
-    struct list node;                /* Element in global list. */
-};
-
-void netdev_init(struct netdev *, struct netdev_dev *);
-void netdev_uninit(struct netdev *, bool close);
-struct netdev_dev *netdev_get_dev(const struct netdev *);
+void netdev_init(struct netdev *, const char *name,
+                 const struct netdev_class *);
+void netdev_uninit(struct netdev *, bool destroy);
+const char *netdev_get_type(const struct netdev *);
+const struct netdev_class *netdev_get_class(const struct netdev *);
+const char *netdev_get_name(const struct netdev *);
+struct netdev *netdev_from_name(const char *name);
+void netdev_get_devices(const struct netdev_class *,
+                        struct shash *device_list);
 
 static inline void netdev_assert_class(const struct netdev *netdev,
-                                       const struct netdev_class *netdev_class)
+                                           const struct netdev_class *class_)
 {
-    netdev_dev_assert_class(netdev_get_dev(netdev), netdev_class);
+    ovs_assert(netdev->netdev_class == class_);
 }
 
 /* Network device class structure, to be defined by each implementation of a
@@ -110,96 +90,50 @@ struct netdev_class {
     void (*wait)(void);
 
     /* Attempts to create a network device named 'name' in 'netdev_class'.  On
-     * success sets 'netdev_devp' to the newly created device. */
+     * success sets 'netdevp' to the newly created device. */
     int (*create)(const struct netdev_class *netdev_class, const char *name,
-                  struct netdev_dev **netdev_devp);
+                  struct netdev **netdevp);
 
-    /* Destroys 'netdev_dev'.
+    /* Destroys 'netdev'.
      *
      * Netdev devices maintain a reference count that is incremented on
-     * netdev_open() and decremented on netdev_close().  If 'netdev_dev'
+     * netdev_open() and decremented on netdev_close().  If 'netdev'
      * has a non-zero reference count, then this function will not be
      * called. */
-    void (*destroy)(struct netdev_dev *netdev_dev);
+    void (*destroy)(struct netdev *netdev);
 
-    /* Fetches the device 'netdev_dev''s configuration, storing it in 'args'.
+    /* Fetches the device 'netdev''s configuration, storing it in 'args'.
      * The caller owns 'args' and pre-initializes it to an empty smap.
      *
      * If this netdev class does not have any configuration options, this may
      * be a null pointer. */
-    int (*get_config)(struct netdev_dev *netdev_dev, struct smap *args);
+    int (*get_config)(const struct netdev *netdev, struct smap *args);
 
-    /* Changes the device 'netdev_dev''s configuration to 'args'.
+    /* Changes the device 'netdev''s configuration to 'args'.
      *
      * If this netdev class does not support configuration, this may be a null
      * pointer. */
-    int (*set_config)(struct netdev_dev *netdev_dev, const struct smap *args);
+    int (*set_config)(struct netdev *netdev, const struct smap *args);
 
-    /* Returns the tunnel configuration of 'netdev_dev'.  If 'netdev_dev' is
+    /* Returns the tunnel configuration of 'netdev'.  If 'netdev' is
      * not a tunnel, returns null.
      *
      * If this function would always return null, it may be null instead. */
     const struct netdev_tunnel_config *
-        (*get_tunnel_config)(const struct netdev_dev *netdev_dev);
-
-    /* Attempts to open a network device.  On success, sets 'netdevp'
-     * to the new network device. */
-    int (*open)(struct netdev_dev *netdev_dev, struct netdev **netdevp);
+        (*get_tunnel_config)(const struct netdev *netdev);
 
-    /* Closes 'netdev'. */
-    void (*close)(struct netdev *netdev);
-\f
-/* ## ----------------- ## */
-/* ## Receiving Packets ## */
-/* ## ----------------- ## */
-
-/* The network provider interface is mostly used for inspecting and configuring
- * device "metadata", not for sending and receiving packets directly.  It may
- * be impractical to implement these functions on some operating systems and
- * hardware.  These functions may all be NULL in such cases.
- *
- * (However, the "dpif-netdev" implementation, which is the easiest way to
- * integrate Open vSwitch with a new operating system or hardware, does require
- * the ability to receive packets.) */
-
-    /* Attempts to set up 'netdev' for receiving packets with ->recv().
-     * Returns 0 if successful, otherwise a positive errno value.  Return
+    /* Attempts to open a netdev_rx for receiving packets from 'netdev'.
+     * Returns 0 if successful, otherwise a positive errno value.  Returns
      * EOPNOTSUPP to indicate that the 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 prevent the
      * network device from being usefully used by the netdev-based "userspace
-     * datapath".)*/
-    int (*listen)(struct netdev *netdev);
-
-    /* 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.
-     *
-     * Returns -EMSGSIZE, and discards the packet, if the received packet is
-     * longer than 'size' bytes.
-     *
-     * This function can only be expected to return a packet if ->listen() has
-     * been called successfully.
-     *
-     * May be null if not needed, such as for a network device that does not
-     * implement packet reception through the 'recv' member function. */
-    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'.
+     * datapath".)
      *
-     * 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);
+     * On success, the implementation must set '*rxp' to a 'netdev_rx' for
+     * 'netdev' that it has already initialized (with netdev_rx_init()). */
+    int (*rx_open)(struct netdev *netdev, struct netdev_rx **rxp);
 
-    /* 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);
-\f
     /* Sends the 'size'-byte packet in 'buffer' on 'netdev'.  Returns 0 if
      * successful, otherwise a positive errno value.  Returns EAGAIN without
      * blocking if the packet cannot be queued immediately.  Returns EMSGSIZE
@@ -536,7 +470,7 @@ struct netdev_class {
      * anyhow. */
     int (*add_router)(struct netdev *netdev, struct in_addr router);
 
-    /* Looks up the next hop for 'host'.  If succesful, stores the next hop
+    /* Looks up the next hop for 'host'.  If successful, stores the next hop
      * gateway's address (0 if 'host' is on a directly connected network) in
      * '*next_hop' and a copy of the name of the device to reach 'host' in
      * '*netdev_name', and returns 0.  The caller is responsible for freeing
@@ -570,14 +504,14 @@ struct netdev_class {
     int (*arp_lookup)(const struct netdev *netdev, ovs_be32 ip,
                       uint8_t mac[6]);
 
-    /* Retrieves the current set of flags on 'dev' into '*old_flags'.  Then,
+    /* Retrieves the current set of flags on 'netdev' into '*old_flags'.  Then,
      * turns off the flags that are set to 1 in 'off' and turns on the flags
      * that are set to 1 in 'on'.  (No bit will be set to 1 in both 'off' and
      * 'on'; that is, off & on == 0.)
      *
      * This function may be invoked from a signal handler.  Therefore, it
      * should not do anything that is not signal-safe (such as logging). */
-    int (*update_flags)(struct netdev_dev *dev, enum netdev_flags off,
+    int (*update_flags)(struct netdev *netdev, enum netdev_flags off,
                         enum netdev_flags on, enum netdev_flags *old_flags);
 
     /* Returns a sequence number which indicates changes in one of 'netdev''s
@@ -591,6 +525,48 @@ struct netdev_class {
      * change, although implementations should try to avoid this. */
     unsigned int (*change_seq)(const struct netdev *netdev);
 };
+\f
+/* A data structure for capturing packets received by a network device.
+ *
+ * This structure should be treated as opaque by network device
+ * implementations. */
+struct netdev_rx {
+    const struct netdev_rx_class *rx_class;
+    struct netdev *netdev;
+};
+
+void netdev_rx_init(struct netdev_rx *, struct netdev *,
+                    const struct netdev_rx_class *);
+void netdev_rx_uninit(struct netdev_rx *);
+struct netdev *netdev_rx_get_netdev(const struct netdev_rx *);
+
+struct netdev_rx_class {
+    /* Destroys 'rx'. */
+    void (*destroy)(struct netdev_rx *rx);
+
+    /* Attempts to receive a packet from 'rx' 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.
+     *
+     * Must return -EMSGSIZE, and discard the packet, if the received packet
+     * is longer than 'size' bytes. */
+    int (*recv)(struct netdev_rx *rx, 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_rx_recv()
+     * on 'rx'. */
+    void (*wait)(struct netdev_rx *rx);
+
+    /* Discards all packets waiting to be received from 'rx'. */
+    int (*drain)(struct netdev_rx *rx);
+};
+
+static inline void netdev_rx_assert_class(const struct netdev_rx *rx,
+                                          const struct netdev_rx_class *class_)
+{
+    ovs_assert(rx->rx_class == class_);
+}
 
 int netdev_register_provider(const struct netdev_class *);
 int netdev_unregister_provider(const char *type);
@@ -599,7 +575,7 @@ const struct netdev_class *netdev_lookup_provider(const char *type);
 extern const struct netdev_class netdev_linux_class;
 extern const struct netdev_class netdev_internal_class;
 extern const struct netdev_class netdev_tap_class;
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
 extern const struct netdev_class netdev_bsd_class;
 #endif