From aeaae11fceb0939001705b7e4024cff37dd94c5c Mon Sep 17 00:00:00 2001 From: Alex Wang Date: Mon, 28 Apr 2014 22:05:05 -0700 Subject: [PATCH] dpif-linux: Fix a bug in creating port. Based on the policy of 'OVS_VPORT_ATTR_UPCALL_PID', if upcall should not be sent to userspace (i.e. the number of handler threads is zero), the netlink message for creating vport should be an one-element array of value 0. However, dpif_linux_port_add__() fails to obey it and generates zero-payload netlink message which causes the netlink transaction failing with ERANGE error. This is particularly bad when the 'flow-restore-wait' is set during upgrade, since number of handler threads is not set in dpif-linux module and ovs is not able to add port in datapath until the 'flow-restore-wait' is disabled. Connection may lose due to this bug. This bug was introduced by commit 1579cf677fc (dpif-linux: Implement the API functions to allow multiple handler threads read upcall.). This commit fixes the bug by fixing the dpif_linux_port_add__() to generate the correct netlink message when the number of handler threads is not set. Bug #1239914. Bug #1240598. Bug #1240626. Reported-by: Gurucharan Shetty Signed-off-by: Alex Wang Acked-by: Ben Pfaff --- lib/dpif-linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index a575b788d..abb4b5190 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -676,7 +676,7 @@ dpif_linux_port_add__(struct dpif_linux *dpif, struct netdev *netdev, request.port_no = *port_nop; upcall_pids = vport_socksp_to_pids(socksp, dpif->n_handlers); - request.n_upcall_pids = dpif->n_handlers; + request.n_upcall_pids = socksp ? dpif->n_handlers : 1; request.upcall_pids = upcall_pids; error = dpif_linux_vport_transact(&request, &reply, &buf); -- 2.43.0