//***************************************************************************** // //!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; }
/*! \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; }