Lines Matching refs:match
95 static void update_range(struct sw_flow_match *match, in update_range() argument
103 range = &match->range; in update_range()
105 range = &match->mask->range; in update_range()
120 #define SW_FLOW_KEY_PUT(match, field, value, is_mask) \ argument
122 update_range(match, offsetof(struct sw_flow_key, field), \
123 sizeof((match)->key->field), is_mask); \
125 (match)->mask->key.field = value; \
127 (match)->key->field = value; \
130 #define SW_FLOW_KEY_MEMCPY_OFFSET(match, offset, value_p, len, is_mask) \ argument
132 update_range(match, offset, len, is_mask); \
134 memcpy((u8 *)&(match)->mask->key + offset, value_p, \
137 memcpy((u8 *)(match)->key + offset, value_p, len); \
140 #define SW_FLOW_KEY_MEMCPY(match, field, value_p, len, is_mask) \ argument
141 SW_FLOW_KEY_MEMCPY_OFFSET(match, offsetof(struct sw_flow_key, field), \
144 #define SW_FLOW_KEY_MEMSET_FIELD(match, field, value, is_mask) \ argument
146 update_range(match, offsetof(struct sw_flow_key, field), \
147 sizeof((match)->key->field), is_mask); \
149 memset((u8 *)&(match)->mask->key.field, value, \
150 sizeof((match)->mask->key.field)); \
152 memset((u8 *)&(match)->key->field, value, \
153 sizeof((match)->key->field)); \
156 #define SW_FLOW_KEY_BITMAP_COPY(match, field, value_p, nbits, is_mask) ({ \ argument
157 update_range(match, offsetof(struct sw_flow_key, field), \
159 bitmap_copy(is_mask ? (match)->mask->key.field : (match)->key->field, \
163 static bool match_validate(const struct sw_flow_match *match, in match_validate() argument
192 if (match->key->eth.type == htons(ETH_P_ARP) in match_validate()
193 || match->key->eth.type == htons(ETH_P_RARP)) { in match_validate()
195 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
199 if (eth_p_mpls(match->key->eth.type)) { in match_validate()
201 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
205 if (match->key->eth.type == htons(ETH_P_IP)) { in match_validate()
207 if (match->mask && match->mask->key.eth.type == htons(0xffff)) { in match_validate()
212 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) { in match_validate()
213 if (match->key->ip.proto == IPPROTO_UDP) { in match_validate()
215 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
219 if (match->key->ip.proto == IPPROTO_SCTP) { in match_validate()
221 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
225 if (match->key->ip.proto == IPPROTO_TCP) { in match_validate()
228 if (match->mask && (match->mask->key.ip.proto == 0xff)) { in match_validate()
234 if (match->key->ip.proto == IPPROTO_ICMP) { in match_validate()
236 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
242 if (match->key->eth.type == htons(ETH_P_IPV6)) { in match_validate()
244 if (match->mask && match->mask->key.eth.type == htons(0xffff)) { in match_validate()
249 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) { in match_validate()
250 if (match->key->ip.proto == IPPROTO_UDP) { in match_validate()
252 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
256 if (match->key->ip.proto == IPPROTO_SCTP) { in match_validate()
258 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
262 if (match->key->ip.proto == IPPROTO_TCP) { in match_validate()
265 if (match->mask && (match->mask->key.ip.proto == 0xff)) { in match_validate()
271 if (match->key->ip.proto == IPPROTO_ICMPV6) { in match_validate()
273 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
276 if (match->key->tp.src == in match_validate()
278 match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) { in match_validate()
286 if (match->mask && (match->mask->key.tp.src == htons(0xff))) in match_validate()
293 if (match->key->eth.type == htons(ETH_P_NSH)) { in match_validate()
295 if (match->mask && in match_validate()
296 match->mask->key.eth.type == htons(0xffff)) { in match_validate()
543 struct sw_flow_match *match, bool is_mask, in genev_tun_opt_from_nlattr() argument
548 if (nla_len(a) > sizeof(match->key->tun_opts)) { in genev_tun_opt_from_nlattr()
550 nla_len(a), sizeof(match->key->tun_opts)); in genev_tun_opt_from_nlattr()
565 SW_FLOW_KEY_PUT(match, tun_opts_len, nla_len(a), in genev_tun_opt_from_nlattr()
578 if (match->key->tun_opts_len != nla_len(a)) { in genev_tun_opt_from_nlattr()
580 match->key->tun_opts_len, nla_len(a)); in genev_tun_opt_from_nlattr()
584 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in genev_tun_opt_from_nlattr()
588 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, nla_data(a), in genev_tun_opt_from_nlattr()
594 struct sw_flow_match *match, bool is_mask, in vxlan_tun_opt_from_nlattr() argument
602 BUILD_BUG_ON(sizeof(opts) > sizeof(match->key->tun_opts)); in vxlan_tun_opt_from_nlattr()
639 SW_FLOW_KEY_PUT(match, tun_opts_len, sizeof(opts), false); in vxlan_tun_opt_from_nlattr()
641 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in vxlan_tun_opt_from_nlattr()
644 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, &opts, sizeof(opts), in vxlan_tun_opt_from_nlattr()
650 struct sw_flow_match *match, bool is_mask, in erspan_tun_opt_from_nlattr() argument
656 sizeof(match->key->tun_opts)); in erspan_tun_opt_from_nlattr()
658 if (nla_len(a) > sizeof(match->key->tun_opts)) { in erspan_tun_opt_from_nlattr()
660 nla_len(a), sizeof(match->key->tun_opts)); in erspan_tun_opt_from_nlattr()
665 SW_FLOW_KEY_PUT(match, tun_opts_len, in erspan_tun_opt_from_nlattr()
668 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in erspan_tun_opt_from_nlattr()
671 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, nla_data(a), in erspan_tun_opt_from_nlattr()
677 struct sw_flow_match *match, bool is_mask, in ip_tun_from_nlattr() argument
706 SW_FLOW_KEY_PUT(match, tun_key.tun_id, in ip_tun_from_nlattr()
711 SW_FLOW_KEY_PUT(match, tun_key.u.ipv4.src, in ip_tun_from_nlattr()
716 SW_FLOW_KEY_PUT(match, tun_key.u.ipv4.dst, in ip_tun_from_nlattr()
721 SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.src, in ip_tun_from_nlattr()
726 SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.dst, in ip_tun_from_nlattr()
731 SW_FLOW_KEY_PUT(match, tun_key.tos, in ip_tun_from_nlattr()
735 SW_FLOW_KEY_PUT(match, tun_key.ttl, in ip_tun_from_nlattr()
746 SW_FLOW_KEY_PUT(match, tun_key.tp_src, in ip_tun_from_nlattr()
750 SW_FLOW_KEY_PUT(match, tun_key.tp_dst, in ip_tun_from_nlattr()
762 err = genev_tun_opt_from_nlattr(a, match, is_mask, log); in ip_tun_from_nlattr()
775 err = vxlan_tun_opt_from_nlattr(a, match, is_mask, log); in ip_tun_from_nlattr()
790 err = erspan_tun_opt_from_nlattr(a, match, is_mask, in ip_tun_from_nlattr()
809 SW_FLOW_KEY_BITMAP_COPY(match, tun_key.tun_flags, tun_flags, in ip_tun_from_nlattr()
812 SW_FLOW_KEY_MEMSET_FIELD(match, tun_proto, 0xff, true); in ip_tun_from_nlattr()
814 SW_FLOW_KEY_PUT(match, tun_proto, ipv6 ? AF_INET6 : AF_INET, in ip_tun_from_nlattr()
837 if (match->key->tun_key.u.ipv4.src || in ip_tun_from_nlattr()
838 match->key->tun_key.u.ipv4.dst || in ip_tun_from_nlattr()
839 match->key->tun_key.tp_src || in ip_tun_from_nlattr()
840 match->key->tun_key.tp_dst || in ip_tun_from_nlattr()
841 match->key->tun_key.ttl || in ip_tun_from_nlattr()
842 match->key->tun_key.tos || in ip_tun_from_nlattr()
847 } else if (!match->key->tun_key.u.ipv4.dst) { in ip_tun_from_nlattr()
852 if (ipv6 && ipv6_addr_any(&match->key->tun_key.u.ipv6.dst)) { in ip_tun_from_nlattr()
988 static int encode_vlan_from_nlattrs(struct sw_flow_match *match, in encode_vlan_from_nlattrs() argument
1002 SW_FLOW_KEY_PUT(match, eth.vlan.tpid, tpid, is_mask); in encode_vlan_from_nlattrs()
1003 SW_FLOW_KEY_PUT(match, eth.vlan.tci, tci, is_mask); in encode_vlan_from_nlattrs()
1005 SW_FLOW_KEY_PUT(match, eth.cvlan.tpid, tpid, is_mask); in encode_vlan_from_nlattrs()
1006 SW_FLOW_KEY_PUT(match, eth.cvlan.tci, tci, is_mask); in encode_vlan_from_nlattrs()
1011 static int validate_vlan_from_nlattrs(const struct sw_flow_match *match, in validate_vlan_from_nlattrs() argument
1049 static int validate_vlan_mask_from_nlattrs(const struct sw_flow_match *match, in validate_vlan_mask_from_nlattrs() argument
1055 bool encap_valid = !!(match->key->eth.vlan.tci & in validate_vlan_mask_from_nlattrs()
1057 bool i_encap_valid = !!(match->key->eth.cvlan.tci & in validate_vlan_mask_from_nlattrs()
1091 static int __parse_vlan_from_nlattrs(struct sw_flow_match *match, in __parse_vlan_from_nlattrs() argument
1100 err = validate_vlan_from_nlattrs(match, *key_attrs, inner, in __parse_vlan_from_nlattrs()
1103 err = validate_vlan_mask_from_nlattrs(match, *key_attrs, inner, in __parse_vlan_from_nlattrs()
1108 err = encode_vlan_from_nlattrs(match, a, is_mask, inner); in __parse_vlan_from_nlattrs()
1126 static int parse_vlan_from_nlattrs(struct sw_flow_match *match, in parse_vlan_from_nlattrs() argument
1133 err = __parse_vlan_from_nlattrs(match, key_attrs, false, a, in parse_vlan_from_nlattrs()
1138 encap_valid = !!(match->key->eth.vlan.tci & htons(VLAN_CFI_MASK)); in parse_vlan_from_nlattrs()
1140 err = __parse_vlan_from_nlattrs(match, key_attrs, true, a, in parse_vlan_from_nlattrs()
1149 static int parse_eth_type_from_nlattrs(struct sw_flow_match *match, in parse_eth_type_from_nlattrs() argument
1165 SW_FLOW_KEY_PUT(match, eth.type, eth_type, is_mask); in parse_eth_type_from_nlattrs()
1170 static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match, in metadata_from_nlattrs() argument
1179 SW_FLOW_KEY_PUT(match, ovs_flow_hash, hash_val, is_mask); in metadata_from_nlattrs()
1186 SW_FLOW_KEY_PUT(match, recirc_id, recirc_id, is_mask); in metadata_from_nlattrs()
1191 SW_FLOW_KEY_PUT(match, phy.priority, in metadata_from_nlattrs()
1207 SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask); in metadata_from_nlattrs()
1210 SW_FLOW_KEY_PUT(match, phy.in_port, DP_MAX_PORTS, is_mask); in metadata_from_nlattrs()
1216 SW_FLOW_KEY_PUT(match, phy.skb_mark, mark, is_mask); in metadata_from_nlattrs()
1220 if (ip_tun_from_nlattr(a[OVS_KEY_ATTR_TUNNEL], match, in metadata_from_nlattrs()
1236 SW_FLOW_KEY_PUT(match, ct_state, ct_state, is_mask); in metadata_from_nlattrs()
1243 SW_FLOW_KEY_PUT(match, ct_zone, ct_zone, is_mask); in metadata_from_nlattrs()
1250 SW_FLOW_KEY_PUT(match, ct.mark, mark, is_mask); in metadata_from_nlattrs()
1258 SW_FLOW_KEY_MEMCPY(match, ct.labels, cl->ct_labels, in metadata_from_nlattrs()
1267 SW_FLOW_KEY_PUT(match, ipv4.ct_orig.src, ct->ipv4_src, is_mask); in metadata_from_nlattrs()
1268 SW_FLOW_KEY_PUT(match, ipv4.ct_orig.dst, ct->ipv4_dst, is_mask); in metadata_from_nlattrs()
1269 SW_FLOW_KEY_PUT(match, ct.orig_tp.src, ct->src_port, is_mask); in metadata_from_nlattrs()
1270 SW_FLOW_KEY_PUT(match, ct.orig_tp.dst, ct->dst_port, is_mask); in metadata_from_nlattrs()
1271 SW_FLOW_KEY_PUT(match, ct_orig_proto, ct->ipv4_proto, is_mask); in metadata_from_nlattrs()
1279 SW_FLOW_KEY_MEMCPY(match, ipv6.ct_orig.src, &ct->ipv6_src, in metadata_from_nlattrs()
1280 sizeof(match->key->ipv6.ct_orig.src), in metadata_from_nlattrs()
1282 SW_FLOW_KEY_MEMCPY(match, ipv6.ct_orig.dst, &ct->ipv6_dst, in metadata_from_nlattrs()
1283 sizeof(match->key->ipv6.ct_orig.dst), in metadata_from_nlattrs()
1285 SW_FLOW_KEY_PUT(match, ct.orig_tp.src, ct->src_port, is_mask); in metadata_from_nlattrs()
1286 SW_FLOW_KEY_PUT(match, ct.orig_tp.dst, ct->dst_port, is_mask); in metadata_from_nlattrs()
1287 SW_FLOW_KEY_PUT(match, ct_orig_proto, ct->ipv6_proto, is_mask); in metadata_from_nlattrs()
1299 SW_FLOW_KEY_PUT(match, mac_proto, is_mask ? 0xff : mac_proto, is_mask); in metadata_from_nlattrs()
1302 return parse_eth_type_from_nlattrs(match, attrs, a, is_mask, in metadata_from_nlattrs()
1403 struct sw_flow_match *match, bool is_mask, in nsh_key_put_from_nlattr() argument
1445 SW_FLOW_KEY_PUT(match, nsh.base.flags, in nsh_key_put_from_nlattr()
1447 SW_FLOW_KEY_PUT(match, nsh.base.ttl, in nsh_key_put_from_nlattr()
1449 SW_FLOW_KEY_PUT(match, nsh.base.mdtype, in nsh_key_put_from_nlattr()
1451 SW_FLOW_KEY_PUT(match, nsh.base.np, in nsh_key_put_from_nlattr()
1453 SW_FLOW_KEY_PUT(match, nsh.base.path_hdr, in nsh_key_put_from_nlattr()
1462 SW_FLOW_KEY_PUT(match, nsh.context[i], in nsh_key_put_from_nlattr()
1523 static int ovs_key_from_nlattrs(struct net *net, struct sw_flow_match *match, in ovs_key_from_nlattrs() argument
1529 err = metadata_from_nlattrs(net, match, &attrs, a, is_mask, log); in ovs_key_from_nlattrs()
1537 SW_FLOW_KEY_MEMCPY(match, eth.src, in ovs_key_from_nlattrs()
1539 SW_FLOW_KEY_MEMCPY(match, eth.dst, in ovs_key_from_nlattrs()
1552 err = parse_eth_type_from_nlattrs(match, &attrs, a, is_mask, in ovs_key_from_nlattrs()
1557 SW_FLOW_KEY_PUT(match, eth.type, htons(ETH_P_802_2), is_mask); in ovs_key_from_nlattrs()
1559 } else if (!match->key->eth.type) { in ovs_key_from_nlattrs()
1573 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
1575 SW_FLOW_KEY_PUT(match, ip.tos, in ovs_key_from_nlattrs()
1577 SW_FLOW_KEY_PUT(match, ip.ttl, in ovs_key_from_nlattrs()
1579 SW_FLOW_KEY_PUT(match, ip.frag, in ovs_key_from_nlattrs()
1581 SW_FLOW_KEY_PUT(match, ipv4.addr.src, in ovs_key_from_nlattrs()
1583 SW_FLOW_KEY_PUT(match, ipv4.addr.dst, in ovs_key_from_nlattrs()
1604 SW_FLOW_KEY_PUT(match, ipv6.label, in ovs_key_from_nlattrs()
1606 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
1608 SW_FLOW_KEY_PUT(match, ip.tos, in ovs_key_from_nlattrs()
1610 SW_FLOW_KEY_PUT(match, ip.ttl, in ovs_key_from_nlattrs()
1612 SW_FLOW_KEY_PUT(match, ip.frag, in ovs_key_from_nlattrs()
1614 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.src, in ovs_key_from_nlattrs()
1616 sizeof(match->key->ipv6.addr.src), in ovs_key_from_nlattrs()
1618 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.dst, in ovs_key_from_nlattrs()
1620 sizeof(match->key->ipv6.addr.dst), in ovs_key_from_nlattrs()
1631 SW_FLOW_KEY_PUT(match, ipv6.exthdrs, in ovs_key_from_nlattrs()
1647 SW_FLOW_KEY_PUT(match, ipv4.addr.src, in ovs_key_from_nlattrs()
1649 SW_FLOW_KEY_PUT(match, ipv4.addr.dst, in ovs_key_from_nlattrs()
1651 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
1653 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.sha, in ovs_key_from_nlattrs()
1655 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.tha, in ovs_key_from_nlattrs()
1662 if (nsh_key_put_from_nlattr(a[OVS_KEY_ATTR_NSH], match, in ovs_key_from_nlattrs()
1684 SW_FLOW_KEY_PUT(match, mpls.lse[i], in ovs_key_from_nlattrs()
1687 SW_FLOW_KEY_PUT(match, mpls.num_labels_mask, in ovs_key_from_nlattrs()
1697 SW_FLOW_KEY_PUT(match, tp.src, tcp_key->tcp_src, is_mask); in ovs_key_from_nlattrs()
1698 SW_FLOW_KEY_PUT(match, tp.dst, tcp_key->tcp_dst, is_mask); in ovs_key_from_nlattrs()
1703 SW_FLOW_KEY_PUT(match, tp.flags, in ovs_key_from_nlattrs()
1713 SW_FLOW_KEY_PUT(match, tp.src, udp_key->udp_src, is_mask); in ovs_key_from_nlattrs()
1714 SW_FLOW_KEY_PUT(match, tp.dst, udp_key->udp_dst, is_mask); in ovs_key_from_nlattrs()
1722 SW_FLOW_KEY_PUT(match, tp.src, sctp_key->sctp_src, is_mask); in ovs_key_from_nlattrs()
1723 SW_FLOW_KEY_PUT(match, tp.dst, sctp_key->sctp_dst, is_mask); in ovs_key_from_nlattrs()
1731 SW_FLOW_KEY_PUT(match, tp.src, in ovs_key_from_nlattrs()
1733 SW_FLOW_KEY_PUT(match, tp.dst, in ovs_key_from_nlattrs()
1742 SW_FLOW_KEY_PUT(match, tp.src, in ovs_key_from_nlattrs()
1744 SW_FLOW_KEY_PUT(match, tp.dst, in ovs_key_from_nlattrs()
1753 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.target, in ovs_key_from_nlattrs()
1755 sizeof(match->key->ipv6.nd.target), in ovs_key_from_nlattrs()
1757 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.sll, in ovs_key_from_nlattrs()
1759 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.tll, in ovs_key_from_nlattrs()
1812 int ovs_nla_get_match(struct net *net, struct sw_flow_match *match, in ovs_nla_get_match() argument
1827 err = parse_vlan_from_nlattrs(match, &key_attrs, a, false, log); in ovs_nla_get_match()
1831 err = ovs_key_from_nlattrs(net, match, key_attrs, a, false, log); in ovs_nla_get_match()
1835 if (match->mask) { in ovs_nla_get_match()
1858 if (match->key->tun_proto) in ovs_nla_get_match()
1859 SW_FLOW_KEY_MEMSET_FIELD(match, tun_key, in ovs_nla_get_match()
1870 SW_FLOW_KEY_PUT(match, eth.vlan.tci, htons(0xffff), true); in ovs_nla_get_match()
1871 SW_FLOW_KEY_PUT(match, eth.cvlan.tci, htons(0xffff), true); in ovs_nla_get_match()
1873 err = parse_vlan_from_nlattrs(match, &mask_attrs, a, true, log); in ovs_nla_get_match()
1877 err = ovs_key_from_nlattrs(net, match, mask_attrs, a, true, in ovs_nla_get_match()
1883 if (!match_validate(match, key_attrs, mask_attrs, log)) in ovs_nla_get_match()
1968 struct sw_flow_match match; in ovs_nla_get_flow_metadata() local
1970 memset(&match, 0, sizeof(match)); in ovs_nla_get_flow_metadata()
1971 match.key = key; in ovs_nla_get_flow_metadata()
1982 return metadata_from_nlattrs(net, &match, &attrs, a, false, log); in ovs_nla_get_flow_metadata()
2727 void ovs_match_init(struct sw_flow_match *match, in ovs_match_init() argument
2732 memset(match, 0, sizeof(*match)); in ovs_match_init()
2733 match->key = key; in ovs_match_init()
2734 match->mask = mask; in ovs_match_init()
2778 struct sw_flow_match match; in validate_and_copy_set_tun() local
2786 ovs_match_init(&match, &key, true, NULL); in validate_and_copy_set_tun()
2787 opts_type = ip_tun_from_nlattr(nla_data(attr), &match, false, log); in validate_and_copy_set_tun()
2858 struct sw_flow_match match; in validate_nsh() local
2862 ovs_match_init(&match, &key, true, NULL); in validate_nsh()
2863 ret = nsh_key_put_from_nlattr(attr, &match, is_mask, in validate_nsh()