diff options
author | 2016-11-10 20:35:14 +0000 | |
---|---|---|
committer | 2016-11-12 00:06:39 +0000 | |
commit | ad95b5df2728f9061f8cd8c3d06a41a9c2c943bd (patch) | |
tree | dc8933e3b091e0b35988d030511783a533dd0193 /vnet/vnet/fib/fib_path.c | |
parent | f5179c71449792a059be2b753f4c43ba8c438d71 (diff) |
pseudo atomic adjacency updates
When an adjacency changes from incomplete to complete (arp to rewrite) and vice-versa, that update must produce valid behavour w.r.t. the packets that continue to encounter it.
Change-Id: Icc2709aff9807c5d24f91ef7649268991ad9a45d
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'vnet/vnet/fib/fib_path.c')
-rw-r--r-- | vnet/vnet/fib/fib_path.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/vnet/vnet/fib/fib_path.c b/vnet/vnet/fib/fib_path.c index 7f5aac77c43..9fe653dc8d0 100644 --- a/vnet/vnet/fib/fib_path.c +++ b/vnet/vnet/fib/fib_path.c @@ -757,7 +757,8 @@ fib_path_back_walk_notify (fib_node_t *node, fib_path_proto_to_chain_type(path->fp_nh_proto), &path->fp_dpo); } - if (FIB_NODE_BW_REASON_FLAG_ADJ_UPDATE & ctx->fnbw_reason) + if ((FIB_NODE_BW_REASON_FLAG_ADJ_UPDATE & ctx->fnbw_reason) || + (FIB_NODE_BW_REASON_FLAG_ADJ_DOWN & ctx->fnbw_reason)) { /* * ADJ updates (complete<->incomplete) do not need to propagate to @@ -810,6 +811,12 @@ FIXME comment */ adj_index_t ai; + if (vnet_sw_interface_is_admin_up(vnet_get_main(), + path->attached_next_hop.fp_interface)) + { + path->fp_oper_flags |= FIB_PATH_OPER_FLAG_RESOLVED; + } + ai = fib_path_attached_next_hop_get_adj( path, fib_proto_to_link(path->fp_nh_proto)); @@ -819,6 +826,13 @@ FIXME comment ai); adj_unlock(ai); } + if (FIB_NODE_BW_REASON_FLAG_ADJ_DOWN & ctx->fnbw_reason) + { + /* + * the adj has gone down. the path is no longer resolved. + */ + path->fp_oper_flags &= ~FIB_PATH_OPER_FLAG_RESOLVED; + } break; case FIB_PATH_TYPE_ATTACHED: /* |