}
struct port_lookup_key {
+ const struct tnl_mutable_config *mutable;
+ __be64 key;
u32 tunnel_type;
__be32 saddr;
__be32 daddr;
- __be32 key;
- const struct tnl_mutable_config *mutable;
};
/*
static u32 port_hash(struct port_lookup_key *k)
{
- return jhash_3words(k->key, k->saddr, k->daddr, k->tunnel_type);
+ u32 x = jhash_3words(k->saddr, k->daddr, k->tunnel_type, 0);
+ return jhash_2words(k->key >> 32, k->key, x);
}
static u32 mutable_hash(const struct tnl_mutable_config *mutable)
err = tbl_insert(port_table, &tnl_vport->tbl_node, mutable_hash(tnl_vport->mutable));
if (err) {
- (*find_port_pool(tnl_vport->mutable))--;
check_table_empty();
return err;
}
err = tbl_insert(port_table, &tnl_vport->tbl_node, hash);
if (err) {
+ (*find_port_pool(tnl_vport->mutable))--;
check_table_empty();
return err;
}
return 0;
}
-struct vport *tnl_find_port(__be32 saddr, __be32 daddr, __be32 key,
+struct vport *tnl_find_port(__be32 saddr, __be32 daddr, __be64 key,
int tunnel_type,
const struct tnl_mutable_config **mutable)
{
#endif /* IPv6 */
bool tnl_frag_needed(struct vport *vport, const struct tnl_mutable_config *mutable,
- struct sk_buff *skb, unsigned int mtu, __be32 flow_key)
+ struct sk_buff *skb, unsigned int mtu, __be64 flow_key)
{
unsigned int eth_hdr_len = ETH_HLEN;
unsigned int total_length = 0, header_length = 0, payload_length;
*/
if (skb_headroom(skb) < min_headroom) {
skb = check_headroom(skb, min_headroom);
- if (unlikely(IS_ERR(skb))) {
+ if (IS_ERR(skb)) {
err = PTR_ERR(skb);
goto error;
}
nskb = skb_gso_segment(skb, 0);
kfree_skb(skb);
- if (unlikely(IS_ERR(nskb))) {
+ if (IS_ERR(nskb)) {
err = PTR_ERR(nskb);
goto error;
}
skb = nskb;
} else {
skb = check_headroom(skb, min_headroom);
- if (unlikely(IS_ERR(skb))) {
+ if (IS_ERR(skb)) {
err = PTR_ERR(skb);
goto error;
}
/* Offloading */
skb = handle_offloads(skb, mutable, rt);
- if (unlikely(IS_ERR(skb)))
+ if (IS_ERR(skb))
goto error;
/* MTU */