2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 07:45:30 +00:00

dpif-netlink-rtnl: Retry smaller MTU when default MAX_MTU is too large.

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@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
This commit is contained in:
Yifeng Sun
2018-07-06 08:28:27 -07:00
committed by Ben Pfaff
parent 9c937ec56f
commit def5b366a3

View File

@@ -281,6 +281,19 @@ dpif_netlink_rtnl_verify(const struct netdev_tunnel_config *tnl_cfg,
return err; return err;
} }
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 static int
dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg, dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
const char *name, enum ovs_vport_type type, const char *name, enum ovs_vport_type type,
@@ -354,15 +367,13 @@ dpif_netlink_rtnl_create(const struct netdev_tunnel_config *tnl_cfg,
type == OVS_VPORT_TYPE_IP6GRE)) { type == OVS_VPORT_TYPE_IP6GRE)) {
/* Work around a bug in kernel GRE driver, which ignores IFLA_MTU in /* Work around a bug in kernel GRE driver, which ignores IFLA_MTU in
* RTM_NEWLINK, by setting the MTU again. See * RTM_NEWLINK, by setting the MTU again. See
* https://bugzilla.redhat.com/show_bug.cgi?id=1488484. */ * https://bugzilla.redhat.com/show_bug.cgi?id=1488484.
ofpbuf_clear(&request); *
nl_msg_put_nlmsghdr(&request, 0, RTM_SETLINK, * In case of MAX_MTU exceeds hw max MTU, retry a smaller value. */
NLM_F_REQUEST | NLM_F_ACK); int err2 = rtnl_set_mtu(name, MAX_MTU, &request);
ofpbuf_put_zeros(&request, sizeof(struct ifinfomsg)); if (err2) {
nl_msg_put_string(&request, IFLA_IFNAME, name); err2 = rtnl_set_mtu(name, 1450, &request);
nl_msg_put_u32(&request, IFLA_MTU, MAX_MTU); }
int err2 = nl_transact(NETLINK_ROUTE, &request, NULL);
if (err2) { if (err2) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);