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 <gshe...@nicira.com> Signed-off-by: Alex Wang <al...@nicira.com> --- 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 a575b78..abb4b51 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); -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev