Lines Matching refs:match
92 static void update_range(struct sw_flow_match *match,
100 range = &match->range;
102 range = &match->mask->range;
117 #define SW_FLOW_KEY_PUT(match, field, value, is_mask) \
119 update_range(match, offsetof(struct sw_flow_key, field), \
120 sizeof((match)->key->field), is_mask); \
122 (match)->mask->key.field = value; \
124 (match)->key->field = value; \
127 #define SW_FLOW_KEY_MEMCPY_OFFSET(match, offset, value_p, len, is_mask) \
129 update_range(match, offset, len, is_mask); \
131 memcpy((u8 *)&(match)->mask->key + offset, value_p, \
134 memcpy((u8 *)(match)->key + offset, value_p, len); \
137 #define SW_FLOW_KEY_MEMCPY(match, field, value_p, len, is_mask) \
138 SW_FLOW_KEY_MEMCPY_OFFSET(match, offsetof(struct sw_flow_key, field), \
141 #define SW_FLOW_KEY_MEMSET_FIELD(match, field, value, is_mask) \
143 update_range(match, offsetof(struct sw_flow_key, field), \
144 sizeof((match)->key->field), is_mask); \
146 memset((u8 *)&(match)->mask->key.field, value, \
147 sizeof((match)->mask->key.field)); \
149 memset((u8 *)&(match)->key->field, value, \
150 sizeof((match)->key->field)); \
153 static bool match_validate(const struct sw_flow_match *match,
182 if (match->key->eth.type == htons(ETH_P_ARP)
183 || match->key->eth.type == htons(ETH_P_RARP)) {
185 if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
189 if (eth_p_mpls(match->key->eth.type)) {
191 if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
195 if (match->key->eth.type == htons(ETH_P_IP)) {
197 if (match->mask && match->mask->key.eth.type == htons(0xffff)) {
202 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) {
203 if (match->key->ip.proto == IPPROTO_UDP) {
205 if (match->mask && (match->mask->key.ip.proto == 0xff))
209 if (match->key->ip.proto == IPPROTO_SCTP) {
211 if (match->mask && (match->mask->key.ip.proto == 0xff))
215 if (match->key->ip.proto == IPPROTO_TCP) {
218 if (match->mask && (match->mask->key.ip.proto == 0xff)) {
224 if (match->key->ip.proto == IPPROTO_ICMP) {
226 if (match->mask && (match->mask->key.ip.proto == 0xff))
232 if (match->key->eth.type == htons(ETH_P_IPV6)) {
234 if (match->mask && match->mask->key.eth.type == htons(0xffff)) {
239 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) {
240 if (match->key->ip.proto == IPPROTO_UDP) {
242 if (match->mask && (match->mask->key.ip.proto == 0xff))
246 if (match->key->ip.proto == IPPROTO_SCTP) {
248 if (match->mask && (match->mask->key.ip.proto == 0xff))
252 if (match->key->ip.proto == IPPROTO_TCP) {
255 if (match->mask && (match->mask->key.ip.proto == 0xff)) {
261 if (match->key->ip.proto == IPPROTO_ICMPV6) {
263 if (match->mask && (match->mask->key.ip.proto == 0xff))
266 if (match->key->tp.src ==
268 match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) {
276 if (match->mask && (match->mask->key.tp.src == htons(0xff)))
283 if (match->key->eth.type == htons(ETH_P_NSH)) {
285 if (match->mask &&
286 match->mask->key.eth.type == htons(0xffff)) {
523 struct sw_flow_match *match, bool is_mask,
528 if (nla_len(a) > sizeof(match->key->tun_opts)) {
530 nla_len(a), sizeof(match->key->tun_opts));
545 SW_FLOW_KEY_PUT(match, tun_opts_len, nla_len(a),
558 if (match->key->tun_opts_len != nla_len(a)) {
560 match->key->tun_opts_len, nla_len(a));
564 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true);
568 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, nla_data(a),
574 struct sw_flow_match *match, bool is_mask,
582 BUILD_BUG_ON(sizeof(opts) > sizeof(match->key->tun_opts));
619 SW_FLOW_KEY_PUT(match, tun_opts_len, sizeof(opts), false);
621 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true);
624 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, &opts, sizeof(opts),
630 struct sw_flow_match *match, bool is_mask,
636 sizeof(match->key->tun_opts));
638 if (nla_len(a) > sizeof(match->key->tun_opts)) {
640 nla_len(a), sizeof(match->key->tun_opts));
645 SW_FLOW_KEY_PUT(match, tun_opts_len,
648 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true);
651 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, nla_data(a),
657 struct sw_flow_match *match, bool is_mask,
686 SW_FLOW_KEY_PUT(match, tun_key.tun_id,
691 SW_FLOW_KEY_PUT(match, tun_key.u.ipv4.src,
696 SW_FLOW_KEY_PUT(match, tun_key.u.ipv4.dst,
701 SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.src,
706 SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.dst,
711 SW_FLOW_KEY_PUT(match, tun_key.tos,
715 SW_FLOW_KEY_PUT(match, tun_key.ttl,
726 SW_FLOW_KEY_PUT(match, tun_key.tp_src,
730 SW_FLOW_KEY_PUT(match, tun_key.tp_dst,
742 err = genev_tun_opt_from_nlattr(a, match, is_mask, log);
755 err = vxlan_tun_opt_from_nlattr(a, match, is_mask, log);
770 err = erspan_tun_opt_from_nlattr(a, match, is_mask,
789 SW_FLOW_KEY_PUT(match, tun_key.tun_flags, tun_flags, is_mask);
791 SW_FLOW_KEY_MEMSET_FIELD(match, tun_proto, 0xff, true);
793 SW_FLOW_KEY_PUT(match, tun_proto, ipv6 ? AF_INET6 : AF_INET,
814 if (match->key->tun_key.u.ipv4.src ||
815 match->key->tun_key.u.ipv4.dst ||
816 match->key->tun_key.tp_src ||
817 match->key->tun_key.tp_dst ||
818 match->key->tun_key.ttl ||
819 match->key->tun_key.tos ||
824 } else if (!match->key->tun_key.u.ipv4.dst) {
829 if (ipv6 && ipv6_addr_any(&match->key->tun_key.u.ipv6.dst)) {
963 static int encode_vlan_from_nlattrs(struct sw_flow_match *match,
977 SW_FLOW_KEY_PUT(match, eth.vlan.tpid, tpid, is_mask);
978 SW_FLOW_KEY_PUT(match, eth.vlan.tci, tci, is_mask);
980 SW_FLOW_KEY_PUT(match, eth.cvlan.tpid, tpid, is_mask);
981 SW_FLOW_KEY_PUT(match, eth.cvlan.tci, tci, is_mask);
986 static int validate_vlan_from_nlattrs(const struct sw_flow_match *match,
1024 static int validate_vlan_mask_from_nlattrs(const struct sw_flow_match *match,
1030 bool encap_valid = !!(match->key->eth.vlan.tci &
1032 bool i_encap_valid = !!(match->key->eth.cvlan.tci &
1053 OVS_NLERR(log, "Must have an exact match on %s TPID (mask=%x).",
1058 OVS_NLERR(log, "%s TCI mask does not have exact match for VLAN_CFI_MASK bit.",
1066 static int __parse_vlan_from_nlattrs(struct sw_flow_match *match,
1075 err = validate_vlan_from_nlattrs(match, *key_attrs, inner,
1078 err = validate_vlan_mask_from_nlattrs(match, *key_attrs, inner,
1083 err = encode_vlan_from_nlattrs(match, a, is_mask, inner);
1101 static int parse_vlan_from_nlattrs(struct sw_flow_match *match,
1108 err = __parse_vlan_from_nlattrs(match, key_attrs, false, a,
1113 encap_valid = !!(match->key->eth.vlan.tci & htons(VLAN_CFI_MASK));
1115 err = __parse_vlan_from_nlattrs(match, key_attrs, true, a,
1124 static int parse_eth_type_from_nlattrs(struct sw_flow_match *match,
1132 /* Always exact match EtherType. */
1140 SW_FLOW_KEY_PUT(match, eth.type, eth_type, is_mask);
1145 static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match,
1154 SW_FLOW_KEY_PUT(match, ovs_flow_hash, hash_val, is_mask);
1161 SW_FLOW_KEY_PUT(match, recirc_id, recirc_id, is_mask);
1166 SW_FLOW_KEY_PUT(match, phy.priority,
1175 in_port = 0xffffffff; /* Always exact match in_port. */
1182 SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask);
1185 SW_FLOW_KEY_PUT(match, phy.in_port, DP_MAX_PORTS, is_mask);
1191 SW_FLOW_KEY_PUT(match, phy.skb_mark, mark, is_mask);
1195 if (ip_tun_from_nlattr(a[OVS_KEY_ATTR_TUNNEL], match,
1211 SW_FLOW_KEY_PUT(match, ct_state, ct_state, is_mask);
1218 SW_FLOW_KEY_PUT(match, ct_zone, ct_zone, is_mask);
1225 SW_FLOW_KEY_PUT(match, ct.mark, mark, is_mask);
1233 SW_FLOW_KEY_MEMCPY(match, ct.labels, cl->ct_labels,
1242 SW_FLOW_KEY_PUT(match, ipv4.ct_orig.src, ct->ipv4_src, is_mask);
1243 SW_FLOW_KEY_PUT(match, ipv4.ct_orig.dst, ct->ipv4_dst, is_mask);
1244 SW_FLOW_KEY_PUT(match, ct.orig_tp.src, ct->src_port, is_mask);
1245 SW_FLOW_KEY_PUT(match, ct.orig_tp.dst, ct->dst_port, is_mask);
1246 SW_FLOW_KEY_PUT(match, ct_orig_proto, ct->ipv4_proto, is_mask);
1254 SW_FLOW_KEY_MEMCPY(match, ipv6.ct_orig.src, &ct->ipv6_src,
1255 sizeof(match->key->ipv6.ct_orig.src),
1257 SW_FLOW_KEY_MEMCPY(match, ipv6.ct_orig.dst, &ct->ipv6_dst,
1258 sizeof(match->key->ipv6.ct_orig.dst),
1260 SW_FLOW_KEY_PUT(match, ct.orig_tp.src, ct->src_port, is_mask);
1261 SW_FLOW_KEY_PUT(match, ct.orig_tp.dst, ct->dst_port, is_mask);
1262 SW_FLOW_KEY_PUT(match, ct_orig_proto, ct->ipv6_proto, is_mask);
1273 /* Always exact match mac_proto */
1274 SW_FLOW_KEY_PUT(match, mac_proto, is_mask ? 0xff : mac_proto, is_mask);
1277 return parse_eth_type_from_nlattrs(match, attrs, a, is_mask,
1378 struct sw_flow_match *match, bool is_mask,
1420 SW_FLOW_KEY_PUT(match, nsh.base.flags,
1422 SW_FLOW_KEY_PUT(match, nsh.base.ttl,
1424 SW_FLOW_KEY_PUT(match, nsh.base.mdtype,
1426 SW_FLOW_KEY_PUT(match, nsh.base.np,
1428 SW_FLOW_KEY_PUT(match, nsh.base.path_hdr,
1437 SW_FLOW_KEY_PUT(match, nsh.context[i],
1498 static int ovs_key_from_nlattrs(struct net *net, struct sw_flow_match *match,
1504 err = metadata_from_nlattrs(net, match, &attrs, a, is_mask, log);
1512 SW_FLOW_KEY_MEMCPY(match, eth.src,
1514 SW_FLOW_KEY_MEMCPY(match, eth.dst,
1527 err = parse_eth_type_from_nlattrs(match, &attrs, a, is_mask,
1532 SW_FLOW_KEY_PUT(match, eth.type, htons(ETH_P_802_2), is_mask);
1534 } else if (!match->key->eth.type) {
1548 SW_FLOW_KEY_PUT(match, ip.proto,
1550 SW_FLOW_KEY_PUT(match, ip.tos,
1552 SW_FLOW_KEY_PUT(match, ip.ttl,
1554 SW_FLOW_KEY_PUT(match, ip.frag,
1556 SW_FLOW_KEY_PUT(match, ipv4.addr.src,
1558 SW_FLOW_KEY_PUT(match, ipv4.addr.dst,
1579 SW_FLOW_KEY_PUT(match, ipv6.label,
1581 SW_FLOW_KEY_PUT(match, ip.proto,
1583 SW_FLOW_KEY_PUT(match, ip.tos,
1585 SW_FLOW_KEY_PUT(match, ip.ttl,
1587 SW_FLOW_KEY_PUT(match, ip.frag,
1589 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.src,
1591 sizeof(match->key->ipv6.addr.src),
1593 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.dst,
1595 sizeof(match->key->ipv6.addr.dst),
1611 SW_FLOW_KEY_PUT(match, ipv4.addr.src,
1613 SW_FLOW_KEY_PUT(match, ipv4.addr.dst,
1615 SW_FLOW_KEY_PUT(match, ip.proto,
1617 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.sha,
1619 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.tha,
1626 if (nsh_key_put_from_nlattr(a[OVS_KEY_ATTR_NSH], match,
1648 SW_FLOW_KEY_PUT(match, mpls.lse[i],
1651 SW_FLOW_KEY_PUT(match, mpls.num_labels_mask,
1661 SW_FLOW_KEY_PUT(match, tp.src, tcp_key->tcp_src, is_mask);
1662 SW_FLOW_KEY_PUT(match, tp.dst, tcp_key->tcp_dst, is_mask);
1667 SW_FLOW_KEY_PUT(match, tp.flags,
1677 SW_FLOW_KEY_PUT(match, tp.src, udp_key->udp_src, is_mask);
1678 SW_FLOW_KEY_PUT(match, tp.dst, udp_key->udp_dst, is_mask);
1686 SW_FLOW_KEY_PUT(match, tp.src, sctp_key->sctp_src, is_mask);
1687 SW_FLOW_KEY_PUT(match, tp.dst, sctp_key->sctp_dst, is_mask);
1695 SW_FLOW_KEY_PUT(match, tp.src,
1697 SW_FLOW_KEY_PUT(match, tp.dst,
1706 SW_FLOW_KEY_PUT(match, tp.src,
1708 SW_FLOW_KEY_PUT(match, tp.dst,
1717 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.target,
1719 sizeof(match->key->ipv6.nd.target),
1721 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.sll,
1723 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.tll,
1762 * mask. In case the 'mask' is NULL, the flow is treated as exact match
1766 * @match: receives the extracted flow match information.
1776 int ovs_nla_get_match(struct net *net, struct sw_flow_match *match,
1791 err = parse_vlan_from_nlattrs(match, &key_attrs, a, false, log);
1795 err = ovs_key_from_nlattrs(net, match, key_attrs, a, false, log);
1799 if (match->mask) {
1801 /* Create an exact match mask. We need to set to 0xff
1802 * all the 'match->mask' fields that have been touched
1803 * in 'match->key'. We cannot simply memset
1804 * 'match->mask', because padding bytes and fields not
1805 * specified in 'match->key' should be left to 0.
1809 * 'match->mask' appropriately.
1822 if (match->key->tun_proto)
1823 SW_FLOW_KEY_MEMSET_FIELD(match, tun_key,
1833 /* Always match on tci. */
1834 SW_FLOW_KEY_PUT(match, eth.vlan.tci, htons(0xffff), true);
1835 SW_FLOW_KEY_PUT(match, eth.cvlan.tci, htons(0xffff), true);
1837 err = parse_vlan_from_nlattrs(match, &mask_attrs, a, true, log);
1841 err = ovs_key_from_nlattrs(net, match, mask_attrs, a, true,
1847 if (!match_validate(match, key_attrs, mask_attrs, log))
1932 struct sw_flow_match match;
1934 memset(&match, 0, sizeof(match));
1935 match.key = key;
1946 return metadata_from_nlattrs(net, &match, &attrs, a, false, log);
2673 void ovs_match_init(struct sw_flow_match *match,
2678 memset(match, 0, sizeof(*match));
2679 match->key = key;
2680 match->mask = mask;
2722 struct sw_flow_match match;
2732 ovs_match_init(&match, &key, true, NULL);
2733 opts_type = ip_tun_from_nlattr(nla_data(attr), &match, false, log);
2803 struct sw_flow_match match;
2807 ovs_match_init(&match, &key, true, NULL);
2808 ret = nsh_key_put_from_nlattr(attr, &match, is_mask,