Fixes:
https://github.com/openvswitch/ovs-issues/issues/164

Signed-off-by: Alin Gabriel Serdean <[email protected]>
---
 lib/dpif-netlink.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 57 insertions(+), 1 deletion(-)

diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index 69c145cc3..5994c3445 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -246,6 +246,38 @@ static int dpif_netlink_port_query__(const struct 
dpif_netlink *dpif,
                                      odp_port_t port_no, const char *port_name,
                                      struct dpif_port *dpif_port);
 
+
+static struct nl_sock *
+vport_create_socksp_windows(struct dpif_netlink *dpif, int *error)
+OVS_REQ_WRLOCK(dpif->upcall_lock)
+{
+    struct nl_sock *socksp;
+    size_t i;
+    /* Pick netlink sockets to use in a round-robin fashion from each
+     * handler's pool of sockets. */
+    struct dpif_handler *handler = &dpif->handlers[0];
+    struct dpif_windows_vport_sock *sock_pool = handler->vport_sock_pool;
+    size_t index = handler->last_used_pool_idx;
+    /* A pool of sockets is allocated when the handler is initialized. */
+    if (sock_pool == NULL) {
+        *error = EINVAL;
+        return NULL;
+    }
+    ovs_assert(index < VPORT_SOCK_POOL_SIZE);
+    socksp = sock_pool[index].nl_sock;
+    ovs_assert(socksp);
+    index = (index == VPORT_SOCK_POOL_SIZE - 1) ? 0 : index + 1;
+    handler->last_used_pool_idx = index;
+    *error = 0;
+    return socksp;
+}
+static void
+vport_del_socksp_windows(struct dpif_netlink *dpif, struct nl_sock *socksp)
+{
+    socksp = NULL;
+}
+
+
 static struct dpif_netlink *
 dpif_netlink_cast(const struct dpif *dpif)
 {
@@ -716,7 +748,12 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const 
char *name,
     int error = 0;
 
     if (dpif->handlers) {
-        if (nl_sock_create(NETLINK_GENERIC, &socksp)) {
+#ifdef _WIN32
+        socksp = vport_create_socksp_windows(dpif, &error);
+#else
+        error = nl_sock_create(NETLINK_GENERIC, &socksp);
+#endif
+        if (!socksp) {
             return error;
         }
     }
@@ -748,7 +785,11 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const 
char *name,
                       dpif_name(&dpif->dpif), *port_nop);
         }
 
+#ifdef _WIN32
+        vport_del_socksp_windows(dpif, socksp);
+#else
         nl_sock_destroy(socksp);
+#endif
         goto exit;
     }
 
@@ -763,7 +804,11 @@ dpif_netlink_port_add__(struct dpif_netlink *dpif, const 
char *name,
         request.dp_ifindex = dpif->dp_ifindex;
         request.port_no = *port_nop;
         dpif_netlink_vport_transact(&request, NULL, NULL);
+#ifdef _WIN32
+        vport_del_socksp_windows(dpif, socksp);
+#else
         nl_sock_destroy(socksp);
+#endif
         goto exit;
     }
 
@@ -2249,15 +2294,26 @@ dpif_netlink_refresh_channels(struct dpif_netlink 
*dpif, uint32_t n_handlers)
             || !vport_get_pid(dpif, port_no, &upcall_pid)) {
             struct nl_sock *socksp;
 
+#ifdef _WIN32
+            socksp = vport_create_socksp_windows(dpif, &error);
+            if (!socksp) {
+                goto error;
+            }
+#else
             if (nl_sock_create(NETLINK_GENERIC, &socksp)) {
                 goto error;
             }
+#endif
 
             error = vport_add_channel(dpif, vport.port_no, socksp);
             if (error) {
                 VLOG_INFO("%s: could not add channels for port %s",
                           dpif_name(&dpif->dpif), vport.name);
+#ifdef _WIN32
+                vport_del_socksp_windows(dpif, socksp);
+#else
                 nl_sock_destroy(socksp);
+#endif
                 retval = error;
                 goto error;
             }
-- 
2.16.1.windows.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to