Lines Matching defs:filter

331 			   struct ocelot_vcap_filter *filter)
334 struct ocelot_vcap_action *a = &filter->action;
346 struct ocelot_vcap_filter *filter)
349 struct ocelot_vcap_key_vlan *tag = &filter->vlan;
366 if (filter->prio != 0)
371 vcap_key_set(vcap, &data, VCAP_IS2_HK_PAG, filter->pag, 0xff);
373 (filter->lookup == 0) ? OCELOT_VCAP_BIT_1 :
376 ~filter->ingress_port_mask);
379 vcap_key_bit_set(vcap, &data, VCAP_IS2_HK_L2_MC, filter->dmac_mc);
380 vcap_key_bit_set(vcap, &data, VCAP_IS2_HK_L2_BC, filter->dmac_bc);
388 switch (filter->key_type) {
390 struct ocelot_vcap_key_etype *etype = &filter->key.etype;
412 struct ocelot_vcap_key_llc *llc = &filter->key.llc;
428 struct ocelot_vcap_key_snap *snap = &filter->key.snap;
436 filter->key.snap.snap.value,
437 filter->key.snap.snap.mask);
441 struct ocelot_vcap_key_arp *arp = &filter->key.arp;
494 if (filter->key_type == OCELOT_VCAP_KEY_IPV4) {
495 ipv4 = &filter->key.ipv4;
516 ipv6 = &filter->key.ipv6;
636 is2_action_set(ocelot, &data, filter);
638 vcap->counter_width, filter->stats.pkts);
647 const struct ocelot_vcap_filter *filter)
650 const struct ocelot_vcap_action *a = &filter->action;
670 struct ocelot_vcap_filter *filter)
673 struct ocelot_vcap_key_vlan *tag = &filter->vlan;
689 if (filter->prio != 0)
692 vcap_key_set(vcap, &data, VCAP_IS1_HK_LOOKUP, filter->lookup, 0x3);
694 ~filter->ingress_port_mask);
695 vcap_key_bit_set(vcap, &data, VCAP_IS1_HK_L2_MC, filter->dmac_mc);
696 vcap_key_bit_set(vcap, &data, VCAP_IS1_HK_L2_BC, filter->dmac_bc);
704 switch (filter->key_type) {
706 struct ocelot_vcap_key_etype *etype = &filter->key.etype;
715 struct ocelot_vcap_key_ipv4 *ipv4 = &filter->key.ipv4;
770 is1_action_set(ocelot, &data, filter);
772 vcap->counter_width, filter->stats.pkts);
781 const struct ocelot_vcap_filter *filter)
784 const struct ocelot_vcap_action *a = &filter->action;
809 struct ocelot_vcap_filter *filter)
812 struct ocelot_vcap_key_vlan *tag = &filter->vlan;
827 if (filter->prio != 0)
830 vcap_key_set(vcap, &data, VCAP_ES0_IGR_PORT, filter->ingress_port.value,
831 filter->ingress_port.mask);
832 vcap_key_set(vcap, &data, VCAP_ES0_EGR_PORT, filter->egress_port.value,
833 filter->egress_port.mask);
834 vcap_key_bit_set(vcap, &data, VCAP_ES0_L2_MC, filter->dmac_mc);
835 vcap_key_bit_set(vcap, &data, VCAP_ES0_L2_BC, filter->dmac_bc);
841 es0_action_set(ocelot, &data, filter);
843 vcap->counter_width, filter->stats.pkts);
852 struct ocelot_vcap_filter *filter)
854 const struct vcap_props *vcap = &ocelot->vcap[filter->block_id];
859 if (filter->block_id == VCAP_ES0)
872 filter->stats.pkts = cnt;
876 struct ocelot_vcap_filter *filter)
878 if (filter->block_id == VCAP_IS1)
879 return is1_entry_set(ocelot, ix, filter);
880 if (filter->block_id == VCAP_IS2)
881 return is2_entry_set(ocelot, ix, filter);
882 if (filter->block_id == VCAP_ES0)
883 return es0_entry_set(ocelot, ix, filter);
956 struct ocelot_vcap_filter *filter,
962 if (filter->block_id == VCAP_IS2 && filter->action.mirror_ena) {
963 m = ocelot_mirror_get(ocelot, filter->egress_port.value,
969 if (filter->block_id == VCAP_IS2 && filter->action.police_ena) {
970 ret = ocelot_vcap_policer_add(ocelot, filter->action.pol_ix,
971 &filter->action.pol);
981 struct ocelot_vcap_filter *filter)
983 if (filter->block_id == VCAP_IS2 && filter->action.police_ena)
984 ocelot_vcap_policer_del(ocelot, filter->action.pol_ix);
986 if (filter->block_id == VCAP_IS2 && filter->action.mirror_ena)
992 struct ocelot_vcap_filter *filter,
999 ret = ocelot_vcap_filter_add_aux_resources(ocelot, filter, extack);
1006 if (filter->prio < tmp->prio) {
1011 list_add_tail(&filter->list, pos);
1023 struct ocelot_vcap_filter *filter)
1029 if (ocelot_vcap_filter_equal(filter, tmp))
1057 struct ocelot_vcap_filter *filter;
1059 list_for_each_entry(filter, &block->rules, list)
1060 if (filter->id.tc_offload == tc_offload &&
1061 filter->id.cookie == cookie)
1062 return filter;
1100 ocelot_vcap_is_problematic_mac_etype(struct ocelot_vcap_filter *filter)
1104 if (filter->key_type != OCELOT_VCAP_KEY_ETYPE)
1107 proto = ntohs(*(__be16 *)filter->key.etype.etype.value);
1108 mask = ntohs(*(__be16 *)filter->key.etype.etype.mask);
1124 ocelot_vcap_is_problematic_non_mac_etype(struct ocelot_vcap_filter *filter)
1126 if (filter->key_type == OCELOT_VCAP_KEY_SNAP)
1128 if (filter->key_type == OCELOT_VCAP_KEY_ARP)
1130 if (filter->key_type == OCELOT_VCAP_KEY_IPV4)
1132 if (filter->key_type == OCELOT_VCAP_KEY_IPV6)
1139 struct ocelot_vcap_filter *filter)
1141 struct ocelot_vcap_block *block = &ocelot->block[filter->block_id];
1147 if (filter->block_id != VCAP_IS2)
1150 if (ocelot_vcap_is_problematic_mac_etype(filter)) {
1154 if (tmp->ingress_port_mask & filter->ingress_port_mask &&
1155 tmp->lookup == filter->lookup &&
1160 for_each_set_bit(port, &filter->ingress_port_mask,
1163 filter->lookup, true);
1164 } else if (ocelot_vcap_is_problematic_non_mac_etype(filter)) {
1168 if (tmp->ingress_port_mask & filter->ingress_port_mask &&
1169 tmp->lookup == filter->lookup &&
1174 for_each_set_bit(port, &filter->ingress_port_mask,
1177 filter->lookup, false);
1184 struct ocelot_vcap_filter *filter,
1187 struct ocelot_vcap_block *block = &ocelot->block[filter->block_id];
1190 if (!ocelot_exclusive_mac_etype_filter_rules(ocelot, filter)) {
1196 /* Add filter to the linked list */
1197 ret = ocelot_vcap_filter_add_to_block(ocelot, block, filter, extack);
1201 /* Get the index of the inserted filter */
1202 index = ocelot_vcap_block_get_filter_index(block, filter);
1206 /* Move down the rules to make place for the new filter */
1211 /* Read back the filter's counters before moving it */
1216 /* Now insert the new filter */
1217 vcap_entry_set(ocelot, index, filter);
1224 struct ocelot_vcap_filter *filter)
1229 if (ocelot_vcap_filter_equal(filter, tmp)) {
1240 struct ocelot_vcap_filter *filter)
1242 struct ocelot_vcap_block *block = &ocelot->block[filter->block_id];
1250 del_filter.block_id = filter->block_id;
1252 /* Gets index of the filter */
1253 index = ocelot_vcap_block_get_filter_index(block, filter);
1257 /* Delete filter */
1258 ocelot_vcap_block_remove_filter(ocelot, block, filter);
1260 /* Move up all the blocks over the deleted filter */
1265 /* Read back the filter's counters before moving it */
1270 /* Now delete the last filter, because it is duplicated */
1278 struct ocelot_vcap_filter *filter)
1280 struct ocelot_vcap_block *block = &ocelot->block[filter->block_id];
1283 index = ocelot_vcap_block_get_filter_index(block, filter);
1287 vcap_entry_set(ocelot, index, filter);
1294 struct ocelot_vcap_filter *filter)
1296 struct ocelot_vcap_block *block = &ocelot->block[filter->block_id];
1300 index = ocelot_vcap_block_get_filter_index(block, filter);
1304 vcap_entry_get(ocelot, index, filter);
1307 tmp = *filter;