ip6_sr_sl_t *segment_list;
ip6_sr_main_t *sm = &sr_main;
load_balance_path_t path;
+ path.path_index = FIB_NODE_INDEX_INVALID;
load_balance_path_t *ip4_path_vector = 0;
load_balance_path_t *ip6_path_vector = 0;
load_balance_path_t *b_path_vector = 0;
load_balance_create (0, DPO_PROTO_IP6, fhc));
/* Update FIB entry's to point to the LB DPO in the main FIB and hidden one */
- fib_table_entry_special_dpo_update (fib_table_id_find_fib_index
- (FIB_PROTOCOL_IP6,
- sr_policy->fib_table), &pfx,
- FIB_SOURCE_SR,
+ fib_table_entry_special_dpo_update (fib_table_find (FIB_PROTOCOL_IP6,
+ sr_policy->fib_table),
+ &pfx, FIB_SOURCE_SR,
FIB_ENTRY_FLAG_EXCLUSIVE,
&sr_policy->bsid_dpo);
ip6_sr_sl_t *segment_list;
ip6_sr_main_t *sm = &sr_main;
load_balance_path_t path;
+ path.path_index = FIB_NODE_INDEX_INVALID;
load_balance_path_t *b_path_vector = 0;
load_balance_path_t *ip6_path_vector = 0;
load_balance_path_t *ip4_path_vector = 0;
.ip6 = sr_policy->bsid,
}
};
- fib_table_entry_special_dpo_update (fib_table_id_find_fib_index
- (FIB_PROTOCOL_IP6,
- sr_policy->fib_table), &pfx,
- FIB_SOURCE_SR,
+ fib_table_entry_special_dpo_update (fib_table_find (FIB_PROTOCOL_IP6,
+ sr_policy->fib_table),
+ &pfx, FIB_SOURCE_SR,
FIB_ENTRY_FLAG_EXCLUSIVE,
&sr_policy->bsid_dpo);
replicate_multipath_update (&sr_policy->ip6_dpo, ip6_path_vector);
if (sr_policy->is_encap)
replicate_multipath_update (&sr_policy->ip4_dpo, ip4_path_vector);
-
- /* Cleanup */
- vec_free (b_path_vector);
- vec_free (ip6_path_vector);
- vec_free (ip4_path_vector);
}
/******************************* SR rewrite API *******************************/
{
ip6_sr_main_t *sm = &sr_main;
ip6_sr_policy_t *sr_policy = 0;
- ip6_address_t *key_copy;
uword *p;
/* Search for existing keys (BSID) */
- p = hash_get_mem (sm->sr_policy_index_by_key, bsid);
+ p = mhash_get (&sm->sr_policies_index_hash, bsid);
if (p)
{
/* Add SR policy that already exists; complain */
};
/* Lookup the FIB index associated to the table selected */
- u32 fib_index = fib_table_id_find_fib_index (FIB_PROTOCOL_IP6,
- (fib_table !=
- (u32) ~ 0 ? fib_table : 0));
+ u32 fib_index = fib_table_find (FIB_PROTOCOL_IP6,
+ (fib_table != (u32) ~ 0 ? fib_table : 0));
if (fib_index == ~0)
return -13;
sr_policy->is_encap = is_encap;
/* Copy the key */
- key_copy = vec_new (ip6_address_t, 1);
- clib_memcpy (key_copy, bsid, sizeof (ip6_address_t));
- hash_set_mem (sm->sr_policy_index_by_key, key_copy,
- sr_policy - sm->sr_policies);
+ mhash_set (&sm->sr_policies_index_hash, bsid, sr_policy - sm->sr_policies,
+ NULL);
/* Create a segment list and add the index to the SR policy */
create_sl (sr_policy, segments, weight, is_encap);
"SRv6 steering of IP6 prefixes through BSIDs");
sm->fib_table_ip4 = fib_table_create_and_lock (FIB_PROTOCOL_IP6,
"SRv6 steering of IP4 prefixes through BSIDs");
- fib_table_flush (sm->fib_table_ip6, FIB_PROTOCOL_IP6,
- FIB_SOURCE_SPECIAL);
- fib_table_flush (sm->fib_table_ip4, FIB_PROTOCOL_IP6,
- FIB_SOURCE_SPECIAL);
}
/* Create IPv6 FIB for the BindingSID attached to the DPO of the only SL */
ip6_sr_main_t *sm = &sr_main;
ip6_sr_policy_t *sr_policy = 0;
ip6_sr_sl_t *segment_list;
- ip6_address_t *key_copy;
u32 *sl_index;
uword *p;
- hash_pair_t *hp;
if (bsid)
{
- p = hash_get_mem (sm->sr_policy_index_by_key, bsid);
+ p = mhash_get (&sm->sr_policies_index_hash, bsid);
if (p)
sr_policy = pool_elt_at_index (sm->sr_policies, p[0]);
else
,
};
- fib_table_entry_special_remove (fib_table_id_find_fib_index
- (FIB_PROTOCOL_IP6, sr_policy->fib_table),
+ fib_table_entry_special_remove (fib_table_find (FIB_PROTOCOL_IP6,
+ sr_policy->fib_table),
&pfx, FIB_SOURCE_SR);
fib_table_entry_special_remove (sm->fib_table_ip6, &pfx, FIB_SOURCE_SR);
}
/* Remove SR policy entry */
- hp = hash_get_pair (sm->sr_policy_index_by_key, &sr_policy->bsid);
- key_copy = (void *) (hp->key);
- hash_unset_mem (sm->sr_policy_index_by_key, &sr_policy->bsid);
- vec_free (key_copy);
+ mhash_unset (&sm->sr_policies_index_hash, &sr_policy->bsid, NULL);
pool_put (sm->sr_policies, sr_policy);
/* If FIB empty unlock it */
- if (!pool_elts (sm->sr_policies))
+ if (!pool_elts (sm->sr_policies) && !pool_elts (sm->steer_policies))
{
fib_table_unlock (sm->fib_table_ip6, FIB_PROTOCOL_IP6);
fib_table_unlock (sm->fib_table_ip4, FIB_PROTOCOL_IP6);
if (bsid)
{
- p = hash_get_mem (sm->sr_policy_index_by_key, bsid);
+ p = mhash_get (&sm->sr_policies_index_hash, bsid);
if (p)
sr_policy = pool_elt_at_index (sm->sr_policies, p[0]);
else
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b3)->ip.adj_index[VLIB_TX]);
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl1->rewrite) + b1->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl2->rewrite) + b2->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl3->rewrite) + b3->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
+ ASSERT (b1->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl1->rewrite));
+ ASSERT (b2->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl2->rewrite));
+ ASSERT (b3->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl3->rewrite));
ip0_encap = vlib_buffer_get_current (b0);
ip1_encap = vlib_buffer_get_current (b1);
sl0 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
ip0_encap = vlib_buffer_get_current (b0);
sl3 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b3)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl1->rewrite) + b1->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl2->rewrite) + b2->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl3->rewrite) + b3->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
+ ASSERT (b1->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl1->rewrite));
+ ASSERT (b2->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl2->rewrite));
+ ASSERT (b3->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl3->rewrite));
ip0_encap = vlib_buffer_get_current (b0);
ip1_encap = vlib_buffer_get_current (b1);
sl0 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
ip0_encap = vlib_buffer_get_current (b0);
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b3)->ip.adj_index[VLIB_TX]);
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl1->rewrite) + b1->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl2->rewrite) + b2->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl3->rewrite) + b3->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
+ ASSERT (b1->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl1->rewrite));
+ ASSERT (b2->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl2->rewrite));
+ ASSERT (b3->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl3->rewrite));
en0 = vlib_buffer_get_current (b0);
en1 = vlib_buffer_get_current (b1);
sl0 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
en0 = vlib_buffer_get_current (b0);
sl3 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b3)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl1->rewrite) + b1->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl2->rewrite) + b2->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl3->rewrite) + b3->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
+ ASSERT (b1->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl1->rewrite));
+ ASSERT (b2->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl2->rewrite));
+ ASSERT (b3->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl3->rewrite));
ip0 = vlib_buffer_get_current (b0);
ip1 = vlib_buffer_get_current (b1);
sl0 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
ip0 = vlib_buffer_get_current (b0);
sl3 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b3)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite_bsid) + b0->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl1->rewrite_bsid) + b1->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl2->rewrite_bsid) + b2->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl3->rewrite_bsid) + b3->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite_bsid));
+ ASSERT (b1->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl1->rewrite_bsid));
+ ASSERT (b2->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl2->rewrite_bsid));
+ ASSERT (b3->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl3->rewrite_bsid));
ip0 = vlib_buffer_get_current (b0);
ip1 = vlib_buffer_get_current (b1);
sl0 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite_bsid) + b0->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite_bsid));
ip0 = vlib_buffer_get_current (b0);
sl3 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b3)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl1->rewrite) + b1->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl2->rewrite) + b2->current_data));
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl3->rewrite) + b3->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
+ ASSERT (b1->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl1->rewrite));
+ ASSERT (b2->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl2->rewrite));
+ ASSERT (b3->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl3->rewrite));
ip0_encap = vlib_buffer_get_current (b0);
ip1_encap = vlib_buffer_get_current (b1);
sl0 =
pool_elt_at_index (sm->sid_lists,
vnet_buffer (b0)->ip.adj_index[VLIB_TX]);
-
- ASSERT (VLIB_BUFFER_PRE_DATA_SIZE >=
- (vec_len (sl0->rewrite) + b0->current_data));
+ ASSERT (b0->current_data + VLIB_BUFFER_PRE_DATA_SIZE >=
+ vec_len (sl0->rewrite));
ip0_encap = vlib_buffer_get_current (b0);
ip6_ext_header_find_t (ip0_encap, prev0, sr0,
ip6_sr_main_t *sm = &sr_main;
/* Init memory for sr policy keys (bsid <-> ip6_address_t) */
- sm->sr_policy_index_by_key = hash_create_mem (0, sizeof (ip6_address_t),
- sizeof (uword));
+ mhash_init (&sm->sr_policies_index_hash, sizeof (uword),
+ sizeof (ip6_address_t));
/* Init SR VPO DPOs type */
sr_pr_encaps_dpo_type =