Lines Matching refs:match
62 static void update_range(struct sw_flow_match *match, in update_range() argument
70 range = &match->range; in update_range()
72 range = &match->mask->range; in update_range()
87 #define SW_FLOW_KEY_PUT(match, field, value, is_mask) \ argument
89 update_range(match, offsetof(struct sw_flow_key, field), \
90 sizeof((match)->key->field), is_mask); \
92 (match)->mask->key.field = value; \
94 (match)->key->field = value; \
97 #define SW_FLOW_KEY_MEMCPY_OFFSET(match, offset, value_p, len, is_mask) \ argument
99 update_range(match, offset, len, is_mask); \
101 memcpy((u8 *)&(match)->mask->key + offset, value_p, \
104 memcpy((u8 *)(match)->key + offset, value_p, len); \
107 #define SW_FLOW_KEY_MEMCPY(match, field, value_p, len, is_mask) \ argument
108 SW_FLOW_KEY_MEMCPY_OFFSET(match, offsetof(struct sw_flow_key, field), \
111 #define SW_FLOW_KEY_MEMSET_FIELD(match, field, value, is_mask) \ argument
113 update_range(match, offsetof(struct sw_flow_key, field), \
114 sizeof((match)->key->field), is_mask); \
116 memset((u8 *)&(match)->mask->key.field, value, \
117 sizeof((match)->mask->key.field)); \
119 memset((u8 *)&(match)->key->field, value, \
120 sizeof((match)->key->field)); \
123 static bool match_validate(const struct sw_flow_match *match, in match_validate() argument
149 if (match->key->eth.type == htons(ETH_P_ARP) in match_validate()
150 || match->key->eth.type == htons(ETH_P_RARP)) { in match_validate()
152 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
156 if (eth_p_mpls(match->key->eth.type)) { in match_validate()
158 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
162 if (match->key->eth.type == htons(ETH_P_IP)) { in match_validate()
164 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
167 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) { in match_validate()
168 if (match->key->ip.proto == IPPROTO_UDP) { in match_validate()
170 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
174 if (match->key->ip.proto == IPPROTO_SCTP) { in match_validate()
176 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
180 if (match->key->ip.proto == IPPROTO_TCP) { in match_validate()
183 if (match->mask && (match->mask->key.ip.proto == 0xff)) { in match_validate()
189 if (match->key->ip.proto == IPPROTO_ICMP) { in match_validate()
191 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
197 if (match->key->eth.type == htons(ETH_P_IPV6)) { in match_validate()
199 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
202 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) { in match_validate()
203 if (match->key->ip.proto == IPPROTO_UDP) { in match_validate()
205 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
209 if (match->key->ip.proto == IPPROTO_SCTP) { in match_validate()
211 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
215 if (match->key->ip.proto == IPPROTO_TCP) { in match_validate()
218 if (match->mask && (match->mask->key.ip.proto == 0xff)) { in match_validate()
224 if (match->key->ip.proto == IPPROTO_ICMPV6) { in match_validate()
226 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
229 if (match->key->tp.src == in match_validate()
231 match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) { in match_validate()
233 if (match->mask && (match->mask->key.tp.src == htons(0xff))) in match_validate()
441 struct sw_flow_match *match, bool is_mask, in genev_tun_opt_from_nlattr() argument
446 if (nla_len(a) > sizeof(match->key->tun_opts)) { in genev_tun_opt_from_nlattr()
448 nla_len(a), sizeof(match->key->tun_opts)); in genev_tun_opt_from_nlattr()
463 SW_FLOW_KEY_PUT(match, tun_opts_len, nla_len(a), in genev_tun_opt_from_nlattr()
476 if (match->key->tun_opts_len != nla_len(a)) { in genev_tun_opt_from_nlattr()
478 match->key->tun_opts_len, nla_len(a)); in genev_tun_opt_from_nlattr()
482 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in genev_tun_opt_from_nlattr()
486 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, nla_data(a), in genev_tun_opt_from_nlattr()
492 struct sw_flow_match *match, bool is_mask, in vxlan_tun_opt_from_nlattr() argument
500 BUILD_BUG_ON(sizeof(opts) > sizeof(match->key->tun_opts)); in vxlan_tun_opt_from_nlattr()
537 SW_FLOW_KEY_PUT(match, tun_opts_len, sizeof(opts), false); in vxlan_tun_opt_from_nlattr()
539 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in vxlan_tun_opt_from_nlattr()
542 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, &opts, sizeof(opts), in vxlan_tun_opt_from_nlattr()
548 struct sw_flow_match *match, bool is_mask, in ip_tun_from_nlattr() argument
576 SW_FLOW_KEY_PUT(match, tun_key.tun_id, in ip_tun_from_nlattr()
581 SW_FLOW_KEY_PUT(match, tun_key.u.ipv4.src, in ip_tun_from_nlattr()
586 SW_FLOW_KEY_PUT(match, tun_key.u.ipv4.dst, in ip_tun_from_nlattr()
591 SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.dst, in ip_tun_from_nlattr()
596 SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.dst, in ip_tun_from_nlattr()
601 SW_FLOW_KEY_PUT(match, tun_key.tos, in ip_tun_from_nlattr()
605 SW_FLOW_KEY_PUT(match, tun_key.ttl, in ip_tun_from_nlattr()
616 SW_FLOW_KEY_PUT(match, tun_key.tp_src, in ip_tun_from_nlattr()
620 SW_FLOW_KEY_PUT(match, tun_key.tp_dst, in ip_tun_from_nlattr()
632 err = genev_tun_opt_from_nlattr(a, match, is_mask, log); in ip_tun_from_nlattr()
645 err = vxlan_tun_opt_from_nlattr(a, match, is_mask, log); in ip_tun_from_nlattr()
659 SW_FLOW_KEY_PUT(match, tun_key.tun_flags, tun_flags, is_mask); in ip_tun_from_nlattr()
661 SW_FLOW_KEY_MEMSET_FIELD(match, tun_proto, 0xff, true); in ip_tun_from_nlattr()
663 SW_FLOW_KEY_PUT(match, tun_proto, ipv6 ? AF_INET6 : AF_INET, in ip_tun_from_nlattr()
682 if (ipv4 && !match->key->tun_key.u.ipv4.dst) { in ip_tun_from_nlattr()
686 if (ipv6 && ipv6_addr_any(&match->key->tun_key.u.ipv6.dst)) { in ip_tun_from_nlattr()
810 static int metadata_from_nlattrs(struct net *net, struct sw_flow_match *match, in metadata_from_nlattrs() argument
817 SW_FLOW_KEY_PUT(match, ovs_flow_hash, hash_val, is_mask); in metadata_from_nlattrs()
824 SW_FLOW_KEY_PUT(match, recirc_id, recirc_id, is_mask); in metadata_from_nlattrs()
829 SW_FLOW_KEY_PUT(match, phy.priority, in metadata_from_nlattrs()
845 SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask); in metadata_from_nlattrs()
848 SW_FLOW_KEY_PUT(match, phy.in_port, DP_MAX_PORTS, is_mask); in metadata_from_nlattrs()
854 SW_FLOW_KEY_PUT(match, phy.skb_mark, mark, is_mask); in metadata_from_nlattrs()
858 if (ip_tun_from_nlattr(a[OVS_KEY_ATTR_TUNNEL], match, in metadata_from_nlattrs()
874 SW_FLOW_KEY_PUT(match, ct.state, ct_state, is_mask); in metadata_from_nlattrs()
881 SW_FLOW_KEY_PUT(match, ct.zone, ct_zone, is_mask); in metadata_from_nlattrs()
888 SW_FLOW_KEY_PUT(match, ct.mark, mark, is_mask); in metadata_from_nlattrs()
896 SW_FLOW_KEY_MEMCPY(match, ct.labels, cl->ct_labels, in metadata_from_nlattrs()
903 static int ovs_key_from_nlattrs(struct net *net, struct sw_flow_match *match, in ovs_key_from_nlattrs() argument
909 err = metadata_from_nlattrs(net, match, &attrs, a, is_mask, log); in ovs_key_from_nlattrs()
917 SW_FLOW_KEY_MEMCPY(match, eth.src, in ovs_key_from_nlattrs()
919 SW_FLOW_KEY_MEMCPY(match, eth.dst, in ovs_key_from_nlattrs()
937 SW_FLOW_KEY_PUT(match, eth.tci, tci, is_mask); in ovs_key_from_nlattrs()
954 SW_FLOW_KEY_PUT(match, eth.type, eth_type, is_mask); in ovs_key_from_nlattrs()
957 SW_FLOW_KEY_PUT(match, eth.type, htons(ETH_P_802_2), is_mask); in ovs_key_from_nlattrs()
969 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
971 SW_FLOW_KEY_PUT(match, ip.tos, in ovs_key_from_nlattrs()
973 SW_FLOW_KEY_PUT(match, ip.ttl, in ovs_key_from_nlattrs()
975 SW_FLOW_KEY_PUT(match, ip.frag, in ovs_key_from_nlattrs()
977 SW_FLOW_KEY_PUT(match, ipv4.addr.src, in ovs_key_from_nlattrs()
979 SW_FLOW_KEY_PUT(match, ipv4.addr.dst, in ovs_key_from_nlattrs()
1000 SW_FLOW_KEY_PUT(match, ipv6.label, in ovs_key_from_nlattrs()
1002 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
1004 SW_FLOW_KEY_PUT(match, ip.tos, in ovs_key_from_nlattrs()
1006 SW_FLOW_KEY_PUT(match, ip.ttl, in ovs_key_from_nlattrs()
1008 SW_FLOW_KEY_PUT(match, ip.frag, in ovs_key_from_nlattrs()
1010 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.src, in ovs_key_from_nlattrs()
1012 sizeof(match->key->ipv6.addr.src), in ovs_key_from_nlattrs()
1014 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.dst, in ovs_key_from_nlattrs()
1016 sizeof(match->key->ipv6.addr.dst), in ovs_key_from_nlattrs()
1032 SW_FLOW_KEY_PUT(match, ipv4.addr.src, in ovs_key_from_nlattrs()
1034 SW_FLOW_KEY_PUT(match, ipv4.addr.dst, in ovs_key_from_nlattrs()
1036 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
1038 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.sha, in ovs_key_from_nlattrs()
1040 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.tha, in ovs_key_from_nlattrs()
1050 SW_FLOW_KEY_PUT(match, mpls.top_lse, in ovs_key_from_nlattrs()
1060 SW_FLOW_KEY_PUT(match, tp.src, tcp_key->tcp_src, is_mask); in ovs_key_from_nlattrs()
1061 SW_FLOW_KEY_PUT(match, tp.dst, tcp_key->tcp_dst, is_mask); in ovs_key_from_nlattrs()
1066 SW_FLOW_KEY_PUT(match, tp.flags, in ovs_key_from_nlattrs()
1076 SW_FLOW_KEY_PUT(match, tp.src, udp_key->udp_src, is_mask); in ovs_key_from_nlattrs()
1077 SW_FLOW_KEY_PUT(match, tp.dst, udp_key->udp_dst, is_mask); in ovs_key_from_nlattrs()
1085 SW_FLOW_KEY_PUT(match, tp.src, sctp_key->sctp_src, is_mask); in ovs_key_from_nlattrs()
1086 SW_FLOW_KEY_PUT(match, tp.dst, sctp_key->sctp_dst, is_mask); in ovs_key_from_nlattrs()
1094 SW_FLOW_KEY_PUT(match, tp.src, in ovs_key_from_nlattrs()
1096 SW_FLOW_KEY_PUT(match, tp.dst, in ovs_key_from_nlattrs()
1105 SW_FLOW_KEY_PUT(match, tp.src, in ovs_key_from_nlattrs()
1107 SW_FLOW_KEY_PUT(match, tp.dst, in ovs_key_from_nlattrs()
1116 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.target, in ovs_key_from_nlattrs()
1118 sizeof(match->key->ipv6.nd.target), in ovs_key_from_nlattrs()
1120 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.sll, in ovs_key_from_nlattrs()
1122 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.tll, in ovs_key_from_nlattrs()
1178 int ovs_nla_get_match(struct net *net, struct sw_flow_match *match, in ovs_nla_get_match() argument
1228 err = ovs_key_from_nlattrs(net, match, key_attrs, a, false, log); in ovs_nla_get_match()
1232 if (match->mask) { in ovs_nla_get_match()
1255 if (match->key->tun_proto) in ovs_nla_get_match()
1256 SW_FLOW_KEY_MEMSET_FIELD(match, tun_key, in ovs_nla_get_match()
1267 SW_FLOW_KEY_PUT(match, eth.tci, htons(0xffff), true); in ovs_nla_get_match()
1308 err = ovs_key_from_nlattrs(net, match, mask_attrs, a, true, in ovs_nla_get_match()
1314 if (!match_validate(match, key_attrs, mask_attrs, log)) in ovs_nla_get_match()
1395 struct sw_flow_match match; in ovs_nla_get_flow_metadata() local
1403 memset(&match, 0, sizeof(match)); in ovs_nla_get_flow_metadata()
1404 match.key = key; in ovs_nla_get_flow_metadata()
1409 return metadata_from_nlattrs(net, &match, &attrs, a, false, log); in ovs_nla_get_flow_metadata()
1882 void ovs_match_init(struct sw_flow_match *match, in ovs_match_init() argument
1886 memset(match, 0, sizeof(*match)); in ovs_match_init()
1887 match->key = key; in ovs_match_init()
1888 match->mask = mask; in ovs_match_init()
1929 struct sw_flow_match match; in validate_and_copy_set_tun() local
1937 ovs_match_init(&match, &key, NULL); in validate_and_copy_set_tun()
1938 opts_type = ip_tun_from_nlattr(nla_data(attr), &match, false, log); in validate_and_copy_set_tun()