bool is_filter_exact_match(struct adapter *adap, struct ch_filter_specification *fs) { struct tp_params *tp = &adap->params.tp; u64 hash_filter_mask = tp->hash_filter_mask; u32 mask; if (!is_hashfilter(adap)) return false; if (fs->type) { if (is_inaddr_any(fs->val.fip, AF_INET6) || !is_addr_all_mask(fs->mask.fip, AF_INET6)) return false; if (is_inaddr_any(fs->val.lip, AF_INET6) || !is_addr_all_mask(fs->mask.lip, AF_INET6)) return false; } else { if (is_inaddr_any(fs->val.fip, AF_INET) || !is_addr_all_mask(fs->mask.fip, AF_INET)) return false; if (is_inaddr_any(fs->val.lip, AF_INET) || !is_addr_all_mask(fs->mask.lip, AF_INET)) return false; } if (!fs->val.lport || fs->mask.lport != 0xffff) return false; if (!fs->val.fport || fs->mask.fport != 0xffff) return false; if (tp->fcoe_shift >= 0) { mask = (hash_filter_mask >> tp->fcoe_shift) & FT_FCOE_W; if (mask && !fs->mask.fcoe) return false; }
bool is_filter_exact_match(struct adapter *adap, struct ch_filter_specification *fs) { struct tp_params *tp = &adap->params.tp; u64 hash_filter_mask = tp->hash_filter_mask; u64 ntuple_mask = 0; if (!is_hashfilter(adap)) return false; if (fs->type) { if (is_inaddr_any(fs->val.fip, AF_INET6) || !is_addr_all_mask(fs->mask.fip, AF_INET6)) return false; if (is_inaddr_any(fs->val.lip, AF_INET6) || !is_addr_all_mask(fs->mask.lip, AF_INET6)) return false; } else { if (is_inaddr_any(fs->val.fip, AF_INET) || !is_addr_all_mask(fs->mask.fip, AF_INET)) return false; if (is_inaddr_any(fs->val.lip, AF_INET) || !is_addr_all_mask(fs->mask.lip, AF_INET)) return false; } if (!fs->val.lport || fs->mask.lport != 0xffff) return false; if (!fs->val.fport || fs->mask.fport != 0xffff) return false; /* calculate tuple mask and compare with mask configured in hw */ if (tp->fcoe_shift >= 0) ntuple_mask |= (u64)fs->mask.fcoe << tp->fcoe_shift; if (tp->port_shift >= 0) ntuple_mask |= (u64)fs->mask.iport << tp->port_shift; if (tp->vnic_shift >= 0) { if ((adap->params.tp.ingress_config & VNIC_F)) ntuple_mask |= (u64)fs->mask.pfvf_vld << tp->vnic_shift; else ntuple_mask |= (u64)fs->mask.ovlan_vld << tp->vnic_shift; } if (tp->vlan_shift >= 0) ntuple_mask |= (u64)fs->mask.ivlan << tp->vlan_shift; if (tp->tos_shift >= 0) ntuple_mask |= (u64)fs->mask.tos << tp->tos_shift; if (tp->protocol_shift >= 0) ntuple_mask |= (u64)fs->mask.proto << tp->protocol_shift; if (tp->ethertype_shift >= 0) ntuple_mask |= (u64)fs->mask.ethtype << tp->ethertype_shift; if (tp->macmatch_shift >= 0) ntuple_mask |= (u64)fs->mask.macidx << tp->macmatch_shift; if (tp->matchtype_shift >= 0) ntuple_mask |= (u64)fs->mask.matchtype << tp->matchtype_shift; if (tp->frag_shift >= 0) ntuple_mask |= (u64)fs->mask.frag << tp->frag_shift; if (ntuple_mask != hash_filter_mask) return false; return true; }