aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/fib/fib_path.c
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2016-11-10 20:35:14 +0000
committerDamjan Marion <dmarion.lists@gmail.com>2016-11-12 00:06:39 +0000
commitad95b5df2728f9061f8cd8c3d06a41a9c2c943bd (patch)
treedc8933e3b091e0b35988d030511783a533dd0193 /vnet/vnet/fib/fib_path.c
parentf5179c71449792a059be2b753f4c43ba8c438d71 (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.c16
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:
/*