X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fadj%2Fadj_nbr.c;h=811d0b8faa2f17c6093b6ef255651876c221deab;hb=8f5fef2c7;hp=78bf6df5324402881e1af1c5410b0ea10cf2e9ec;hpb=22391fa92b95ee0376eb372450d6315523c8a9ae;p=vpp.git diff --git a/src/vnet/adj/adj_nbr.c b/src/vnet/adj/adj_nbr.c index 78bf6df5324..811d0b8faa2 100644 --- a/src/vnet/adj/adj_nbr.c +++ b/src/vnet/adj/adj_nbr.c @@ -39,7 +39,20 @@ typedef struct adj_nbr_key_t_ #define ADJ_NBR_ITF_OK(_proto, _itf) \ (((_itf) < vec_len(adj_nbr_tables[_proto])) && \ - (NULL != adj_nbr_tables[_proto][sw_if_index])) + (NULL != adj_nbr_tables[_proto][(_itf)])) + +#define ADJ_NBR_ASSERT_NH_PROTO(nh_proto, err) \ + do { \ + ASSERT (nh_proto < FIB_PROTOCOL_IP_MAX); \ + const fib_protocol_t nh_proto__ = (nh_proto); \ + if (nh_proto__ >= FIB_PROTOCOL_IP_MAX) \ + { \ + clib_warning ("BUG: protocol %d > %d\n", \ + (int)nh_proto__, \ + FIB_PROTOCOL_IP_MAX); \ + return err; \ + } \ + } while (0) static void adj_nbr_insert (fib_protocol_t nh_proto, @@ -50,6 +63,8 @@ adj_nbr_insert (fib_protocol_t nh_proto, { adj_nbr_key_t kv; + ADJ_NBR_ASSERT_NH_PROTO (nh_proto,); + if (sw_if_index >= vec_len(adj_nbr_tables[nh_proto])) { vec_validate(adj_nbr_tables[nh_proto], sw_if_index); @@ -75,6 +90,8 @@ adj_nbr_remove (adj_index_t ai, { adj_nbr_key_t kv; + ADJ_NBR_ASSERT_NH_PROTO (nh_proto,); + if (!ADJ_NBR_ITF_OK(nh_proto, sw_if_index)) return; @@ -97,6 +114,8 @@ adj_nbr_find (fib_protocol_t nh_proto, adj_nbr_key_t kv; uword *p; + ADJ_NBR_ASSERT_NH_PROTO (nh_proto, ADJ_INDEX_INVALID); + ADJ_NBR_SET_KEY(kv, link_type, nh_addr); if (!ADJ_NBR_ITF_OK(nh_proto, sw_if_index)) @@ -203,6 +222,27 @@ adj_nbr_alloc (fib_protocol_t nh_proto, return (adj); } +void +adj_nbr_set_mtu (adj_index_t adj_index, u16 mtu) +{ + ip_adjacency_t *adj; + + ASSERT(ADJ_INDEX_INVALID != adj_index); + + adj = adj_get(adj_index); + + if (0 == mtu) + vnet_rewrite_update_mtu(vnet_get_main(), adj->ia_link, + &adj->rewrite_header); + else + { + vnet_rewrite_update_mtu(vnet_get_main(), adj->ia_link, + &adj->rewrite_header); + adj->rewrite_header.max_l3_packet_bytes = + clib_min (adj->rewrite_header.max_l3_packet_bytes, mtu); + } +} + /* * adj_nbr_add_or_lock * @@ -249,13 +289,13 @@ adj_nbr_add_or_lock (fib_protocol_t nh_proto, * So ask the interface to do it. */ vnet_update_adjacency_for_sw_interface(vnm, sw_if_index, adj_index); + adj_delegate_adj_created(adj_get(adj_index)); } else { adj_lock(adj_index); } - adj_delegate_adj_created(adj_get(adj_index)); return (adj_index); } @@ -557,6 +597,8 @@ adj_nbr_walk (u32 sw_if_index, adj_index_t ai, *ais, *aip; adj_nbr_key_t *key; + ADJ_NBR_ASSERT_NH_PROTO (adj_nh_proto,); + if (!ADJ_NBR_ITF_OK(adj_nh_proto, sw_if_index)) return; @@ -645,6 +687,8 @@ adj_nbr_walk_nh (u32 sw_if_index, adj_walk_cb_t cb, void *ctx) { + ADJ_NBR_ASSERT_NH_PROTO (adj_nh_proto,); + if (!ADJ_NBR_ITF_OK(adj_nh_proto, sw_if_index)) return; @@ -1032,12 +1076,14 @@ const static dpo_vft_t adj_nbr_dpo_vft = { .dv_format = format_adj_nbr, .dv_mem_show = adj_mem_show, .dv_get_urpf = adj_dpo_get_urpf, + .dv_get_mtu = adj_dpo_get_mtu, }; const static dpo_vft_t adj_nbr_incompl_dpo_vft = { .dv_lock = adj_dpo_lock, .dv_unlock = adj_dpo_unlock, .dv_format = format_adj_nbr_incomplete, .dv_get_urpf = adj_dpo_get_urpf, + .dv_get_mtu = adj_dpo_get_mtu, }; /**