prima: WLAN Driver Release 3.1.7.9

This is the initial release of the Prima WLAN Driver
diff --git a/CORE/SYS/legacy/src/system/src/sysEntryFunc.c b/CORE/SYS/legacy/src/system/src/sysEntryFunc.c
new file mode 100644
index 0000000..7e215e2
--- /dev/null
+++ b/CORE/SYS/legacy/src/system/src/sysEntryFunc.c
@@ -0,0 +1,733 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Airgo Networks, Inc proprietary. All rights reserved
+ * sysEntryFunc.cc - This file has all the system level entry functions
+ *                   for all the defined threads at system level.
+ * Author:    V. K. Kandarpa
+ * Date:      01/16/2002
+ * History:-
+ * Date       Modified by            Modification Information
+ * --------------------------------------------------------------------------
+ *
+ */
+/* Standard include files */
+
+/* Application Specific include files */
+#include "sirCommon.h"
+#include "aniGlobal.h"
+
+
+#include "limApi.h"
+#include "schApi.h"
+#include "utilsApi.h"
+#include "pmmApi.h"
+
+#include "sysDebug.h"
+#include "sysDef.h"
+#include "sysEntryFunc.h"
+#include "sysStartup.h"
+#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
+#include "halMacSecurityApi.h"
+#endif
+#include "limTrace.h"
+#include "wlan_qct_wda.h"
+
+#ifndef WLAN_FTM_STUB
+tSirRetStatus
+postPTTMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
+#endif
+
+#ifdef VOSS_ENABLED
+#include "vos_types.h"
+#include "vos_packet.h"
+#endif
+
+// ---------------------------------------------------------------------------
+/**
+ * sysInitGlobals
+ *
+ * FUNCTION:
+ *    Initializes system level global parameters
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param tpAniSirGlobal Sirius software parameter struct pointer
+ * @return None
+ */
+
+tSirRetStatus
+sysInitGlobals(tpAniSirGlobal pMac)
+{
+
+    palZeroMemory(pMac->hHdd, (tANI_U8 *) &pMac->sys, sizeof(pMac->sys));
+
+#if defined(ANI_DEBUG)
+    //FIXME : right now we want the reset to happen even in diag debug build.
+    // later on we need to set this to true.
+    //pMac->sys.debugOnReset = true;
+    pMac->sys.debugOnReset = false;
+#else
+    pMac->sys.debugOnReset = false;
+#endif
+
+    pMac->sys.gSysEnableScanMode        = 1;
+    pMac->sys.gSysEnableLinkMonitorMode = 0;
+    pMac->sys.fTestRadar                = false;
+    pMac->sys.radarDetected             = false;
+    pMac->sys.gSysdropLimPkts           = false;
+#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
+    if(eHAL_STATUS_SUCCESS != halGlobalInit(pMac))
+        return eSIR_FAILURE;
+#endif
+    schInitGlobals(pMac);
+
+    return eSIR_SUCCESS;
+}
+
+#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
+
+
+// ---------------------------------------------------------------------------
+/**
+ * sysIsLearnScanModeFrame
+ *
+ * FUNCTION:
+ * Determine whether the received frame was received in learn/scan mode
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param pFrame
+ * @return true if frame was received in learn/scan mode
+ *         false otherwise
+ */
+
+static inline tANI_U8
+sysIsLearnScanModeFrame(tpHalBufDesc pBd)
+{
+    if( SIR_MAC_BD_TO_SCAN_LEARN(pBd) )
+         return 1;
+    else
+        return 0;
+}
+#endif
+// ---------------------------------------------------------------------------
+/**
+ * sysBbtProcessMessageCore
+ *
+ * FUNCTION:
+ * Process BBT messages
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param tpAniSirGlobal A pointer to MAC params instance
+ * @param pMsg message pointer
+ * @param tANI_U32 type
+ * @param tANI_U32 sub type
+ * @return None
+ */
+tSirRetStatus
+sysBbtProcessMessageCore(tpAniSirGlobal pMac, tpSirMsgQ pMsg, tANI_U32 type,
+                         tANI_U32 subType)
+{
+    tSirRetStatus ret;
+    void*         pBd;
+    tMgmtFrmDropReason dropReason;
+    vos_pkt_t  *pVosPkt = (vos_pkt_t *)pMsg->bodyptr;
+    VOS_STATUS  vosStatus =
+              WDA_DS_PeekRxPacketInfo( pVosPkt, (v_PVOID_t *)&pBd, VOS_FALSE );
+    pMac->sys.gSysBbtReceived++;
+
+    if ( !VOS_IS_STATUS_SUCCESS(vosStatus) )
+    {
+        goto fail;
+    }
+
+    PELOGW(sysLog(pMac, LOGW, FL("Rx Mgmt Frame Subtype: %d\n"), subType);
+    sirDumpBuf(pMac, SIR_SYS_MODULE_ID, LOGW, (tANI_U8 *)WDA_GET_RX_MAC_HEADER(pBd), WDA_GET_RX_MPDU_LEN(pBd));
+    sirDumpBuf(pMac, SIR_SYS_MODULE_ID, LOGW, WDA_GET_RX_MPDU_DATA(pBd), WDA_GET_RX_PAYLOAD_LEN(pBd));)
+
+    pMac->sys.gSysFrameCount[type][subType]++;
+
+    if(type == SIR_MAC_MGMT_FRAME)
+    {
+
+            if( (dropReason = limIsPktCandidateForDrop(pMac, pBd, subType)) != eMGMT_DROP_NO_DROP)
+            {
+                PELOG1(sysLog(pMac, LOG1, FL("Mgmt Frame %d being dropped, reason: %d\n"), subType, dropReason);)
+                MTRACE(macTrace(pMac,   TRACE_CODE_RX_MGMT_DROP, 0, dropReason);)
+                goto fail;
+            }
+            //Post the message to PE Queue
+            ret = (tSirRetStatus) limPostMsgApi(pMac, pMsg);
+            if (ret != eSIR_SUCCESS)
+            {
+                PELOGE(sysLog(pMac, LOGE, FL("posting to LIM2 failed, ret %d\n"), ret);)
+                goto fail;
+            }
+            pMac->sys.gSysBbtPostedToLim++;
+    }
+#ifdef FEATURE_WLAN_CCX
+    else if (type == SIR_MAC_DATA_FRAME)
+    {
+        PELOGW(sysLog(pMac, LOGW, FL("IAPP Frame...\n")););
+        //Post the message to PE Queue
+        ret = (tSirRetStatus) limPostMsgApi(pMac, pMsg);
+        if (ret != eSIR_SUCCESS)
+        {
+            PELOGE(sysLog(pMac, LOGE, FL("posting to LIM2 failed, ret %d\n"), ret);)
+            goto fail;
+        }
+        pMac->sys.gSysBbtPostedToLim++;
+    }
+#endif
+    else
+    {
+        PELOGE(sysLog(pMac, LOGE, "BBT received Invalid type %d subType %d "
+                   "LIM state %X. BD dump is:\n",
+                   type, subType, limGetSmeState(pMac));
+        sirDumpBuf(pMac, SIR_SYS_MODULE_ID, LOGE,
+                       (tANI_U8 *) pBd, WLANHAL_RX_BD_HEADER_SIZE);)
+
+        goto fail;
+    }
+
+    return eSIR_SUCCESS;
+
+fail:
+
+    pMac->sys.gSysBbtDropped++;
+    return eSIR_FAILURE;
+}
+
+
+void sysLog(tpAniSirGlobal pMac, tANI_U32 loglevel, const char *pString,...)
+{
+    // Verify against current log level
+    if ( loglevel > pMac->utils.gLogDbgLevel[LOG_INDEX_FOR_MODULE( SIR_SYS_MODULE_ID )] )
+        return;
+    else
+    {
+        va_list marker;
+
+        va_start( marker, pString );     /* Initialize variable arguments. */
+
+        logDebug(pMac, SIR_SYS_MODULE_ID, loglevel, pString, marker);
+
+        va_end( marker );              /* Reset variable arguments.      */
+    }
+}
+
+
+
+#if defined( ANI_OS_TYPE_WINDOWS )
+// ---------------------------------------------------------------------------
+/**
+ * sysBbtProcessMessage
+ *
+ * FUNCTION:
+ *    Process BBT messages
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param pBD Buffer descriptor pointer
+ * @return None
+ */
+void sysBbtProcessMessage( tHalHandle hHal, void *pBD )
+{
+    tpAniSirGlobal  pMac = PMAC_STRUCT( hHal );
+    tpSirMacMgmtHdr mHdr;
+    tSirMsgQ        msg;
+
+    //
+    //  The MPDU header is now present at a certain "offset" in
+    // the BD and is specified in the BD itself
+    //
+    mHdr = WDA_GET_RX_MAC_HEADER(pBD);
+
+    // Dump received packet
+    /*
+    if(pBD->swBdType != SMAC_SWBD_TYPE_CTLMSG)
+        sysLog( pMac, LOG3,
+            FL( "%s: RX Mesg Type %d, subType %d, MPDU Len %d, RXP Flags 0x%x\n" ),
+            __FUNCTION__,
+            mHdr->fc.type,
+            mHdr->fc.subType,
+            pBD->mpduLength,
+            pBD->rxpFlags );
+    */
+    //sirDumpBuf(pMac, SIR_SYS_MODULE_ID, LOGW, SIR_MAC_BD_TO_MPDUDATA(pBD), SIR_MAC_BD_TO_PAYLOAD_LEN(pBD));
+
+    // Forward to MAC via mesg = SIR_BB_XPORT_MGMT_MSG
+    msg.type = SIR_BB_XPORT_MGMT_MSG;
+    msg.bodyptr = pBD;
+    msg.bodyval = 0;
+
+    if( eSIR_SUCCESS != sysBbtProcessMessageCore( pMac,
+                                                  &msg,
+                                                  mHdr->fc.type,
+                                                  mHdr->fc.subType ))
+    {
+        sysLog( pMac, LOGW,
+                FL ( "sysBbtProcessMessageCore failed to process SIR_BB_XPORT_MGMT_MSG\n" ));
+
+        // TODO - Will the caller (HDD) free the received packet?
+    }
+}
+#endif // #if defined( ANI_OS_TYPE_WINDOWS )
+
+#if defined(ANI_OS_TYPE_RTAI_LINUX)
+#ifndef WLAN_FTM_STUB
+#include "pttModuleApi.h"
+#endif // eDRIVER_TYPE_MFG
+
+// ---------------------------------------------------------------------
+/**
+ * sysMmhEntry
+ *
+ * FUNCTION:
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param dummy Dummy parameter
+ * @return None
+ */
+void
+sysMmhEntry(tANI_U32 dummy)
+{
+    tSirMbMsg  *pMbMsg;
+    tSirMsgQ    msg;
+    tpAniSirGlobal pMac;
+
+    pMac = getPMac();
+
+    sysLog(pMac, LOG4, "MMH task started\n");
+
+    while (1)
+    {
+        // Blocks waiting for messages from HDD
+
+        tx_queue_receive(&pMac->sys.gSirTxMsgQ, (void*)&pMbMsg,
+                         TX_WAIT_FOREVER);
+        // Compose inter-module message and send it off to the receiver
+        msg.type = sirReadU16N((tANI_U8*)&(pMbMsg->type));
+        msg.bodyptr = pMbMsg;
+        msg.bodyval = 0;
+        sysLog(pMac, LOG4, "<MMH> HDD message received id=0x%x\n", msg.type);
+        if (pMac->sys.abort==1)
+        {
+            if (msg.type==eWNI_SME_STOP_BSS_REQ)
+            {
+                sirStoreU16N((tANI_U8*)(&(pMbMsg->type)), eWNI_SME_STOP_BSS_RSP);
+                pMbMsg->data[0] = 0;
+                halMmhPostMsgApi(pMac, &msg,  ePROT);
+            }
+            else
+            {
+                // we should free buffer, but only if it is an skbuff
+            }
+            continue;
+        }
+
+        switch (msg.type & 0xFF00)
+        {
+            case SIR_HAL_MSG_TYPES_BEGIN:
+                if (halPostMsgApi(pMac, &msg) != eSIR_SUCCESS)
+                    sysLog(pMac, LOGP, "sysMmhEntry: halPostMsgApi Failed!\n");
+                else
+                {
+                    sysLog(pMac, LOG4, "<MMH> Message forwarded to HAL\n");
+                }
+
+                break;
+
+            case SIR_LIM_MSG_TYPES_BEGIN:
+                limPostMsgApi(pMac, &msg);
+                break;
+
+            case SIR_MNT_MSG_TYPES_BEGIN:
+
+                if (halMntPostMsgApi(pMac, &msg) != eSIR_SUCCESS)
+                    sysLog(pMac, LOGP, "sysMmhEntry: halMntPostMsgApi Failed!\n");
+                else
+                {
+                    sysLog(pMac, LOG4, "<MMH> Message forwarded to MNT type (%X)\n",
+                           msg.type);
+                }
+
+                break;
+
+            case SIR_PMM_MSG_TYPES_BEGIN:
+
+                // Shall have its API call here; Once API is added, remove the
+                // following release memory call.
+                break;
+
+            case SIR_CFG_MSG_TYPES_BEGIN:
+
+                if (halMntPostMsgApi(pMac, &msg) != eSIR_SUCCESS)
+                    sysLog(pMac, LOGP,
+                           "sysMmhEntry: cfg msg: halMntPostMsgApi Failed!\n");
+                else
+                {
+                    sysLog(pMac, LOG4,
+                           "sysMmhEntry: cfg msg: halMntPostMsgApi!\n");
+                }
+
+                break;
+
+#ifndef WLAN_FTM_STUB
+            case PTT_MSG_TYPES_BEGIN_30: /*PTT_MSG_TYPES_BEGIN:*/
+            case PTT_MSG_TYPES_BEGIN_31:
+            case PTT_MSG_TYPES_BEGIN_32:
+                if (postPTTMsgApi(pMac, &msg) != eSIR_SUCCESS)
+                    sysLog(pMac, LOGP,
+                           "sysMmhEntry: RD msg: postPTTMsgApi Failed!\n");
+                else
+                {
+                    sysLog(pMac, LOG4,
+                           "sysMmhEntry: RD msg: postPTTMsgApi!\n");
+                }
+                break;
+#endif
+
+            default:
+                sysLog(pMac, LOGW, "sysMmhEntry Unknown destination \n");
+                // Unknown destination.  Just drop it
+                palFreeMemory( pMac->hHdd, (void*)pMbMsg);
+        }
+    }
+
+} /*** sysMmhEntry() ***/
+
+#endif // #if defined(ANI_OS_TYPE_RTAI_LINUX)
+
+#if defined(ANI_OS_TYPE_LINUX) || defined(ANI_OS_TYPE_OSX)
+
+// ---------------------------------------------------------------------------
+/**
+ * sysSchEntry
+ *
+ * FUNCTION:
+ *         SCH thread entry function.
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param dummy At present there is no need of any entry input. Default=0
+ * @return None
+ */
+void
+sysSchEntry(tANI_U32 i)
+{
+    tpAniSirGlobal pMac;
+    pMac = getPMac();
+    while (1)
+{
+        schProcessMessageQueue(pMac);
+    }
+} // sysSchEntry()
+
+
+// ---------------------------------------------------------------------------
+/**
+ * sysPmmEntry
+ *
+ * FUNCTION:
+ *         PMM thread entry function.
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param dummy At present there is no need of any entry input. Default=0
+ * @return None
+ */
+void
+sysPmmEntry(tANI_U32 i)
+{
+    tpAniSirGlobal pMac;
+    pMac = getPMac();
+    while (1)
+    {
+        pmmProcessMessageQueue(pMac);
+    }
+} // sysPmmEntry()
+
+
+// ---------------------------------------------------------------------
+/**
+ * sysLimEntry
+ *
+ * FUNCTION:
+ *   LIM thread entry point
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param dummy Dummy parameter
+ * @return None
+ */
+
+void
+sysLimEntry(tANI_U32 dummy)
+{
+    tpAniSirGlobal pMac;
+    pMac = getPMac();
+    limInitialize(pMac);
+
+    while (1)
+    {
+        limProcessMessageQueue(pMac);
+    } // while(1)
+} // limEntry()
+
+
+
+// ---------------------------------------------------------------------
+/**
+ * sysMntEntry
+ *
+ * FUNCTION:
+ *    MNT thread entry point
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param dummy Dummy parameter
+ * @return None
+ */
+
+void
+sysMntEntry(tANI_U32 dummy)
+{
+    tANI_U32      status;
+    tSirMsgQ msg;
+    tpAniSirGlobal pMac;
+    pMac = getPMac();
+    sysLog(pMac, LOG4, "<MNT> MNT task started\n");
+
+#if defined(ANI_OS_TYPE_RTAI_LINUX)
+    tANI_U32      interval;
+    interval = SYS_MNT_INTERVAL * SYS_TICKS_PER_SECOND;
+#endif
+
+    while (1)
+    {
+#if defined(ANI_OS_TYPE_RTAI_LINUX)
+        status = tx_queue_receive(&pMac->sys.gSirMntMsgQ, &msg, interval);
+#else
+        status = tx_queue_receive(&pMac->sys.gSirMntMsgQ, &msg,
+                                  TX_WAIT_FOREVER);
+#endif
+
+        // this routine only dequeues the message from queue
+        // processing is done by sysMntProcessMsg
+        if (status == TX_SUCCESS)
+        {
+            if (halMntProcessMsgs(pMac, &msg) != eSIR_SUCCESS)
+            {
+                sysLog(pMac, LOGP, "sysMntEntry: halMntProcessMsgs call "
+                       "failed!\n");
+            }
+        }
+    }
+} // sysMntEntry()
+
+// ---------------------------------------------------------------------
+/**
+ * sysHalEntry
+ *
+ * FUNCTION:
+ *   HAL thread entry point
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param dummy Dummy parameter
+ * @return None
+ */
+
+void
+sysHalEntry(tANI_U32 dummy)
+{
+    tANI_U32 status;
+    tSirMsgQ msg;
+    tpAniSirGlobal pMac;
+
+    pMac = getPMac();
+    sysLog(pMac, LOG4, "<HAL> HAL task started\n");
+
+    while (1)
+    {
+
+        status = tx_queue_receive(&pMac->sys.gSirHalMsgQ, &msg,
+                                  TX_WAIT_FOREVER);
+        // this routine only dequeues the message from queue
+        if (status == TX_SUCCESS)
+        {
+            if (halProcessMsg(pMac, &msg) != eSIR_SUCCESS)
+            {
+                sysLog(pMac, LOGP, "sysHalEntry: halProcessMsgQ call failed!\n");
+            }
+        }
+    } // while(1)
+} // sysHalEntry
+
+#ifndef WLAN_FTM_STUB
+#include "pttModuleApi.h"
+// ---------------------------------------------------------------------
+// ---------------------------------------------------------------------
+/**
+  * sysNimPttEntry
+  *
+  * FUNCTION:
+  *   NIM PTT thread entry point
+  * LOGIC:
+  *
+  * ASSUMPTIONS:
+  *
+  * NOTE:
+  *
+  * @param dummy Dummy parameter
+  * @return None
+  */
+
+void
+sysNimPttEntry(tANI_U32 dummy)
+{
+    tANI_U32 status;
+    tSirMsgQ msg;
+    tpAniSirGlobal pMac;
+    pMac = getPMac();
+
+    sysLog(pMac, LOGW, "<NIM> PTT task started\n");
+
+    while (1)
+    {
+        status = tx_queue_receive(&pMac->sys.gSirNimRDMsgQ, &msg,
+                                  TX_WAIT_FOREVER);
+
+        // this routine only dequeues the message from queue
+        if (status == TX_SUCCESS)
+        {
+            pttProcessMsg(pMac, (tPttMsgbuffer *)msg.bodyptr);
+            //TODO: the resonse is now packaged in ((tPttMsgbuffer *)&msg->body)->msgResponse and needs to be sent back to the application
+        }
+     } // while(1)
+} // sysNimPttEntry
+
+// ---------------------------------------------------------------------
+
+// -------------------------------------------------------------
+/**
+ * postPTTMsgApi
+ *
+ * FUNCTION:
+ *     Posts NIM messages to gNIM thread
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:pl
+ *
+ *
+ * NOTE:
+ *
+ * @param tpAniSirGlobal MAC parameters structure
+ * @param pMsg pointer with message
+ * @return Success or Failure
+ */
+
+tSirRetStatus
+postPTTMsgApi(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
+{
+    tSirRetStatus rc = eSIR_SUCCESS;
+    tPttMsgbuffer *pPttMsg;
+    ePttMsgId msgId;
+    uPttMsgs *msgBody;
+    tANI_U8 *pReq = (tANI_U8*) pMsg->bodyptr;
+
+    pPttMsg = (tPttMsgbuffer *)pReq;
+#if (defined(ANI_OS_TYPE_RTAI_LINUX) && defined(ANI_LITTLE_BYTE_ENDIAN))
+    pPttMsg->msgId = sirReadU16N((tANI_U8 *)&(pPttMsg->msgId));
+#endif
+    msgId = (ePttMsgId)(pPttMsg->msgId);
+    msgBody = (uPttMsgs *)&(pPttMsg->msgBody);
+    do
+    {
+#if defined ANI_OS_TYPE_LINUX || defined ANI_OS_TYPE_OSX
+        // Posts message to the queue
+        if (tx_queue_send(&pMac->sys.gSirHalMsgQ, pMsg,
+                          TX_NO_WAIT) != TX_SUCCESS)
+        {
+            rc = eSIR_FAILURE;
+            break;
+        }
+#else
+        // For Windows based MAC, instead of posting message to different
+        // queues, we will call the handler routines directly
+
+        //pttProcessMsg(pMac, pMsg);
+        rc = eSIR_SUCCESS;
+#endif
+    }
+    while (0);
+
+    return rc;
+} // postPTTMsgApi()
+
+
+#endif // eDRIVER_TYPE_MFG
+
+#endif // #if defined ANI_OS_TYPE_LINUX || defined ANI_OS_TYPE_OSX
+