* [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device
@ 2018-04-19 12:42 Alexey Kodanev
2018-04-19 12:42 ` [PATCH net-next 1/4] geneve: remove white-space before '#if IS_ENABLED(CONFIG_IPV6)' Alexey Kodanev
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Alexey Kodanev @ 2018-04-19 12:42 UTC (permalink / raw)
To: netdev; +Cc: David Miller, Alexey Kodanev
The first two patches don't introduce any functional changes and
contain minor cleanups for code readability.
The last one adds a new function geneve_link_config() similar to the
other tunnels. The function will be used on a new link creation or
when 'remote' parameter is changed. It adjusts a user specified MTU
or, if it finds a lower device, tunes the tunnel MTU using it.
Alexey Kodanev (4):
geneve: remove white-space before '#if IS_ENABLED(CONFIG_IPV6)'
geneve: cleanup hard coded value for Ethernet header length
geneve: check MTU for a minimum in geneve_change_mtu()
geneve: configure MTU based on a lower device
drivers/net/geneve.c | 72 ++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 61 insertions(+), 11 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH net-next 1/4] geneve: remove white-space before '#if IS_ENABLED(CONFIG_IPV6)' 2018-04-19 12:42 [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device Alexey Kodanev @ 2018-04-19 12:42 ` Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 2/4] geneve: cleanup hard coded value for Ethernet header length Alexey Kodanev ` (3 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: Alexey Kodanev @ 2018-04-19 12:42 UTC (permalink / raw) To: netdev; +Cc: David Miller, Alexey Kodanev Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com> --- drivers/net/geneve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index b919e89..45acdc9 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -1261,7 +1261,7 @@ static int geneve_nl2info(struct nlattr *tb[], struct nlattr *data[], } if (data[IFLA_GENEVE_REMOTE6]) { - #if IS_ENABLED(CONFIG_IPV6) +#if IS_ENABLED(CONFIG_IPV6) if (changelink && (ip_tunnel_info_af(info) == AF_INET)) { attrtype = IFLA_GENEVE_REMOTE6; goto change_notsup; -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 2/4] geneve: cleanup hard coded value for Ethernet header length 2018-04-19 12:42 [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 1/4] geneve: remove white-space before '#if IS_ENABLED(CONFIG_IPV6)' Alexey Kodanev @ 2018-04-19 12:42 ` Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 3/4] geneve: check MTU for a minimum in geneve_change_mtu() Alexey Kodanev ` (2 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: Alexey Kodanev @ 2018-04-19 12:42 UTC (permalink / raw) To: netdev; +Cc: David Miller, Alexey Kodanev Use ETH_HLEN instead and introduce two new macros: GENEVE_IPV4_HLEN and GENEVE_IPV6_HLEN that include Ethernet header length, corresponded IP header length and GENEVE_BASE_HLEN. Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com> --- drivers/net/geneve.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 45acdc9..b650f84 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -36,6 +36,8 @@ #define GENEVE_VER 0 #define GENEVE_BASE_HLEN (sizeof(struct udphdr) + sizeof(struct genevehdr)) +#define GENEVE_IPV4_HLEN (ETH_HLEN + sizeof(struct iphdr) + GENEVE_BASE_HLEN) +#define GENEVE_IPV6_HLEN (ETH_HLEN + sizeof(struct ipv6hdr) + GENEVE_BASE_HLEN) /* per-network namespace private data for this module */ struct geneve_net { @@ -826,8 +828,8 @@ static int geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev, return PTR_ERR(rt); if (skb_dst(skb)) { - int mtu = dst_mtu(&rt->dst) - sizeof(struct iphdr) - - GENEVE_BASE_HLEN - info->options_len - 14; + int mtu = dst_mtu(&rt->dst) - GENEVE_IPV4_HLEN - + info->options_len; skb_dst_update_pmtu(skb, mtu); } @@ -872,8 +874,7 @@ static int geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev, return PTR_ERR(dst); if (skb_dst(skb)) { - int mtu = dst_mtu(dst) - sizeof(struct ipv6hdr) - - GENEVE_BASE_HLEN - info->options_len - 14; + int mtu = dst_mtu(dst) - GENEVE_IPV6_HLEN - info->options_len; skb_dst_update_pmtu(skb, mtu); } -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 3/4] geneve: check MTU for a minimum in geneve_change_mtu() 2018-04-19 12:42 [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 1/4] geneve: remove white-space before '#if IS_ENABLED(CONFIG_IPV6)' Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 2/4] geneve: cleanup hard coded value for Ethernet header length Alexey Kodanev @ 2018-04-19 12:42 ` Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 4/4] geneve: configure MTU based on a lower device Alexey Kodanev 2018-04-20 15:19 ` [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with " David Miller 4 siblings, 0 replies; 6+ messages in thread From: Alexey Kodanev @ 2018-04-19 12:42 UTC (permalink / raw) To: netdev; +Cc: David Miller, Alexey Kodanev geneve_change_mtu() will be used not only as ndo_change_mtu() callback, but also to verify a user specified MTU on a new link creation in the next patch. Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com> --- drivers/net/geneve.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index b650f84..ae649f6 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -942,11 +942,10 @@ static netdev_tx_t geneve_xmit(struct sk_buff *skb, struct net_device *dev) static int geneve_change_mtu(struct net_device *dev, int new_mtu) { - /* Only possible if called internally, ndo_change_mtu path's new_mtu - * is guaranteed to be between dev->min_mtu and dev->max_mtu. - */ if (new_mtu > dev->max_mtu) new_mtu = dev->max_mtu; + else if (new_mtu < dev->min_mtu) + new_mtu = dev->min_mtu; dev->mtu = new_mtu; return 0; -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next 4/4] geneve: configure MTU based on a lower device 2018-04-19 12:42 [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device Alexey Kodanev ` (2 preceding siblings ...) 2018-04-19 12:42 ` [PATCH net-next 3/4] geneve: check MTU for a minimum in geneve_change_mtu() Alexey Kodanev @ 2018-04-19 12:42 ` Alexey Kodanev 2018-04-20 15:19 ` [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with " David Miller 4 siblings, 0 replies; 6+ messages in thread From: Alexey Kodanev @ 2018-04-19 12:42 UTC (permalink / raw) To: netdev; +Cc: David Miller, Alexey Kodanev Currently, on a new link creation or when 'remote' address parameter is updated, an MTU is not changed and always equals 1500. When a lower device has a larger MTU, it might not be efficient, e.g. for UDP, and requires the manual MTU adjustments to match the MTU of the lower device. This patch tries to automate this process, finds a lower device using the 'remote' address parameter, then uses its MTU to tune GENEVE's MTU: * on a new link creation * when 'remote' parameter is changed Also with this patch, the MTU from a user, on a new link creation, is passed to geneve_change_mtu() where it is verified, and MTU adjustments with a lower device is skipped in that case. Prior that change, it was possible to set the invalid MTU values on a new link creation. Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com> --- drivers/net/geneve.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index ae649f6..750eaa5 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -1387,6 +1387,48 @@ static int geneve_nl2info(struct nlattr *tb[], struct nlattr *data[], return -EOPNOTSUPP; } +static void geneve_link_config(struct net_device *dev, + struct ip_tunnel_info *info, struct nlattr *tb[]) +{ + struct geneve_dev *geneve = netdev_priv(dev); + int ldev_mtu = 0; + + if (tb[IFLA_MTU]) { + geneve_change_mtu(dev, nla_get_u32(tb[IFLA_MTU])); + return; + } + + switch (ip_tunnel_info_af(info)) { + case AF_INET: { + struct flowi4 fl4 = { .daddr = info->key.u.ipv4.dst }; + struct rtable *rt = ip_route_output_key(geneve->net, &fl4); + + if (!IS_ERR(rt) && rt->dst.dev) { + ldev_mtu = rt->dst.dev->mtu - GENEVE_IPV4_HLEN; + ip_rt_put(rt); + } + break; + } +#if IS_ENABLED(CONFIG_IPV6) + case AF_INET6: { + struct rt6_info *rt = rt6_lookup(geneve->net, + &info->key.u.ipv6.dst, NULL, 0, + NULL, 0); + + if (rt && rt->dst.dev) + ldev_mtu = rt->dst.dev->mtu - GENEVE_IPV6_HLEN; + ip6_rt_put(rt); + break; + } +#endif + } + + if (ldev_mtu <= 0) + return; + + geneve_change_mtu(dev, ldev_mtu - info->options_len); +} + static int geneve_newlink(struct net *net, struct net_device *dev, struct nlattr *tb[], struct nlattr *data[], struct netlink_ext_ack *extack) @@ -1402,8 +1444,14 @@ static int geneve_newlink(struct net *net, struct net_device *dev, if (err) return err; - return geneve_configure(net, dev, extack, &info, metadata, - use_udp6_rx_checksums); + err = geneve_configure(net, dev, extack, &info, metadata, + use_udp6_rx_checksums); + if (err) + return err; + + geneve_link_config(dev, &info, tb); + + return 0; } /* Quiesces the geneve device data path for both TX and RX. @@ -1477,8 +1525,10 @@ static int geneve_changelink(struct net_device *dev, struct nlattr *tb[], if (err) return err; - if (!geneve_dst_addr_equal(&geneve->info, &info)) + if (!geneve_dst_addr_equal(&geneve->info, &info)) { dst_cache_reset(&info.dst_cache); + geneve_link_config(dev, &info, tb); + } geneve_quiesce(geneve, &gs4, &gs6); geneve->info = info; -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device 2018-04-19 12:42 [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device Alexey Kodanev ` (3 preceding siblings ...) 2018-04-19 12:42 ` [PATCH net-next 4/4] geneve: configure MTU based on a lower device Alexey Kodanev @ 2018-04-20 15:19 ` David Miller 4 siblings, 0 replies; 6+ messages in thread From: David Miller @ 2018-04-20 15:19 UTC (permalink / raw) To: alexey.kodanev; +Cc: netdev From: Alexey Kodanev <alexey.kodanev@oracle.com> Date: Thu, 19 Apr 2018 15:42:28 +0300 > The first two patches don't introduce any functional changes and > contain minor cleanups for code readability. > > The last one adds a new function geneve_link_config() similar to the > other tunnels. The function will be used on a new link creation or > when 'remote' parameter is changed. It adjusts a user specified MTU > or, if it finds a lower device, tunes the tunnel MTU using it. Ok, series applied, thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-04-20 15:19 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-04-19 12:42 [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with a lower device Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 1/4] geneve: remove white-space before '#if IS_ENABLED(CONFIG_IPV6)' Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 2/4] geneve: cleanup hard coded value for Ethernet header length Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 3/4] geneve: check MTU for a minimum in geneve_change_mtu() Alexey Kodanev 2018-04-19 12:42 ` [PATCH net-next 4/4] geneve: configure MTU based on a lower device Alexey Kodanev 2018-04-20 15:19 ` [PATCH net-next 0/4] geneve: verify user specified MTU or adjust with " David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).