diff mbox series

[ovs-dev,v3,2/2] dpif-netlink-rtnl: Work around MTU bug in kernel GRE driver.

Message ID 20180117180225.25604-3-blp@ovn.org
State Accepted
Headers show
Series Fix GRE tunnel MTU issues. | expand

Commit Message

Ben Pfaff Jan. 17, 2018, 6:02 p.m. UTC
The kernel GRE driver ignores IFLA_MTU in RTM_NEWLINK requests and
overrides the MTU to 1472 bytes.  This commit works around the problem by
following up a request to create a GRE device with a second request to set
the MTU.

Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1488484
Reported-by: Eric Garver <e@erig.me>
Reported-by: James Page <james.page@ubuntu.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
---
 lib/dpif-netlink-rtnl.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Eric Garver Jan. 18, 2018, 1:45 p.m. UTC | #1
On Wed, Jan 17, 2018 at 10:02:25AM -0800, Ben Pfaff wrote:
> The kernel GRE driver ignores IFLA_MTU in RTM_NEWLINK requests and
> overrides the MTU to 1472 bytes.  This commit works around the problem by
> following up a request to create a GRE device with a second request to set
> the MTU.
> 
> Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1488484
> Reported-by: Eric Garver <e@erig.me>
> Reported-by: James Page <james.page@ubuntu.com>
> Signed-off-by: Ben Pfaff <blp@ovn.org>
> ---
>  lib/dpif-netlink-rtnl.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
> index 37451b80de0e..40c456951827 100644
> --- a/lib/dpif-netlink-rtnl.c
> +++ b/lib/dpif-netlink-rtnl.c
> @@ -338,6 +338,25 @@ dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
>      nl_msg_end_nested(&request, linkinfo_off);
>  
>      err = nl_transact(NETLINK_ROUTE, &request, NULL);
> +    if (!err && type == OVS_VPORT_TYPE_GRE) {
> +        /* 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);
> +        if (err2) {
> +            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
> +
> +            VLOG_WARN_RL(&rl, "setting MTU of tunnel %s failed (%s)",
> +                         name, ovs_strerror(err2));
> +        }
> +    }
>  
>  exit:
>      ofpbuf_uninit(&request);
> -- 
> 2.10.2
>

Looks good. Thank Ben and James!
I just wanted to note that the above workaround also applies to GRE with
the "layer3" flag, but I don't think that was tested/verified by James.

Acked-by: Eric Garver <e@erig.me>
Ben Pfaff Jan. 18, 2018, 10:55 p.m. UTC | #2
On Thu, Jan 18, 2018 at 08:45:54AM -0500, Eric Garver wrote:
> On Wed, Jan 17, 2018 at 10:02:25AM -0800, Ben Pfaff wrote:
> > The kernel GRE driver ignores IFLA_MTU in RTM_NEWLINK requests and
> > overrides the MTU to 1472 bytes.  This commit works around the problem by
> > following up a request to create a GRE device with a second request to set
> > the MTU.
> > 
> > Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=1488484
> > Reported-by: Eric Garver <e@erig.me>
> > Reported-by: James Page <james.page@ubuntu.com>
> > Signed-off-by: Ben Pfaff <blp@ovn.org>
> > ---
> >  lib/dpif-netlink-rtnl.c | 19 +++++++++++++++++++
> >  1 file changed, 19 insertions(+)
> > 
> > diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
> > index 37451b80de0e..40c456951827 100644
> > --- a/lib/dpif-netlink-rtnl.c
> > +++ b/lib/dpif-netlink-rtnl.c
> > @@ -338,6 +338,25 @@ dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
> >      nl_msg_end_nested(&request, linkinfo_off);
> >  
> >      err = nl_transact(NETLINK_ROUTE, &request, NULL);
> > +    if (!err && type == OVS_VPORT_TYPE_GRE) {
> > +        /* 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);
> > +        if (err2) {
> > +            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
> > +
> > +            VLOG_WARN_RL(&rl, "setting MTU of tunnel %s failed (%s)",
> > +                         name, ovs_strerror(err2));
> > +        }
> > +    }
> >  
> >  exit:
> >      ofpbuf_uninit(&request);
> > -- 
> > 2.10.2
> >
> 
> Looks good. Thank Ben and James!
> I just wanted to note that the above workaround also applies to GRE with
> the "layer3" flag, but I don't think that was tested/verified by James.
> 
> Acked-by: Eric Garver <e@erig.me>

Thanks for the reviews.  I applied these patches to master.
diff mbox series

Patch

diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
index 37451b80de0e..40c456951827 100644
--- a/lib/dpif-netlink-rtnl.c
+++ b/lib/dpif-netlink-rtnl.c
@@ -338,6 +338,25 @@  dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
     nl_msg_end_nested(&request, linkinfo_off);
 
     err = nl_transact(NETLINK_ROUTE, &request, NULL);
+    if (!err && type == OVS_VPORT_TYPE_GRE) {
+        /* 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);
+        if (err2) {
+            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
+
+            VLOG_WARN_RL(&rl, "setting MTU of tunnel %s failed (%s)",
+                         name, ovs_strerror(err2));
+        }
+    }
 
 exit:
     ofpbuf_uninit(&request);