vxlan: IPv6 fill_metadata_dst support
Subsystems (2)
v2 cover vxlan: IPv6 fill_metadata_dst support
This adds IPv6 support to ndo_fill_metadata_dst in vxlan. The IPv4 part needs some restructuring to avoid duplicate code, this will be sent as a separate patch targeting net-next.
Jiri Benc (2):
vxlan: move IPv6 outpute route calculation to a function
vxlan: support ndo_fill_metadata_dst also for IPv6
drivers/net/vxlan.c | 70 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 12 deletions(-)
Signature · 1 line
1.8.3.1
PATCH v2 1/2 vxlan: move IPv6 outpute route calculation to a function
Will be used also for ndo_fill_metadata_dst.
---
v2: removed the unused 'tos' parameter that leaked from the IPv4 version
--- drivers/net/vxlan.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-)
drivers/net/vxlan.c +34 -10
@@ -1848,6 +1848,34 @@ static int vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *sk !(vxflags & VXLAN_F_UDP_CSUM)); } +#if IS_ENABLED (CONFIG_IPV6 ) +static struct dst_entry *vxlan6_get_route (struct vxlan_dev *vxlan, +struct sk_buff *skb,int oif, +const struct in6_addr *daddr, +struct in6_addr *saddr) +{ +struct dst_entry *ndst; +struct flowi6 fl6; +int err; + +memset (&fl6,0 ,sizeof (fl6)); + fl6.flowi6_oif = oif; + fl6.daddr = *daddr; + fl6.saddr = vxlan->cfg.saddr.sin6.sin6_addr; + fl6.flowi6_mark = skb->mark; + fl6.flowi6_proto =IPPROTO_UDP ; + + err = ipv6_stub->ipv6_dst_lookup (vxlan->net, + vxlan->vn6_sock->sock->sk, + &ndst, &fl6); +if (err <0 ) +return ERR_PTR (err); + + *saddr = fl6.saddr; +return ndst; +} +#endif +/* Bypass encapsulation if the destination is local */ static void vxlan_encap_bypass (struct sk_buff *skb,struct vxlan_dev *src_vxlan,struct vxlan_dev *dst_vxlan)
@@ -2035,21 +2063,17 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,#if IS_ENABLED (CONFIG_IPV6 ) } else {struct dst_entry *ndst; -struct flowi6 fl6; +struct in6_addr saddr;u32 rt6i_flags;if (!vxlan->vn6_sock) goto drop; sk = vxlan->vn6_sock->sock->sk; -memset (&fl6,0 ,sizeof (fl6)); - fl6.flowi6_oif = rdst ? rdst->remote_ifindex :0 ; - fl6.daddr = dst->sin6.sin6_addr; - fl6.saddr = vxlan->cfg.saddr.sin6.sin6_addr; - fl6.flowi6_mark = skb->mark; - fl6.flowi6_proto =IPPROTO_UDP ; - -if (ipv6_stub->ipv6_dst_lookup (vxlan->net, sk, &ndst, &fl6)) { + ndst =vxlan6_get_route (vxlan, skb, + rdst ? rdst->remote_ifindex :0 , + &dst->sin6.sin6_addr, &saddr); +if (IS_ERR (ndst)) {netdev_dbg (dev,"no route to %pI6\n" , &dst->sin6.sin6_addr); dev->stats.tx_carrier_errors++;
@@ -2081,7 +2105,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev, } ttl = ttl ? :ip6_dst_hoplimit (ndst); - err =vxlan6_xmit_skb (ndst, sk, skb, dev, &fl6.saddr, &fl6.daddr, + err =vxlan6_xmit_skb (ndst, sk, skb, dev, &saddr, &dst->sin6.sin6_addr,0 , ttl, src_port, dst_port,htonl (vni <<8 ), md, !net_eq (vxlan->net,dev_net (vxlan->dev)), flags);
Signature · 1 line
1.8.3.1
Re: [PATCH net v2 1/2] vxlan: move IPv6 outpute route calculation to a function
Quoted 3 lines · Jiri Benc
Will be used also for
ndo_fill_metadata_dst.Signed-off-by Jiri Benc <[email protected]>
Looks good.
PATCH v2 2/2 vxlan: support ndo_fill_metadata_dst also for IPv6
In reply to Jiri BencFill the metadata correctly even when tunneling over IPv6. Also, check that the provided metadata is of an address family that is supported by the tunnel.
---
v2: fixed unused variable warning when building without IPv6
--- drivers/net/vxlan.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
drivers/net/vxlan.c +24 -2
@@ -2413,15 +2413,37 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) {struct vxlan_dev *vxlan =netdev_priv (dev);struct ip_tunnel_info *info =skb_tunnel_info (skb); +#if IS_ENABLED (CONFIG_IPV6 ) +struct dst_entry *ndst; +#endif __be16 sport, dport; sport =udp_flow_src_port (dev_net (dev), skb, vxlan->cfg.port_min, vxlan->cfg.port_max, true); dport = info->key.tp_dst ? : vxlan->cfg.dst_port; -if (ip_tunnel_info_af (info) ==AF_INET ) +if (ip_tunnel_info_af (info) ==AF_INET ) { +if (!vxlan->vn4_sock) +return -EINVAL ;return egress_ipv4_tun_info (dev, skb, info, sport, dport); -return -EINVAL ; + }else { +if (!IS_ENABLED (CONFIG_IPV6 )) +return -EPFNOSUPPORT ; + +#if IS_ENABLED (CONFIG_IPV6 ) +if (!vxlan->vn6_sock) +return -EINVAL ; + ndst =vxlan6_get_route (vxlan, skb,0 , + &info->key.u.ipv6.dst, + &info->key.u.ipv6.src); +if (IS_ERR (ndst)) +return PTR_ERR (ndst); +dst_release (ndst); +#endif + info->key.tp_src = sport; + info->key.tp_dst = dport; + } +return 0 ; }static const struct net_device_ops vxlan_netdev_ops = {
Signature · 1 line
1.8.3.1
Re: [PATCH net v2 2/2] vxlan: support ndo_fill_metadata_dst also for IPv6
Quoted 38 lines · Jiri Benc
Fill the metadata correctly even when tunneling over IPv6. Also, check that the provided metadata is of an address family that is supported by the tunnel.
Signed-off-by Jiri Benc <[email protected]>---
v2: fixed unused variable warning when building without IPv6--- drivers/net/vxlan.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)drivers/net/vxlan.c +10
-2@@ -2413,15 +2413,37 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) {struct vxlan_dev *vxlan =netdev_priv (dev);struct ip_tunnel_info *info =skb_tunnel_info (skb); +#if IS_ENABLED (CONFIG_IPV6 ) +struct dst_entry *ndst; +#endif __be16 sport, dport; sport =udp_flow_src_port (dev_net (dev), skb, vxlan->cfg.port_min, vxlan->cfg.port_max, true); dport = info->key.tp_dst ? : vxlan->cfg.dst_port; -if (ip_tunnel_info_af (info) ==AF_INET ) +if (ip_tunnel_info_af (info) ==AF_INET ) { +if (!vxlan->vn4_sock) +return -EINVAL ;return egress_ipv4_tun_info (dev, skb, info, sport, dport); -return -EINVAL ; + }else { +if (!IS_ENABLED (CONFIG_IPV6 )) +return -EPFNOSUPPORT ; +
drivers/net/vxlan.c static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) · line 2442
Quoted 10 lines
drivers/net/vxlan.c +10
-0+#if IS_ENABLED (CONFIG_IPV6 ) +if (!vxlan->vn6_sock) +return -EINVAL ; + ndst =vxlan6_get_route (vxlan, skb,0 , + &info->key.u.ipv6.dst, + &info->key.u.ipv6.src); +if (IS_ERR (ndst)) +return PTR_ERR (ndst); +dst_release (ndst); +#endif
Rather than checking IS_ENABLED(CONFIG_IPV6) three separate times, all code can is restructured in one #if #else block by moving the ndst definition to IPv6 local block.
Quoted 10 lines
drivers/net/vxlan.c +4
-1+ info->key.tp_src = sport; + info->key.tp_dst = dport; + } +return 0 ; }static const struct net_device_ops vxlan_netdev_ops = { --1.8.3.1
David Miller
maintainerRe: [PATCH net v2 2/2] vxlan: support ndo_fill_metadata_dst also for IPv6
From: Pravin Shelar <[email protected]>
Date: Fri, 4 Dec 2015 10:49:37 -0800
Quoted 45 lines · Jiri Benc
Quoted 44 lines
Fill the metadata correctly even when tunneling over IPv6. Also, check that the provided metadata is of an address family that is supported by the tunnel.
Signed-off-by Jiri Benc <[email protected]>---
v2: fixed unused variable warning when building without IPv6--- drivers/net/vxlan.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)drivers/net/vxlan.c +16
-2@@ -2413,15 +2413,37 @@ static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) {struct vxlan_dev *vxlan =netdev_priv (dev);struct ip_tunnel_info *info =skb_tunnel_info (skb); +#if IS_ENABLED (CONFIG_IPV6 ) +struct dst_entry *ndst; +#endif __be16 sport, dport; sport =udp_flow_src_port (dev_net (dev), skb, vxlan->cfg.port_min, vxlan->cfg.port_max, true); dport = info->key.tp_dst ? : vxlan->cfg.dst_port; -if (ip_tunnel_info_af (info) ==AF_INET ) +if (ip_tunnel_info_af (info) ==AF_INET ) { +if (!vxlan->vn4_sock) +return -EINVAL ;return egress_ipv4_tun_info (dev, skb, info, sport, dport); -return -EINVAL ; + }else { +if (!IS_ENABLED (CONFIG_IPV6 )) +return -EPFNOSUPPORT ; + +#if IS_ENABLED (CONFIG_IPV6 ) +if (!vxlan->vn6_sock) +return -EINVAL ; + ndst =vxlan6_get_route (vxlan, skb,0 , + &info->key.u.ipv6.dst, + &info->key.u.ipv6.src);
Quoted 8 lines
drivers/net/vxlan.c static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb) · line 2442
Quoted 4 lines
drivers/net/vxlan.c +4
-0+if (IS_ERR (ndst)) +return PTR_ERR (ndst); +dst_release (ndst); +#endif Rather than checking
IS_ENABLED(CONFIG_IPV6)three separate times, all code can is restructured in one #if #else block by moving the ndst definition to IPv6 local block.
Agreed, you should be putting variable definitions into the deepest most containing scope anyways. So if you declare 'ndst' inside of the else branch you'll be doing that plus decreasing the amount of CPP tests in this file.
Re: [PATCH net v2 2/2] vxlan: support ndo_fill_metadata_dst also for IPv6
Quoted 9 lines · David Miller
From: Pravin Shelar <[email protected]>
Quoted 3 lines
Rather than checking
IS_ENABLED(CONFIG_IPV6)three separate times, all code can is restructured in one #if #else block by moving the ndst definition to IPv6 local block.Agreed, you should be putting variable definitions into the deepest most containing scope anyways. So if you declare 'ndst' inside of the else branch you'll be doing that plus decreasing the amount of CPP tests in this file.
No problem. I actually had it that way but decided that I didn't like the #if #else maze. I'll change it and send v3.
Jiri
Signature · 1 line
Jiri Benc