/*
* Copyright (c) 2016 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef included_vnet_handoff_h
#define included_vnet_handoff_h
#include <vlib/vlib.h>
#include <vnet/ethernet/ethernet.h>
#include <vnet/ip/ip4_packet.h>
#include <vnet/ip/ip6_packet.h>
#include <vnet/mpls/packet.h>
static inline u64
ipv4_get_key (ip4_header_t * ip)
{
u64 hash_key;
hash_key = *((u64 *) (&ip->address_pair)) ^ ip->protocol;
return hash_key;
}
static inline u64
ipv6_get_key (ip6_header_t * ip)
{
u64 hash_key;
hash_key = ip->src_address.as_u64[0] ^
rotate_left (ip->src_address.as_u64[1], 13) ^
rotate_left (ip->dst_address.as_u64[0], 26) ^
rotate_left (ip->dst_address.as_u64[1], 39) ^ ip->protocol;
return hash_key;
}
#define MPLS_BOTTOM_OF_STACK_BIT_MASK 0x00000100U
#define MPLS_LABEL_MASK 0xFFFFF000U
static inline u64
mpls_get_key (mpls_unicast_header_t * m)
{
u64 hash_key;
u8 ip_ver;
/* find the bottom of the MPLS label stack. */
if (PREDICT_TRUE (m->label_exp_s_ttl &
clib_net_to_host_u32 (MPLS_BOTTOM_OF_STACK_BIT_MASK)))
{
goto bottom_lbl_found;
}
m++;
if (PREDICT_TRUE (m->label_exp_s_ttl &
clib_net_to_host_u32 (MPLS_BOTTOM_OF_STACK_BIT_MASK)))
{
goto bottom_lbl_found;
}
m++;
if (m->label_exp_s_ttl &
clib_net_to_host_u32 (MPLS_BOTTOM_OF_STACK_BIT_MASK))
{
goto bottom_lbl_found;
}
m++;
if (m->label_exp_s_ttl &
clib_net_to_host_u32 (MPLS_BOTTOM_OF_STACK_BIT_MASK))
{
goto bottom_lbl_found;
}
m++;
if (m->label_exp_s_ttl &
clib_net_to_host_u32 (MPLS_BOTTOM_OF_STACK_BIT_MASK))
{
goto bottom_lbl_found;
}
/* the bottom label was not found - use the last label */
hash_key = m->label_exp_s_ttl & clib_net_to_host_u32 (