fix warning
[sliver-openvswitch.git] / lib / netdev.h
index 86924aa..287f6cc 100644 (file)
@@ -31,8 +31,27 @@ extern "C" {
  * Every port on a switch must have a corresponding netdev that must minimally
  * support a few operations, such as the ability to read the netdev's MTU.
  * The PORTING file at the top of the source tree has more information in the
- * "Writing a netdev Provider" section. */
+ * "Writing a netdev Provider" section.
+ *
+ * Thread-safety
+ * =============
+ *
+ * Most of the netdev functions are fully thread-safe: they may be called from
+ * any number of threads on the same or different netdev objects.  The
+ * exceptions are:
+ *
+ *    netdev_rx_recv()
+ *    netdev_rx_wait()
+ *    netdev_rx_drain()
+ *
+ *      These functions are conditionally thread-safe: they may be called from
+ *      different threads only on different netdev_rx objects.  (The client may
+ *      create multiple netdev_rx objects for a single netdev and access each
+ *      of those from a different thread.) */
 
+struct netdev;
+struct netdev_class;
+struct netdev_rx;
 struct netdev_saved_flags;
 struct ofpbuf;
 struct in_addr;
@@ -99,16 +118,15 @@ struct netdev_tunnel_config {
     bool dont_fragment;
 };
 
-struct netdev;
-struct netdev_class;
-
 void netdev_run(void);
 void netdev_wait(void);
 
 void netdev_enumerate_types(struct sset *types);
+bool netdev_is_reserved_name(const char *name);
 
 /* Open and close. */
 int netdev_open(const char *name, const char *type, struct netdev **);
+struct netdev *netdev_ref(const struct netdev *);
 void netdev_close(struct netdev *);
 
 void netdev_parse_name(const char *netdev_name, char **name, char **type);
@@ -127,12 +145,17 @@ int netdev_get_mtu(const struct netdev *, int *mtup);
 int netdev_set_mtu(const struct netdev *, int mtu);
 int netdev_get_ifindex(const struct netdev *);
 
-/* Packet send and receive. */
-int netdev_listen(struct netdev *);
-int netdev_recv(struct netdev *, struct ofpbuf *);
-void netdev_recv_wait(struct netdev *);
-int netdev_drain(struct netdev *);
+/* Packet reception. */
+int netdev_rx_open(struct netdev *, struct netdev_rx **);
+void netdev_rx_close(struct netdev_rx *);
 
+const char *netdev_rx_get_name(const struct netdev_rx *);
+
+int netdev_rx_recv(struct netdev_rx *, struct ofpbuf *);
+void netdev_rx_wait(struct netdev_rx *);
+int netdev_rx_drain(struct netdev_rx *);
+
+/* Packet transmission. */
 int netdev_send(struct netdev *, const struct ofpbuf *);
 void netdev_send_wait(struct netdev *);
 
@@ -220,6 +243,9 @@ struct netdev_queue_stats {
     uint64_t tx_bytes;
     uint64_t tx_packets;
     uint64_t tx_errors;
+
+    /* Time at which the queue was created, in msecs, LLONG_MIN if unknown. */
+    long long int created;
 };
 
 int netdev_set_policing(struct netdev *, uint32_t kbits_rate,