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;
}
Beispiel #3
0
/*
 * ---------------------------------------------------------------------------
 *  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() */