python: Implement write support in Python IDL for OVSDB.
[sliver-openvswitch.git] / lib / dpif-linux.c
index 9533e14..15a21e6 100644 (file)
@@ -44,6 +44,7 @@
 #include "netlink.h"
 #include "odp-util.h"
 #include "ofpbuf.h"
+#include "openvswitch/datapath-compat.h"
 #include "openvswitch/tunnel.h"
 #include "packets.h"
 #include "poll-loop.h"
@@ -137,7 +138,7 @@ struct dpif_linux {
 
     /* Change notification. */
     struct sset changed_ports;  /* Ports that have changed. */
-    struct nln_notifier port_notifier;
+    struct nln_notifier *port_notifier;
     bool change_error;
 
     /* Queue of unused ports. */
@@ -160,7 +161,7 @@ static struct nl_sock *genl_sock;
 static struct nln *nln = NULL;
 
 static int dpif_linux_init(void);
-static int open_dpif(const struct dpif_linux_dp *, struct dpif **);
+static void open_dpif(const struct dpif_linux_dp *, struct dpif **);
 static bool dpif_linux_nln_parse(struct ofpbuf *, void *);
 static void dpif_linux_port_changed(const void *vport, void *dpif);
 
@@ -243,25 +244,21 @@ dpif_linux_open(const struct dpif_class *class OVS_UNUSED, const char *name,
     if (error) {
         return error;
     }
-    error = open_dpif(&dp, dpifp);
-    ofpbuf_delete(buf);
 
-    return error;
+    open_dpif(&dp, dpifp);
+    ofpbuf_delete(buf);
+    return 0;
 }
 
-static int
+static void
 open_dpif(const struct dpif_linux_dp *dp, struct dpif **dpifp)
 {
     struct dpif_linux *dpif;
-    int error;
     int i;
 
     dpif = xmalloc(sizeof *dpif);
-    error = nln_notifier_register(nln, &dpif->port_notifier,
-                                  dpif_linux_port_changed, dpif);
-    if (error) {
-        goto error_free;
-    }
+    dpif->port_notifier = nln_notifier_create(nln, dpif_linux_port_changed,
+                                              dpif);
 
     dpif_init(&dpif->dpif, &dpif_linux_class, dp->name,
               dp->dp_ifindex, dp->dp_ifindex);
@@ -282,11 +279,6 @@ open_dpif(const struct dpif_linux_dp *dp, struct dpif **dpifp)
     for (i = 1; i < LRU_MAX_PORTS; i++) {
         dpif_linux_push_port(dpif, i);
     }
-    return 0;
-
-error_free:
-    free(dpif);
-    return error;
 }
 
 static void
@@ -294,10 +286,7 @@ dpif_linux_close(struct dpif *dpif_)
 {
     struct dpif_linux *dpif = dpif_linux_cast(dpif_);
 
-    if (nln) {
-        nln_notifier_unregister(nln, &dpif->port_notifier);
-    }
-
+    nln_notifier_destroy(dpif->port_notifier);
     nl_sock_destroy(dpif->mc_sock);
     sset_destroy(&dpif->changed_ports);
     free(dpif->lru_bitmap);
@@ -320,7 +309,7 @@ static void
 dpif_linux_run(struct dpif *dpif OVS_UNUSED)
 {
     if (nln) {
-        nln_notifier_run(nln);
+        nln_run(nln);
     }
 }
 
@@ -328,7 +317,7 @@ static void
 dpif_linux_wait(struct dpif *dpif OVS_UNUSED)
 {
     if (nln) {
-        nln_notifier_wait(nln);
+        nln_wait(nln);
     }
 }
 
@@ -463,12 +452,6 @@ dpif_linux_port_query__(const struct dpif *dpif, uint32_t port_no,
         dpif_port->name = xstrdup(reply.name);
         dpif_port->type = xstrdup(netdev_vport_get_netdev_type(&reply));
         dpif_port->port_no = reply.port_no;
-        if (reply.stats) {
-            netdev_stats_from_rtnl_link_stats64(&dpif_port->stats,
-                                                reply.stats);
-        } else {
-            memset(&dpif_port->stats, 0xff, sizeof dpif_port->stats);
-        }
         ofpbuf_delete(buf);
     }
     return error;
@@ -564,11 +547,6 @@ dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
     dpif_port->name = (char *) vport.name;
     dpif_port->type = (char *) netdev_vport_get_netdev_type(&vport);
     dpif_port->port_no = vport.port_no;
-    if (vport.stats) {
-        netdev_stats_from_rtnl_link_stats64(&dpif_port->stats, vport.stats);
-    } else {
-        memset(&dpif_port->stats, 0xff, sizeof dpif_port->stats);
-    }
     return 0;
 }
 
@@ -1137,7 +1115,8 @@ dpif_linux_init(void)
         }
         if (!error) {
             error = nl_lookup_genl_mcgroup(OVS_VPORT_FAMILY, OVS_VPORT_MCGROUP,
-                                           &ovs_vport_mcgroup);
+                                           &ovs_vport_mcgroup,
+                                           OVS_VPORT_MCGROUP_FALLBACK_ID);
         }
         if (!error) {
             static struct dpif_linux_vport vport;
@@ -1231,8 +1210,8 @@ dpif_linux_vport_from_ofpbuf(struct dpif_linux_vport *vport,
         [OVS_VPORT_ATTR_TYPE] = { .type = NL_A_U32 },
         [OVS_VPORT_ATTR_NAME] = { .type = NL_A_STRING, .max_len = IFNAMSIZ },
         [OVS_VPORT_ATTR_STATS] = { .type = NL_A_UNSPEC,
-                                   .min_len = sizeof(struct rtnl_link_stats64),
-                                   .max_len = sizeof(struct rtnl_link_stats64),
+                                   .min_len = sizeof(struct ovs_vport_stats),
+                                   .max_len = sizeof(struct ovs_vport_stats),
                                    .optional = true },
         [OVS_VPORT_ATTR_ADDRESS] = { .type = NL_A_UNSPEC,
                                      .min_len = ETH_ADDR_LEN,