Lines Matching refs:match
230 match->value._field = fm.key->_tcfield; \
231 match->mask._field = fm.mask->_tcfield; \
240 struct efx_tc_match *match,
243 struct flow_dissector *dissector = rule->match.dissector;
269 match->value.ip_frag = fm.key->flags & FLOW_DIS_IS_FRAGMENT;
270 match->mask.ip_frag = true;
273 match->value.ip_firstfrag = fm.key->flags & FLOW_DIS_FIRST_FRAG;
274 match->mask.ip_firstfrag = true;
277 NL_SET_ERR_MSG_FMT_MOD(extack, "Unsupported match on control.flags %#x",
307 if (!IS_ALL_ONES(match->mask.eth_proto) ||
308 !(match->value.eth_proto == htons(ETH_P_IP) ||
309 match->value.eth_proto == htons(ETH_P_IPV6)))
327 match->value.vlan_proto[0] = fm.key->vlan_tpid;
328 match->mask.vlan_proto[0] = fm.mask->vlan_tpid;
329 match->value.vlan_tci[0] = cpu_to_be16(fm.key->vlan_priority << 13 |
331 match->mask.vlan_tci[0] = cpu_to_be16(fm.mask->vlan_priority << 13 |
341 match->value.vlan_proto[1] = fm.key->vlan_tpid;
342 match->mask.vlan_proto[1] = fm.mask->vlan_tpid;
343 match->value.vlan_tci[1] = cpu_to_be16(fm.key->vlan_priority << 13 |
345 match->mask.vlan_tci[1] = cpu_to_be16(fm.mask->vlan_priority << 13 |
354 ether_addr_copy(match->value.eth_saddr, fm.key->src);
355 ether_addr_copy(match->value.eth_daddr, fm.key->dst);
356 ether_addr_copy(match->mask.eth_saddr, fm.mask->src);
357 ether_addr_copy(match->mask.eth_daddr, fm.mask->dst);
362 if ((match->value.ip_proto != IPPROTO_UDP &&
363 match->value.ip_proto != IPPROTO_TCP) || !IS_ALL_ONES(match->mask.ip_proto))
392 NL_SET_ERR_MSG_FMT_MOD(extack, "Unsupported match on enc_control.flags %#x",
443 match->value.ct_state_trk = !!(fm.key->ct_state & TCA_FLOWER_KEY_CT_FLAGS_TRACKED);
444 match->mask.ct_state_trk = !!(fm.mask->ct_state & TCA_FLOWER_KEY_CT_FLAGS_TRACKED);
445 match->value.ct_state_est = !!(fm.key->ct_state & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED);
446 match->mask.ct_state_est = !!(fm.mask->ct_state & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED);
450 "Unsupported ct_state match %#x",
454 match->value.ct_mark = fm.key->ct_mark;
455 match->mask.ct_mark = fm.mask->ct_mark;
456 match->value.ct_zone = fm.key->ct_zone;
457 match->mask.ct_zone = fm.mask->ct_zone;
483 "Failed to release encap match %#x, rc %d\n",
494 struct efx_tc_match *match,
506 * port) are present and exact-match. Other fields may only be used
511 if (match->mask.enc_dst_ip | match->mask.enc_src_ip) {
512 if (!IS_ALL_ONES(match->mask.enc_dst_ip)) {
514 "Egress encap match is not exact on dst IP address");
517 if (!IS_ALL_ONES(match->mask.enc_src_ip)) {
519 "Egress encap match is not exact on src IP address");
523 if (!ipv6_addr_any(&match->mask.enc_dst_ip6) ||
524 !ipv6_addr_any(&match->mask.enc_src_ip6)) {
526 "Egress encap match on both IPv4 and IPv6, don't understand");
531 if (!efx_ipv6_addr_all_ones(&match->mask.enc_dst_ip6)) {
533 "Egress encap match is not exact on dst IP address");
536 if (!efx_ipv6_addr_all_ones(&match->mask.enc_src_ip6)) {
538 "Egress encap match is not exact on src IP address");
543 if (!IS_ALL_ONES(match->mask.enc_dport)) {
544 NL_SET_ERR_MSG_MOD(extack, "Egress encap match is not exact on dst UDP port");
547 if (match->mask.enc_sport || match->mask.enc_ip_tos) {
548 struct efx_tc_match pmatch = *match;
551 NL_SET_ERR_MSG_MOD(extack, "Bad recursion in egress encap match handler");
560 match->mask.enc_ip_tos,
561 match->mask.enc_sport,
567 if (match->mask.enc_ip_ttl) {
568 NL_SET_ERR_MSG_MOD(extack, "Egress encap match on IP TTL not supported");
573 rc = efx_mae_check_encap_match_caps(efx, ipv6, match->mask.enc_ip_tos,
574 match->mask.enc_sport, extack);
583 encap->src_ip = match->value.enc_src_ip;
584 encap->dst_ip = match->value.enc_dst_ip;
586 encap->src_ip6 = match->value.enc_src_ip6;
587 encap->dst_ip6 = match->value.enc_dst_ip6;
589 encap->udp_dport = match->value.enc_dport;
591 encap->ip_tos = match->value.enc_ip_tos;
592 encap->ip_tos_mask = match->mask.enc_ip_tos;
594 encap->udp_sport = match->value.enc_sport;
595 encap->udp_sport_mask = match->mask.enc_sport;
617 NL_SET_ERR_MSG_MOD(extack, "Pseudo encap match conflicts with existing direct entry");
626 "%s encap match conflicts with existing pseudo(MASK) entry",
632 "Pseudo encap match for TOS mask %#04x conflicts with existing mask %#04x",
639 "Pseudo encap match for UDP src port mask %#x conflicts with existing mask %#x",
647 "%s encap match conflicts with existing pseudo(%d) entry",
655 "Egress encap match with conflicting tun_type %u != %u",
667 NL_SET_ERR_MSG_MOD(extack, "Failed to record egress encap match in HW");
673 match->encap = encap;
744 if (rule->match.rid)
745 efx_tc_put_recirc_id(efx, rule->match.rid);
746 if (rule->match.encap)
747 efx_tc_flower_release_encap_match(efx, rule->match.encap);
838 * chain N, which typically match on +trk+est, and may perform ct(nat) actions.
849 struct efx_tc_match *match)
865 if (!match->mask.ct_state_trk || !match->value.ct_state_trk)
1136 * @match: original match used along with the mangle action
1148 struct efx_tc_match *match)
1226 * exact match on the ttl field
1228 if (match->mask.ip_ttl != U8_MAX) {
1230 "only support mangle ttl when we have an exact match, current mask (%#x)",
1231 match->mask.ip_ttl);
1238 if (match->value.ip_ttl == 0) {
1253 tr_ttl = match->value.ip_ttl - 1;
1285 * exact match on the ttl field
1287 if (match->mask.ip_ttl != U8_MAX) {
1289 "only support hop_limit when we have an exact match, current mask (%#x)",
1290 match->mask.ip_ttl);
1297 if (match->value.ip_ttl == 0) {
1312 tr_ttl = match->value.ip_ttl - 1;
1367 struct efx_tc_match match;
1372 /* Parse match */
1373 memset(&match, 0, sizeof(match));
1374 rc = efx_tc_flower_parse_match(efx, fr, &match, NULL);
1378 * But, determining whether packets from a VF should match it is
1387 match.value.ingress_port = rc;
1388 match.mask.ingress_port = ~0;
1400 match.rid = rid;
1401 match.value.recirc_id = rid->fw_id;
1403 match.mask.recirc_id = 0xff;
1405 /* AR table can't match on DO_CT (+trk). But a commonly used pattern is
1408 if (match.mask.ct_state_trk && match.value.ct_state_trk &&
1409 match.mask.ct_state_est && match.value.ct_state_est)
1410 match.mask.ct_state_trk = 0;
1412 * match +trk-est (CT_HIT=0) despite being on an established connection.
1413 * So make -est imply -tcp_syn_fin_rst match to ensure these packets
1416 if (match.mask.ct_state_est && !match.value.ct_state_est) {
1417 if (match.value.tcp_syn_fin_rst) {
1422 match.mask.tcp_syn_fin_rst = true;
1445 rc = efx_mae_match_check_caps(efx, &match.mask, NULL);
1449 if (efx_tc_match_is_encap(&match.mask)) {
1455 "Egress encap match on unsupported tunnel device");
1463 "Firmware reports no support for %s encap match",
1468 rc = efx_tc_flower_record_encap_match(efx, &match, type,
1476 "Ignoring foreign filter without encap match\n");
1632 rule->match = match;
1643 rc = efx_mae_insert_rule(efx, &rule->match, EFX_TC_PRIO_TC,
1657 if (match.rid)
1658 efx_tc_put_recirc_id(efx, match.rid);
1669 if (match.encap)
1670 efx_tc_flower_release_encap_match(efx, match.encap);
1677 struct efx_tc_match *match,
1690 if (match->mask.ct_state_trk && match->value.ct_state_trk) {
1691 NL_SET_ERR_MSG_MOD(extack, "LHS rule can never match +trk");
1694 /* LHS rules are always -trk, so we don't need to match on that */
1695 match->mask.ct_state_trk = 0;
1696 match->value.ct_state_trk = 0;
1698 rc = efx_mae_match_check_caps_lhs(efx, &match->mask, extack);
1728 rule->match = *match;
1762 struct efx_tc_match match;
1788 /* Parse match */
1789 memset(&match, 0, sizeof(match));
1795 match.value.ingress_port = rc;
1796 match.mask.ingress_port = ~0;
1797 rc = efx_tc_flower_parse_match(efx, fr, &match, extack);
1800 if (efx_tc_match_is_encap(&match.mask)) {
1805 if (efx_tc_rule_is_lhs_rule(fr, &match))
1806 return efx_tc_flower_replace_lhs(efx, tc, fr, &match, efv,
1810 * Conveniently, match.rid == NULL and match.value.recirc_id == 0 owing
1834 match.rid = rid;
1835 match.value.recirc_id = rid->fw_id;
1837 match.mask.recirc_id = 0xff;
1839 /* AR table can't match on DO_CT (+trk). But a commonly used pattern is
1842 if (match.mask.ct_state_trk && match.value.ct_state_trk &&
1843 match.mask.ct_state_est && match.value.ct_state_est)
1844 match.mask.ct_state_trk = 0;
1846 * match +trk-est (CT_HIT=0) despite being on an established connection.
1847 * So make -est imply -tcp_syn_fin_rst match to ensure these packets
1850 if (match.mask.ct_state_est && !match.value.ct_state_est) {
1851 if (match.value.tcp_syn_fin_rst) {
1856 match.mask.tcp_syn_fin_rst = true;
1859 rc = efx_mae_match_check_caps(efx, &match.mask, extack);
2104 rc = efx_tc_mangle(efx, act, fa, &mung, extack, &match);
2178 rule->match = match;
2198 rc = efx_mae_insert_rule(efx, &rule->match, EFX_TC_PRIO_TC,
2212 if (match.rid)
2213 efx_tc_put_recirc_id(efx, match.rid);
2244 if (lhs_rule->match.encap)
2245 efx_tc_flower_release_encap_match(efx, lhs_rule->match.encap);
2344 struct efx_tc_match *match = &rule->match;
2348 match->value.ingress_port = ing_port;
2349 match->mask.ingress_port = ~0;
2363 rc = efx_mae_insert_rule(efx, match, EFX_TC_PRIO_DFLT,
2539 /* Firmware supports some match fields the driver doesn't know
2544 "FW reports additional match fields %u\n",