From fdd874acacdf7dd167a8d228c13b01ea8a38711d Mon Sep 17 00:00:00 2001 From: David Mercadie Date: Thu, 5 May 2011 16:55:47 +0200 Subject: cesar/{cl, cp/{sta/{action, mgr}, msg}}: support IGMP with mutiple members in a group, closes #2470 --- cesar/cp/sta/action/src/bridge.c | 5 +++ cesar/cp/sta/action/src/drv.c | 30 +++++++----------- cesar/cp/sta/action/test/utest/inc/scenario_defs.h | 7 +++- .../cp/sta/action/test/utest/src/dataplane_stub.c | 37 +++++++++++++++++----- cesar/cp/sta/action/test/utest/src/drv.c | 18 ++++++++--- cesar/cp/sta/action/test/utest/src/msg_stub.c | 4 +-- cesar/cp/sta/mgr/src/sta_mgr.c | 10 +++--- 7 files changed, 74 insertions(+), 37 deletions(-) (limited to 'cesar/cp/sta') diff --git a/cesar/cp/sta/action/src/bridge.c b/cesar/cp/sta/action/src/bridge.c index cef13c4d29..2d27454ee3 100644 --- a/cesar/cp/sta/action/src/bridge.c +++ b/cesar/cp/sta/action/src/bridge.c @@ -99,6 +99,10 @@ cp_sta_action_process_cm_brg_info_cnf (cp_t *ctx, cp_mme_rx_t *mme) cl_mactotei_blk_t *new_table = cl_mactotei_new (); /* Copy entries except the old ones. */ cl_mactotei_copy_except_tag (ctx->cl, new_table, mme->peer.tei); + /* Copy also the multicast group if exist */ + cl_mactotei_copy_tei_and_tag (ctx->cl, new_table, MAC_TEI_BCAST, + mme->peer.tei); + /* Add new entries. */ uint count; mac_t bda; @@ -127,6 +131,7 @@ cp_sta_action_process_cm_brg_info_cnf (cp_t *ctx, cp_mme_rx_t *mme) { /* Use new MAC to TEI table. */ cl_mactotei_use_table (ctx->cl, new_table); + cl_update_igmp_groups (ctx->cl); } } /* End MME decoding if there are no error. */ diff --git a/cesar/cp/sta/action/src/drv.c b/cesar/cp/sta/action/src/drv.c index 837399018d..58a0984931 100644 --- a/cesar/cp/sta/action/src/drv.c +++ b/cesar/cp/sta/action/src/drv.c @@ -550,35 +550,29 @@ cp_sta_action_drv__drv_mcast_set_list_req (cp_t *ctx, cp_mme_rx_t *mme) dbg_assert (mme); cp_msg_drv_result_t result = CP_MSG_DRV_RESULT_SUCCESS; + igmp_groups_t *igmp_groups = NULL; - mac_t groups[MCAST_GROUP_MAX_NB]; - int nb_groups; - int nb_members[MCAST_GROUP_MAX_NB]; - mac_t members[MCAST_GROUP_MAX_NB][MCAST_MEMBER_MAX_NB]; + igmp_groups = cl_get_igmp_groups (ctx->cl); - if (cp_msg_drv_mcast_set_list_req_receive (ctx, mme, &nb_groups, groups, - nb_members, members)) + if (cp_msg_drv_mcast_set_list_req_receive (ctx, mme, &igmp_groups->nb, + igmp_groups->group_mac, + igmp_groups->nb_total_members, + igmp_groups->member_mac)) { /* Create a new table. */ cl_mactotei_blk_t *new_table = cl_mactotei_new (); /* Copy entries except the groups entries. */ - cl_mactotei_copy_except_tag (ctx->cl, new_table, MAC_TEI_BCAST); + cl_mactotei_copy_except_tei (ctx->cl, new_table, MAC_TEI_BCAST); /* Add new entries. */ - int group; - for (group = 0; group < nb_groups; group++) + uint g; + for (g = 0; g < igmp_groups->nb; g++) { - dbg_assert (nb_members[group] == 1); - /* Get the tei from the mactotei table. */ - cp_tei_t tei = cl_mactotei_table_find_tei_from_mac ( - ctx->cl, members[group][0]); - - /* Add bridged destination address. */ - if (MAC_TEI_IS_STA(tei)) - cl_mactotei_addr_add (new_table, groups[group], tei, - MAC_TEI_BCAST); + cl_mactotei_addr_add (new_table, igmp_groups->group_mac[g], + MAC_TEI_BCAST, g); } /* Use new MAC to TEI table. */ cl_mactotei_use_table (ctx->cl, new_table); + cl_update_igmp_groups (ctx->cl); } else result = CP_MSG_DRV_RESULT_FAILURE; diff --git a/cesar/cp/sta/action/test/utest/inc/scenario_defs.h b/cesar/cp/sta/action/test/utest/inc/scenario_defs.h index ce48e91e05..26e11b62e2 100644 --- a/cesar/cp/sta/action/test/utest/inc/scenario_defs.h +++ b/cesar/cp/sta/action/test/utest/inc/scenario_defs.h @@ -449,9 +449,12 @@ __0 (whoru_timeout_process) \ cl_mactotei_new, \ cl_mactotei_copy_except_tag, \ + cl_mactotei_copy_except_tei, \ cl_mactotei_addr_add, \ cl_mactotei_use_table, \ cl_mactotei_cancel, \ + cl_get_igmp_groups, \ + cl_update_igmp_groups, \ \ cp_msg_cm_brg_info_cnf_receive_begin, \ cp_msg_cm_brg_info_cnf_receive, \ @@ -854,8 +857,10 @@ __e (cl_mactotei_use_table) __e (cl_mactotei_cancel) __e (cl_mactotei_new) __e (cl_mactotei_copy_except_tag) +__e (cl_mactotei_copy_except_tei) __e (cp_sta_own_data_set_nid, cp_nid_t nid) - +__e (cl_get_igmp_groups, igmp_groups_t *groups) +__e (cl_update_igmp_groups) #undef __e #undef __er diff --git a/cesar/cp/sta/action/test/utest/src/dataplane_stub.c b/cesar/cp/sta/action/test/utest/src/dataplane_stub.c index 237827bc54..7ae91e0334 100644 --- a/cesar/cp/sta/action/test/utest/src/dataplane_stub.c +++ b/cesar/cp/sta/action/test/utest/src/dataplane_stub.c @@ -27,14 +27,7 @@ cl_mactotei_new (void) scenario_event (cl_mactotei_new); return INVALID_PTR; } -/* -void -cl_mactotei_addr_add (cl_mactotei_blk_t *table, mac_t mac_addr, - uint tei, uint tag) -{ - scenario_event (cl_mactotei_addr_add); -} -*/ + void cl_mactotei_copy_except_tag (cl_t *ctx, cl_mactotei_blk_t *table, uint tag) { @@ -45,6 +38,16 @@ cl_mactotei_copy_except_tag (cl_t *ctx, cl_mactotei_blk_t *table, uint tag) scenario_event (cl_mactotei_copy_except_tag); } +void +cl_mactotei_copy_except_tei (cl_t *ctx, cl_mactotei_blk_t *table, uint tei) +{ + if (!scenario.current + || (scenario.current->event_id != + SCENARIO_EVENT_cl_mactotei_copy_except_tei)) + return; /* Be less strict. */ + scenario_event (cl_mactotei_copy_except_tei); +} + uint cl_mactotei_table_find_tei_from_mac (cl_t *ctx, mac_t mac) { @@ -87,6 +90,24 @@ cl_mactotei_cancel (cl_mactotei_blk_t *table) scenario_event (cl_mactotei_cancel); } +igmp_groups_t * +cl_get_igmp_groups (cl_t *ctx) +{ + scenario_event (cl_get_igmp_groups, param); + + return param->groups; +} + +void +cl_update_igmp_groups (cl_t *ctx) +{ + if (!scenario.current + || (scenario.current->event_id != SCENARIO_EVENT_cl_update_igmp_groups)) + return; /* Be less strict. */ + + scenario_event (cl_update_igmp_groups); +} + void sar_activate (sar_t *ctx, bool flag) { diff --git a/cesar/cp/sta/action/test/utest/src/drv.c b/cesar/cp/sta/action/test/utest/src/drv.c index e126f58fb2..8bcbc31a9f 100644 --- a/cesar/cp/sta/action/test/utest/src/drv.c +++ b/cesar/cp/sta/action/test/utest/src/drv.c @@ -731,6 +731,8 @@ drv_mcast_test_case (test_t t) .cp = &ctx.cp, }; + igmp_groups_t igmp_groups; + test_case_begin (t, "igmp"); test_begin (t, "set") { @@ -750,6 +752,8 @@ drv_mcast_test_case (test_t t) /* Set multicast set list. */ scenario_entry_t entries[] = { SCENARIO_ACTION (drv__drv_mcast_set_list_req, .peer = peer), + SCENARIO_EVENT (cl_get_igmp_groups, + .groups = &igmp_groups), SCENARIO_EVENT (cp_msg_drv_mcast_set_list_req_receive, .ok = true, .nb_groups = nb_groups, @@ -757,12 +761,13 @@ drv_mcast_test_case (test_t t) .nb_members = nb_members, .members = (mac_t*)members), SCENARIO_EVENT (cl_mactotei_new), - SCENARIO_EVENT (cl_mactotei_copy_except_tag), + SCENARIO_EVENT (cl_mactotei_copy_except_tei), SCENARIO_EVENT (cl_mactotei_addr_add, .mac = groups[0], - .tag = MAC_TEI_BCAST), + .tag = 0), SCENARIO_EVENT (cl_mactotei_addr_add, .mac = groups[1], - .tag = MAC_TEI_BCAST), + .tag = 1), SCENARIO_EVENT (cl_mactotei_use_table), + SCENARIO_EVENT (cl_update_igmp_groups), SCENARIO_EVENT (cp_msg_drv_any_cnf_send, .peer = peer, .mmtype = DRV_MCAST_SET_LIST_CNF, @@ -785,13 +790,16 @@ drv_mcast_test_case (test_t t) /* Set multicast set list. */ scenario_entry_t entries[] = { SCENARIO_ACTION (drv__drv_mcast_set_list_req, .peer = peer), + SCENARIO_EVENT (cl_get_igmp_groups, + .groups = &igmp_groups), SCENARIO_EVENT (cp_msg_drv_mcast_set_list_req_receive, .ok = true, .nb_groups = nb_groups, .groups = groups, .nb_members = nb_members, .members = (mac_t*)members), SCENARIO_EVENT (cl_mactotei_new), - SCENARIO_EVENT (cl_mactotei_copy_except_tag), + SCENARIO_EVENT (cl_mactotei_copy_except_tei), SCENARIO_EVENT (cl_mactotei_use_table), + SCENARIO_EVENT (cl_update_igmp_groups), SCENARIO_EVENT (cp_msg_drv_any_cnf_send, .peer = peer, .mmtype = DRV_MCAST_SET_LIST_CNF, @@ -812,6 +820,8 @@ drv_mcast_test_case (test_t t) /* Set multicast set list. */ scenario_entry_t entries[] = { SCENARIO_ACTION (drv__drv_mcast_set_list_req, .peer = peer), + SCENARIO_EVENT (cl_get_igmp_groups, + .groups = &igmp_groups), SCENARIO_EVENT (cp_msg_drv_mcast_set_list_req_receive, .ok = false, .nb_groups = nb_groups, .groups = groups, .nb_members = nb_members, diff --git a/cesar/cp/sta/action/test/utest/src/msg_stub.c b/cesar/cp/sta/action/test/utest/src/msg_stub.c index 41593791f7..38b1c6381b 100644 --- a/cesar/cp/sta/action/test/utest/src/msg_stub.c +++ b/cesar/cp/sta/action/test/utest/src/msg_stub.c @@ -503,9 +503,9 @@ __msd (cp_msg_drv_sta_status_ind_send, cp_msg_drv_sta_status_t, __mr (cp_msg_drv_sta_set_config_req_receive, (char *, config, string)) __mr (cp_msg_drv_mcast_set_list_req_receive, - (int, nb_groups, assign), + (uint, nb_groups, assign), (mac_t, groups, array, [MCAST_GROUP_MAX_NB]), - (int, nb_members, array, [MCAST_GROUP_MAX_NB]), + (uint, nb_members, array, [MCAST_GROUP_MAX_NB]), (mac_t, members, array, [MCAST_GROUP_MAX_NB][MCAST_MEMBER_MAX_NB])) __mr (cp_msg_cm_brg_info_cnf_receive_begin, diff --git a/cesar/cp/sta/mgr/src/sta_mgr.c b/cesar/cp/sta/mgr/src/sta_mgr.c index 241eaea5a2..d25d781a9e 100644 --- a/cesar/cp/sta/mgr/src/sta_mgr.c +++ b/cesar/cp/sta/mgr/src/sta_mgr.c @@ -734,7 +734,9 @@ cp_sta_mgr_sta_remove (cp_t *ctx, cp_sta_t * station) if ((sta->net == ctx->sta_mgr.our_avln) && (MAC_TEI_IS_STA (sta->tei))) + { sar_sta_remove (ctx->sar, sta->tei); + } cp_sta_mgr_sta_remove_common (ctx, station); @@ -866,17 +868,17 @@ cp_sta_mgr_commit_to_dataplane (cp_t *ctx) // Copy all the bridge table from the previous list. cl_mactotei_copy_tei_and_tag (ctx->cl, mactotei, sta_private->tei, sta_private->tei); - // Copy all the groups list table from the previous list. - cl_mactotei_copy_tei_and_tag (ctx->cl, mactotei, sta_private->tei, - MAC_TEI_BCAST); // Add the current station. cl_mactotei_addr_add (mactotei, sta_private->mac_address, sta_private->tei, MAC_TEI_UNASSOCIATED); - } + // Copy all the groups list table from the previous list. + cl_mactotei_copy_tei (ctx->cl, mactotei, MAC_TEI_BCAST); + // Request the CL to use the table. cl_mactotei_use_table (ctx->cl, mactotei); + cl_update_igmp_groups (ctx->cl); } } -- cgit v1.2.3