From: Alex Wang Date: Tue, 29 Apr 2014 05:05:05 +0000 (-0700) Subject: dpif-linux: Fix a bug in creating port. X-Git-Tag: sliver-openvswitch-2.2.90-1~3^2~50 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=aeaae11fceb0939001705b7e4024cff37dd94c5c;ds=sidebyside 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 --- 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);