diff options
Diffstat (limited to 'src/vnet/bonding')
-rw-r--r-- | src/vnet/bonding/node.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/vnet/bonding/node.c b/src/vnet/bonding/node.c index 9f6579cda89..de720706822 100644 --- a/src/vnet/bonding/node.c +++ b/src/vnet/bonding/node.c @@ -28,6 +28,7 @@ bond_main_t bond_main; #define foreach_bond_input_error \ _(NONE, "no error") \ _(IF_DOWN, "interface down") \ + _(PASSIVE_IF, "traffic received on passive interface") \ _(PASS_THRU, "pass through (CDP, LLDP, slow protocols)") typedef enum @@ -158,10 +159,20 @@ bond_update_next (vlib_main_t * vm, vlib_node_runtime_t * node, ASSERT (bif); ASSERT (vec_len (bif->slaves)); - if (PREDICT_TRUE (bif->admin_up == 0)) + if (PREDICT_FALSE (bif->admin_up == 0)) { *bond_sw_if_index = slave_sw_if_index; *error = node->errors[BOND_INPUT_ERROR_IF_DOWN]; + return; + } + + if (PREDICT_FALSE ((bif->mode == BOND_MODE_ACTIVE_BACKUP) && + vec_len (bif->active_slaves) && + (slave_sw_if_index != bif->active_slaves[0]))) + { + *bond_sw_if_index = slave_sw_if_index; + *error = node->errors[BOND_INPUT_ERROR_PASSIVE_IF]; + return; } *bond_sw_if_index = bif->sw_if_index; |