summaryrefslogtreecommitdiff
path: root/cesar/cp
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
parent88ebb85bff702c4f5461e647256c7c29a7766f5a (diff)
cesar/{cl, cp/{sta/{action, mgr}, msg}}: support IGMP with mutiple members in a group, closes #2470
Diffstat (limited to 'cesar/cp')
-rw-r--r--cesar/cp/msg/inc/msg_drv.h4
-rw-r--r--cesar/cp/msg/src/msg_drv.c8
-rw-r--r--cesar/cp/msg/test/src/msg_drv.c109
-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
10 files changed, 135 insertions, 97 deletions
diff --git a/cesar/cp/msg/inc/msg_drv.h b/cesar/cp/msg/inc/msg_drv.h
index faffaaac08..a15a98c6e4 100644
--- a/cesar/cp/msg/inc/msg_drv.h
+++ b/cesar/cp/msg/inc/msg_drv.h
@@ -337,8 +337,8 @@ cp_msg_drv_sta_set_avln_hfid_ind_send (cp_t *ctx, cp_mme_peer_t *peer,
*/
bool
cp_msg_drv_mcast_set_list_req_receive (
- cp_t *ctx, cp_mme_rx_t *mme, int *nb_groups,
- mac_t groups[MCAST_GROUP_MAX_NB], int nb_members[MCAST_GROUP_MAX_NB],
+ cp_t *ctx, cp_mme_rx_t *mme, uint *nb_groups,
+ mac_t groups[MCAST_GROUP_MAX_NB], uint nb_members[MCAST_GROUP_MAX_NB],
mac_t members[MCAST_GROUP_MAX_NB][MCAST_MEMBER_MAX_NB]);
END_DECLS
diff --git a/cesar/cp/msg/src/msg_drv.c b/cesar/cp/msg/src/msg_drv.c
index 8920772e37..98db473794 100644
--- a/cesar/cp/msg/src/msg_drv.c
+++ b/cesar/cp/msg/src/msg_drv.c
@@ -663,8 +663,8 @@ cp_msg_drv_sta_set_avln_hfid_ind_send (cp_t *ctx, cp_mme_peer_t *peer,
bool
cp_msg_drv_mcast_set_list_req_receive (
- cp_t *ctx, cp_mme_rx_t *mme, int *nb_groups,
- mac_t groups[MCAST_GROUP_MAX_NB], int nb_members[MCAST_GROUP_MAX_NB],
+ cp_t *ctx, cp_mme_rx_t *mme, uint *nb_groups,
+ mac_t groups[MCAST_GROUP_MAX_NB], uint nb_members[MCAST_GROUP_MAX_NB],
mac_t members[MCAST_GROUP_MAX_NB][MCAST_MEMBER_MAX_NB])
{
/* Check parameters. */
@@ -681,7 +681,7 @@ cp_msg_drv_mcast_set_list_req_receive (
if (*nb_groups > MCAST_GROUP_MAX_NB)
return false;
- int group;
+ uint group;
for (group = 0; group < *nb_groups; group++)
{
groups[group] = bitstream_read_large (&mme->bitstream, 48);
@@ -694,7 +694,7 @@ cp_msg_drv_mcast_set_list_req_receive (
(nb_members[group] == 0))
return false;
- int member;
+ uint member;
for (member = 0; member < nb_members[group]; member++)
{
members[group][member] =
diff --git a/cesar/cp/msg/test/src/msg_drv.c b/cesar/cp/msg/test/src/msg_drv.c
index 1340c7c6af..41920140ba 100644
--- a/cesar/cp/msg/test/src/msg_drv.c
+++ b/cesar/cp/msg/test/src/msg_drv.c
@@ -878,23 +878,19 @@ test_case_drv_mcast_set_list (test_t test)
cp_mme_rx_t mme;
cp_t cp;
- int nb_groups;
- mac_t groups[MCAST_GROUP_MAX_NB];
- int nb_members[MCAST_GROUP_MAX_NB];
- mac_t members[MCAST_GROUP_MAX_NB][MCAST_MEMBER_MAX_NB];
+ igmp_groups_t groups;
+ igmp_groups_t groups_ref;
/* Create the groups and members. */
- mac_t groups_ref[MCAST_GROUP_MAX_NB];
- mac_t members_ref[MCAST_GROUP_MAX_NB][MCAST_MEMBER_MAX_NB];
- u8 group;
- u8 member;
- for (group = 0; group < MCAST_GROUP_MAX_NB; group++)
+ uint g;
+ uint m;
+ for (g = 0; g < MCAST_GROUP_MAX_NB; g++)
{
- groups_ref[group] = MAC_ADDRESS(0x01, 0x00, 0x5E, group, 0x00, 0x00);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ groups_ref.group_mac[g] = MAC_ADDRESS(0x01, 0x00, 0x5E, g, 0x00, 0x00);
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
- members_ref[group][member] =
- MAC_ADDRESS(0x10, 0x22, 0x33, 0x44, group, member);
+ groups_ref.member_mac[g][m] =
+ MAC_ADDRESS(0x10, 0x22, 0x33, 0x44, g, m);
}
}
@@ -906,35 +902,35 @@ test_case_drv_mcast_set_list (test_t test)
/* Fill the message */
bitstream_write (&mme.bitstream, MCAST_GROUP_MAX_NB, 8);
- for (group = 0; group < MCAST_GROUP_MAX_NB; group++)
+ for (g = 0; g < MCAST_GROUP_MAX_NB; g++)
{
- bitstream_write_large (&mme.bitstream, groups_ref[group], 48);
+ bitstream_write_large (&mme.bitstream, groups_ref.group_mac[g], 48);
bitstream_write (&mme.bitstream, MCAST_MEMBER_MAX_NB, 8);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
bitstream_write_large (&mme.bitstream,
- members_ref[group][member], 48);
+ groups_ref.member_mac[g][m], 48);
}
}
uint bits = bitstream_write_finalise (&mme.bitstream);
bitstream_init (&mme.bitstream, buffer, bits / 8, BITSTREAM_READ);
- test_fail_unless (cp_msg_drv_mcast_set_list_req_receive(&cp, &mme,
- &nb_groups, groups, nb_members, members));
+ test_fail_unless (cp_msg_drv_mcast_set_list_req_receive (
+ &cp, &mme, &groups.nb, groups.group_mac,
+ groups.nb_total_members, groups.member_mac));
- test_fail_unless (nb_groups == MCAST_GROUP_MAX_NB);
- for (group = 0; group < nb_groups; group++)
+ test_fail_unless (groups.nb == MCAST_GROUP_MAX_NB);
+ for (g = 0; g < groups.nb; g++)
{
- test_fail_unless (groups[group] == groups_ref[group]);
- test_fail_unless (nb_members[group] == MCAST_MEMBER_MAX_NB);
+ test_fail_unless (groups.group_mac[g] == groups_ref.group_mac[g]);
+ test_fail_unless (groups.nb_total_members[g] == MCAST_MEMBER_MAX_NB);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
- test_fail_unless (members[group][member] ==
- members_ref[group][member]);
+ test_fail_unless (groups.member_mac[g][m] ==
+ groups_ref.member_mac[g][m]);
}
}
-
} test_end;
test_begin (test, "REQ, zero groups and members")
@@ -948,10 +944,11 @@ test_case_drv_mcast_set_list (test_t test)
uint bits = bitstream_write_finalise (&mme.bitstream);
bitstream_init (&mme.bitstream, buffer, bits / 8, BITSTREAM_READ);
- test_fail_unless (cp_msg_drv_mcast_set_list_req_receive(&cp, &mme,
- &nb_groups, groups, nb_members, members));
+ test_fail_unless (cp_msg_drv_mcast_set_list_req_receive (
+ &cp, &mme, &groups.nb, groups.group_mac,
+ groups.nb_total_members, groups.member_mac));
- test_fail_unless (nb_groups == 0);
+ test_fail_unless (groups.nb == 0);
} test_end;
test_begin (test, "REQ, invalid group")
@@ -962,23 +959,24 @@ test_case_drv_mcast_set_list (test_t test)
/* Fill the message */
bitstream_write (&mme.bitstream, MCAST_GROUP_MAX_NB, 8);
- for (group = 0; group < MCAST_GROUP_MAX_NB; group++)
+ for (g = 0; g < MCAST_GROUP_MAX_NB; g++)
{
bitstream_write_large (
&mme.bitstream,
- MAC_ADDRESS(0x01, 0x00, 0x5F, group, 0x00, 0x00), 48);
+ MAC_ADDRESS(0x01, 0x00, 0x5F, g, 0x00, 0x00), 48);
bitstream_write (&mme.bitstream, MCAST_MEMBER_MAX_NB, 8);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
bitstream_write_large (&mme.bitstream,
- members_ref[group][member], 48);
+ groups_ref.member_mac[g][m], 48);
}
}
uint bits = bitstream_write_finalise (&mme.bitstream);
bitstream_init (&mme.bitstream, buffer, bits / 8, BITSTREAM_READ);
- test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive(&cp, &mme,
- &nb_groups, groups, nb_members, members));
+ test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive (
+ &cp, &mme, &groups.nb, groups.group_mac,
+ groups.nb_total_members, groups.member_mac));
} test_end;
test_begin (test, "REQ, invalid groups number")
@@ -989,21 +987,22 @@ test_case_drv_mcast_set_list (test_t test)
/* Fill the message */
bitstream_write (&mme.bitstream, MCAST_GROUP_MAX_NB+1, 8);
- for (group = 0; group < MCAST_GROUP_MAX_NB; group++)
+ for (g = 0; g < MCAST_GROUP_MAX_NB; g++)
{
- bitstream_write_large (&mme.bitstream, groups_ref[group], 48);
+ bitstream_write_large (&mme.bitstream, groups_ref.group_mac[g], 48);
bitstream_write (&mme.bitstream, MCAST_MEMBER_MAX_NB, 8);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
bitstream_write_large (&mme.bitstream,
- members_ref[group][member], 48);
+ groups_ref.member_mac[g][m], 48);
}
}
uint bits = bitstream_write_finalise (&mme.bitstream);
bitstream_init (&mme.bitstream, buffer, bits / 8, BITSTREAM_READ);
- test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive(&cp, &mme,
- &nb_groups, groups, nb_members, members));
+ test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive (
+ &cp, &mme, &groups.nb, groups.group_mac,
+ groups.nb_total_members, groups.member_mac));
} test_end;
test_begin (test, "REQ, invalid members number")
@@ -1014,21 +1013,22 @@ test_case_drv_mcast_set_list (test_t test)
/* Fill the message */
bitstream_write (&mme.bitstream, MCAST_GROUP_MAX_NB, 8);
- for (group = 0; group < MCAST_GROUP_MAX_NB; group++)
+ for (g = 0; g < MCAST_GROUP_MAX_NB; g++)
{
- bitstream_write_large (&mme.bitstream, groups_ref[group], 48);
+ bitstream_write_large (&mme.bitstream, groups_ref.group_mac[g], 48);
bitstream_write (&mme.bitstream, MCAST_MEMBER_MAX_NB+1, 8);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
bitstream_write_large (&mme.bitstream,
- members_ref[group][member], 48);
+ groups_ref.member_mac[g][m], 48);
}
}
uint bits = bitstream_write_finalise (&mme.bitstream);
bitstream_init (&mme.bitstream, buffer, bits / 8, BITSTREAM_READ);
- test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive(&cp, &mme,
- &nb_groups, groups, nb_members, members));
+ test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive (
+ &cp, &mme, &groups.nb, groups.group_mac,
+ groups.nb_total_members, groups.member_mac));
} test_end;
test_begin (test, "REQ, null members number")
@@ -1039,21 +1039,22 @@ test_case_drv_mcast_set_list (test_t test)
/* Fill the message */
bitstream_write (&mme.bitstream, MCAST_GROUP_MAX_NB, 8);
- for (group = 0; group < MCAST_GROUP_MAX_NB; group++)
+ for (g = 0; g < MCAST_GROUP_MAX_NB; g++)
{
- bitstream_write_large (&mme.bitstream, groups_ref[group], 48);
+ bitstream_write_large (&mme.bitstream, groups_ref.group_mac[g], 48);
bitstream_write (&mme.bitstream, 0, 8);
- for (member = 0; member < MCAST_MEMBER_MAX_NB; member++)
+ for (m = 0; m < MCAST_MEMBER_MAX_NB; m++)
{
bitstream_write_large (&mme.bitstream,
- members_ref[group][member], 48);
+ groups_ref.member_mac[g][m], 48);
}
}
uint bits = bitstream_write_finalise (&mme.bitstream);
bitstream_init (&mme.bitstream, buffer, bits / 8, BITSTREAM_READ);
- test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive(&cp, &mme,
- &nb_groups, groups, nb_members, members));
+ test_fail_unless (!cp_msg_drv_mcast_set_list_req_receive (
+ &cp, &mme, &groups.nb, groups.group_mac,
+ groups.nb_total_members, groups.member_mac));
} test_end;
}
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);
}
}