summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-07-08 06:14:29 +0200
committerDavid S. Miller <davem@davemloft.net>2014-07-08 06:14:29 +0200
commit6c035ea0a2c20c6c481241da562f1adb5b7b8631 (patch)
tree5100dd399922df55b29a1acf2b5a4dcc332c10b4 /drivers
parentMerge branch 'systemport-next' (diff)
parentnet: Only do flow_dissector hash computation once per packet (diff)
downloadlinux-6c035ea0a2c20c6c481241da562f1adb5b7b8631.tar.xz
linux-6c035ea0a2c20c6c481241da562f1adb5b7b8631.zip
Merge branch 'net-hash-tx'
Tom Herbert says: ==================== net: Improvements and applications of packet flow hash in transmit path This patch series includes some patches which improve and make use of skb->hash in the transmit path. What is included: - Infrastructure to save a precomputed hash in the sock structure. For connected TCP and UDP sockets we only need to compute the flow hash once and not once for every packet. - Call skb_get_hash in get_xps_queue and __skb_tx_hash. This eliminates the awkward access to skb->sk->sk_hash in the lower transmit path. - Move UDP source port generation into a common function in udp.h This implementation is mostly based on vxlan_src_port. - Use non-zero IPv6 flow labels in flow_dissector as port information for flow hash calculation. - Implement automatic flow label generation on transmit (per RFC 6438). - Don't repeatedly try to compute an L4 hash in skb_get_hash if we've already tried to find one in software stack calculation. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/vxlan.c26
1 files changed, 2 insertions, 24 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index ade33ef82823..c2d360150804 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -1570,25 +1570,6 @@ static bool route_shortcircuit(struct net_device *dev, struct sk_buff *skb)
return false;
}
-/* Compute source port for outgoing packet
- * first choice to use L4 flow hash since it will spread
- * better and maybe available from hardware
- * secondary choice is to use jhash on the Ethernet header
- */
-__be16 vxlan_src_port(__u16 port_min, __u16 port_max, struct sk_buff *skb)
-{
- unsigned int range = (port_max - port_min) + 1;
- u32 hash;
-
- hash = skb_get_hash(skb);
- if (!hash)
- hash = jhash(skb->data, 2 * ETH_ALEN,
- (__force u32) skb->protocol);
-
- return htons((((u64) hash * range) >> 32) + port_min);
-}
-EXPORT_SYMBOL_GPL(vxlan_src_port);
-
static inline struct sk_buff *vxlan_handle_offloads(struct sk_buff *skb,
bool udp_csum)
{
@@ -1807,7 +1788,8 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
if (tos == 1)
tos = ip_tunnel_get_dsfield(old_iph, skb);
- src_port = vxlan_src_port(vxlan->port_min, vxlan->port_max, skb);
+ src_port = udp_flow_src_port(dev_net(dev), skb, vxlan->port_min,
+ vxlan->port_max, true);
if (dst->sa.sa_family == AF_INET) {
memset(&fl4, 0, sizeof(fl4));
@@ -2235,7 +2217,6 @@ static void vxlan_setup(struct net_device *dev)
{
struct vxlan_dev *vxlan = netdev_priv(dev);
unsigned int h;
- int low, high;
eth_hw_addr_random(dev);
ether_setup(dev);
@@ -2272,9 +2253,6 @@ static void vxlan_setup(struct net_device *dev)
vxlan->age_timer.function = vxlan_cleanup;
vxlan->age_timer.data = (unsigned long) vxlan;
- inet_get_local_port_range(dev_net(dev), &low, &high);
- vxlan->port_min = low;
- vxlan->port_max = high;
vxlan->dst_port = htons(vxlan_port);
vxlan->dev = dev;