static void event_to_unifi_sys_hip_ind(FsmContext* context, CsrUint8* inputbuffer, CsrUint16 length) { CsrUint8* buffer = &inputbuffer[6]; UnifiSysHipInd_Evt evt; evt.mlmeCommandLength = event_unpack_CsrUint16(&buffer); evt.mlmeCommand = NULL; if (evt.mlmeCommandLength) { evt.mlmeCommand = (CsrUint8*)CsrPmalloc(evt.mlmeCommandLength); event_unpack_buffer(&buffer, evt.mlmeCommand, evt.mlmeCommandLength); } evt.dataRef1Length = event_unpack_CsrUint16(&buffer); evt.dataRef1 = NULL; if (evt.dataRef1Length) { evt.dataRef1 = (CsrUint8*)CsrPmalloc(evt.dataRef1Length); event_unpack_buffer(&buffer, evt.dataRef1, evt.dataRef1Length); } evt.dataRef2Length = event_unpack_CsrUint16(&buffer); evt.dataRef2 = NULL; if (evt.dataRef2Length) { evt.dataRef2 = (CsrUint8*)CsrPmalloc(evt.dataRef2Length); event_unpack_buffer(&buffer, evt.dataRef2, evt.dataRef2Length); } unifi_sys_hip_ind(context, evt.mlmeCommandLength, evt.mlmeCommand, evt.dataRef1Length, evt.dataRef1, evt.dataRef2Length, evt.dataRef2); CsrPfree(evt.mlmeCommand); CsrPfree(evt.dataRef1); CsrPfree(evt.dataRef2); }
CsrBool remote_sys_signal_receive(FsmContext* context, CsrUint8* buffer, CsrUint16 size) { CsrUint8* tempbuffer = buffer; CsrUint16 id = event_unpack_CsrUint16(&tempbuffer); if (id >= 0x0100 && id < 0x1000) { unifi_DataBlock mlmeCommand; unifi_DataBlock dataref1; unifi_DataBlock dataref2; mlmeCommand.length = size; mlmeCommand.data = buffer; tempbuffer += 6; /* Skip the 4 bytes for dest, sender and 1st slotnumber */ dataref1.length = event_unpack_CsrUint16(&tempbuffer); tempbuffer += 2; /* Skip the slot number */ dataref2.length = event_unpack_CsrUint16(&tempbuffer); dataref1.data = buffer + ((size - dataref2.length) - dataref1.length); dataref2.data = buffer + size - dataref2.length; mlmeCommand.length -= dataref1.length + dataref2.length; unifi_sys_hip_ind(context, mlmeCommand.length, mlmeCommand.data, dataref1.length, dataref1.data, dataref2.length, dataref2.data); return TRUE; } if (id >= 0x8001 && id <= 0x802D) { if (fnlookup1[id - 0x8001]) { (*fnlookup1[id - 0x8001])(context, buffer, size); return TRUE; } } return FALSE; }
/* * --------------------------------------------------------------------------- * sme_log_event * * Callback function to be registered as the SME event callback. * Copies the signal content into a new udi_log_t struct and adds * it to the read queue for the SME client. * * Arguments: * arg This is the value given to unifi_add_udi_hook, in * this case a pointer to the client instance. * signal Pointer to the received signal. * signal_len Size of the signal structure in bytes. * bulkdata Pointers to any associated bulk data. * dir Direction of the signal. Zero means from host, * non-zero means to host. * * Returns: * None. * --------------------------------------------------------------------------- */ void sme_log_event(ul_client_t *pcli, const u8 *signal, int signal_len, const bulk_data_param_t *bulkdata, int dir) { unifi_priv_t *priv; CSR_SIGNAL unpacked_signal; unifi_DataBlock mlmeCommand; unifi_DataBlock dataref1; unifi_DataBlock dataref2; int r; func_enter(); /* Just a sanity check */ if ((signal == NULL) || (signal_len <= 0)) { func_exit(); return; } priv = uf_find_instance(pcli->instance); if (!priv) { unifi_error(priv, "sme_log_event: invalid priv\n"); func_exit(); return; } if (priv->smepriv == NULL) { unifi_error(priv, "sme_log_event: invalid smepriv\n"); func_exit(); return; } unifi_trace(priv, UDBG3, "sme_log_event: Process signal 0x%X %s\n", *((CsrUint16*)signal), lookup_signal_name(*((CsrUint16*)signal))); /* * Indicate CSR_MLME_EAPOL_CONFIRM_ID and CSR_MA_UNITDATA_CONFIRM_ID * using the respective SYS API. */ r = read_unpack_signal(signal, &unpacked_signal); if (r) { unifi_error(priv, "sme_log_event: Received unknown or corrupted signal.\n"); func_exit(); return; } if (unpacked_signal.SignalPrimitiveHeader.SignalId == CSR_MLME_EAPOL_CONFIRM_ID) { CSR_MLME_EAPOL_CONFIRM *cfm = &unpacked_signal.u.MlmeEapolConfirm; /* Retrieve the appHandle from the LSB of the ReceiverId. */ unifi_sys_eapol_cfm(priv->smepriv, (void*)((unsigned int)signal[2]), (cfm->ResultCode) ? unifi_EapolRcFailure : unifi_EapolRcSuccess); func_exit(); return; } if (unpacked_signal.SignalPrimitiveHeader.SignalId == CSR_MA_UNITDATA_CONFIRM_ID) { CSR_MA_UNITDATA_CONFIRM *cfm = &unpacked_signal.u.MaUnitdataConfirm; /* Retrieve the appHandle from the LSB of the ReceiverId. */ unifi_sys_ma_unitdata_cfm(priv->smepriv, (void*)((unsigned int)signal[2]), (cfm->TransmissionStatus) ? unifi_Error : unifi_Success, cfm->TransmissionStatus, cfm->ProvidedPriority, cfm->ProvidedServiceClass, cfm->ProvidedHostTag); func_exit(); return; } mlmeCommand.length = signal_len; mlmeCommand.data = (CsrUint8*)signal; dataref1.length = bulkdata->d[0].data_length; if (dataref1.length > 0) { dataref1.data = (CsrUint8 *) bulkdata->d[0].os_data_ptr; } else { dataref1.data = NULL; } dataref2.length = bulkdata->d[1].data_length; if (dataref2.length > 0) { dataref2.data = (CsrUint8 *) bulkdata->d[1].os_data_ptr; } else { dataref2.data = NULL; } unifi_sys_hip_ind(priv->smepriv, mlmeCommand.length, mlmeCommand.data, dataref1.length, dataref1.data, dataref2.length, dataref2.data); func_exit(); } /* sme_log_event() */