mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
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:
parent
2a5cf8016c
commit
ef59febe3b
1 changed files with 20 additions and 11 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue