summaryrefslogtreecommitdiffstats
path: root/drivers/net/vxlan.c
diff options
context:
space:
mode:
authorstephen hemminger <shemminger@vyatta.com>2012-10-09 20:35:48 +0000
committerDavid S. Miller <davem@davemloft.net>2012-10-10 22:41:21 -0400
commitca78f18129999320466107887317b5d1c042accd (patch)
tree7834a3ceb007dd1efe7424bf9a883bdca1c074d7 /drivers/net/vxlan.c
parent321fb991399bd7b156f8b15a8acfa0c8622e3c68 (diff)
downloadlinux-ca78f18129999320466107887317b5d1c042accd.tar.gz
linux-ca78f18129999320466107887317b5d1c042accd.tar.bz2
linux-ca78f18129999320466107887317b5d1c042accd.zip
vxlan: use ip_route_output
Select source address for VXLAN packet based on route destination and don't lie to route code. VXLAN is not GRE. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/vxlan.c')
-rw-r--r--drivers/net/vxlan.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index 882a041d7594..0b53a9cb6f84 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -680,9 +680,13 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
hash = skb_get_rxhash(skb);
- rt = ip_route_output_gre(dev_net(dev), &fl4, dst,
- vxlan->saddr, vxlan->vni,
- RT_TOS(tos), vxlan->link);
+ memset(&fl4, 0, sizeof(fl4));
+ fl4.flowi4_oif = vxlan->link;
+ fl4.flowi4_tos = RT_TOS(tos);
+ fl4.daddr = dst;
+ fl4.saddr = vxlan->saddr;
+
+ rt = ip_route_output_key(dev_net(dev), &fl4);
if (IS_ERR(rt)) {
netdev_dbg(dev, "no route to %pI4\n", &dst);
dev->stats.tx_carrier_errors++;
@@ -724,7 +728,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
iph->frag_off = df;
iph->protocol = IPPROTO_UDP;
iph->tos = vxlan_ecn_encap(tos, old_iph, skb);
- iph->daddr = fl4.daddr;
+ iph->daddr = dst;
iph->saddr = fl4.saddr;
iph->ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);