Lines Matching refs:fltr

33  * @fltr: Flow Director filter data structure
39 struct iavf_fdir_fltr *fltr)
41 if (fltr->eth_mask.etype && fltr->eth_mask.etype != htons(U16_MAX))
44 if (fltr->ip_ver == 4) {
45 if (fltr->ip_mask.v4_addrs.src_ip &&
46 fltr->ip_mask.v4_addrs.src_ip != htonl(U32_MAX))
49 if (fltr->ip_mask.v4_addrs.dst_ip &&
50 fltr->ip_mask.v4_addrs.dst_ip != htonl(U32_MAX))
53 if (fltr->ip_mask.tos && fltr->ip_mask.tos != U8_MAX)
55 } else if (fltr->ip_ver == 6) {
56 if (memcmp(&fltr->ip_mask.v6_addrs.src_ip, &ipv6_addr_zero_mask,
58 memcmp(&fltr->ip_mask.v6_addrs.src_ip, &ipv6_addr_full_mask,
62 if (memcmp(&fltr->ip_mask.v6_addrs.dst_ip, &ipv6_addr_zero_mask,
64 memcmp(&fltr->ip_mask.v6_addrs.dst_ip, &ipv6_addr_full_mask,
68 if (fltr->ip_mask.tclass && fltr->ip_mask.tclass != U8_MAX)
72 if (fltr->ip_mask.proto && fltr->ip_mask.proto != U8_MAX)
75 if (fltr->ip_mask.src_port && fltr->ip_mask.src_port != htons(U16_MAX))
78 if (fltr->ip_mask.dst_port && fltr->ip_mask.dst_port != htons(U16_MAX))
81 if (fltr->ip_mask.spi && fltr->ip_mask.spi != htonl(U32_MAX))
84 if (fltr->ip_mask.l4_header &&
85 fltr->ip_mask.l4_header != htonl(U32_MAX))
97 * @fltr: Flow Director filter data structure
99 static u16 iavf_pkt_udp_no_pay_len(struct iavf_fdir_fltr *fltr)
102 (fltr->ip_ver == 4 ? sizeof(struct iphdr) : sizeof(struct ipv6hdr)) +
108 * @fltr: Flow Director filter data structure
114 iavf_fill_fdir_gtpu_hdr(struct iavf_fdir_fltr *fltr,
125 adj_offs = iavf_pkt_udp_no_pay_len(fltr);
127 for (i = 0; i < fltr->flex_cnt; i++) {
138 if (fltr->flex_words[i].offset < adj_offs)
141 hdr_offs = fltr->flex_words[i].offset - adj_offs;
148 pay_word[hdr_offs >> 1] = htons(fltr->flex_words[i].word);
153 if ((fltr->flex_words[i].word &
165 fltr->flex_words[i].word &
181 * @fltr: Flow Director filter data structure
187 iavf_fill_fdir_pfcp_hdr(struct iavf_fdir_fltr *fltr,
197 adj_offs = iavf_pkt_udp_no_pay_len(fltr);
199 for (i = 0; i < fltr->flex_cnt; i++) {
201 if (fltr->flex_words[i].offset < adj_offs)
204 hdr_offs = fltr->flex_words[i].offset - adj_offs;
208 hdr->buffer[0] = (fltr->flex_words[i].word >> 8) & 0xff;
223 * @fltr: Flow Director filter data structure
229 iavf_fill_fdir_nat_t_esp_hdr(struct iavf_fdir_fltr *fltr,
240 adj_offs = iavf_pkt_udp_no_pay_len(fltr);
242 for (i = 0; i < fltr->flex_cnt; i++) {
245 if (fltr->flex_words[i].offset < adj_offs)
248 hdr_offs = fltr->flex_words[i].offset - adj_offs;
252 spi |= fltr->flex_words[i].word << 16;
255 spi |= fltr->flex_words[i].word;
275 * @fltr: Flow Director filter data structure
281 iavf_fill_fdir_udp_flex_pay_hdr(struct iavf_fdir_fltr *fltr,
286 switch (ntohs(fltr->ip_data.dst_port)) {
288 err = iavf_fill_fdir_gtpu_hdr(fltr, proto_hdrs);
291 err = iavf_fill_fdir_nat_t_esp_hdr(fltr, proto_hdrs);
294 err = iavf_fill_fdir_pfcp_hdr(fltr, proto_hdrs);
306 * @fltr: Flow Director filter data structure
312 iavf_fill_fdir_ip4_hdr(struct iavf_fdir_fltr *fltr,
320 if (fltr->ip_mask.tos == U8_MAX) {
321 iph->tos = fltr->ip_data.tos;
325 if (fltr->ip_mask.proto == U8_MAX) {
326 iph->protocol = fltr->ip_data.proto;
330 if (fltr->ip_mask.v4_addrs.src_ip == htonl(U32_MAX)) {
331 iph->saddr = fltr->ip_data.v4_addrs.src_ip;
335 if (fltr->ip_mask.v4_addrs.dst_ip == htonl(U32_MAX)) {
336 iph->daddr = fltr->ip_data.v4_addrs.dst_ip;
345 * @fltr: Flow Director filter data structure
351 iavf_fill_fdir_ip6_hdr(struct iavf_fdir_fltr *fltr,
359 if (fltr->ip_mask.tclass == U8_MAX) {
360 iph->priority = (fltr->ip_data.tclass >> 4) & 0xF;
361 iph->flow_lbl[0] = FIELD_PREP(0xF0, fltr->ip_data.tclass);
365 if (fltr->ip_mask.proto == U8_MAX) {
366 iph->nexthdr = fltr->ip_data.proto;
370 if (!memcmp(&fltr->ip_mask.v6_addrs.src_ip, &ipv6_addr_full_mask,
372 memcpy(&iph->saddr, &fltr->ip_data.v6_addrs.src_ip,
377 if (!memcmp(&fltr->ip_mask.v6_addrs.dst_ip, &ipv6_addr_full_mask,
379 memcpy(&iph->daddr, &fltr->ip_data.v6_addrs.dst_ip,
389 * @fltr: Flow Director filter data structure
395 iavf_fill_fdir_tcp_hdr(struct iavf_fdir_fltr *fltr,
403 if (fltr->ip_mask.src_port == htons(U16_MAX)) {
404 tcph->source = fltr->ip_data.src_port;
408 if (fltr->ip_mask.dst_port == htons(U16_MAX)) {
409 tcph->dest = fltr->ip_data.dst_port;
418 * @fltr: Flow Director filter data structure
424 iavf_fill_fdir_udp_hdr(struct iavf_fdir_fltr *fltr,
432 if (fltr->ip_mask.src_port == htons(U16_MAX)) {
433 udph->source = fltr->ip_data.src_port;
437 if (fltr->ip_mask.dst_port == htons(U16_MAX)) {
438 udph->dest = fltr->ip_data.dst_port;
442 if (!fltr->flex_cnt)
445 return iavf_fill_fdir_udp_flex_pay_hdr(fltr, proto_hdrs);
450 * @fltr: Flow Director filter data structure
456 iavf_fill_fdir_sctp_hdr(struct iavf_fdir_fltr *fltr,
464 if (fltr->ip_mask.src_port == htons(U16_MAX)) {
465 sctph->source = fltr->ip_data.src_port;
469 if (fltr->ip_mask.dst_port == htons(U16_MAX)) {
470 sctph->dest = fltr->ip_data.dst_port;
479 * @fltr: Flow Director filter data structure
485 iavf_fill_fdir_ah_hdr(struct iavf_fdir_fltr *fltr,
493 if (fltr->ip_mask.spi == htonl(U32_MAX)) {
494 ah->spi = fltr->ip_data.spi;
503 * @fltr: Flow Director filter data structure
509 iavf_fill_fdir_esp_hdr(struct iavf_fdir_fltr *fltr,
517 if (fltr->ip_mask.spi == htonl(U32_MAX)) {
518 esph->spi = fltr->ip_data.spi;
527 * @fltr: Flow Director filter data structure
533 iavf_fill_fdir_l4_hdr(struct iavf_fdir_fltr *fltr,
539 if (!fltr->ip_mask.proto) /* IPv4/IPv6 header only */
546 if (fltr->ip_data.proto == 115 && fltr->ip_mask.l4_header == htonl(U32_MAX)) {
550 *l4_4_data = fltr->ip_data.l4_header;
560 * @fltr: Flow Director filter data structure
566 iavf_fill_fdir_eth_hdr(struct iavf_fdir_fltr *fltr,
574 if (fltr->eth_mask.etype == htons(U16_MAX)) {
575 if (fltr->eth_data.etype == htons(ETH_P_IP) ||
576 fltr->eth_data.etype == htons(ETH_P_IPV6))
579 ehdr->h_proto = fltr->eth_data.etype;
589 * @fltr: Flow Director filter data structure
593 int iavf_fill_fdir_add_msg(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr)
595 struct virtchnl_fdir_add *vc_msg = &fltr->vc_add_msg;
601 err = iavf_fill_fdir_eth_hdr(fltr, proto_hdrs); /* L2 always exists */
605 switch (fltr->flow_type) {
607 err = iavf_fill_fdir_ip4_hdr(fltr, proto_hdrs) |
608 iavf_fill_fdir_tcp_hdr(fltr, proto_hdrs);
611 err = iavf_fill_fdir_ip4_hdr(fltr, proto_hdrs) |
612 iavf_fill_fdir_udp_hdr(fltr, proto_hdrs);
615 err = iavf_fill_fdir_ip4_hdr(fltr, proto_hdrs) |
616 iavf_fill_fdir_sctp_hdr(fltr, proto_hdrs);
619 err = iavf_fill_fdir_ip4_hdr(fltr, proto_hdrs) |
620 iavf_fill_fdir_ah_hdr(fltr, proto_hdrs);
623 err = iavf_fill_fdir_ip4_hdr(fltr, proto_hdrs) |
624 iavf_fill_fdir_esp_hdr(fltr, proto_hdrs);
627 err = iavf_fill_fdir_ip4_hdr(fltr, proto_hdrs) |
628 iavf_fill_fdir_l4_hdr(fltr, proto_hdrs);
631 err = iavf_fill_fdir_ip6_hdr(fltr, proto_hdrs) |
632 iavf_fill_fdir_tcp_hdr(fltr, proto_hdrs);
635 err = iavf_fill_fdir_ip6_hdr(fltr, proto_hdrs) |
636 iavf_fill_fdir_udp_hdr(fltr, proto_hdrs);
639 err = iavf_fill_fdir_ip6_hdr(fltr, proto_hdrs) |
640 iavf_fill_fdir_sctp_hdr(fltr, proto_hdrs);
643 err = iavf_fill_fdir_ip6_hdr(fltr, proto_hdrs) |
644 iavf_fill_fdir_ah_hdr(fltr, proto_hdrs);
647 err = iavf_fill_fdir_ip6_hdr(fltr, proto_hdrs) |
648 iavf_fill_fdir_esp_hdr(fltr, proto_hdrs);
651 err = iavf_fill_fdir_ip6_hdr(fltr, proto_hdrs) |
652 iavf_fill_fdir_l4_hdr(fltr, proto_hdrs);
666 vc_msg->rule_cfg.action_set.actions[0].type = fltr->action;
667 vc_msg->rule_cfg.action_set.actions[0].act_conf.queue.index = fltr->q_index;
707 * @fltr: Flow Director filter to print
711 void iavf_print_fdir_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr)
713 const char *proto = iavf_fdir_flow_proto_name(fltr->flow_type);
718 switch (fltr->flow_type) {
723 fltr->loc,
724 &fltr->ip_data.v4_addrs.dst_ip,
725 &fltr->ip_data.v4_addrs.src_ip,
727 ntohs(fltr->ip_data.dst_port),
728 ntohs(fltr->ip_data.src_port));
733 fltr->loc,
734 &fltr->ip_data.v4_addrs.dst_ip,
735 &fltr->ip_data.v4_addrs.src_ip,
737 ntohl(fltr->ip_data.spi));
741 fltr->loc,
742 &fltr->ip_data.v4_addrs.dst_ip,
743 &fltr->ip_data.v4_addrs.src_ip,
744 fltr->ip_data.proto,
745 ntohl(fltr->ip_data.l4_header));
751 fltr->loc,
752 &fltr->ip_data.v6_addrs.dst_ip,
753 &fltr->ip_data.v6_addrs.src_ip,
755 ntohs(fltr->ip_data.dst_port),
756 ntohs(fltr->ip_data.src_port));
761 fltr->loc,
762 &fltr->ip_data.v6_addrs.dst_ip,
763 &fltr->ip_data.v6_addrs.src_ip,
765 ntohl(fltr->ip_data.spi));
769 fltr->loc,
770 &fltr->ip_data.v6_addrs.dst_ip,
771 &fltr->ip_data.v6_addrs.src_ip,
772 fltr->ip_data.proto,
773 ntohl(fltr->ip_data.l4_header));
777 fltr->loc,
778 ntohs(fltr->eth_data.etype));
788 * @fltr: Flow Director filter data structure
792 bool iavf_fdir_is_dup_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr)
799 if (iavf_is_raw_fdir(fltr))
802 if (tmp->flow_type != fltr->flow_type)
805 if (!memcmp(&tmp->eth_data, &fltr->eth_data,
806 sizeof(fltr->eth_data)) &&
807 !memcmp(&tmp->ip_data, &fltr->ip_data,
808 sizeof(fltr->ip_data)) &&
809 !memcmp(&tmp->ext_data, &fltr->ext_data,
810 sizeof(fltr->ext_data))) {
845 * @fltr: filter node to add to structure
850 struct iavf_fdir_fltr *fltr)
864 if (iavf_is_raw_fdir(fltr))
867 if (rule->loc >= fltr->loc)
873 list_add(&fltr->list, &parent->list);
875 list_add(&fltr->list, &adapter->fdir_list_head);
877 iavf_inc_fdir_active_fltr(adapter, fltr);
880 fltr->state = IAVF_FDIR_FLTR_ADD_REQUEST;
882 fltr->state = IAVF_FDIR_FLTR_INACTIVE;
901 struct iavf_fdir_fltr *fltr = NULL;
905 fltr = iavf_find_fdir_fltr(adapter, is_raw, data);
907 if (fltr) {
908 if (fltr->state == IAVF_FDIR_FLTR_ACTIVE) {
909 fltr->state = IAVF_FDIR_FLTR_DEL_REQUEST;
910 } else if (fltr->state == IAVF_FDIR_FLTR_INACTIVE) {
911 list_del(&fltr->list);
912 iavf_dec_fdir_active_fltr(adapter, fltr);
913 kfree(fltr);
914 fltr = NULL;
922 if (fltr && fltr->state == IAVF_FDIR_FLTR_DEL_REQUEST)