summaryrefslogtreecommitdiff
path: root/cesar/cp/eoc/cco/action/src/drv.c
blob: 0684c63441c0bac469179afcf5690fbf836479fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* Cesar project {{{
 *
 * Copyright (C) 2011 Spidcom
 *
 * <<<Licence>>>
 *
 * }}} */
/**
 * \file    cp/eoc/cco/action/src/drv.c
 * \brief   DRV functions.
 * \ingroup cp_eoc_cco_action
 */

#include "common/std.h"

/* Private headers. */
#include "cp/inc/context.h"
#include "cp/msg/inc/msg_drv.h"

/* Public headers. */
#include "cp/eoc/cco/action/drv.h"
#include "hal/arch/arch.h"
#include "cl/mcast.h"

void
cp_eoc_cco_action_drv__drv_mcast_set_list_req (
    cp_t *ctx, cp_mme_rx_t *mme)
{
    /* Check parameters. */
    dbg_assert (ctx);
    dbg_assert (mme);

    cp_msg_drv_result_t result = CP_MSG_DRV_RESULT_FAILURE;
    igmp_groups_t *igmp_groups = NULL;
    /* Lock DSR to avoid the CL to use corrupted entries. */
    arch_dsr_lock ();
    igmp_groups = cl_get_igmp_groups (ctx->cl);
    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))
        result = CP_MSG_DRV_RESULT_SUCCESS;
    else
        igmp_groups->nb = 0;
    cl_update_igmp_groups (ctx->cl);
    arch_dsr_unlock ();
    cp_msg_drv_any_cnf_send (ctx, &mme->peer,
                             DRV_MCAST_SET_LIST_CNF,
                             result);
}