When MAX_MTU is larger than hw supported max MTU,
dpif_netlink_rtnl_create will fail. This leads to
testing failure '11: datapath - ping over gre tunnel'
in 'make check-kmod'.

This patch fixes this issue by retrying a smaller MTU
when MAX_MTU is too large.

Signed-off-by: Yifeng Sun <pkusunyif...@gmail.com>
---
 lib/dpif-netlink-rtnl.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
index bec3fce91e38..8304e7fb3826 100644
--- a/lib/dpif-netlink-rtnl.c
+++ b/lib/dpif-netlink-rtnl.c
@@ -282,6 +282,19 @@ dpif_netlink_rtnl_verify(const struct netdev_tunnel_config 
*tnl_cfg,
 }
 
 static int
+rtnl_set_mtu(const char *name, uint32_t mtu, struct ofpbuf *request)
+{
+    ofpbuf_clear(request);
+    nl_msg_put_nlmsghdr(request, 0, RTM_SETLINK,
+                        NLM_F_REQUEST | NLM_F_ACK);
+    ofpbuf_put_zeros(request, sizeof(struct ifinfomsg));
+    nl_msg_put_string(request, IFLA_IFNAME, name);
+    nl_msg_put_u32(request, IFLA_MTU, mtu);
+
+    return nl_transact(NETLINK_ROUTE, request, NULL);
+}
+
+static int
 dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
                          const char *name, enum ovs_vport_type type,
                          const char *kind, uint32_t flags)
@@ -354,15 +367,11 @@ dpif_netlink_rtnl_create(const struct 
netdev_tunnel_config *tnl_cfg,
                  type == OVS_VPORT_TYPE_IP6GRE)) {
         /* Work around a bug in kernel GRE driver, which ignores IFLA_MTU in
          * RTM_NEWLINK, by setting the MTU again.  See
-         * https://bugzilla.redhat.com/show_bug.cgi?id=1488484. */
-        ofpbuf_clear(&request);
-        nl_msg_put_nlmsghdr(&request, 0, RTM_SETLINK,
-                            NLM_F_REQUEST | NLM_F_ACK);
-        ofpbuf_put_zeros(&request, sizeof(struct ifinfomsg));
-        nl_msg_put_string(&request, IFLA_IFNAME, name);
-        nl_msg_put_u32(&request, IFLA_MTU, MAX_MTU);
-
-        int err2 = nl_transact(NETLINK_ROUTE, &request, NULL);
+         * https://bugzilla.redhat.com/show_bug.cgi?id=1488484.
+         *
+         * In case of MAX_MTU exceeds hw max MTU, retry a smaller value. */
+        int err2 = rtnl_set_mtu(name, MAX_MTU, &request) &&
+                   rtnl_set_mtu(name, 1450, &request);
         if (err2) {
             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
 
-- 
2.7.4

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to