netdev-vport: Checks tunnel status change when route-table is reset.
[sliver-openvswitch.git] / lib / netdev-provider.h
index 943acc9..c2123dc 100644 (file)
 
 /* Generic interface to network devices. */
 
+#include "connectivity.h"
 #include "netdev.h"
 #include "list.h"
+#include "seq.h"
 #include "shash.h"
 #include "smap.h"
 
@@ -38,18 +40,38 @@ struct netdev {
     const struct netdev_class *netdev_class; /* Functions to control
                                                 this device. */
 
+    /* A sequence number which indicates changes in one of 'netdev''s
+     * properties.   It must be nonzero so that users have a value which
+     * they may use as a reset when tracking 'netdev'.
+     *
+     * Minimally, the sequence number is required to change whenever
+     * 'netdev''s flags, features, ethernet address, or carrier changes. */
+    uint64_t change_seq;
+
     /* The following are protected by 'netdev_mutex' (internal to netdev.c). */
+    int n_rxq;
     int ref_cnt;                        /* Times this devices was opened. */
     struct shash_node *node;            /* Pointer to element in global map. */
     struct list saved_flags_list; /* Contains "struct netdev_saved_flags". */
 };
 
+static void
+netdev_change_seq_changed(struct netdev *netdev)
+{
+    seq_change(connectivity_seq_get());
+    netdev->change_seq++;
+    if (!netdev->change_seq) {
+        netdev->change_seq++;
+    }
+}
+
 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);
+struct netdev **netdev_get_vports(size_t *size);
 
 /* A data structure for capturing packets received by a network device.
  *
@@ -59,6 +81,7 @@ void netdev_get_devices(const struct netdev_class *,
  * None of these members change during the lifetime of a struct netdev_rxq. */
 struct netdev_rxq {
     struct netdev *netdev;      /* Owns a reference to the netdev. */
+    int queue_id;
 };
 
 struct netdev *netdev_rxq_get_netdev(const struct netdev_rxq *);
@@ -127,6 +150,9 @@ struct netdev *netdev_rxq_get_netdev(const struct netdev_rxq *);
  *      implementation must not refer to base or derived state in the data
  *      structure, because it has already been uninitialized.
  *
+ * If netdev support multi-queue IO then netdev->construct should set initialize
+ * netdev->n_rxq to number of queues.
+ *
  * Each "alloc" function allocates and returns a new instance of the respective
  * data structure.  The "alloc" function is not given any information about the
  * use of the new data structure, so it cannot perform much initialization.