Lines Matching full:mask
79 struct fl_flow_key mask; member
92 struct fl_flow_mask *mask; member
113 static unsigned short int fl_mask_range(const struct fl_flow_mask *mask) in fl_mask_range() argument
115 return mask->range.end - mask->range.start; in fl_mask_range()
118 static void fl_mask_update_range(struct fl_flow_mask *mask) in fl_mask_update_range() argument
120 const u8 *bytes = (const u8 *) &mask->key; in fl_mask_update_range()
121 size_t size = sizeof(mask->key); in fl_mask_update_range()
137 mask->range.start = rounddown(first, sizeof(long)); in fl_mask_update_range()
138 mask->range.end = roundup(last + 1, sizeof(long)); in fl_mask_update_range()
142 const struct fl_flow_mask *mask) in fl_key_get_start() argument
144 return (u8 *) key + mask->range.start; in fl_key_get_start()
148 struct fl_flow_mask *mask) in fl_set_masked_key() argument
150 const long *lkey = fl_key_get_start(key, mask); in fl_set_masked_key()
151 const long *lmask = fl_key_get_start(&mask->key, mask); in fl_set_masked_key()
152 long *lmkey = fl_key_get_start(mkey, mask); in fl_set_masked_key()
155 for (i = 0; i < fl_mask_range(mask); i += sizeof(long)) in fl_set_masked_key()
160 struct fl_flow_mask *mask) in fl_mask_fits_tmplt() argument
162 const long *lmask = fl_key_get_start(&mask->key, mask); in fl_mask_fits_tmplt()
168 ltmplt = fl_key_get_start(&tmplt->mask, mask); in fl_mask_fits_tmplt()
169 for (i = 0; i < fl_mask_range(mask); i += sizeof(long)) { in fl_mask_fits_tmplt()
177 struct fl_flow_mask *mask) in fl_clear_masked_range() argument
179 memset(fl_key_get_start(key, mask), 0, fl_mask_range(mask)); in fl_clear_masked_range()
182 static struct cls_fl_filter *fl_lookup(struct fl_flow_mask *mask, in fl_lookup() argument
185 return rhashtable_lookup_fast(&mask->ht, fl_key_get_start(mkey, mask), in fl_lookup()
186 mask->filter_ht_params); in fl_lookup()
194 struct fl_flow_mask *mask; in fl_classify() local
198 list_for_each_entry_rcu(mask, &head->masks, list) { in fl_classify()
200 fl_clear_masked_range(&skb_key, mask); in fl_classify()
207 skb_flow_dissect_tunnel_info(skb, &mask->dissector, &skb_key); in fl_classify()
208 skb_flow_dissect(skb, &mask->dissector, &skb_key, 0); in fl_classify()
210 fl_set_masked_key(&skb_mkey, &skb_key, mask); in fl_classify()
212 f = fl_lookup(mask, &skb_mkey); in fl_classify()
236 static void fl_mask_free(struct fl_flow_mask *mask) in fl_mask_free() argument
238 rhashtable_destroy(&mask->ht); in fl_mask_free()
239 kfree(mask); in fl_mask_free()
244 struct fl_flow_mask *mask = container_of(to_rcu_work(work), in fl_mask_free_work() local
247 fl_mask_free(mask); in fl_mask_free_work()
250 static bool fl_mask_put(struct cls_fl_head *head, struct fl_flow_mask *mask, in fl_mask_put() argument
253 if (!list_empty(&mask->filters)) in fl_mask_put()
256 rhashtable_remove_fast(&head->ht, &mask->ht_node, mask_ht_params); in fl_mask_put()
257 list_del_rcu(&mask->list); in fl_mask_put()
259 tcf_queue_work(&mask->rwork, fl_mask_free_work); in fl_mask_put()
261 fl_mask_free(mask); in fl_mask_put()
310 cls_flower.dissector = &f->mask->dissector; in fl_hw_replace_filter()
311 cls_flower.mask = &f->mask->key; in fl_hw_replace_filter()
356 last = fl_mask_put(head, f->mask, async); in __fl_delete()
382 struct fl_flow_mask *mask, *next_mask; in fl_destroy() local
385 list_for_each_entry_safe(mask, next_mask, &head->masks, list) { in fl_destroy()
386 list_for_each_entry_safe(f, next, &mask->filters, list) { in fl_destroy()
508 void *mask, int mask_type, int len) in fl_set_key_val() argument
514 memset(mask, 0xff, len); in fl_set_key_val()
516 memcpy(mask, nla_data(tb[mask_type]), len); in fl_set_key_val()
591 u32 key, mask; in fl_set_key_flags() local
593 /* mask is mandatory for flags */ in fl_set_key_flags()
598 mask = be32_to_cpu(nla_get_u32(tb[TCA_FLOWER_KEY_FLAGS_MASK])); in fl_set_key_flags()
603 fl_set_key_flag(key, mask, flags_key, flags_mask, in fl_set_key_flags()
605 fl_set_key_flag(key, mask, flags_key, flags_mask, in fl_set_key_flags()
614 struct flow_dissector_key_ip *mask) in fl_set_key_ip() argument
621 fl_set_key_val(tb, &key->tos, tos_key, &mask->tos, tos_mask, sizeof(key->tos)); in fl_set_key_ip()
622 fl_set_key_val(tb, &key->ttl, ttl_key, &mask->ttl, ttl_mask, sizeof(key->ttl)); in fl_set_key_ip()
644 /* If no mask has been prodived we assume an exact match. */ in fl_set_geneve_opt()
649 NL_SET_ERR_MSG(extack, "Non-geneve option type for mask"); in fl_set_geneve_opt()
670 * for the mask. in fl_set_geneve_opt()
710 struct fl_flow_key *mask, in fl_set_enc_opt() argument
748 /* At the same time we need to parse through the mask in fl_set_enc_opt()
749 * in order to verify exact and mask attribute lengths. in fl_set_enc_opt()
751 mask->enc_opts.dst_opt_type = TUNNEL_GENEVE_OPT; in fl_set_enc_opt()
752 option_len = fl_set_geneve_opt(nla_opt_msk, mask, in fl_set_enc_opt()
758 mask->enc_opts.len += option_len; in fl_set_enc_opt()
759 if (key->enc_opts.len != mask->enc_opts.len) { in fl_set_enc_opt()
760 NL_SET_ERR_MSG(extack, "Key and mask miss aligned"); in fl_set_enc_opt()
777 struct fl_flow_key *key, struct fl_flow_key *mask, in fl_set_key() argument
788 mask->indev_ifindex = 0xffffffff; in fl_set_key()
793 mask->eth.dst, TCA_FLOWER_KEY_ETH_DST_MASK, in fl_set_key()
796 mask->eth.src, TCA_FLOWER_KEY_ETH_SRC_MASK, in fl_set_key()
805 &mask->vlan); in fl_set_key()
813 &key->cvlan, &mask->cvlan); in fl_set_key()
816 &mask->basic.n_proto, in fl_set_key()
821 mask->basic.n_proto = cpu_to_be16(~0); in fl_set_key()
826 mask->basic.n_proto = cpu_to_be16(~0); in fl_set_key()
833 &mask->basic.ip_proto, TCA_FLOWER_UNSPEC, in fl_set_key()
835 fl_set_key_ip(tb, false, &key->ip, &mask->ip); in fl_set_key()
840 mask->control.addr_type = ~0; in fl_set_key()
842 &mask->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC_MASK, in fl_set_key()
845 &mask->ipv4.dst, TCA_FLOWER_KEY_IPV4_DST_MASK, in fl_set_key()
849 mask->control.addr_type = ~0; in fl_set_key()
851 &mask->ipv6.src, TCA_FLOWER_KEY_IPV6_SRC_MASK, in fl_set_key()
854 &mask->ipv6.dst, TCA_FLOWER_KEY_IPV6_DST_MASK, in fl_set_key()
860 &mask->tp.src, TCA_FLOWER_KEY_TCP_SRC_MASK, in fl_set_key()
863 &mask->tp.dst, TCA_FLOWER_KEY_TCP_DST_MASK, in fl_set_key()
866 &mask->tcp.flags, TCA_FLOWER_KEY_TCP_FLAGS_MASK, in fl_set_key()
870 &mask->tp.src, TCA_FLOWER_KEY_UDP_SRC_MASK, in fl_set_key()
873 &mask->tp.dst, TCA_FLOWER_KEY_UDP_DST_MASK, in fl_set_key()
877 &mask->tp.src, TCA_FLOWER_KEY_SCTP_SRC_MASK, in fl_set_key()
880 &mask->tp.dst, TCA_FLOWER_KEY_SCTP_DST_MASK, in fl_set_key()
885 &mask->icmp.type, in fl_set_key()
889 &mask->icmp.code, in fl_set_key()
895 &mask->icmp.type, in fl_set_key()
899 &mask->icmp.code, in fl_set_key()
904 ret = fl_set_key_mpls(tb, &key->mpls, &mask->mpls); in fl_set_key()
910 &mask->arp.sip, TCA_FLOWER_KEY_ARP_SIP_MASK, in fl_set_key()
913 &mask->arp.tip, TCA_FLOWER_KEY_ARP_TIP_MASK, in fl_set_key()
916 &mask->arp.op, TCA_FLOWER_KEY_ARP_OP_MASK, in fl_set_key()
919 mask->arp.sha, TCA_FLOWER_KEY_ARP_SHA_MASK, in fl_set_key()
922 mask->arp.tha, TCA_FLOWER_KEY_ARP_THA_MASK, in fl_set_key()
929 mask->enc_control.addr_type = ~0; in fl_set_key()
932 &mask->enc_ipv4.src, in fl_set_key()
937 &mask->enc_ipv4.dst, in fl_set_key()
945 mask->enc_control.addr_type = ~0; in fl_set_key()
948 &mask->enc_ipv6.src, in fl_set_key()
953 &mask->enc_ipv6.dst, in fl_set_key()
959 &mask->enc_key_id.keyid, TCA_FLOWER_UNSPEC, in fl_set_key()
963 &mask->enc_tp.src, TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, in fl_set_key()
967 &mask->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, in fl_set_key()
970 fl_set_key_ip(tb, true, &key->enc_ip, &mask->enc_ip); in fl_set_key()
973 ret = fl_set_enc_opt(tb, key, mask, extack); in fl_set_key()
979 ret = fl_set_key_flags(tb, &key->control.flags, &mask->control.flags); in fl_set_key()
1000 static int fl_init_mask_hashtable(struct fl_flow_mask *mask) in fl_init_mask_hashtable() argument
1002 mask->filter_ht_params = fl_ht_params; in fl_init_mask_hashtable()
1003 mask->filter_ht_params.key_len = fl_mask_range(mask); in fl_init_mask_hashtable()
1004 mask->filter_ht_params.key_offset += mask->range.start; in fl_init_mask_hashtable()
1006 return rhashtable_init(&mask->ht, &mask->filter_ht_params); in fl_init_mask_hashtable()
1012 #define FL_KEY_IS_MASKED(mask, member) \ argument
1013 memchr_inv(((char *)mask) + FL_KEY_MEMBER_OFFSET(member), \
1023 #define FL_KEY_SET_IF_MASKED(mask, keys, cnt, id, member) \ argument
1025 if (FL_KEY_IS_MASKED(mask, member)) \
1030 struct fl_flow_key *mask) in fl_init_dissector() argument
1037 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1039 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1041 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1043 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1045 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1047 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1049 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1051 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1053 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1055 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1057 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1059 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1061 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1063 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1065 if (FL_KEY_IS_MASKED(mask, enc_ipv4) || in fl_init_dissector()
1066 FL_KEY_IS_MASKED(mask, enc_ipv6)) in fl_init_dissector()
1069 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1071 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1073 FL_KEY_SET_IF_MASKED(mask, keys, cnt, in fl_init_dissector()
1080 struct fl_flow_mask *mask) in fl_create_new_mask() argument
1089 fl_mask_copy(newmask, mask); in fl_create_new_mask()
1119 struct fl_flow_mask *mask) in fl_check_assign_mask() argument
1123 fnew->mask = rhashtable_lookup_fast(&head->ht, mask, mask_ht_params); in fl_check_assign_mask()
1124 if (!fnew->mask) { in fl_check_assign_mask()
1128 newmask = fl_create_new_mask(head, mask); in fl_check_assign_mask()
1132 fnew->mask = newmask; in fl_check_assign_mask()
1133 } else if (fold && fold->mask != fnew->mask) { in fl_check_assign_mask()
1141 struct cls_fl_filter *f, struct fl_flow_mask *mask, in fl_set_parms() argument
1158 err = fl_set_key(net, tb, &f->key, &mask->key, extack); in fl_set_parms()
1162 fl_mask_update_range(mask); in fl_set_parms()
1163 fl_set_masked_key(&f->mkey, &f->key, mask); in fl_set_parms()
1165 if (!fl_mask_fits_tmplt(tmplt, mask)) { in fl_set_parms()
1166 NL_SET_ERR_MSG_MOD(extack, "Mask does not fit the template"); in fl_set_parms()
1181 struct fl_flow_mask *mask; in fl_change() local
1188 mask = kzalloc(sizeof(struct fl_flow_mask), GFP_KERNEL); in fl_change()
1189 if (!mask) in fl_change()
1227 err = fl_set_parms(net, tp, fnew, mask, base, tb, tca[TCA_RATE], ovr, in fl_change()
1232 err = fl_check_assign_mask(head, fnew, fold, mask); in fl_change()
1250 if (!fold && fl_lookup(fnew->mask, &fnew->mkey)) { in fl_change()
1255 err = rhashtable_insert_fast(&fnew->mask->ht, &fnew->ht_node, in fl_change()
1256 fnew->mask->filter_ht_params); in fl_change()
1272 rhashtable_remove_fast(&fold->mask->ht, in fl_change()
1274 fold->mask->filter_ht_params); in fl_change()
1288 list_add_tail_rcu(&fnew->list, &fnew->mask->filters); in fl_change()
1292 kfree(mask); in fl_change()
1300 fl_mask_put(head, fnew->mask, false); in fl_change()
1308 kfree(mask); in fl_change()
1319 rhashtable_remove_fast(&f->mask->ht, &f->ht_node, in fl_delete()
1320 f->mask->filter_ht_params); in fl_delete()
1350 struct fl_flow_mask *mask; in fl_reoffload() local
1354 list_for_each_entry(mask, &head->masks, list) { in fl_reoffload()
1355 list_for_each_entry(f, &mask->filters, list) { in fl_reoffload()
1364 cls_flower.dissector = &mask->dissector; in fl_reoffload()
1365 cls_flower.mask = &mask->key; in fl_reoffload()
1396 cls_flower.mask = &tmplt->mask; in fl_hw_create_tmplt()
1446 err = fl_set_key(net, tb, &tmplt->dummy_key, &tmplt->mask, extack); in fl_tmplt_create()
1451 fl_init_dissector(&tmplt->dissector, &tmplt->mask); in fl_tmplt_create()
1474 void *mask, int mask_type, int len) in fl_dump_key_val() argument
1478 if (!memchr_inv(mask, 0, len)) in fl_dump_key_val()
1484 err = nla_put(skb, mask_type, len, mask); in fl_dump_key_val()
1528 struct flow_dissector_key_ip *mask) in fl_dump_key_ip() argument
1535 if (fl_dump_key_val(skb, &key->tos, tos_key, &mask->tos, tos_mask, sizeof(key->tos)) || in fl_dump_key_ip()
1536 fl_dump_key_val(skb, &key->ttl, ttl_key, &mask->ttl, ttl_mask, sizeof(key->ttl))) in fl_dump_key_ip()
1579 u32 key, mask; in fl_dump_key_flags() local
1587 mask = 0; in fl_dump_key_flags()
1589 fl_get_key_flag(flags_key, flags_mask, &key, &mask, in fl_dump_key_flags()
1591 fl_get_key_flag(flags_key, flags_mask, &key, &mask, in fl_dump_key_flags()
1596 _mask = cpu_to_be32(mask); in fl_dump_key_flags()
1683 struct fl_flow_key *key, struct fl_flow_key *mask) in fl_dump_key() argument
1685 if (mask->indev_ifindex) { in fl_dump_key()
1694 mask->eth.dst, TCA_FLOWER_KEY_ETH_DST_MASK, in fl_dump_key()
1697 mask->eth.src, TCA_FLOWER_KEY_ETH_SRC_MASK, in fl_dump_key()
1700 &mask->basic.n_proto, TCA_FLOWER_UNSPEC, in fl_dump_key()
1704 if (fl_dump_key_mpls(skb, &key->mpls, &mask->mpls)) in fl_dump_key()
1708 TCA_FLOWER_KEY_VLAN_PRIO, &key->vlan, &mask->vlan)) in fl_dump_key()
1713 &key->cvlan, &mask->cvlan) || in fl_dump_key()
1714 (mask->cvlan.vlan_tpid && in fl_dump_key()
1719 if (mask->basic.n_proto) { in fl_dump_key()
1720 if (mask->cvlan.vlan_tpid) { in fl_dump_key()
1724 } else if (mask->vlan.vlan_tpid) { in fl_dump_key()
1734 &mask->basic.ip_proto, TCA_FLOWER_UNSPEC, in fl_dump_key()
1736 fl_dump_key_ip(skb, false, &key->ip, &mask->ip))) in fl_dump_key()
1741 &mask->ipv4.src, TCA_FLOWER_KEY_IPV4_SRC_MASK, in fl_dump_key()
1744 &mask->ipv4.dst, TCA_FLOWER_KEY_IPV4_DST_MASK, in fl_dump_key()
1749 &mask->ipv6.src, TCA_FLOWER_KEY_IPV6_SRC_MASK, in fl_dump_key()
1752 &mask->ipv6.dst, TCA_FLOWER_KEY_IPV6_DST_MASK, in fl_dump_key()
1758 &mask->tp.src, TCA_FLOWER_KEY_TCP_SRC_MASK, in fl_dump_key()
1761 &mask->tp.dst, TCA_FLOWER_KEY_TCP_DST_MASK, in fl_dump_key()
1764 &mask->tcp.flags, TCA_FLOWER_KEY_TCP_FLAGS_MASK, in fl_dump_key()
1769 &mask->tp.src, TCA_FLOWER_KEY_UDP_SRC_MASK, in fl_dump_key()
1772 &mask->tp.dst, TCA_FLOWER_KEY_UDP_DST_MASK, in fl_dump_key()
1777 &mask->tp.src, TCA_FLOWER_KEY_SCTP_SRC_MASK, in fl_dump_key()
1780 &mask->tp.dst, TCA_FLOWER_KEY_SCTP_DST_MASK, in fl_dump_key()
1786 TCA_FLOWER_KEY_ICMPV4_TYPE, &mask->icmp.type, in fl_dump_key()
1790 TCA_FLOWER_KEY_ICMPV4_CODE, &mask->icmp.code, in fl_dump_key()
1797 TCA_FLOWER_KEY_ICMPV6_TYPE, &mask->icmp.type, in fl_dump_key()
1801 TCA_FLOWER_KEY_ICMPV6_CODE, &mask->icmp.code, in fl_dump_key()
1808 TCA_FLOWER_KEY_ARP_SIP, &mask->arp.sip, in fl_dump_key()
1812 TCA_FLOWER_KEY_ARP_TIP, &mask->arp.tip, in fl_dump_key()
1816 TCA_FLOWER_KEY_ARP_OP, &mask->arp.op, in fl_dump_key()
1820 mask->arp.sha, TCA_FLOWER_KEY_ARP_SHA_MASK, in fl_dump_key()
1823 mask->arp.tha, TCA_FLOWER_KEY_ARP_THA_MASK, in fl_dump_key()
1829 TCA_FLOWER_KEY_ENC_IPV4_SRC, &mask->enc_ipv4.src, in fl_dump_key()
1833 TCA_FLOWER_KEY_ENC_IPV4_DST, &mask->enc_ipv4.dst, in fl_dump_key()
1839 TCA_FLOWER_KEY_ENC_IPV6_SRC, &mask->enc_ipv6.src, in fl_dump_key()
1844 &mask->enc_ipv6.dst, in fl_dump_key()
1850 &mask->enc_key_id, TCA_FLOWER_UNSPEC, in fl_dump_key()
1854 &mask->enc_tp.src, in fl_dump_key()
1859 &mask->enc_tp.dst, in fl_dump_key()
1862 fl_dump_key_ip(skb, true, &key->enc_ip, &mask->enc_ip) || in fl_dump_key()
1863 fl_dump_key_enc_opt(skb, &key->enc_opts, &mask->enc_opts)) in fl_dump_key()
1866 if (fl_dump_key_flags(skb, key->control.flags, mask->control.flags)) in fl_dump_key()
1880 struct fl_flow_key *key, *mask; in fl_dump() local
1896 mask = &f->mask->key; in fl_dump()
1898 if (fl_dump_key(skb, net, key, mask)) in fl_dump()
1925 struct fl_flow_key *key, *mask; in fl_tmplt_dump() local
1933 mask = &tmplt->mask; in fl_tmplt_dump()
1935 if (fl_dump_key(skb, net, key, mask)) in fl_tmplt_dump()