Message ID | 20180117180225.25604-3-blp@ovn.org |
---|---|
State | Accepted |
Headers | show |
Series | Fix GRE tunnel MTU issues. | expand |
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>
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 --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);
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(+)