[ovs-dev] [PATCH] dpif-netlink-rtnl: Retry a smaller MTU for netdev when MAX_MTU is too large.

Gregory Rose gvrose8192 at gmail.com
Fri Jul 6 22:59:33 UTC 2018


On 7/5/2018 11:55 AM, Yifeng Sun wrote:
> 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 <pkusunyifeng at 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);
>   

This has been bugging me forever and I just never get around to fixing it.

Thanks!!!

- Greg


More information about the dev mailing list