X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Figmp%2Figmp.c;h=d66a013e3f96280d1e43d6e726e3973fdc63448d;hb=5d5f85f5e4003476fb6d9a0ccd6ad58ad90e5138;hp=7f828619331e0096694b325fa41a1b9380736dda;hpb=1d1985de91833a5483a6b7ee96ef4090d530a7a6;p=vpp.git diff --git a/src/plugins/igmp/igmp.c b/src/plugins/igmp/igmp.c index 7f828619331..d66a013e3f9 100644 --- a/src/plugins/igmp/igmp.c +++ b/src/plugins/igmp/igmp.c @@ -282,7 +282,7 @@ igmp_listen (vlib_main_t * vm, } if (0 == igmp_group_n_srcs (group, mode)) - igmp_group_clear (group); + igmp_group_clear (&group); vec_free (added); vec_free (removed); @@ -303,13 +303,6 @@ error: return (rv); } -/** \brief igmp hardware interface link up down - @param vnm - vnet main - @param hw_if_index - interface hw_if_index - @param flags - hw interface flags - - If an interface goes down, remove its (S,G)s. -*/ static walk_rc_t igmp_sw_if_down (vnet_main_t * vnm, u32 sw_if_index, void *ctx) { @@ -325,6 +318,13 @@ igmp_sw_if_down (vnet_main_t * vnm, u32 sw_if_index, void *ctx) return (WALK_CONTINUE); } +/** \brief igmp hardware interface link up down + @param vnm - vnet main + @param hw_if_index - interface hw_if_index + @param flags - hw interface flags + + If an interface goes down, remove its (S,G)s. +*/ static clib_error_t * igmp_hw_interface_link_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags) { @@ -346,15 +346,6 @@ igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode) format_vnet_sw_if_index_name, vnet_get_main (), sw_if_index); /* *INDENT-OFF* */ - fib_route_path_t for_us_path = - { - .frp_proto = fib_proto_to_dpo (FIB_PROTOCOL_IP4), - .frp_addr = zero_addr, - .frp_sw_if_index = 0xffffffff, - .frp_fib_index = 0, - .frp_weight = 1, - .frp_flags = FIB_ROUTE_PATH_LOCAL, - }; fib_route_path_t via_itf_path = { .frp_proto = fib_proto_to_dpo (FIB_PROTOCOL_IP4), @@ -362,7 +353,18 @@ igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode) .frp_sw_if_index = sw_if_index, .frp_fib_index = 0, .frp_weight = 1, + .frp_mitf_flags = MFIB_ITF_FLAG_ACCEPT, }; + fib_route_path_t for_us_path = { + .frp_proto = fib_proto_to_dpo (FIB_PROTOCOL_IP4), + .frp_addr = zero_addr, + .frp_sw_if_index = 0xffffffff, + .frp_fib_index = 1, + .frp_weight = 0, + .frp_flags = FIB_ROUTE_PATH_LOCAL, + .frp_mitf_flags = MFIB_ITF_FLAG_FORWARD, + }; + /* *INDENT-ON* */ /* find configuration, if it doesn't exist, create new */ config = igmp_config_lookup (sw_if_index); @@ -405,24 +407,20 @@ igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode) if (1 == im->n_configs_per_mfib_index[mfib_index]) { /* first config in this FIB */ - mfib_table_entry_path_update (mfib_index, - &mpfx_general_query, + mfib_table_lock (mfib_index, FIB_PROTOCOL_IP4, MFIB_SOURCE_IGMP); + mfib_table_entry_path_update (mfib_index, &mpfx_general_query, MFIB_SOURCE_IGMP, - &for_us_path, - MFIB_ITF_FLAG_FORWARD); - mfib_table_entry_path_update (mfib_index, - &mpfx_report, + MFIB_ENTRY_FLAG_NONE, &for_us_path); + mfib_table_entry_path_update (mfib_index, &mpfx_report, MFIB_SOURCE_IGMP, - &for_us_path, - MFIB_ITF_FLAG_FORWARD); + MFIB_ENTRY_FLAG_NONE, &for_us_path); } - mfib_table_entry_path_update (mfib_index, - &mpfx_general_query, - MFIB_SOURCE_IGMP, - &via_itf_path, MFIB_ITF_FLAG_ACCEPT); + mfib_table_entry_path_update (mfib_index, &mpfx_general_query, + MFIB_SOURCE_IGMP, MFIB_ENTRY_FLAG_NONE, + &via_itf_path); mfib_table_entry_path_update (mfib_index, &mpfx_report, - MFIB_SOURCE_IGMP, &via_itf_path, - MFIB_ITF_FLAG_ACCEPT); + MFIB_SOURCE_IGMP, MFIB_ENTRY_FLAG_NONE, + &via_itf_path); } } else if (config && !enable) @@ -438,6 +436,7 @@ igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode) mfib_table_entry_path_remove (mfib_index, &mpfx_report, MFIB_SOURCE_IGMP, &for_us_path); + mfib_table_unlock (mfib_index, FIB_PROTOCOL_IP4, MFIB_SOURCE_IGMP); } mfib_table_entry_path_remove (mfib_index, @@ -479,24 +478,23 @@ igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode) static clib_error_t * igmp_init (vlib_main_t * vm) { - clib_error_t *error; igmp_main_t *im = &igmp_main; - if ((error = vlib_call_init_function (vm, ip4_lookup_init))) - return error; - im->igmp_api_client_by_client_index = hash_create (0, sizeof (u32)); - im->logger = vlib_log_register_class ("igmp", 0); IGMP_DBG ("initialized"); - return (error); + return (0); } -VLIB_INIT_FUNCTION (igmp_init); /* *INDENT-OFF* */ -VLIB_PLUGIN_REGISTER () = { +VLIB_INIT_FUNCTION (igmp_init) = +{ + .runs_after = VLIB_INITS("ip4_lookup_init"), +}; +VLIB_PLUGIN_REGISTER () = +{ .version = VPP_BUILD_VER, .description = "Internet Group Management Protocol (IGMP)", };