X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fbonding%2Fnode.h;h=8ead02285235dd0736d682691c7a580a275c0ffe;hb=282872127;hp=3a01abe222622badc9b10ea9fcebb1a55a83284f;hpb=18c0f229cec4695cf77a0e3a9033d2ff0d1e085a;p=vpp.git diff --git a/src/vnet/bonding/node.h b/src/vnet/bonding/node.h index 3a01abe2226..8ead0228523 100644 --- a/src/vnet/bonding/node.h +++ b/src/vnet/bonding/node.h @@ -31,6 +31,9 @@ #define MIN(x,y) (((x)<(y))?(x):(y)) #endif +#define BOND_MODULO_SHORTCUT(a) \ + (is_pow2 (a)) + #define foreach_bond_mode \ _ (1, ROUND_ROBIN, "round-robin") \ _ (2, ACTIVE_BACKUP, "active-backup") \ @@ -48,13 +51,13 @@ typedef enum /* configurable load-balances */ #define foreach_bond_lb \ _ (2, L23, "l23", l23) \ - _ (1, l34 , "l34", l34) \ + _ (1, L34 , "l34", l34) \ _ (0, L2, "l2", l2) /* load-balance functions implemented in bond-output */ #define foreach_bond_lb_algo \ _ (0, L2, "l2", l2) \ - _ (1, l34 , "l34", l34) \ + _ (1, L34 , "l34", l34) \ _ (2, L23, "l23", l23) \ _ (3, RR, "round-robin", round_robin) \ _ (4, BC, "broadcast", broadcast) \ @@ -67,12 +70,19 @@ typedef enum #undef _ } bond_load_balance_t; +typedef enum +{ + BOND_SEND_GARP_NA = 1, +} bond_send_garp_na_process_event_t; + typedef struct { + u32 id; u8 hw_addr_set; u8 hw_addr[6]; u8 mode; u8 lb; + u8 numa_only; /* return */ u32 sw_if_index; int rv; @@ -100,13 +110,24 @@ typedef struct clib_error_t *error; } bond_detach_slave_args_t; +typedef struct +{ + u32 sw_if_index; + u32 weight; + /* return */ + int rv; + clib_error_t *error; +} bond_set_intf_weight_args_t; + /** BOND interface details struct */ typedef struct { u32 sw_if_index; + u32 id; u8 interface_name[64]; u8 mode; u8 lb; + u8 numa_only; u32 active_slaves; u32 slaves; } bond_interface_details_t; @@ -118,6 +139,8 @@ typedef struct u8 interface_name[64]; u8 is_passive; u8 is_long_timeout; + u8 is_local_numa; + u32 weight; u32 active_slaves; } slave_interface_details_t; @@ -131,9 +154,15 @@ typedef CLIB_PACKED (struct typedef struct { - vlib_frame_t **frame; + CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); + u32 buffers[VLIB_FRAME_SIZE]; + u32 n_buffers; +} bond_per_port_queue_t; -} bond_if_per_thread_t; +typedef struct +{ + bond_per_port_queue_t *per_port_queue; +} bond_per_thread_data_t; typedef struct { @@ -144,7 +173,12 @@ typedef struct /* the last slave index for the rr lb */ u32 lb_rr_last_index; + /* Real device instance in interface vector */ u32 dev_instance; + + /* Interface ID being shown to user */ + u32 id; + u32 hw_if_index; u32 sw_if_index; @@ -154,20 +188,24 @@ typedef struct /* Slaves that are in DISTRIBUTING state */ u32 *active_slaves; - /* rapidly find an active slave */ - uword *active_slave_by_sw_if_index; - lacp_port_info_t partner; lacp_port_info_t actor; u8 individual_aggregator; + /* If the flag numa_only is set, it means that only slaves + on local numa node works for lacp mode if have at least one, + otherwise it works as usual. */ + u8 numa_only; + + /* How many slaves on local numa node are there in lacp mode? */ + word n_numa_slaves; + u32 group; uword *port_number_bitmap; u8 use_custom_mac; u8 hw_address[6]; clib_spinlock_t lockp; - bond_if_per_thread_t *per_thread_info; } bond_if_t; typedef struct @@ -204,6 +242,9 @@ typedef struct /* neighbor vlib hw_if_index */ u32 hw_if_index; + /* weight -- valid only for active backup */ + u32 weight; + /* actor does not initiate the protocol exchange */ u8 is_passive; @@ -211,7 +252,7 @@ typedef struct lacp_port_info_t partner; lacp_port_info_t partner_admin;; - /* Partner port information */ + /* Actor port information */ lacp_port_info_t actor; lacp_port_info_t actor_admin; @@ -246,7 +287,16 @@ typedef struct f64 actor_churn_timer; /* time last lacpdu was sent */ - f64 last_lacpdu_time; + f64 last_lacpdu_sent_time; + + /* time last lacpdu was received */ + f64 last_lacpdu_recd_time; + + /* time last marker pdu was sent */ + f64 last_marker_pdu_sent_time; + + /* time last marker pdu was received */ + f64 last_marker_pdu_recd_time; /* timer used to generate periodic transmission */ f64 periodic_timer; @@ -275,22 +325,47 @@ typedef struct /* bond mode */ u8 mode; - clib_spinlock_t lockp; + /* good lacp pdu received */ + u64 pdu_received; + + /* bad lacp pdu received */ + u64 bad_pdu_received; + + /* pdu sent */ + u64 pdu_sent; + + /* good marker pdu received */ + u64 marker_pdu_received; + + /* bad marker pdu received */ + u64 marker_bad_pdu_received; + + /* pdu sent */ + u64 marker_pdu_sent; + + /* slave is numa node */ + u8 is_local_numa; } slave_if_t; 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_if_t *interfaces; - /* pool of lacp neighbors */ - slave_if_t *neighbors; + /* record used interface IDs */ + uword *id_used; - /* rapidly find a neighbor by vlib software interface index */ - uword *neighbor_by_sw_if_index; + /* pool of slave interfaces */ + slave_if_t *neighbors; /* rapidly find a bond by vlib software interface index */ uword *bond_by_sw_if_index; @@ -303,6 +378,12 @@ typedef struct u8 lacp_plugin_loaded; lacp_enable_disable_func lacp_enable_disable; + + uword *slave_by_sw_if_index; + + bond_per_thread_data_t *per_thread_data; + + lacp_stats_t **stats; } bond_main_t; /* bond packet trace capture */ @@ -323,6 +404,7 @@ typedef struct } bond_load_balance_func_t; extern vlib_node_registration_t bond_input_node; +extern vlib_node_registration_t bond_process_node; extern vnet_device_class_t bond_dev_class; extern bond_main_t bond_main; @@ -331,6 +413,8 @@ void bond_disable_collecting_distributing (vlib_main_t * vm, void bond_enable_collecting_distributing (vlib_main_t * vm, slave_if_t * sif); u8 *format_bond_interface_name (u8 * s, va_list * args); +void bond_set_intf_weight (vlib_main_t * vm, + bond_set_intf_weight_args_t * args); void bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args); int bond_delete_if (vlib_main_t * vm, u32 sw_if_index); void bond_enslave (vlib_main_t * vm, bond_enslave_args_t * args); @@ -439,13 +523,15 @@ bond_get_slave_by_sw_if_index (u32 sw_if_index) { bond_main_t *bm = &bond_main; slave_if_t *sif = 0; - uword *p; + uword p; - p = hash_get (bm->neighbor_by_sw_if_index, sw_if_index); - if (p) + if (sw_if_index < vec_len (bm->slave_by_sw_if_index)) { - sif = pool_elt_at_index (bm->neighbors, p[0]); + p = bm->slave_by_sw_if_index[sw_if_index]; + if (p) + sif = pool_elt_at_index (bm->neighbors, p >> 1); } + return sif; }