- igmp_type_info_t *ti;
- igmp_report_type_info_t *rti;
-#define igmp_type(n,s) \
-do { \
- vec_add2 (im->type_infos, ti, 1); \
- ti->type = n; \
- ti->name = (u8 *) #s; \
-} while (0);
-
-#define igmp_report_type(n,s) \
-do { \
- vec_add2 (im->report_type_infos, rti, 1); \
- rti->type = n; \
- rti->name = (u8 *) #s; \
-} while (0);
-
-#include "igmp.def"
-
-#undef igmp_type
-#undef igmp_report_type
-
- for (i = 0; i < vec_len (im->type_infos); i++)
- {
- ti = im->type_infos + i;
- hash_set (im->type_info_by_type, ti->type, i);
- }
-
- for (i = 0; i < vec_len (im->report_type_infos); i++)
- {
- rti = im->report_type_infos + i;
- hash_set (im->report_type_info_by_report_type, rti->type, i);
- }
-
- /* General Query address */
- ip46_address_t addr0;
- addr0.ip4.as_u8[0] = 224;
- addr0.ip4.as_u8[1] = 0;
- addr0.ip4.as_u8[2] = 0;
- addr0.ip4.as_u8[3] = 1;
- /* Report address */
- ip46_address_t addr1;
- addr1.ip4.as_u8[0] = 224;
- addr1.ip4.as_u8[1] = 0;
- addr1.ip4.as_u8[2] = 0;
- addr1.ip4.as_u8[3] = 22;
-
- fib_route_path_t 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 = 0,
- .frp_flags = FIB_ROUTE_PATH_LOCAL,
- };
- const mfib_prefix_t mpfx0 = {
- .fp_proto = FIB_PROTOCOL_IP4,
- .fp_len = 32,
- .fp_grp_addr = addr0,
- };
- const mfib_prefix_t mpfx1 = {
- .fp_proto = FIB_PROTOCOL_IP4,
- .fp_len = 32,
- .fp_grp_addr = addr1,
- };
- /* configure MFIB to accept IGMPv3 general query and reports from all interfaces */
- mfib_table_entry_path_update (0, &mpfx0, MFIB_SOURCE_DEFAULT_ROUTE, &path,
- MFIB_ITF_FLAG_FORWARD);
- mfib_table_entry_path_update (0, &mpfx1, MFIB_SOURCE_DEFAULT_ROUTE, &path,
- MFIB_ITF_FLAG_FORWARD);
-
- mfib_table_entry_update (0, &mpfx0, MFIB_SOURCE_DEFAULT_ROUTE, 0,
- MFIB_ENTRY_FLAG_ACCEPT_ALL_ITF);
- mfib_table_entry_update (0, &mpfx1, MFIB_SOURCE_DEFAULT_ROUTE, 0,
- MFIB_ENTRY_FLAG_ACCEPT_ALL_ITF);
-
- return 0;