vxlan: minor output refactoring

Move code to find destination to a small function.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
stephen hemminger 2012-10-09 20:35:46 +00:00 committed by David S. Miller
parent 2a5cf8016c
commit ef59febe3b

View file

@ -621,6 +621,22 @@ static inline u8 vxlan_ecn_encap(u8 tos,
return INET_ECN_encapsulate(tos, inner); return INET_ECN_encapsulate(tos, inner);
} }
static __be32 vxlan_find_dst(struct vxlan_dev *vxlan, struct sk_buff *skb)
{
const struct ethhdr *eth = (struct ethhdr *) skb->data;
const struct vxlan_fdb *f;
if (is_multicast_ether_addr(eth->h_dest))
return vxlan->gaddr;
f = vxlan_find_mac(vxlan, eth->h_dest);
if (f)
return f->remote_ip;
else
return vxlan->gaddr;
}
/* Transmit local packets over Vxlan /* Transmit local packets over Vxlan
* *
* Outer IP header inherits ECN and DF from inner header. * Outer IP header inherits ECN and DF from inner header.
@ -632,13 +648,11 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct vxlan_dev *vxlan = netdev_priv(dev); struct vxlan_dev *vxlan = netdev_priv(dev);
struct rtable *rt; struct rtable *rt;
const struct ethhdr *eth;
const struct iphdr *old_iph; const struct iphdr *old_iph;
struct iphdr *iph; struct iphdr *iph;
struct vxlanhdr *vxh; struct vxlanhdr *vxh;
struct udphdr *uh; struct udphdr *uh;
struct flowi4 fl4; struct flowi4 fl4;
struct vxlan_fdb *f;
unsigned int pkt_len = skb->len; unsigned int pkt_len = skb->len;
u32 hash; u32 hash;
__be32 dst; __be32 dst;
@ -646,21 +660,16 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
__u8 tos, ttl; __u8 tos, ttl;
int err; int err;
dst = vxlan_find_dst(vxlan, skb);
if (!dst)
goto drop;
/* Need space for new headers (invalidates iph ptr) */ /* Need space for new headers (invalidates iph ptr) */
if (skb_cow_head(skb, VXLAN_HEADROOM)) if (skb_cow_head(skb, VXLAN_HEADROOM))
goto drop; goto drop;
eth = (void *)skb->data;
old_iph = ip_hdr(skb); old_iph = ip_hdr(skb);
if (!is_multicast_ether_addr(eth->h_dest) &&
(f = vxlan_find_mac(vxlan, eth->h_dest)))
dst = f->remote_ip;
else if (vxlan->gaddr) {
dst = vxlan->gaddr;
} else
goto drop;
ttl = vxlan->ttl; ttl = vxlan->ttl;
if (!ttl && IN_MULTICAST(ntohl(dst))) if (!ttl && IN_MULTICAST(ntohl(dst)))
ttl = 1; ttl = 1;