Lines Matching refs:match
61 static void update_range(struct sw_flow_match *match, in update_range() argument
69 range = &match->range; in update_range()
71 range = &match->mask->range; in update_range()
86 #define SW_FLOW_KEY_PUT(match, field, value, is_mask) \ argument
88 update_range(match, offsetof(struct sw_flow_key, field), \
89 sizeof((match)->key->field), is_mask); \
91 (match)->mask->key.field = value; \
93 (match)->key->field = value; \
96 #define SW_FLOW_KEY_MEMCPY_OFFSET(match, offset, value_p, len, is_mask) \ argument
98 update_range(match, offset, len, is_mask); \
100 memcpy((u8 *)&(match)->mask->key + offset, value_p, \
103 memcpy((u8 *)(match)->key + offset, value_p, len); \
106 #define SW_FLOW_KEY_MEMCPY(match, field, value_p, len, is_mask) \ argument
107 SW_FLOW_KEY_MEMCPY_OFFSET(match, offsetof(struct sw_flow_key, field), \
110 #define SW_FLOW_KEY_MEMSET_FIELD(match, field, value, is_mask) \ argument
112 update_range(match, offsetof(struct sw_flow_key, field), \
113 sizeof((match)->key->field), is_mask); \
115 memset((u8 *)&(match)->mask->key.field, value, \
116 sizeof((match)->mask->key.field)); \
118 memset((u8 *)&(match)->key->field, value, \
119 sizeof((match)->key->field)); \
122 static bool match_validate(const struct sw_flow_match *match, in match_validate() argument
148 if (match->key->eth.type == htons(ETH_P_ARP) in match_validate()
149 || match->key->eth.type == htons(ETH_P_RARP)) { in match_validate()
151 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
155 if (eth_p_mpls(match->key->eth.type)) { in match_validate()
157 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
161 if (match->key->eth.type == htons(ETH_P_IP)) { in match_validate()
163 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
166 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) { in match_validate()
167 if (match->key->ip.proto == IPPROTO_UDP) { in match_validate()
169 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
173 if (match->key->ip.proto == IPPROTO_SCTP) { in match_validate()
175 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
179 if (match->key->ip.proto == IPPROTO_TCP) { in match_validate()
182 if (match->mask && (match->mask->key.ip.proto == 0xff)) { in match_validate()
188 if (match->key->ip.proto == IPPROTO_ICMP) { in match_validate()
190 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
196 if (match->key->eth.type == htons(ETH_P_IPV6)) { in match_validate()
198 if (match->mask && (match->mask->key.eth.type == htons(0xffff))) in match_validate()
201 if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) { in match_validate()
202 if (match->key->ip.proto == IPPROTO_UDP) { in match_validate()
204 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
208 if (match->key->ip.proto == IPPROTO_SCTP) { in match_validate()
210 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
214 if (match->key->ip.proto == IPPROTO_TCP) { in match_validate()
217 if (match->mask && (match->mask->key.ip.proto == 0xff)) { in match_validate()
223 if (match->key->ip.proto == IPPROTO_ICMPV6) { in match_validate()
225 if (match->mask && (match->mask->key.ip.proto == 0xff)) in match_validate()
228 if (match->key->tp.src == in match_validate()
230 match->key->tp.src == htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) { in match_validate()
232 if (match->mask && (match->mask->key.tp.src == htons(0xff))) in match_validate()
418 struct sw_flow_match *match, bool is_mask, in genev_tun_opt_from_nlattr() argument
423 if (nla_len(a) > sizeof(match->key->tun_opts)) { in genev_tun_opt_from_nlattr()
425 nla_len(a), sizeof(match->key->tun_opts)); in genev_tun_opt_from_nlattr()
440 SW_FLOW_KEY_PUT(match, tun_opts_len, nla_len(a), in genev_tun_opt_from_nlattr()
453 if (match->key->tun_opts_len != nla_len(a)) { in genev_tun_opt_from_nlattr()
455 match->key->tun_opts_len, nla_len(a)); in genev_tun_opt_from_nlattr()
459 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in genev_tun_opt_from_nlattr()
463 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, nla_data(a), in genev_tun_opt_from_nlattr()
473 struct sw_flow_match *match, bool is_mask, in vxlan_tun_opt_from_nlattr() argument
481 BUILD_BUG_ON(sizeof(opts) > sizeof(match->key->tun_opts)); in vxlan_tun_opt_from_nlattr()
493 SW_FLOW_KEY_PUT(match, tun_opts_len, sizeof(opts), false); in vxlan_tun_opt_from_nlattr()
495 SW_FLOW_KEY_PUT(match, tun_opts_len, 0xff, true); in vxlan_tun_opt_from_nlattr()
498 SW_FLOW_KEY_MEMCPY_OFFSET(match, opt_key_offset, &opts, sizeof(opts), in vxlan_tun_opt_from_nlattr()
504 struct sw_flow_match *match, bool is_mask, in ipv4_tun_from_nlattr() argument
532 SW_FLOW_KEY_PUT(match, tun_key.tun_id, in ipv4_tun_from_nlattr()
537 SW_FLOW_KEY_PUT(match, tun_key.ipv4_src, in ipv4_tun_from_nlattr()
541 SW_FLOW_KEY_PUT(match, tun_key.ipv4_dst, in ipv4_tun_from_nlattr()
545 SW_FLOW_KEY_PUT(match, tun_key.ipv4_tos, in ipv4_tun_from_nlattr()
549 SW_FLOW_KEY_PUT(match, tun_key.ipv4_ttl, in ipv4_tun_from_nlattr()
560 SW_FLOW_KEY_PUT(match, tun_key.tp_src, in ipv4_tun_from_nlattr()
564 SW_FLOW_KEY_PUT(match, tun_key.tp_dst, in ipv4_tun_from_nlattr()
576 err = genev_tun_opt_from_nlattr(a, match, is_mask, log); in ipv4_tun_from_nlattr()
589 err = vxlan_tun_opt_from_nlattr(a, match, is_mask, log); in ipv4_tun_from_nlattr()
603 SW_FLOW_KEY_PUT(match, tun_key.tun_flags, tun_flags, is_mask); in ipv4_tun_from_nlattr()
612 if (!match->key->tun_key.ipv4_dst) { in ipv4_tun_from_nlattr()
718 static int metadata_from_nlattrs(struct sw_flow_match *match, u64 *attrs, in metadata_from_nlattrs() argument
725 SW_FLOW_KEY_PUT(match, ovs_flow_hash, hash_val, is_mask); in metadata_from_nlattrs()
732 SW_FLOW_KEY_PUT(match, recirc_id, recirc_id, is_mask); in metadata_from_nlattrs()
737 SW_FLOW_KEY_PUT(match, phy.priority, in metadata_from_nlattrs()
753 SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask); in metadata_from_nlattrs()
756 SW_FLOW_KEY_PUT(match, phy.in_port, DP_MAX_PORTS, is_mask); in metadata_from_nlattrs()
762 SW_FLOW_KEY_PUT(match, phy.skb_mark, mark, is_mask); in metadata_from_nlattrs()
766 if (ipv4_tun_from_nlattr(a[OVS_KEY_ATTR_TUNNEL], match, in metadata_from_nlattrs()
774 static int ovs_key_from_nlattrs(struct sw_flow_match *match, u64 attrs, in ovs_key_from_nlattrs() argument
780 err = metadata_from_nlattrs(match, &attrs, a, is_mask, log); in ovs_key_from_nlattrs()
788 SW_FLOW_KEY_MEMCPY(match, eth.src, in ovs_key_from_nlattrs()
790 SW_FLOW_KEY_MEMCPY(match, eth.dst, in ovs_key_from_nlattrs()
808 SW_FLOW_KEY_PUT(match, eth.tci, tci, is_mask); in ovs_key_from_nlattrs()
825 SW_FLOW_KEY_PUT(match, eth.type, eth_type, is_mask); in ovs_key_from_nlattrs()
828 SW_FLOW_KEY_PUT(match, eth.type, htons(ETH_P_802_2), is_mask); in ovs_key_from_nlattrs()
840 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
842 SW_FLOW_KEY_PUT(match, ip.tos, in ovs_key_from_nlattrs()
844 SW_FLOW_KEY_PUT(match, ip.ttl, in ovs_key_from_nlattrs()
846 SW_FLOW_KEY_PUT(match, ip.frag, in ovs_key_from_nlattrs()
848 SW_FLOW_KEY_PUT(match, ipv4.addr.src, in ovs_key_from_nlattrs()
850 SW_FLOW_KEY_PUT(match, ipv4.addr.dst, in ovs_key_from_nlattrs()
871 SW_FLOW_KEY_PUT(match, ipv6.label, in ovs_key_from_nlattrs()
873 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
875 SW_FLOW_KEY_PUT(match, ip.tos, in ovs_key_from_nlattrs()
877 SW_FLOW_KEY_PUT(match, ip.ttl, in ovs_key_from_nlattrs()
879 SW_FLOW_KEY_PUT(match, ip.frag, in ovs_key_from_nlattrs()
881 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.src, in ovs_key_from_nlattrs()
883 sizeof(match->key->ipv6.addr.src), in ovs_key_from_nlattrs()
885 SW_FLOW_KEY_MEMCPY(match, ipv6.addr.dst, in ovs_key_from_nlattrs()
887 sizeof(match->key->ipv6.addr.dst), in ovs_key_from_nlattrs()
903 SW_FLOW_KEY_PUT(match, ipv4.addr.src, in ovs_key_from_nlattrs()
905 SW_FLOW_KEY_PUT(match, ipv4.addr.dst, in ovs_key_from_nlattrs()
907 SW_FLOW_KEY_PUT(match, ip.proto, in ovs_key_from_nlattrs()
909 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.sha, in ovs_key_from_nlattrs()
911 SW_FLOW_KEY_MEMCPY(match, ipv4.arp.tha, in ovs_key_from_nlattrs()
921 SW_FLOW_KEY_PUT(match, mpls.top_lse, in ovs_key_from_nlattrs()
931 SW_FLOW_KEY_PUT(match, tp.src, tcp_key->tcp_src, is_mask); in ovs_key_from_nlattrs()
932 SW_FLOW_KEY_PUT(match, tp.dst, tcp_key->tcp_dst, is_mask); in ovs_key_from_nlattrs()
937 SW_FLOW_KEY_PUT(match, tp.flags, in ovs_key_from_nlattrs()
947 SW_FLOW_KEY_PUT(match, tp.src, udp_key->udp_src, is_mask); in ovs_key_from_nlattrs()
948 SW_FLOW_KEY_PUT(match, tp.dst, udp_key->udp_dst, is_mask); in ovs_key_from_nlattrs()
956 SW_FLOW_KEY_PUT(match, tp.src, sctp_key->sctp_src, is_mask); in ovs_key_from_nlattrs()
957 SW_FLOW_KEY_PUT(match, tp.dst, sctp_key->sctp_dst, is_mask); in ovs_key_from_nlattrs()
965 SW_FLOW_KEY_PUT(match, tp.src, in ovs_key_from_nlattrs()
967 SW_FLOW_KEY_PUT(match, tp.dst, in ovs_key_from_nlattrs()
976 SW_FLOW_KEY_PUT(match, tp.src, in ovs_key_from_nlattrs()
978 SW_FLOW_KEY_PUT(match, tp.dst, in ovs_key_from_nlattrs()
987 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.target, in ovs_key_from_nlattrs()
989 sizeof(match->key->ipv6.nd.target), in ovs_key_from_nlattrs()
991 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.sll, in ovs_key_from_nlattrs()
993 SW_FLOW_KEY_MEMCPY(match, ipv6.nd.tll, in ovs_key_from_nlattrs()
1042 int ovs_nla_get_match(struct sw_flow_match *match, in ovs_nla_get_match() argument
1092 err = ovs_key_from_nlattrs(match, key_attrs, a, false, log); in ovs_nla_get_match()
1096 if (match->mask) { in ovs_nla_get_match()
1119 if (match->key->tun_key.ipv4_dst) in ovs_nla_get_match()
1120 SW_FLOW_KEY_MEMSET_FIELD(match, tun_key, in ovs_nla_get_match()
1131 SW_FLOW_KEY_PUT(match, eth.tci, htons(0xffff), true); in ovs_nla_get_match()
1172 err = ovs_key_from_nlattrs(match, mask_attrs, a, true, log); in ovs_nla_get_match()
1177 if (!match_validate(match, key_attrs, mask_attrs, log)) in ovs_nla_get_match()
1258 struct sw_flow_match match; in ovs_nla_get_flow_metadata() local
1266 memset(&match, 0, sizeof(match)); in ovs_nla_get_flow_metadata()
1267 match.key = key; in ovs_nla_get_flow_metadata()
1271 return metadata_from_nlattrs(&match, &attrs, a, false, log); in ovs_nla_get_flow_metadata()
1700 void ovs_match_init(struct sw_flow_match *match, in ovs_match_init() argument
1704 memset(match, 0, sizeof(*match)); in ovs_match_init()
1705 match->key = key; in ovs_match_init()
1706 match->mask = mask; in ovs_match_init()
1747 struct sw_flow_match match; in validate_and_copy_set_tun() local
1753 ovs_match_init(&match, &key, NULL); in validate_and_copy_set_tun()
1754 opts_type = ipv4_tun_from_nlattr(nla_data(attr), &match, false, log); in validate_and_copy_set_tun()