Lines Matching refs:fltr

15  * @fltr: Pointer to outer TC filter structure
19 static int ice_tc_count_lkups(u32 flags, struct ice_tc_flower_fltr *fltr)
28 if (fltr->direction == ICE_ESWITCH_FLTR_EGRESS)
184 ice_tc_fill_tunnel_outer(u32 flags, struct ice_tc_flower_fltr *fltr,
187 struct ice_tc_flower_lyr_2_4_hdrs *hdr = &fltr->outer_headers;
192 list[i].type = ice_proto_type_from_tunnel(fltr->tunnel_type);
193 switch (fltr->tunnel_type) {
196 tenant_id = be32_to_cpu(fltr->tenant_id) << 8;
202 list[i].h_u.nvgre_hdr.tni_flow = fltr->tenant_id;
209 list[i].h_u.gtp_hdr.teid = fltr->tenant_id;
229 list[i].type = ice_proto_type_from_tunnel(fltr->tunnel_type);
231 if (fltr->gtp_pdu_info_masks.pdu_type) {
233 fltr->gtp_pdu_info_keys.pdu_type << 4;
237 if (fltr->gtp_pdu_info_masks.qfi) {
238 list[i].h_u.gtp_hdr.qfi = fltr->gtp_pdu_info_keys.qfi;
252 hdr_h->flags = fltr->pfcp_meta_keys.type;
253 hdr_m->flags = fltr->pfcp_meta_masks.type & 0x01;
255 hdr_h->seid = fltr->pfcp_meta_keys.seid;
256 hdr_m->seid = fltr->pfcp_meta_masks.seid;
299 if (fltr->inner_headers.l2_key.n_proto == htons(ETH_P_IP) &&
317 if (fltr->inner_headers.l2_key.n_proto == htons(ETH_P_IPV6) &&
358 * ice_tc_fill_rules - fill filter rules based on TC fltr
670 struct ice_tc_flower_fltr *fltr,
677 NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported action to setup provided");
681 fltr->action.fltr_act = action;
685 fltr->direction == ICE_ESWITCH_FLTR_EGRESS) {
688 fltr->dest_vsi = repr->src_vsi;
691 fltr->direction == ICE_ESWITCH_FLTR_EGRESS) {
694 fltr->dest_vsi = repr->src_vsi->back->eswitch.uplink_vsi;
697 fltr->direction == ICE_ESWITCH_FLTR_INGRESS) {
700 fltr->dest_vsi = repr->src_vsi;
702 NL_SET_ERR_MSG_MOD(fltr->extack,
712 struct ice_tc_flower_fltr *fltr)
714 fltr->action.fltr_act = ICE_DROP_PACKET;
718 fltr->direction == ICE_ESWITCH_FLTR_INGRESS)) {
719 NL_SET_ERR_MSG_MOD(fltr->extack,
728 struct ice_tc_flower_fltr *fltr,
735 err = ice_tc_setup_drop_action(filter_dev, fltr);
742 err = ice_tc_setup_action(filter_dev, fltr,
750 err = ice_tc_setup_action(filter_dev, fltr,
758 NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported action in switchdev mode");
765 static bool ice_is_fltr_lldp(struct ice_tc_flower_fltr *fltr)
767 return fltr->outer_headers.l2_key.n_proto == htons(ETH_P_LLDP);
770 static bool ice_is_fltr_pf_tx_lldp(struct ice_tc_flower_fltr *fltr)
772 struct ice_vsi *vsi = fltr->src_vsi, *uplink;
778 return vsi == uplink && fltr->action.fltr_act == ICE_DROP_PACKET &&
779 ice_is_fltr_lldp(fltr) &&
780 fltr->direction == ICE_ESWITCH_FLTR_EGRESS &&
781 fltr->flags == ICE_TC_FLWR_FIELD_ETH_TYPE_ID;
784 static bool ice_is_fltr_vf_tx_lldp(struct ice_tc_flower_fltr *fltr)
786 struct ice_vsi *vsi = fltr->src_vsi, *uplink;
789 return fltr->src_vsi->type == ICE_VSI_VF && ice_is_fltr_lldp(fltr) &&
790 fltr->direction == ICE_ESWITCH_FLTR_EGRESS &&
791 fltr->dest_vsi == uplink;
797 struct ice_tc_flower_fltr *fltr;
799 hlist_for_each_entry(fltr, &pf->tc_flower_fltr_list, tc_flower_node)
800 if (ice_is_fltr_pf_tx_lldp(fltr))
801 return fltr;
889 struct ice_tc_flower_fltr *fltr;
892 hlist_for_each_entry(fltr, &pf->tc_flower_fltr_list, tc_flower_node) {
893 if (!ice_is_fltr_vf_tx_lldp(fltr))
895 ice_pass_vf_tx_lldp(fltr->src_vsi, true);
914 ice_eswitch_add_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
920 u32 flags = fltr->flags;
926 NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported encap field(s)");
930 if (ice_is_fltr_vf_tx_lldp(fltr))
933 lkups_cnt = ice_tc_count_lkups(flags, fltr);
938 i = ice_tc_fill_rules(hw, flags, fltr, list, &rule_info, NULL);
944 rule_info.sw_act.fltr_act = fltr->action.fltr_act;
945 if (fltr->action.fltr_act != ICE_DROP_PACKET)
946 rule_info.sw_act.vsi_handle = fltr->dest_vsi->idx;
956 if (fltr->direction == ICE_ESWITCH_FLTR_INGRESS) {
961 } else if (fltr->direction == ICE_ESWITCH_FLTR_EGRESS &&
962 !fltr->dest_vsi && vsi == vsi->back->eswitch.uplink_vsi) {
966 } else if (fltr->direction == ICE_ESWITCH_FLTR_EGRESS &&
967 fltr->dest_vsi == vsi->back->eswitch.uplink_vsi) {
991 rule_info.fltr_rule_id = fltr->cookie;
996 NL_SET_ERR_MSG_MOD(fltr->extack, "Unable to add filter because it already exist");
1000 NL_SET_ERR_MSG_MOD(fltr->extack, "Unable to add filter: insufficient space available.");
1003 NL_SET_ERR_MSG_MOD(fltr->extack, "Unable to add filter due to error");
1007 if (ice_is_fltr_pf_tx_lldp(fltr))
1013 fltr->rid = rule_added.rid;
1014 fltr->rule_id = rule_added.rule_id;
1015 fltr->dest_vsi_handle = rule_added.vsi_handle;
1292 * @fltr: Pointer to filter structure
1298 struct ice_tc_flower_fltr *fltr,
1302 fltr->flags |= ICE_TC_FLWR_FIELD_PPPOE_SESSID;
1307 fltr->flags |= ICE_TC_FLWR_FIELD_PPP_PROTO;
1317 * @fltr: Pointer to filter structure
1323 struct ice_tc_flower_fltr *fltr,
1328 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_DEST_IPV4;
1330 fltr->flags |= ICE_TC_FLWR_FIELD_DEST_IPV4;
1336 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_SRC_IPV4;
1338 fltr->flags |= ICE_TC_FLWR_FIELD_SRC_IPV4;
1348 * @fltr: Pointer to filter structure
1354 struct ice_tc_flower_fltr *fltr,
1364 NL_SET_ERR_MSG_MOD(fltr->extack, "Bad IPv6, addr is LOOPBACK");
1370 NL_SET_ERR_MSG_MOD(fltr->extack, "Bad src/dest IPv6, addr is any");
1375 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_DEST_IPV6;
1377 fltr->flags |= ICE_TC_FLWR_FIELD_DEST_IPV6;
1381 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_SRC_IPV6;
1383 fltr->flags |= ICE_TC_FLWR_FIELD_SRC_IPV6;
1389 if (fltr->flags & (ICE_TC_FLWR_FIELD_ENC_SRC_IPV6 |
1396 if (fltr->flags & (ICE_TC_FLWR_FIELD_ENC_DEST_IPV6 |
1410 * @fltr: Pointer to filter structure
1416 struct ice_tc_flower_fltr *fltr,
1422 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_IP_TOS;
1424 fltr->flags |= ICE_TC_FLWR_FIELD_IP_TOS;
1432 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_IP_TTL;
1434 fltr->flags |= ICE_TC_FLWR_FIELD_IP_TTL;
1444 * @fltr: Pointer to filter structure
1450 struct ice_tc_flower_fltr *fltr,
1455 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_DEST_L4_PORT;
1457 fltr->flags |= ICE_TC_FLWR_FIELD_DEST_L4_PORT;
1464 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_SRC_L4_PORT;
1466 fltr->flags |= ICE_TC_FLWR_FIELD_SRC_L4_PORT;
1495 * @fltr: Pointer to filter structure
1498 * Before calling this funtcion, fltr->tunnel_type should be set to TNL_GTPU,
1504 struct ice_tc_flower_fltr *fltr)
1515 fltr->tunnel_type = TNL_GTPC;
1518 NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported GTP port number");
1528 struct ice_tc_flower_fltr *fltr)
1530 struct ice_tc_flower_lyr_2_4_hdrs *headers = &fltr->outer_headers;
1531 struct netlink_ext_ack *extack = fltr->extack;
1534 fltr->tunnel_type = ice_tc_tun_get_type(dev);
1546 fltr->flags |= ICE_TC_FLWR_FIELD_TENANT_ID;
1547 fltr->tenant_id = enc_keyid.key->keyid;
1559 if (ice_tc_set_ipv4(&match, fltr, headers, true))
1566 if (ice_tc_set_ipv6(&match, fltr, headers, true))
1574 ice_tc_set_tos_ttl(&match, fltr, headers, true);
1578 fltr->tunnel_type != TNL_VXLAN && fltr->tunnel_type != TNL_GENEVE) {
1583 if (fltr->tunnel_type != TNL_GTPU) {
1584 if (ice_tc_set_port(match, fltr, headers, true))
1587 if (ice_parse_gtp_type(match, fltr))
1593 (fltr->tunnel_type == TNL_GTPU || fltr->tunnel_type == TNL_GTPC)) {
1598 memcpy(&fltr->gtp_pdu_info_keys, &match.key->data[0],
1601 memcpy(&fltr->gtp_pdu_info_masks, &match.mask->data[0],
1604 fltr->flags |= ICE_TC_FLWR_FIELD_GTP_OPTS;
1608 fltr->tunnel_type == TNL_PFCP) {
1613 memcpy(&fltr->pfcp_meta_keys, match.key->data,
1615 memcpy(&fltr->pfcp_meta_masks, match.mask->data,
1618 fltr->flags |= ICE_TC_FLWR_FIELD_PFCP_OPTS;
1629 * @fltr: Pointer to filter structure
1639 struct ice_tc_flower_fltr *fltr, bool ingress)
1641 struct ice_tc_flower_lyr_2_4_hdrs *headers = &fltr->outer_headers;
1668 NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported key used");
1678 err = ice_parse_tunnel_attr(filter_dev, rule, fltr);
1680 NL_SET_ERR_MSG_MOD(fltr->extack, "Failed to parse TC flower tunnel attributes");
1685 if (fltr->tunnel_type != TNL_PFCP) {
1690 headers = &fltr->inner_headers;
1700 NL_SET_ERR_MSG_MOD(fltr->extack, "Tunnel key used, but device isn't a tunnel");
1703 fltr->tunnel_type = TNL_LAST;
1715 fltr->tunnel_type == TNL_GTPU ||
1716 fltr->tunnel_type == TNL_GTPC) {
1720 fltr->flags |= ICE_TC_FLWR_FIELD_ETH_TYPE_ID;
1728 NL_SET_ERR_MSG_FMT_MOD(fltr->extack,
1752 fltr->flags |= ICE_TC_FLWR_FIELD_DST_MAC;
1760 fltr->flags |= ICE_TC_FLWR_FIELD_SRC_MAC;
1783 fltr->flags |= ICE_TC_FLWR_FIELD_VLAN;
1788 NL_SET_ERR_MSG_MOD(fltr->extack, "Bad VLAN mask");
1794 fltr->flags |= ICE_TC_FLWR_FIELD_VLAN_PRIO;
1802 fltr->flags |= ICE_TC_FLWR_FIELD_VLAN_TPID;
1810 NL_SET_ERR_MSG_MOD(fltr->extack, "Double VLAN mode is not enabled");
1818 fltr->flags |= ICE_TC_FLWR_FIELD_CVLAN;
1823 NL_SET_ERR_MSG_MOD(fltr->extack,
1830 fltr->flags |= ICE_TC_FLWR_FIELD_CVLAN_PRIO;
1841 n_proto_key = ice_tc_set_pppoe(&match, fltr, headers);
1850 fltr->flags |= ICE_TC_FLWR_FIELD_ETH_TYPE_ID;
1861 fltr->extack))
1869 if (ice_tc_set_ipv4(&match, fltr, headers, false))
1877 if (ice_tc_set_ipv6(&match, fltr, headers, false))
1885 ice_tc_set_tos_ttl(&match, fltr, headers, false);
1893 fltr->flags |= ICE_TC_FLWR_FIELD_L2TPV3_SESSID;
1901 if (ice_tc_set_port(match, fltr, headers, false))
1908 NL_SET_ERR_MSG_MOD(fltr->extack, "Only UDP and TCP transport are supported");
1917 fltr->direction = ingress ? ICE_ESWITCH_FLTR_INGRESS :
1926 * @fltr: Pointer to struct ice_tc_flower_fltr
1931 ice_add_switch_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
1933 if (fltr->action.fltr_act == ICE_FWD_TO_QGRP)
1937 return ice_eswitch_add_tc_fltr(vsi, fltr);
1939 return ice_add_tc_flower_adv_fltr(vsi, fltr);
1945 * @fltr: Pointer to TC flower filter structure
1950 ice_prep_adq_filter(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
1952 if ((fltr->flags & ICE_TC_FLWR_FIELD_TENANT_ID) &&
1953 (fltr->flags & (ICE_TC_FLWR_FIELD_DST_MAC |
1955 NL_SET_ERR_MSG_MOD(fltr->extack,
1972 if (fltr->tunnel_type != TNL_LAST &&
1973 !(fltr->flags & ICE_TC_FLWR_FIELD_ENC_DST_MAC))
1974 fltr->flags |= ICE_TC_FLWR_FIELD_ENC_DST_MAC;
1976 if (fltr->tunnel_type == TNL_LAST &&
1977 !(fltr->flags & ICE_TC_FLWR_FIELD_DST_MAC))
1978 fltr->flags |= ICE_TC_FLWR_FIELD_DST_MAC;
1980 if (fltr->flags & (ICE_TC_FLWR_FIELD_DST_MAC |
1982 ether_addr_copy(fltr->outer_headers.l2_key.dst_mac,
1984 eth_broadcast_addr(fltr->outer_headers.l2_mask.dst_mac);
1990 if (fltr->flags & ICE_TC_FLWR_FIELD_VLAN) {
1991 u16 vlan_id = be16_to_cpu(fltr->outer_headers.vlan_hdr.vlan_id);
1994 NL_SET_ERR_MSG_MOD(fltr->extack,
2006 * @fltr: Pointer to TC flower filter structure
2013 struct ice_tc_flower_fltr *fltr)
2021 NL_SET_ERR_MSG_MOD(fltr->extack,
2026 NL_SET_ERR_MSG_MOD(fltr->extack,
2030 fltr->action.fltr_act = ICE_FWD_TO_VSI;
2031 fltr->action.fwd.tc.tc_class = tc;
2033 return ice_prep_adq_filter(vsi, fltr);
2037 ice_tc_forward_to_queue(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr,
2044 NL_SET_ERR_MSG_MOD(fltr->extack,
2048 fltr->action.fltr_act = ICE_FWD_TO_Q;
2049 fltr->action.fwd.q.queue = queue;
2051 fltr->action.fwd.q.hw_queue = vsi->rxq_map[queue];
2056 ch_vsi = ice_locate_vsi_using_queue(vsi, fltr->action.fwd.q.queue);
2059 fltr->dest_vsi = ch_vsi;
2060 if (!ice_is_chnl_fltr(fltr))
2063 return ice_prep_adq_filter(vsi, fltr);
2067 ice_tc_parse_action(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr,
2073 return ice_tc_forward_to_queue(vsi, fltr, act);
2075 fltr->action.fltr_act = ICE_DROP_PACKET;
2078 NL_SET_ERR_MSG_MOD(fltr->extack, "Unsupported TC action");
2088 * @fltr: Pointer to TC flower filter structure
2095 struct ice_tc_flower_fltr *fltr)
2103 return ice_handle_tclass_action(vsi, cls_flower, fltr);
2110 err = ice_eswitch_tc_parse_action(filter_dev, fltr, act);
2112 err = ice_tc_parse_action(vsi, fltr, act);
2123 * @fltr: Pointer to struct ice_tc_flower_fltr
2127 static int ice_del_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
2133 if (ice_is_fltr_pf_tx_lldp(fltr))
2136 if (ice_is_fltr_vf_tx_lldp(fltr))
2139 rule_rem.rid = fltr->rid;
2140 rule_rem.rule_id = fltr->rule_id;
2141 rule_rem.vsi_handle = fltr->dest_vsi_handle;
2145 NL_SET_ERR_MSG_MOD(fltr->extack, "Filter does not exist");
2148 NL_SET_ERR_MSG_MOD(fltr->extack, "Failed to delete TC flower filter");
2155 if (fltr->dest_vsi) {
2156 if (fltr->dest_vsi->type == ICE_VSI_CHNL) {
2157 fltr->dest_vsi->num_chnl_fltr--;
2161 (fltr->flags & (ICE_TC_FLWR_FIELD_DST_MAC |
2188 struct ice_tc_flower_fltr *fltr;
2194 fltr = kzalloc(sizeof(*fltr), GFP_KERNEL);
2195 if (!fltr)
2198 fltr->cookie = f->cookie;
2199 fltr->extack = f->common.extack;
2200 fltr->src_vsi = vsi;
2201 INIT_HLIST_NODE(&fltr->tc_flower_node);
2203 err = ice_parse_cls_flower(netdev, vsi, f, fltr, ingress);
2207 err = ice_parse_tc_flower_actions(netdev, vsi, f, fltr);
2211 err = ice_add_switch_fltr(vsi, fltr);
2216 *__fltr = fltr;
2220 kfree(fltr);
2232 struct ice_tc_flower_fltr *fltr;
2234 hlist_for_each_entry(fltr, &pf->tc_flower_fltr_list, tc_flower_node)
2235 if (cookie == fltr->cookie)
2236 return fltr;
2256 struct ice_tc_flower_fltr *fltr;
2280 fltr = ice_find_tc_flower_fltr(pf, cls_flower->cookie);
2281 if (fltr) {
2287 err = ice_add_tc_fltr(netdev, vsi, cls_flower, &fltr, ingress);
2292 hlist_add_head(&fltr->tc_flower_node, &pf->tc_flower_fltr_list);
2304 struct ice_tc_flower_fltr *fltr;
2309 fltr = ice_find_tc_flower_fltr(pf, cls_flower->cookie);
2310 if (!fltr) {
2319 fltr->extack = cls_flower->common.extack;
2321 err = ice_del_tc_fltr(vsi, fltr);
2326 hlist_del(&fltr->tc_flower_node);
2329 kfree(fltr);
2340 struct ice_tc_flower_fltr *fltr;
2343 hlist_for_each_entry_safe(fltr, node,
2346 fltr->extack = NULL;
2347 ice_add_switch_fltr(fltr->src_vsi, fltr);