X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=datapath%2Ftunnel.c;h=1e402931e8f874cca1c64fb6c69e70bbb6d4981d;hb=a2973b1a8b539e0f7fbd1f9fbb090b406484c1bb;hp=aae3f3d911484b8f15474e1ac42a26dcb879aec5;hpb=1e71f10f38d2ad09ee854b7e926a63744a1883e1;p=openvswitch diff --git a/datapath/tunnel.c b/datapath/tunnel.c index aae3f3d9..1e402931 100644 --- a/datapath/tunnel.c +++ b/datapath/tunnel.c @@ -166,11 +166,11 @@ static unsigned int *find_port_pool(const struct tnl_mutable_config *mutable) } 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; }; /* @@ -192,7 +192,8 @@ static int port_cmp(const struct tbl_node *node, void *target) 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) @@ -247,7 +248,6 @@ static int add_port(struct vport *vport) 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; } @@ -278,6 +278,7 @@ static int move_port(struct vport *vport, struct tnl_mutable_config *new_mutable err = tbl_insert(port_table, &tnl_vport->tbl_node, hash); if (err) { + (*find_port_pool(tnl_vport->mutable))--; check_table_empty(); return err; } @@ -305,7 +306,7 @@ static int del_port(struct vport *vport) 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) { @@ -598,7 +599,7 @@ static void ipv6_build_icmp(struct sk_buff *skb, struct sk_buff *nskb, #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; @@ -1044,7 +1045,7 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb, */ 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; } @@ -1052,7 +1053,7 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb, nskb = skb_gso_segment(skb, 0); kfree_skb(skb); - if (unlikely(IS_ERR(nskb))) { + if (IS_ERR(nskb)) { err = PTR_ERR(nskb); goto error; } @@ -1060,7 +1061,7 @@ static struct sk_buff *handle_offloads(struct sk_buff *skb, skb = nskb; } else { skb = check_headroom(skb, min_headroom); - if (unlikely(IS_ERR(skb))) { + if (IS_ERR(skb)) { err = PTR_ERR(skb); goto error; } @@ -1198,7 +1199,7 @@ int tnl_send(struct vport *vport, struct sk_buff *skb) /* Offloading */ skb = handle_offloads(skb, mutable, rt); - if (unlikely(IS_ERR(skb))) + if (IS_ERR(skb)) goto error; /* MTU */