Example #1
0
//*****************************************************************************
//
//!This function creates rx filters. Two filters are defined in this example:
//!(1) Drop incoming packets according to source MAC address
//!(2) Drop incoming packets according to source IP address
//!
//! \param None
//!
//! \return 0 on success, -1 on failure
//!
//*****************************************************************************
static int CreateFilters()
{
    long                 lRetVal;
    SlrxFilterID_t              FilterId = 0;
    SlrxFilterRuleType_t         RuleType;
    SlrxFilterFlags_t             FilterFlags;
    SlrxFilterRule_t            Rule;
    SlrxFilterTrigger_t         Trigger;
    SlrxFilterAction_t          Action;

    unsigned char ucMacMask[6]    = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    unsigned char ucIPMask[4]    = {0xFF, 0xFF, 0xFF, 0xFF};

    /*************************************************************************/
    /* Build filter to drop incoming packets according to source MAC address */
    /*************************************************************************/

    //
    //define filter as parent
    //
    Trigger.ParentFilterID = 0; 
    
    //
    //no trigger to activate the filter.
    //
    Trigger.Trigger = NO_TRIGGER; 
    
    //
    //connection state and role
    //
    Trigger.TriggerArgConnectionState.IntRepresentation = \
                                    RX_FILTER_CONNECTION_STATE_STA_CONNECTED;
    Trigger.TriggerArgRoleStatus.IntRepresentation = RX_FILTER_ROLE_STA;
    
    //
    // header and Combination types are only supported. Combination for logical 
    // AND/OR between two filters
    //
    RuleType = HEADER; 
    Rule.HeaderType.RuleHeaderfield = MAC_SRC_ADDRESS_FIELD;
    memcpy( Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB6BytesRuleArgs[0], 
            g_ucMacAddress , SL_MAC_ADDR_LEN);
    memcpy( Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask, ucMacMask,
                SL_MAC_ADDR_LEN);
    Rule.HeaderType.RuleCompareFunc = COMPARE_FUNC_EQUAL;
    
    //
    //Action
    //
    Action.ActionType.IntRepresentation = RX_FILTER_ACTION_DROP;
    FilterFlags.IntRepresentation = RX_FILTER_BINARY;
    lRetVal = sl_WlanRxFilterAdd(RuleType, FilterFlags, &Rule, &Trigger,
                                    &Action, &FilterId);
    ASSERT_ON_ERROR(lRetVal);

    /*************************************************************************/
    /* Build filter to drop incoming packets according to source IP address  */
    /*************************************************************************/
    
    //
    //define filter as parent
    //
    Trigger.ParentFilterID = 0; 
    
    //
    //no trigger to activate the filter.
    //
    Trigger.Trigger = NO_TRIGGER; 
    
    //
    //connection state and role
    //
    Trigger.TriggerArgConnectionState.IntRepresentation = \
                                        RX_FILTER_CONNECTION_STATE_STA_CONNECTED;
    Trigger.TriggerArgRoleStatus.IntRepresentation = RX_FILTER_ROLE_STA;
    
    //
    // header and Combination types are only supported. Combination for logical 
    // AND/OR between two filters
    //
    RuleType = HEADER; 
    Rule.HeaderType.RuleHeaderfield = IPV4_SRC_ADRRESS_FIELD;
    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB4BytesRuleArgs[0],
                g_ucIpAddress , IP_ADDR_LENGTH);
    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask, ucIPMask,
                IP_ADDR_LENGTH);
    Rule.HeaderType.RuleCompareFunc = COMPARE_FUNC_EQUAL;
    
    //
    //Action
    //
    Action.ActionType.IntRepresentation = RX_FILTER_ACTION_DROP;
    FilterFlags.IntRepresentation = RX_FILTER_BINARY;
    lRetVal = sl_WlanRxFilterAdd(RuleType, FilterFlags, &Rule, &Trigger,
                                    &Action, &FilterId);
    ASSERT_ON_ERROR(lRetVal);

    return 0;
}
Example #2
0
/*!
    \brief This function creates filters based on rule specified by user

    \param[in]   Input : Filter chosen   
    \param[in]   FilterNumber : Chosen filter type ( Source MAC ID, Dst MAC ID,
                                BSS ID,  IP Address etc)
    \param[in]   Filterparams: parameters  of chosen filter type 
    \param[in]   Filter Rule:  Check for equal or Not
    \param[in]   Filter Rule : If Rule match, to drop packet or pass to Host
    \param[in]   parent Id : in case sub-filter of existing filer, id of the parent filter

    \return      Unique filter ID in long format for success, -ve otherwise

    \note

    \warning
*/
static _i32 RxFiltersExample(_i8 input, _i32 filterNumber,
                                const _u8 *filterParam, _i8 equalOrNot,
                                _i8 dropOrNot, _i8 parentId)
{
    SlrxFilterID_t          FilterId = 0;
    SlrxFilterRuleType_t    RuleType = 0;
    SlrxFilterFlags_t       FilterFlags = {0};
    SlrxFilterRule_t        Rule = {0};
    SlrxFilterTrigger_t     Trigger = {0};
    SlrxFilterAction_t      Action = {0};

    _u8 MacMAsk[6]      = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
    _u8 FrameMask[1]    = {0xFF};
    _u8 IPMask[4]       = {0xFF,0xFF,0xFF,0xFF};
    _u8 zeroMask[4]     = {0x00,0x00,0x00,0x00};

    _i32 retVal = -1;
    _u8 frameByte = 0;

    switch(input)
    {
        case '1': /* Create filter */
            /* Rule definition */
            RuleType = HEADER;
            FilterFlags.IntRepresentation = RX_FILTER_BINARY;
            /* When RX_FILTER_COUNTER7 is bigger than 0 */
            Trigger.Trigger = NO_TRIGGER;

            /* connection state and role */
            Trigger.TriggerArgConnectionState.IntRepresentation = RX_FILTER_CONNECTION_STATE_STA_NOT_CONNECTED;
            Trigger.TriggerArgRoleStatus.IntRepresentation = RX_FILTER_ROLE_PROMISCUOUS;

            switch (filterNumber)
            {
                case 1:
                    Rule.HeaderType.RuleHeaderfield = MAC_SRC_ADDRESS_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB6BytesRuleArgs[0],
                                                                       filterParam, 6);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                           MacMAsk, 6);
                    break;
                case 2:
                    Rule.HeaderType.RuleHeaderfield = MAC_DST_ADDRESS_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB6BytesRuleArgs[0],
                                                                       filterParam, 6);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                           MacMAsk, 6);
                    break;
                case 3:
                    Rule.HeaderType.RuleHeaderfield = BSSID_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB6BytesRuleArgs[0],
                                                                       filterParam, 6);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                           MacMAsk, 6);
                    break;
                case 4:
                {
                    frameByte = (*filterParam & FRAME_TYPE_MASK);

                    Rule.HeaderType.RuleHeaderfield = FRAME_TYPE_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB1BytesRuleArgs[0],
                                                                       &frameByte, 1);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                          FrameMask, 1);
                }
                break;
                case 5:
                {
                    if(parentId <=0 )
                    {
                        printf("\n[Error] Enter a parent frame type filter id for frame subtype filter\r\n");
                        return INVALID_PARENT_FILTER_ID;
                    }
                    
                    frameByte = (*filterParam & FRAME_SUBTYPE_MASK);

                    Rule.HeaderType.RuleHeaderfield = FRAME_SUBTYPE_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB1BytesRuleArgs[0],
                                                                       &frameByte, 1);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                          FrameMask, 1);
                }
                    break;
                case 6:
                    Rule.HeaderType.RuleHeaderfield = IPV4_SRC_ADRRESS_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB4BytesRuleArgs[0],
                                                                       filterParam, 4);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                            IPMask, 4);
                    break;
                case 7:
                    Rule.HeaderType.RuleHeaderfield = IPV4_DST_ADDRESS_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB4BytesRuleArgs[0],
                                                                       filterParam, 4);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                            IPMask, 4);
                    break;
                case 8:
                    Rule.HeaderType.RuleHeaderfield = FRAME_LENGTH_FIELD;
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB4BytesRuleArgs[0],
                                                                          zeroMask, 4);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                            IPMask, 4);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgs.RxFilterDB4BytesRuleArgs[1],
                                                                       filterParam, 4);
                    memcpy(Rule.HeaderType.RuleHeaderArgsAndMask.RuleHeaderArgsMask,
                                                                            IPMask, 4);
                    break;
            }

            switch(equalOrNot)
            {
                case 'y':
                    Rule.HeaderType.RuleCompareFunc = COMPARE_FUNC_EQUAL;
                    break;
                case 'h':
                    Rule.HeaderType.RuleCompareFunc = COMPARE_FUNC_NOT_IN_BETWEEN;
                    break;
                case 'l':
                    Rule.HeaderType.RuleCompareFunc = COMPARE_FUNC_IN_BETWEEN;
                    break;
                case 'n':
                    Rule.HeaderType.RuleCompareFunc = COMPARE_FUNC_NOT_EQUAL_TO;
                    break;
            }

            Trigger.ParentFilterID = parentId;

            /* Action */
            if(dropOrNot == 'y')
            {
                Action.ActionType.IntRepresentation = RX_FILTER_ACTION_DROP;
            }
            else
            {
                Action.ActionType.IntRepresentation = RX_FILTER_ACTION_NULL;
            }

            retVal = sl_WlanRxFilterAdd(RuleType,
                                            FilterFlags,
                                            &Rule,
                                            &Trigger,
                                            &Action,
                                            &FilterId);
            if( retVal < 0)
            {
                printf("\nError creating the filter. Error number: %d.\n",retVal);
                ASSERT_ON_ERROR(retVal);
            }
            
            printf("\nThe filter ID is %d\n",FilterId);
            break;

        case '2': /* remove filter */
        {
                _WlanRxFilterOperationCommandBuff_t     RxFilterIdMask ;
                memset(RxFilterIdMask.FilterIdMask, 0xFF , 8);
                retVal = sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (_u8 *)&RxFilterIdMask,
                                    sizeof(_WlanRxFilterOperationCommandBuff_t));
                ASSERT_ON_ERROR(retVal);

        }
        break;

        case '3' : /* enable\disable filter */
        {
            _WlanRxFilterOperationCommandBuff_t     RxFilterIdMask ;
            memset(RxFilterIdMask.FilterIdMask, 0xFF , 8);
            retVal = sl_WlanRxFilterSet(SL_ENABLE_DISABLE_RX_FILTER, (_u8 *)&RxFilterIdMask,
                                sizeof(_WlanRxFilterOperationCommandBuff_t));
            ASSERT_ON_ERROR(retVal);
        }

        break;
    }

    return FilterId;
}