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); }