X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Flacp%2Finput.c;h=fd1296afe3e0e88f8a26d39a0647b866809e6abd;hb=9a244b0a29b3ed517fc3442c9358d79907f67a24;hp=45db3b8455be837eaa36a56eb26ac279f29b0b6f;hpb=9cd2d7a5a4fafadb65d772c48109d55d1e19d425;p=vpp.git diff --git a/src/plugins/lacp/input.c b/src/plugins/lacp/input.c index 45db3b8455b..fd1296afe3e 100644 --- a/src/plugins/lacp/input.c +++ b/src/plugins/lacp/input.c @@ -16,6 +16,7 @@ #define _GNU_SOURCE #include #include +#include static int lacp_packet_scan (vlib_main_t * vm, slave_if_t * sif) @@ -61,7 +62,7 @@ marker_fill_request_pdu (marker_pdu_t * marker, slave_if_t * sif) } static void -send_ethernet_marker_response_pdu (slave_if_t * sif) +send_ethernet_marker_response_pdu (vlib_main_t * vm, slave_if_t * sif) { lacp_main_t *lm = &lacp_main; u32 *to_next; @@ -70,7 +71,6 @@ send_ethernet_marker_response_pdu (slave_if_t * sif) u32 bi0; vlib_buffer_t *b0; vlib_frame_t *f; - vlib_main_t *vm = lm->vlib_main; vnet_main_t *vnm = lm->vnet_main; /* @@ -108,6 +108,8 @@ send_ethernet_marker_response_pdu (slave_if_t * sif) f->n_vectors = 1; vlib_put_frame_to_node (vm, hw->output_node_index, f); + sif->last_marker_pdu_sent_time = vlib_time_now (vm); + sif->marker_pdu_sent++; } static int @@ -123,7 +125,7 @@ handle_marker_protocol (vlib_main_t * vm, slave_if_t * sif) (marker->terminator.tlv_length != 0)) return (LACP_ERROR_BAD_TLV); - send_ethernet_marker_response_pdu (sif); + send_ethernet_marker_response_pdu (vm, sif); return LACP_ERROR_NONE; } @@ -134,7 +136,7 @@ handle_marker_protocol (vlib_main_t * vm, slave_if_t * sif) lacp_error_t lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0) { - lacp_main_t *lm = &lacp_main; + bond_main_t *bm = &bond_main; slave_if_t *sif; uword nbytes; lacp_error_t e; @@ -153,6 +155,7 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0) marker = (marker_pdu_t *) (b0->data + b0->current_data); if (marker->subtype == MARKER_SUBTYPE) { + sif->last_marker_pdu_recd_time = vlib_time_now (vm); if (sif->last_marker_pkt) _vec_len (sif->last_marker_pkt) = 0; vec_validate (sif->last_marker_pkt, @@ -160,8 +163,13 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0) nbytes = vlib_buffer_contents (vm, bi0, sif->last_marker_pkt); ASSERT (nbytes <= vec_len (sif->last_marker_pkt)); if (nbytes < sizeof (lacp_pdu_t)) - return LACP_ERROR_TOO_SMALL; - return (handle_marker_protocol (vm, sif)); + { + sif->marker_bad_pdu_received++; + return LACP_ERROR_TOO_SMALL; + } + e = handle_marker_protocol (vm, sif); + sif->marker_pdu_received++; + return e; } /* @@ -185,30 +193,38 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0) nbytes = vlib_buffer_contents (vm, bi0, sif->last_rx_pkt); ASSERT (nbytes <= vec_len (sif->last_rx_pkt)); + sif->last_lacpdu_recd_time = vlib_time_now (vm); if (nbytes < sizeof (lacp_pdu_t)) { + sif->bad_pdu_received++; return LACP_ERROR_TOO_SMALL; } last_packet_signature = hash_memory (sif->last_rx_pkt, vec_len (sif->last_rx_pkt), 0xd00b); - bif = bond_get_master_by_dev_instance (sif->bif_dev_instance); if (sif->last_packet_signature_valid && (sif->last_packet_signature == last_packet_signature) && - hash_get (bif->active_slave_by_sw_if_index, sif->sw_if_index)) + ((sif->actor.state & LACP_STEADY_STATE) == LACP_STEADY_STATE)) { - lacp_start_current_while_timer (lm->vlib_main, sif, - sif->ttl_in_seconds); + lacp_start_current_while_timer (vm, sif, sif->ttl_in_seconds); e = LACP_ERROR_CACHE_HIT; } else { /* 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; } + sif->pdu_received++; if (sif->last_rx_pkt) _vec_len (sif->last_rx_pkt) = 0; @@ -222,15 +238,15 @@ lacp_input (vlib_main_t * vm, vlib_buffer_t * b0, u32 bi0) static clib_error_t * lacp_init (vlib_main_t * vm) { - clib_error_t *error; - - if ((error = vlib_call_init_function (vm, lacp_periodic_init))) - return error; - return 0; } -VLIB_INIT_FUNCTION (lacp_init); +/* *INDENT-OFF* */ +VLIB_INIT_FUNCTION (lacp_init) = +{ + .runs_after = VLIB_INITS("lacp_periodic_init"), +}; +/* *INDENT-ON* */ /* * packet trace format function, very similar to @@ -249,6 +265,8 @@ lacp_input_format_trace (u8 * s, va_list * args) u8 *p; lacp_state_struct *state_entry; + s = format (s, "%U:\n", format_vnet_sw_if_index_name, vnet_get_main (), + t->sw_if_index); s = format (s, "Length: %d\n", t->len); if (t->len >= sizeof (lacp_pdu_t)) { @@ -265,11 +283,11 @@ lacp_input_format_trace (u8 * s, va_list * args) s = format (s, " Marker Information TLV: length %u\n", marker->marker_info.tlv_length); s = format (s, " Requester port: %u\n", - marker->marker_info.requester_port); + ntohs (marker->marker_info.requester_port)); s = format (s, " Requester system: %U\n", format_ethernet_address, marker->marker_info.requester_system); s = format (s, " Requester transaction ID: %u\n", - marker->marker_info.requester_transaction_id); + ntohl (marker->marker_info.requester_transaction_id)); break; case LACP_SUBTYPE: