- if (ip_version == 0x4)
- {
- u32 a, t1, t2;
- tcp_header_t *tcp = (void *) (ip4 + 1);
-
- is_tcp_udp = (ip4->protocol == IP_PROTOCOL_TCP) ||
- (ip4->protocol == IP_PROTOCOL_UDP);
- t1 = is_tcp_udp ? clib_mem_unaligned (&tcp->src, u16) : 0;
- t2 = is_tcp_udp ? clib_mem_unaligned (&tcp->dst, u16) : 0;
- a = t1 ^ t2;
- return
- lb_hash_hash_2_tuples (clib_mem_unaligned (&ip4->address_pair, u64),
- a);
- }
- else if (ip_version == 0x6)
- {
- u64 a;
- u32 c, t1, t2;
- ip6_header_t *ip6 = (ip6_header_t *) (eth + 1);
- tcp_header_t *tcp = (void *) (ip6 + 1);
-
- is_tcp_udp = 0;
- if (PREDICT_TRUE ((ip6->protocol == IP_PROTOCOL_TCP) ||
- (ip6->protocol == IP_PROTOCOL_UDP)))
- {
- is_tcp_udp = 1;
- tcp = (void *) (ip6 + 1);
- }
- else if (ip6->protocol == IP_PROTOCOL_IP6_HOP_BY_HOP_OPTIONS)
- {
- ip6_hop_by_hop_header_t *hbh =
- (ip6_hop_by_hop_header_t *) (ip6 + 1);
- if ((hbh->protocol == IP_PROTOCOL_TCP)
- || (hbh->protocol == IP_PROTOCOL_UDP))
- {
- is_tcp_udp = 1;
- tcp = (tcp_header_t *) ((u8 *) hbh + ((hbh->length + 1) << 3));
- }
- }
- t1 = is_tcp_udp ? clib_mem_unaligned (&tcp->src, u16) : 0;
- t2 = is_tcp_udp ? clib_mem_unaligned (&tcp->dst, u16) : 0;
- a = t1 ^ t2;
- c =
- lb_hash_hash (clib_mem_unaligned
- (&ip6->src_address.as_uword[0], uword),
- clib_mem_unaligned (&ip6->src_address.as_uword[1],
- uword),
- clib_mem_unaligned (&ip6->dst_address.as_uword[0],
- uword),
- clib_mem_unaligned (&ip6->dst_address.as_uword[1],
- uword), a);
- return c;