summaryrefslogtreecommitdiff
path: root/cesar/cp/sta
diff options
context:
space:
mode:
authorDavid Mercadie2011-05-05 16:55:47 +0200
committerDavid Mercadie2011-05-18 14:20:02 +0200
commitfdd874acacdf7dd167a8d228c13b01ea8a38711d (patch)
tree620a4cde5ef12d7afbe08722dc4582464d7227df /cesar/cp/sta
parent88ebb85bff702c4f5461e647256c7c29a7766f5a (diff)
cesar/{cl, cp/{sta/{action, mgr}, msg}}: support IGMP with mutiple members in a group, closes #2470
Diffstat (limited to 'cesar/cp/sta')
-rw-r--r--cesar/cp/sta/action/src/bridge.c5
-rw-r--r--cesar/cp/sta/action/src/drv.c30
-rw-r--r--cesar/cp/sta/action/test/utest/inc/scenario_defs.h7
-rw-r--r--cesar/cp/sta/action/test/utest/src/dataplane_stub.c37
-rw-r--r--cesar/cp/sta/action/test/utest/src/drv.c18
-rw-r--r--cesar/cp/sta/action/test/utest/src/msg_stub.c4
-rw-r--r--cesar/cp/sta/mgr/src/sta_mgr.c10
7 files changed, 74 insertions, 37 deletions
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);
}
}