#define _GNU_SOURCE
#include <vnet/bonding/node.h>
#include <lacp/node.h>
+#include <vpp/stats/stat_segment.h>
static int
lacp_packet_scan (vlib_main_t * vm, slave_if_t * sif)
lacp_error_t
lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0)
{
+ bond_main_t *bm = &bond_main;
lacp_main_t *lm = &lacp_main;
slave_if_t *sif;
uword nbytes;
lacp_error_t e;
marker_pdu_t *marker;
uword last_packet_signature;
+ bond_if_t *bif;
sif =
bond_get_slave_by_sw_if_index (vnet_buffer (b0)->sw_if_index[VLIB_RX]);
{
/* Actually scan the packet */
e = lacp_packet_scan (vm, sif);
+ bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
+ stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+ [sif->sw_if_index].actor_state,
+ sif->actor.state);
+ stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+ [sif->sw_if_index].partner_state,
+ sif->partner.state);
sif->last_packet_signature_valid = 1;
sif->last_packet_signature = last_packet_signature;
}
#include <vppinfra/hash.h>
#include <vnet/bonding/node.h>
#include <lacp/node.h>
+#include <vpp/stats/stat_segment.h>
lacp_main_t lacp_main;
bond_main_t *bm = &bond_main;
lacp_main_t *lm = &lacp_main;
slave_if_t *sif;
+ bond_if_t *bif;
+ u8 actor_state, partner_state;
/* *INDENT-OFF* */
pool_foreach (sif, bm->neighbors,
if (sif->port_enabled == 0)
continue;
+ actor_state = sif->actor.state;
+ partner_state = sif->partner.state;
if (lacp_timer_is_running (sif->current_while_timer) &&
lacp_timer_is_expired (lm->vlib_main, sif->current_while_timer))
{
lacp_stop_timer (&sif->wait_while_timer);
lacp_selection_logic (vm, sif);
}
+ if (actor_state != sif->actor.state)
+ {
+ bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
+ stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+ [sif->sw_if_index].actor_state,
+ sif->actor.state);
+ }
+ if (partner_state != sif->partner.state)
+ {
+ bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
+ stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+ [sif->sw_if_index].partner_state,
+ sif->partner.state);
+ }
}));
/* *INDENT-ON* */
}
void
lacp_init_state_machines (vlib_main_t * vm, slave_if_t * sif)
{
+ bond_main_t *bm = &bond_main;
+ bond_if_t *bif = bond_get_master_by_dev_instance (sif->bif_dev_instance);
+
lacp_init_tx_machine (vm, sif);
lacp_init_mux_machine (vm, sif);
lacp_init_ptx_machine (vm, sif);
lacp_init_rx_machine (vm, sif);
+ stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+ [sif->sw_if_index].actor_state,
+ sif->actor.state);
+ stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
+ [sif->sw_if_index].partner_state,
+ sif->partner.state);
}
VLIB_INIT_FUNCTION (lacp_periodic_init);
vlib_process_signal_event (bm->vlib_main, bond_process_node.index,
BOND_SEND_GARP_NA, bif->hw_if_index);
clib_spinlock_unlock_if_init (&bif->lockp);
-
- if (bif->mode == BOND_MODE_LACP)
- stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
- [sif->sw_if_index], sif->actor.state);
}
/*
done:
clib_spinlock_unlock_if_init (&bif->lockp);
-
- if (bif->mode == BOND_MODE_LACP)
- stat_segment_set_state_counter (bm->stats[bif->sw_if_index]
- [sif->sw_if_index], sif->actor.state);
}
int
(*bm->lacp_enable_disable) (vm, bif, sif, 0);
if (bif->mode == BOND_MODE_LACP)
- stat_segment_deregister_state_counter
- (bm->stats[bif->sw_if_index][sif->sw_if_index]);
+ {
+ stat_segment_deregister_state_counter
+ (bm->stats[bif->sw_if_index][sif->sw_if_index].actor_state);
+ stat_segment_deregister_state_counter
+ (bm->stats[bif->sw_if_index][sif->sw_if_index].partner_state);
+ }
pool_put (bm->neighbors, sif);
}
vec_validate (bm->stats[bif->sw_if_index], args->slave);
args->error = stat_segment_register_state_counter
- (name, &bm->stats[bif->sw_if_index][args->slave]);
+ (name, &bm->stats[bif->sw_if_index][args->slave].actor_state);
+ if (args->error != 0)
+ {
+ args->rv = VNET_API_ERROR_INVALID_INTERFACE;
+ vec_free (name);
+ return;
+ }
+
+ vec_reset_length (name);
+ name = format (0, "/if/lacp/%u/%u/partner-state%c", bif->sw_if_index,
+ args->slave, 0);
+ args->error = stat_segment_register_state_counter
+ (name, &bm->stats[bif->sw_if_index][args->slave].partner_state);
vec_free (name);
if (args->error != 0)
{
typedef void (*lacp_enable_disable_func) (vlib_main_t * vm, bond_if_t * bif,
slave_if_t * sif, u8 enable);
+typedef struct
+{
+ u32 partner_state;
+ u32 actor_state;
+} lacp_stats_t;
+
typedef struct
{
/* pool of bonding interfaces */
bond_per_thread_data_t *per_thread_data;
- u32 **stats;
+ lacp_stats_t **stats;
} bond_main_t;
/* bond packet trace capture */