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",
651 "%s encap match conflicts with existing pseudo(OR) entry",
656 "%s encap match conflicts with existing pseudo(%d) entry",
664 "Egress encap match with conflicting tun_type %u != %u",
676 NL_SET_ERR_MSG_MOD(extack, "Failed to record egress encap match in HW");
682 match->encap = encap;
753 if (rule->match.rid)
754 efx_tc_put_recirc_id(efx, rule->match.rid);
755 if (rule->match.encap)
756 efx_tc_flower_release_encap_match(efx, rule->match.encap);
847 * chain N, which typically match on +trk+est, and may perform ct(nat) actions.
858 struct efx_tc_match *match)
874 if (!match->mask.ct_state_trk || !match->value.ct_state_trk)
885 * implied match on enc_ip_proto UDP). Translate these into non-enc_ keys,
897 static int efx_tc_flower_translate_flhs_match(struct efx_tc_match *match)
902 if (match->mask._key) { \
905 match->mask._key = match->mask._ekey; \
906 match->mask._ekey = 0; \
907 match->value._key = match->value._ekey; \
908 match->value._ekey = 0; \
913 if (match->mask.ip_proto)
915 match->mask.ip_proto = ~0;
916 match->value.ip_proto = IPPROTO_UDP;
920 if (!ipv6_addr_any(&match->mask.src_ip6))
922 match->mask.src_ip6 = match->mask.enc_src_ip6;
923 memset(&match->mask.enc_src_ip6, 0, sizeof(struct in6_addr));
924 if (!ipv6_addr_any(&match->mask.dst_ip6))
926 match->mask.dst_ip6 = match->mask.enc_dst_ip6;
927 memset(&match->mask.enc_dst_ip6, 0, sizeof(struct in6_addr));
942 /* If a foreign LHS rule wants to match on keys that are only available after
947 * Return true iff the passed match requires this.
949 static bool efx_tc_flower_flhs_needs_ar(struct efx_tc_match *match)
952 return match->mask.eth_proto ||
953 match->mask.vlan_tci[0] || match->mask.vlan_tci[1] ||
954 match->mask.vlan_proto[0] || match->mask.vlan_proto[1] ||
955 memchr_inv(match->mask.eth_saddr, 0, ETH_ALEN) ||
956 memchr_inv(match->mask.eth_daddr, 0, ETH_ALEN) ||
957 match->mask.ip_proto ||
958 match->mask.ip_tos || match->mask.ip_ttl ||
959 match->mask.src_ip || match->mask.dst_ip ||
961 !ipv6_addr_any(&match->mask.src_ip6) ||
962 !ipv6_addr_any(&match->mask.dst_ip6) ||
964 match->mask.ip_frag || match->mask.ip_firstfrag ||
965 match->mask.l4_sport || match->mask.l4_dport ||
966 match->mask.tcp_flags ||
968 match->mask.enc_keyid;
1235 * @match: original match used along with the mangle action
1247 struct efx_tc_match *match)
1325 * exact match on the ttl field
1327 if (match->mask.ip_ttl != U8_MAX) {
1329 "only support mangle ttl when we have an exact match, current mask (%#x)",
1330 match->mask.ip_ttl);
1337 if (match->value.ip_ttl == 0) {
1352 tr_ttl = match->value.ip_ttl - 1;
1384 * exact match on the ttl field
1386 if (match->mask.ip_ttl != U8_MAX) {
1388 "only support hop_limit when we have an exact match, current mask (%#x)",
1389 match->mask.ip_ttl);
1396 if (match->value.ip_ttl == 0) {
1411 tr_ttl = match->value.ip_ttl - 1;
1459 struct efx_tc_match *match,
1469 NL_SET_ERR_MSG_MOD(extack, "Egress encap match on unsupported tunnel device");
1476 "Firmware reports no support for %s encap match",
1483 rc = efx_tc_flower_record_encap_match(efx, match, type,
1488 match->mask.recirc_id = 0xff;
1489 if (match->mask.ct_state_trk && match->value.ct_state_trk) {
1490 NL_SET_ERR_MSG_MOD(extack, "LHS rule can never match +trk");
1494 /* LHS rules are always -trk, so we don't need to match on that */
1495 match->mask.ct_state_trk = 0;
1496 match->value.ct_state_trk = 0;
1497 /* We must inhibit match on TCP SYN/FIN/RST, so that SW can see
1506 match->mask.tcp_syn_fin_rst = true;
1508 rc = efx_mae_match_check_caps(efx, &match->mask, extack);
1535 rule->match = *match;
1555 if (match->encap)
1556 efx_tc_flower_release_encap_match(efx, match->encap);
1563 struct efx_tc_match *match,
1576 if (!efx_tc_match_is_encap(&match->mask)) {
1578 netif_dbg(efx, drv, efx->net_dev, "Ignoring foreign LHS filter without encap match\n");
1582 if (efx_tc_flower_flhs_needs_ar(match))
1583 return efx_tc_flower_replace_foreign_lhs_ar(efx, tc, fr, match,
1588 NL_SET_ERR_MSG_MOD(extack, "Egress encap match on unsupported tunnel device\n");
1595 "Firmware reports no support for %s encap match",
1600 rc = efx_tc_flower_record_encap_match(efx, match, type,
1606 if (match->mask.ct_state_trk && match->value.ct_state_trk) {
1607 NL_SET_ERR_MSG_MOD(extack, "LHS rule can never match +trk");
1611 /* LHS rules are always -trk, so we don't need to match on that */
1612 match->mask.ct_state_trk = 0;
1613 match->value.ct_state_trk = 0;
1615 rc = efx_tc_flower_translate_flhs_match(match);
1617 NL_SET_ERR_MSG_MOD(extack, "LHS rule cannot match on inner fields");
1621 rc = efx_mae_match_check_caps_lhs(efx, &match->mask, extack);
1647 rule->match = *match;
1667 if (match->encap)
1668 efx_tc_flower_release_encap_match(efx, match->encap);
1682 struct efx_tc_match match;
1687 /* Parse match */
1688 memset(&match, 0, sizeof(match));
1689 rc = efx_tc_flower_parse_match(efx, fr, &match, extack);
1693 * But, determining whether packets from a VF should match it is
1702 match.value.ingress_port = rc;
1703 match.mask.ingress_port = ~0;
1705 if (efx_tc_rule_is_lhs_rule(fr, &match))
1706 return efx_tc_flower_replace_foreign_lhs(efx, tc, fr, &match,
1719 match.rid = rid;
1720 match.value.recirc_id = rid->fw_id;
1722 match.mask.recirc_id = 0xff;
1724 /* AR table can't match on DO_CT (+trk). But a commonly used pattern is
1727 if (match.mask.ct_state_trk && match.value.ct_state_trk &&
1728 match.mask.ct_state_est && match.value.ct_state_est)
1729 match.mask.ct_state_trk = 0;
1731 * match +trk-est (CT_HIT=0) despite being on an established connection.
1732 * So make -est imply -tcp_syn_fin_rst match to ensure these packets
1735 if (match.mask.ct_state_est && !match.value.ct_state_est) {
1736 if (match.value.tcp_syn_fin_rst) {
1742 match.mask.tcp_syn_fin_rst = true;
1765 rc = efx_mae_match_check_caps(efx, &match.mask, extack);
1769 if (efx_tc_match_is_encap(&match.mask)) {
1775 "Egress encap match on unsupported tunnel device");
1783 "Firmware reports no support for %s encap match",
1788 rc = efx_tc_flower_record_encap_match(efx, &match, type,
1796 "Ignoring foreign filter without encap match\n");
1953 rule->match = match;
1964 rc = efx_mae_insert_rule(efx, &rule->match, EFX_TC_PRIO_TC,
1978 if (match.rid)
1979 efx_tc_put_recirc_id(efx, match.rid);
1990 if (match.encap)
1991 efx_tc_flower_release_encap_match(efx, match.encap);
1998 struct efx_tc_match *match,
2011 if (match->mask.ct_state_trk && match->value.ct_state_trk) {
2012 NL_SET_ERR_MSG_MOD(extack, "LHS rule can never match +trk");
2015 /* LHS rules are always -trk, so we don't need to match on that */
2016 match->mask.ct_state_trk = 0;
2017 match->value.ct_state_trk = 0;
2019 rc = efx_mae_match_check_caps_lhs(efx, &match->mask, extack);
2049 rule->match = *match;
2083 struct efx_tc_match match;
2109 /* Parse match */
2110 memset(&match, 0, sizeof(match));
2116 match.value.ingress_port = rc;
2117 match.mask.ingress_port = ~0;
2118 rc = efx_tc_flower_parse_match(efx, fr, &match, extack);
2121 if (efx_tc_match_is_encap(&match.mask)) {
2126 if (efx_tc_rule_is_lhs_rule(fr, &match))
2127 return efx_tc_flower_replace_lhs(efx, tc, fr, &match, efv,
2131 * Conveniently, match.rid == NULL and match.value.recirc_id == 0 owing
2155 match.rid = rid;
2156 match.value.recirc_id = rid->fw_id;
2158 match.mask.recirc_id = 0xff;
2160 /* AR table can't match on DO_CT (+trk). But a commonly used pattern is
2163 if (match.mask.ct_state_trk && match.value.ct_state_trk &&
2164 match.mask.ct_state_est && match.value.ct_state_est)
2165 match.mask.ct_state_trk = 0;
2167 * match +trk-est (CT_HIT=0) despite being on an established connection.
2168 * So make -est imply -tcp_syn_fin_rst match to ensure these packets
2171 if (match.mask.ct_state_est && !match.value.ct_state_est) {
2172 if (match.value.tcp_syn_fin_rst) {
2177 match.mask.tcp_syn_fin_rst = true;
2180 rc = efx_mae_match_check_caps(efx, &match.mask, extack);
2425 rc = efx_tc_mangle(efx, act, fa, &mung, extack, &match);
2507 rule->match = match;
2527 rc = efx_mae_insert_rule(efx, &rule->match, EFX_TC_PRIO_TC,
2541 if (match.rid)
2542 efx_tc_put_recirc_id(efx, match.rid);
2573 if (lhs_rule->match.encap)
2574 efx_tc_flower_release_encap_match(efx, lhs_rule->match.encap);
2673 struct efx_tc_match *match = &rule->match;
2677 match->value.ingress_port = ing_port;
2678 match->mask.ingress_port = ~0;
2692 rc = efx_mae_insert_rule(efx, match, EFX_TC_PRIO_DFLT,
2868 /* Firmware supports some match fields the driver doesn't know
2873 "FW reports additional match fields %u\n",