* 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;
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);
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 *);
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,