Exemplo n.º 1
0
void
uf_multicast_list_wq(struct work_struct *work)
{
    unifi_priv_t *priv = container_of(work, unifi_priv_t,
                                      multicast_list_task);
    int i;
    unifi_MACAddress* multicast_address_list = NULL;
    int mc_count;
    u8 *mc_list;

    unifi_trace(priv, UDBG5,
                "uf_multicast_list_wq: list count = %d\n",
                priv->mc_list_count);

    /* Flush the current list */
    unifi_sys_multicast_address_ind(priv->smepriv, unifi_ListActionFlush, 0, NULL);

    mc_count = priv->mc_list_count;
    mc_list = priv->mc_list;
    /*
     * Allocate a new list, need to free it later
     * in unifi_mgt_multicast_address_cfm().
     */
    multicast_address_list = CsrPmalloc(mc_count * sizeof(unifi_MACAddress));

    if (multicast_address_list == NULL) {
        return;
    }

    for (i = 0; i < mc_count; i++) {
        memcpy(multicast_address_list[i].data, mc_list, ETH_ALEN);
        mc_list += ETH_ALEN;
    }

    if (priv->smepriv == NULL) {
        CsrPfree(multicast_address_list);
        return;
    }

    unifi_sys_multicast_address_ind(priv->smepriv,
                                    unifi_ListActionAdd,
                                    mc_count, multicast_address_list);

    /* The SME will take a copy of the addreses*/
    CsrPfree(multicast_address_list);
}
static void event_to_unifi_sys_multicast_address_ind(FsmContext* context, CsrUint8* inputbuffer, CsrUint16 length)
{
    CsrUint8* buffer = &inputbuffer[6];
    UnifiSysMulticastAddressInd_Evt evt;

    evt.action = (unifi_ListAction) event_unpack_CsrUint8(&buffer);
    evt.setAddressesCount =  event_unpack_CsrUint8(&buffer);
    evt.setAddresses = NULL;
    if (evt.setAddressesCount)
    {
        CsrUint16 i1;
        evt.setAddresses = (unifi_MACAddress*)CsrPmalloc(sizeof(unifi_MACAddress) * evt.setAddressesCount);
        for(i1 = 0; i1 < evt.setAddressesCount; i1++)
        {
            event_unpack_buffer(&buffer, evt.setAddresses[i1].data, 6);
        }
    }

    unifi_sys_multicast_address_ind(context, evt.action, evt.setAddressesCount, evt.setAddresses);

    CsrPfree(evt.setAddresses);
}