1148beb61SHenry Tieman // SPDX-License-Identifier: GPL-2.0 2148beb61SHenry Tieman /* Copyright (C) 2018-2020, Intel Corporation. */ 3148beb61SHenry Tieman 4148beb61SHenry Tieman #include "ice_common.h" 5148beb61SHenry Tieman 6cac2a27cSHenry Tieman /* These are training packet headers used to program flow director filters. */ 7cac2a27cSHenry Tieman static const u8 ice_fdir_tcpv4_pkt[] = { 8cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 10cac2a27cSHenry Tieman 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, 11cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 14cac2a27cSHenry Tieman 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 15cac2a27cSHenry Tieman }; 16cac2a27cSHenry Tieman 17cac2a27cSHenry Tieman static const u8 ice_fdir_udpv4_pkt[] = { 18cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 20cac2a27cSHenry Tieman 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 21cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23cac2a27cSHenry Tieman 0x00, 0x00, 24cac2a27cSHenry Tieman }; 25cac2a27cSHenry Tieman 26cac2a27cSHenry Tieman static const u8 ice_fdir_sctpv4_pkt[] = { 27cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 29cac2a27cSHenry Tieman 0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84, 30cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33cac2a27cSHenry Tieman }; 34cac2a27cSHenry Tieman 35cac2a27cSHenry Tieman static const u8 ice_fdir_ipv4_pkt[] = { 36cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 37cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 38cac2a27cSHenry Tieman 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10, 39cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 40cac2a27cSHenry Tieman 0x00, 0x00 41cac2a27cSHenry Tieman }; 42cac2a27cSHenry Tieman 43165d80d6SHenry Tieman static const u8 ice_fdir_tcpv6_pkt[] = { 44165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 46165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00, 47165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 52165d80d6SHenry Tieman 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 53165d80d6SHenry Tieman 0x00, 0x00, 54165d80d6SHenry Tieman }; 55165d80d6SHenry Tieman 56165d80d6SHenry Tieman static const u8 ice_fdir_udpv6_pkt[] = { 57165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 58165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 59165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 60165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 61165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 62165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 64165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 65165d80d6SHenry Tieman }; 66165d80d6SHenry Tieman 67165d80d6SHenry Tieman static const u8 ice_fdir_sctpv6_pkt[] = { 68165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 70165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00, 71165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 73165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 74165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 76165d80d6SHenry Tieman 0x00, 0x00, 77165d80d6SHenry Tieman }; 78165d80d6SHenry Tieman 79165d80d6SHenry Tieman static const u8 ice_fdir_ipv6_pkt[] = { 80165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 82165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00, 83165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87165d80d6SHenry Tieman }; 88165d80d6SHenry Tieman 89cac2a27cSHenry Tieman static const u8 ice_fdir_tcp4_tun_pkt[] = { 90cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 92cac2a27cSHenry Tieman 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 93cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 95cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 96cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 97cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 98cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 99cac2a27cSHenry Tieman 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 101cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 102cac2a27cSHenry Tieman 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 103cac2a27cSHenry Tieman }; 104cac2a27cSHenry Tieman 105cac2a27cSHenry Tieman static const u8 ice_fdir_udp4_tun_pkt[] = { 106cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 107cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 108cac2a27cSHenry Tieman 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 109cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 110cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 112cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 113cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 114cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 115cac2a27cSHenry Tieman 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 116cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 118cac2a27cSHenry Tieman }; 119cac2a27cSHenry Tieman 120cac2a27cSHenry Tieman static const u8 ice_fdir_sctp4_tun_pkt[] = { 121cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 122cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 123cac2a27cSHenry Tieman 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 124cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 125cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 127cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 128cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 129cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 130cac2a27cSHenry Tieman 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133cac2a27cSHenry Tieman }; 134cac2a27cSHenry Tieman 135cac2a27cSHenry Tieman static const u8 ice_fdir_ip4_tun_pkt[] = { 136cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 137cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 138cac2a27cSHenry Tieman 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 139cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 140cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 141cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 142cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 143cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 144cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 145cac2a27cSHenry Tieman 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 146cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 147cac2a27cSHenry Tieman }; 148cac2a27cSHenry Tieman 149165d80d6SHenry Tieman static const u8 ice_fdir_tcp6_tun_pkt[] = { 150165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 151165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 152165d80d6SHenry Tieman 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 153165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 154165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 155165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 156165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 157165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 158165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 159165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 162165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 165165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 166165d80d6SHenry Tieman }; 167165d80d6SHenry Tieman 168165d80d6SHenry Tieman static const u8 ice_fdir_udp6_tun_pkt[] = { 169165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 170165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 171165d80d6SHenry Tieman 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 172165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 174165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 175165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 176165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 177165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 178165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 179165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 180165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 181165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 183165d80d6SHenry Tieman }; 184165d80d6SHenry Tieman 185165d80d6SHenry Tieman static const u8 ice_fdir_sctp6_tun_pkt[] = { 186165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 187165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 188165d80d6SHenry Tieman 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 189165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 190165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 191165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 192165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 193165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 194165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40, 195165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 196165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 197165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 198165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 199165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 200165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 201165d80d6SHenry Tieman }; 202165d80d6SHenry Tieman 203165d80d6SHenry Tieman static const u8 ice_fdir_ip6_tun_pkt[] = { 204165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 205165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 206165d80d6SHenry Tieman 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 207165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 208165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 209165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 210165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 211165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 212165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 213165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 214165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 215165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 216165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 217165d80d6SHenry Tieman }; 218165d80d6SHenry Tieman 219cac2a27cSHenry Tieman /* Flow Director no-op training packet table */ 220cac2a27cSHenry Tieman static const struct ice_fdir_base_pkt ice_fdir_pkt[] = { 221cac2a27cSHenry Tieman { 222cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_TCP, 223cac2a27cSHenry Tieman sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt, 224cac2a27cSHenry Tieman sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt, 225cac2a27cSHenry Tieman }, 226cac2a27cSHenry Tieman { 227cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_UDP, 228cac2a27cSHenry Tieman sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt, 229cac2a27cSHenry Tieman sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt, 230cac2a27cSHenry Tieman }, 231cac2a27cSHenry Tieman { 232cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_SCTP, 233cac2a27cSHenry Tieman sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt, 234cac2a27cSHenry Tieman sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt, 235cac2a27cSHenry Tieman }, 236cac2a27cSHenry Tieman { 237cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_OTHER, 238cac2a27cSHenry Tieman sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt, 239cac2a27cSHenry Tieman sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt, 240cac2a27cSHenry Tieman }, 241165d80d6SHenry Tieman { 242165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_TCP, 243165d80d6SHenry Tieman sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt, 244165d80d6SHenry Tieman sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt, 245165d80d6SHenry Tieman }, 246165d80d6SHenry Tieman { 247165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_UDP, 248165d80d6SHenry Tieman sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt, 249165d80d6SHenry Tieman sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt, 250165d80d6SHenry Tieman }, 251165d80d6SHenry Tieman { 252165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_SCTP, 253165d80d6SHenry Tieman sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt, 254165d80d6SHenry Tieman sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt, 255165d80d6SHenry Tieman }, 256165d80d6SHenry Tieman { 257165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_OTHER, 258165d80d6SHenry Tieman sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt, 259165d80d6SHenry Tieman sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt, 260165d80d6SHenry Tieman }, 261cac2a27cSHenry Tieman }; 262cac2a27cSHenry Tieman 263cac2a27cSHenry Tieman #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt) 264cac2a27cSHenry Tieman 265cac2a27cSHenry Tieman /** 266cac2a27cSHenry Tieman * ice_set_dflt_val_fd_desc 267cac2a27cSHenry Tieman * @fd_fltr_ctx: pointer to fd filter descriptor 268cac2a27cSHenry Tieman */ 269cac2a27cSHenry Tieman static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx) 270cac2a27cSHenry Tieman { 271cac2a27cSHenry Tieman fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 272cac2a27cSHenry Tieman fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL; 273cac2a27cSHenry Tieman fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST; 274cac2a27cSHenry Tieman fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS; 275cac2a27cSHenry Tieman fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE; 276cac2a27cSHenry Tieman fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX; 277cac2a27cSHenry Tieman fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1; 278cac2a27cSHenry Tieman fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT; 279cac2a27cSHenry Tieman fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO; 280cac2a27cSHenry Tieman fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE; 281cac2a27cSHenry Tieman fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0; 282cac2a27cSHenry Tieman fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0; 283cac2a27cSHenry Tieman fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG; 284cac2a27cSHenry Tieman fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO; 285cac2a27cSHenry Tieman fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO; 286cac2a27cSHenry Tieman fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET; 287cac2a27cSHenry Tieman fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE; 288cac2a27cSHenry Tieman fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD; 289cac2a27cSHenry Tieman fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO; 290cac2a27cSHenry Tieman } 291cac2a27cSHenry Tieman 292cac2a27cSHenry Tieman /** 293cac2a27cSHenry Tieman * ice_set_fd_desc_val 294cac2a27cSHenry Tieman * @ctx: pointer to fd filter descriptor context 295cac2a27cSHenry Tieman * @fdir_desc: populated with fd filter descriptor values 296cac2a27cSHenry Tieman */ 297cac2a27cSHenry Tieman static void 298cac2a27cSHenry Tieman ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx, 299cac2a27cSHenry Tieman struct ice_fltr_desc *fdir_desc) 300cac2a27cSHenry Tieman { 301cac2a27cSHenry Tieman u64 qword; 302cac2a27cSHenry Tieman 303cac2a27cSHenry Tieman /* prep QW0 of FD filter programming desc */ 304cac2a27cSHenry Tieman qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) & 305cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_QINDEX_M; 306cac2a27cSHenry Tieman qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) & 307cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_COMP_Q_M; 308cac2a27cSHenry Tieman qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) & 309cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_COMP_REPORT_M; 310cac2a27cSHenry Tieman qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) & 311cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FD_SPACE_M; 312cac2a27cSHenry Tieman qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) & 313cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_STAT_CNT_M; 314cac2a27cSHenry Tieman qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) & 315cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_STAT_ENA_M; 316cac2a27cSHenry Tieman qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) & 317cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_EVICT_ENA_M; 318cac2a27cSHenry Tieman qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) & 319cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_TO_Q_M; 320cac2a27cSHenry Tieman qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) & 321cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_TO_Q_PRI_M; 322cac2a27cSHenry Tieman qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) & 323cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_DPU_RECIPE_M; 324cac2a27cSHenry Tieman qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) & 325cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_DROP_M; 326cac2a27cSHenry Tieman qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) & 327cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FLEX_PRI_M; 328cac2a27cSHenry Tieman qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) & 329cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FLEX_MDID_M; 330cac2a27cSHenry Tieman qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) & 331cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FLEX_VAL_M; 332cac2a27cSHenry Tieman fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword); 333cac2a27cSHenry Tieman 334cac2a27cSHenry Tieman /* prep QW1 of FD filter programming desc */ 335cac2a27cSHenry Tieman qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) & 336cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_DTYPE_M; 337cac2a27cSHenry Tieman qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) & 338cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PCMD_M; 339cac2a27cSHenry Tieman qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) & 340cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PROF_PRI_M; 341cac2a27cSHenry Tieman qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) & 342cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PROF_M; 343cac2a27cSHenry Tieman qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) & 344cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FD_VSI_M; 345cac2a27cSHenry Tieman qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) & 346cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_SWAP_M; 347cac2a27cSHenry Tieman qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) & 348cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FDID_PRI_M; 349cac2a27cSHenry Tieman qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) & 350cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FDID_MDID_M; 351cac2a27cSHenry Tieman qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) & 352cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FDID_M; 353cac2a27cSHenry Tieman fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword); 354cac2a27cSHenry Tieman } 355cac2a27cSHenry Tieman 356cac2a27cSHenry Tieman /** 357cac2a27cSHenry Tieman * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct 358cac2a27cSHenry Tieman * @hw: pointer to the hardware structure 359cac2a27cSHenry Tieman * @input: filter 360cac2a27cSHenry Tieman * @fdesc: filter descriptor 361cac2a27cSHenry Tieman * @add: if add is true, this is an add operation, false implies delete 362cac2a27cSHenry Tieman */ 363cac2a27cSHenry Tieman void 364cac2a27cSHenry Tieman ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input, 365cac2a27cSHenry Tieman struct ice_fltr_desc *fdesc, bool add) 366cac2a27cSHenry Tieman { 367cac2a27cSHenry Tieman struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 }; 368cac2a27cSHenry Tieman 369cac2a27cSHenry Tieman /* set default context info */ 370cac2a27cSHenry Tieman ice_set_dflt_val_fd_desc(&fdir_fltr_ctx); 371cac2a27cSHenry Tieman 372cac2a27cSHenry Tieman /* change sideband filtering values */ 373cac2a27cSHenry Tieman fdir_fltr_ctx.fdid = input->fltr_id; 374cac2a27cSHenry Tieman if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) { 375cac2a27cSHenry Tieman fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES; 376cac2a27cSHenry Tieman fdir_fltr_ctx.qindex = 0; 377cac2a27cSHenry Tieman } else { 378cac2a27cSHenry Tieman fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 379cac2a27cSHenry Tieman fdir_fltr_ctx.qindex = input->q_index; 380cac2a27cSHenry Tieman } 381cac2a27cSHenry Tieman fdir_fltr_ctx.cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS; 382cac2a27cSHenry Tieman fdir_fltr_ctx.cnt_index = input->cnt_index; 383cac2a27cSHenry Tieman fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi); 384cac2a27cSHenry Tieman fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE; 385cac2a27cSHenry Tieman fdir_fltr_ctx.toq_prio = 3; 386cac2a27cSHenry Tieman fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD : 387cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PCMD_REMOVE; 388cac2a27cSHenry Tieman fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET; 389cac2a27cSHenry Tieman fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 390cac2a27cSHenry Tieman fdir_fltr_ctx.comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL; 391cac2a27cSHenry Tieman fdir_fltr_ctx.fdid_prio = 3; 392cac2a27cSHenry Tieman fdir_fltr_ctx.desc_prof = 1; 393cac2a27cSHenry Tieman fdir_fltr_ctx.desc_prof_prio = 3; 394cac2a27cSHenry Tieman ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc); 395cac2a27cSHenry Tieman } 396cac2a27cSHenry Tieman 397148beb61SHenry Tieman /** 398148beb61SHenry Tieman * ice_alloc_fd_res_cntr - obtain counter resource for FD type 399148beb61SHenry Tieman * @hw: pointer to the hardware structure 400148beb61SHenry Tieman * @cntr_id: returns counter index 401148beb61SHenry Tieman */ 402148beb61SHenry Tieman enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id) 403148beb61SHenry Tieman { 404148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 405148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 406148beb61SHenry Tieman } 407148beb61SHenry Tieman 408148beb61SHenry Tieman /** 409148beb61SHenry Tieman * ice_free_fd_res_cntr - Free counter resource for FD type 410148beb61SHenry Tieman * @hw: pointer to the hardware structure 411148beb61SHenry Tieman * @cntr_id: counter index to be freed 412148beb61SHenry Tieman */ 413148beb61SHenry Tieman enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id) 414148beb61SHenry Tieman { 415148beb61SHenry Tieman return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 416148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 417148beb61SHenry Tieman } 418148beb61SHenry Tieman 419148beb61SHenry Tieman /** 420148beb61SHenry Tieman * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries 421148beb61SHenry Tieman * @hw: pointer to the hardware structure 422148beb61SHenry Tieman * @cntr_id: returns counter index 423148beb61SHenry Tieman * @num_fltr: number of filter entries to be allocated 424148beb61SHenry Tieman */ 425148beb61SHenry Tieman enum ice_status 426148beb61SHenry Tieman ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 427148beb61SHenry Tieman { 428148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 429148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 430148beb61SHenry Tieman cntr_id); 431148beb61SHenry Tieman } 432148beb61SHenry Tieman 433148beb61SHenry Tieman /** 434148beb61SHenry Tieman * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries 435148beb61SHenry Tieman * @hw: pointer to the hardware structure 436148beb61SHenry Tieman * @cntr_id: returns counter index 437148beb61SHenry Tieman * @num_fltr: number of filter entries to be allocated 438148beb61SHenry Tieman */ 439148beb61SHenry Tieman enum ice_status 440148beb61SHenry Tieman ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 441148beb61SHenry Tieman { 442148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 443148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 444148beb61SHenry Tieman cntr_id); 445148beb61SHenry Tieman } 4464ab95646SHenry Tieman 4474ab95646SHenry Tieman /** 4484ab95646SHenry Tieman * ice_get_fdir_cnt_all - get the number of Flow Director filters 4494ab95646SHenry Tieman * @hw: hardware data structure 4504ab95646SHenry Tieman * 4514ab95646SHenry Tieman * Returns the number of filters available on device 4524ab95646SHenry Tieman */ 4534ab95646SHenry Tieman int ice_get_fdir_cnt_all(struct ice_hw *hw) 4544ab95646SHenry Tieman { 4554ab95646SHenry Tieman return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; 4564ab95646SHenry Tieman } 4574ab95646SHenry Tieman 4584ab95646SHenry Tieman /** 459165d80d6SHenry Tieman * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer 460165d80d6SHenry Tieman * @pkt: packet buffer 461165d80d6SHenry Tieman * @offset: offset into buffer 462165d80d6SHenry Tieman * @addr: IPv6 address to convert and insert into pkt at offset 463165d80d6SHenry Tieman */ 464165d80d6SHenry Tieman static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) 465165d80d6SHenry Tieman { 466165d80d6SHenry Tieman int idx; 467165d80d6SHenry Tieman 468165d80d6SHenry Tieman for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) 469165d80d6SHenry Tieman memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], 470165d80d6SHenry Tieman sizeof(*addr)); 471165d80d6SHenry Tieman } 472165d80d6SHenry Tieman 473165d80d6SHenry Tieman /** 474cac2a27cSHenry Tieman * ice_pkt_insert_u16 - insert a be16 value into a memory buffer 475cac2a27cSHenry Tieman * @pkt: packet buffer 476cac2a27cSHenry Tieman * @offset: offset into buffer 477cac2a27cSHenry Tieman * @data: 16 bit value to convert and insert into pkt at offset 478cac2a27cSHenry Tieman */ 479cac2a27cSHenry Tieman static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) 480cac2a27cSHenry Tieman { 481cac2a27cSHenry Tieman memcpy(pkt + offset, &data, sizeof(data)); 482cac2a27cSHenry Tieman } 483cac2a27cSHenry Tieman 484cac2a27cSHenry Tieman /** 485cac2a27cSHenry Tieman * ice_pkt_insert_u32 - insert a be32 value into a memory buffer 486cac2a27cSHenry Tieman * @pkt: packet buffer 487cac2a27cSHenry Tieman * @offset: offset into buffer 488cac2a27cSHenry Tieman * @data: 32 bit value to convert and insert into pkt at offset 489cac2a27cSHenry Tieman */ 490cac2a27cSHenry Tieman static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) 491cac2a27cSHenry Tieman { 492cac2a27cSHenry Tieman memcpy(pkt + offset, &data, sizeof(data)); 493cac2a27cSHenry Tieman } 494cac2a27cSHenry Tieman 495cac2a27cSHenry Tieman /** 496cac2a27cSHenry Tieman * ice_fdir_get_gen_prgm_pkt - generate a training packet 497cac2a27cSHenry Tieman * @hw: pointer to the hardware structure 498cac2a27cSHenry Tieman * @input: flow director filter data structure 499cac2a27cSHenry Tieman * @pkt: pointer to return filter packet 500cac2a27cSHenry Tieman * @frag: generate a fragment packet 501cac2a27cSHenry Tieman * @tun: true implies generate a tunnel packet 502cac2a27cSHenry Tieman */ 503cac2a27cSHenry Tieman enum ice_status 504cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 505cac2a27cSHenry Tieman u8 *pkt, bool frag, bool tun) 506cac2a27cSHenry Tieman { 507cac2a27cSHenry Tieman enum ice_fltr_ptype flow; 508cac2a27cSHenry Tieman u16 tnl_port; 509cac2a27cSHenry Tieman u8 *loc; 510cac2a27cSHenry Tieman u16 idx; 511cac2a27cSHenry Tieman 512cac2a27cSHenry Tieman if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 513165d80d6SHenry Tieman switch (input->ip.v4.proto) { 514cac2a27cSHenry Tieman case IPPROTO_TCP: 515cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; 516cac2a27cSHenry Tieman break; 517cac2a27cSHenry Tieman case IPPROTO_UDP: 518cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; 519cac2a27cSHenry Tieman break; 520cac2a27cSHenry Tieman case IPPROTO_SCTP: 521cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; 522cac2a27cSHenry Tieman break; 523cac2a27cSHenry Tieman case IPPROTO_IP: 524cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; 525cac2a27cSHenry Tieman break; 526cac2a27cSHenry Tieman default: 527cac2a27cSHenry Tieman return ICE_ERR_PARAM; 528cac2a27cSHenry Tieman } 529165d80d6SHenry Tieman } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 530165d80d6SHenry Tieman switch (input->ip.v6.proto) { 531165d80d6SHenry Tieman case IPPROTO_TCP: 532165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; 533165d80d6SHenry Tieman break; 534165d80d6SHenry Tieman case IPPROTO_UDP: 535165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; 536165d80d6SHenry Tieman break; 537165d80d6SHenry Tieman case IPPROTO_SCTP: 538165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; 539165d80d6SHenry Tieman break; 540165d80d6SHenry Tieman case IPPROTO_IP: 541165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; 542165d80d6SHenry Tieman break; 543165d80d6SHenry Tieman default: 544165d80d6SHenry Tieman return ICE_ERR_PARAM; 545165d80d6SHenry Tieman } 546cac2a27cSHenry Tieman } else { 547cac2a27cSHenry Tieman flow = input->flow_type; 548cac2a27cSHenry Tieman } 549cac2a27cSHenry Tieman 550cac2a27cSHenry Tieman for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) 551cac2a27cSHenry Tieman if (ice_fdir_pkt[idx].flow == flow) 552cac2a27cSHenry Tieman break; 553cac2a27cSHenry Tieman if (idx == ICE_FDIR_NUM_PKT) 554cac2a27cSHenry Tieman return ICE_ERR_PARAM; 555cac2a27cSHenry Tieman if (!tun) { 556cac2a27cSHenry Tieman memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len); 557cac2a27cSHenry Tieman loc = pkt; 558cac2a27cSHenry Tieman } else { 559cac2a27cSHenry Tieman if (!ice_get_open_tunnel_port(hw, TNL_ALL, &tnl_port)) 560cac2a27cSHenry Tieman return ICE_ERR_DOES_NOT_EXIST; 561cac2a27cSHenry Tieman if (!ice_fdir_pkt[idx].tun_pkt) 562cac2a27cSHenry Tieman return ICE_ERR_PARAM; 563cac2a27cSHenry Tieman memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 564cac2a27cSHenry Tieman ice_fdir_pkt[idx].tun_pkt_len); 565cac2a27cSHenry Tieman ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, 566cac2a27cSHenry Tieman htons(tnl_port)); 567cac2a27cSHenry Tieman loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; 568cac2a27cSHenry Tieman } 569cac2a27cSHenry Tieman 570cac2a27cSHenry Tieman /* Reverse the src and dst, since the HW expects them to be from Tx 571cac2a27cSHenry Tieman * perspective. The input from user is from Rx filter perspective. 572cac2a27cSHenry Tieman */ 573cac2a27cSHenry Tieman switch (flow) { 574cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_TCP: 575cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 576165d80d6SHenry Tieman input->ip.v4.src_ip); 577cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET, 578165d80d6SHenry Tieman input->ip.v4.src_port); 579cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 580165d80d6SHenry Tieman input->ip.v4.dst_ip); 581cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, 582165d80d6SHenry Tieman input->ip.v4.dst_port); 583cac2a27cSHenry Tieman if (frag) 584cac2a27cSHenry Tieman loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF; 585cac2a27cSHenry Tieman break; 586cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_UDP: 587cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 588165d80d6SHenry Tieman input->ip.v4.src_ip); 589cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 590165d80d6SHenry Tieman input->ip.v4.src_port); 591cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 592165d80d6SHenry Tieman input->ip.v4.dst_ip); 593cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 594165d80d6SHenry Tieman input->ip.v4.dst_port); 595cac2a27cSHenry Tieman break; 596cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: 597cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 598165d80d6SHenry Tieman input->ip.v4.src_ip); 599cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, 600165d80d6SHenry Tieman input->ip.v4.src_port); 601cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 602165d80d6SHenry Tieman input->ip.v4.dst_ip); 603cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, 604165d80d6SHenry Tieman input->ip.v4.dst_port); 605cac2a27cSHenry Tieman break; 606cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: 607cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 608165d80d6SHenry Tieman input->ip.v4.src_ip); 609cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 610165d80d6SHenry Tieman input->ip.v4.dst_ip); 611cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_PROTO_OFFSET, 0); 612cac2a27cSHenry Tieman break; 613165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_TCP: 614165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 615165d80d6SHenry Tieman input->ip.v6.src_ip); 616165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 617165d80d6SHenry Tieman input->ip.v6.dst_ip); 618165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET, 619165d80d6SHenry Tieman input->ip.v6.src_port); 620165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, 621165d80d6SHenry Tieman input->ip.v6.dst_port); 622165d80d6SHenry Tieman break; 623165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_UDP: 624165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 625165d80d6SHenry Tieman input->ip.v6.src_ip); 626165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 627165d80d6SHenry Tieman input->ip.v6.dst_ip); 628165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET, 629165d80d6SHenry Tieman input->ip.v6.src_port); 630165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 631165d80d6SHenry Tieman input->ip.v6.dst_port); 632165d80d6SHenry Tieman break; 633165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: 634165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 635165d80d6SHenry Tieman input->ip.v6.src_ip); 636165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 637165d80d6SHenry Tieman input->ip.v6.dst_ip); 638165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, 639165d80d6SHenry Tieman input->ip.v6.src_port); 640165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, 641165d80d6SHenry Tieman input->ip.v6.dst_port); 642165d80d6SHenry Tieman break; 643165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: 644165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 645165d80d6SHenry Tieman input->ip.v6.src_ip); 646165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 647165d80d6SHenry Tieman input->ip.v6.dst_ip); 648165d80d6SHenry Tieman break; 649cac2a27cSHenry Tieman default: 650cac2a27cSHenry Tieman return ICE_ERR_PARAM; 651cac2a27cSHenry Tieman } 652cac2a27cSHenry Tieman 6532c57ffcbSHenry Tieman if (input->flex_fltr) 6542c57ffcbSHenry Tieman ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word); 6552c57ffcbSHenry Tieman 656cac2a27cSHenry Tieman return 0; 657cac2a27cSHenry Tieman } 658cac2a27cSHenry Tieman 659cac2a27cSHenry Tieman /** 660cac2a27cSHenry Tieman * ice_fdir_has_frag - does flow type have 2 ptypes 661cac2a27cSHenry Tieman * @flow: flow ptype 662cac2a27cSHenry Tieman * 663cac2a27cSHenry Tieman * returns true is there is a fragment packet for this ptype 664cac2a27cSHenry Tieman */ 665cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow) 666cac2a27cSHenry Tieman { 667cac2a27cSHenry Tieman if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 668cac2a27cSHenry Tieman return true; 669cac2a27cSHenry Tieman else 670cac2a27cSHenry Tieman return false; 671cac2a27cSHenry Tieman } 672cac2a27cSHenry Tieman 673cac2a27cSHenry Tieman /** 6744ab95646SHenry Tieman * ice_fdir_find_by_idx - find filter with idx 6754ab95646SHenry Tieman * @hw: pointer to hardware structure 6764ab95646SHenry Tieman * @fltr_idx: index to find. 6774ab95646SHenry Tieman * 6784ab95646SHenry Tieman * Returns pointer to filter if found or null 6794ab95646SHenry Tieman */ 6804ab95646SHenry Tieman struct ice_fdir_fltr * 6814ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) 6824ab95646SHenry Tieman { 6834ab95646SHenry Tieman struct ice_fdir_fltr *rule; 6844ab95646SHenry Tieman 6854ab95646SHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 6864ab95646SHenry Tieman /* rule ID found in the list */ 6874ab95646SHenry Tieman if (fltr_idx == rule->fltr_id) 6884ab95646SHenry Tieman return rule; 6894ab95646SHenry Tieman if (fltr_idx < rule->fltr_id) 6904ab95646SHenry Tieman break; 6914ab95646SHenry Tieman } 6924ab95646SHenry Tieman return NULL; 6934ab95646SHenry Tieman } 694cac2a27cSHenry Tieman 695cac2a27cSHenry Tieman /** 696cac2a27cSHenry Tieman * ice_fdir_list_add_fltr - add a new node to the flow director filter list 697cac2a27cSHenry Tieman * @hw: hardware structure 698cac2a27cSHenry Tieman * @fltr: filter node to add to structure 699cac2a27cSHenry Tieman */ 700cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) 701cac2a27cSHenry Tieman { 702cac2a27cSHenry Tieman struct ice_fdir_fltr *rule, *parent = NULL; 703cac2a27cSHenry Tieman 704cac2a27cSHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 705cac2a27cSHenry Tieman /* rule ID found or pass its spot in the list */ 706cac2a27cSHenry Tieman if (rule->fltr_id >= fltr->fltr_id) 707cac2a27cSHenry Tieman break; 708cac2a27cSHenry Tieman parent = rule; 709cac2a27cSHenry Tieman } 710cac2a27cSHenry Tieman 711cac2a27cSHenry Tieman if (parent) 712cac2a27cSHenry Tieman list_add(&fltr->fltr_node, &parent->fltr_node); 713cac2a27cSHenry Tieman else 714cac2a27cSHenry Tieman list_add(&fltr->fltr_node, &hw->fdir_list_head); 715cac2a27cSHenry Tieman } 716cac2a27cSHenry Tieman 717cac2a27cSHenry Tieman /** 718cac2a27cSHenry Tieman * ice_fdir_update_cntrs - increment / decrement filter counter 719cac2a27cSHenry Tieman * @hw: pointer to hardware structure 720cac2a27cSHenry Tieman * @flow: filter flow type 721cac2a27cSHenry Tieman * @add: true implies filters added 722cac2a27cSHenry Tieman */ 723cac2a27cSHenry Tieman void 724cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add) 725cac2a27cSHenry Tieman { 726cac2a27cSHenry Tieman int incr; 727cac2a27cSHenry Tieman 728cac2a27cSHenry Tieman incr = add ? 1 : -1; 729cac2a27cSHenry Tieman hw->fdir_active_fltr += incr; 730cac2a27cSHenry Tieman 731cac2a27cSHenry Tieman if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) 732cac2a27cSHenry Tieman ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow); 733cac2a27cSHenry Tieman else 734cac2a27cSHenry Tieman hw->fdir_fltr_cnt[flow] += incr; 735cac2a27cSHenry Tieman } 736cac2a27cSHenry Tieman 737cac2a27cSHenry Tieman /** 738165d80d6SHenry Tieman * ice_cmp_ipv6_addr - compare 2 IP v6 addresses 739165d80d6SHenry Tieman * @a: IP v6 address 740165d80d6SHenry Tieman * @b: IP v6 address 741165d80d6SHenry Tieman * 742165d80d6SHenry Tieman * Returns 0 on equal, returns non-0 if different 743165d80d6SHenry Tieman */ 744165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) 745165d80d6SHenry Tieman { 746165d80d6SHenry Tieman return memcmp(a, b, 4 * sizeof(__be32)); 747165d80d6SHenry Tieman } 748165d80d6SHenry Tieman 749165d80d6SHenry Tieman /** 750cac2a27cSHenry Tieman * ice_fdir_comp_rules - compare 2 filters 751cac2a27cSHenry Tieman * @a: a Flow Director filter data structure 752cac2a27cSHenry Tieman * @b: a Flow Director filter data structure 753165d80d6SHenry Tieman * @v6: bool true if v6 filter 754cac2a27cSHenry Tieman * 755cac2a27cSHenry Tieman * Returns true if the filters match 756cac2a27cSHenry Tieman */ 757cac2a27cSHenry Tieman static bool 758165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) 759cac2a27cSHenry Tieman { 760cac2a27cSHenry Tieman enum ice_fltr_ptype flow_type = a->flow_type; 761cac2a27cSHenry Tieman 762cac2a27cSHenry Tieman /* The calling function already checks that the two filters have the 763cac2a27cSHenry Tieman * same flow_type. 764cac2a27cSHenry Tieman */ 765165d80d6SHenry Tieman if (!v6) { 766cac2a27cSHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 767cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 768cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { 769165d80d6SHenry Tieman if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 770165d80d6SHenry Tieman a->ip.v4.src_ip == b->ip.v4.src_ip && 771165d80d6SHenry Tieman a->ip.v4.dst_port == b->ip.v4.dst_port && 772165d80d6SHenry Tieman a->ip.v4.src_port == b->ip.v4.src_port) 773cac2a27cSHenry Tieman return true; 774cac2a27cSHenry Tieman } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 775165d80d6SHenry Tieman if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 776165d80d6SHenry Tieman a->ip.v4.src_ip == b->ip.v4.src_ip && 777165d80d6SHenry Tieman a->ip.v4.l4_header == b->ip.v4.l4_header && 778165d80d6SHenry Tieman a->ip.v4.proto == b->ip.v4.proto && 779165d80d6SHenry Tieman a->ip.v4.ip_ver == b->ip.v4.ip_ver && 780165d80d6SHenry Tieman a->ip.v4.tos == b->ip.v4.tos) 781cac2a27cSHenry Tieman return true; 782cac2a27cSHenry Tieman } 783165d80d6SHenry Tieman } else { 784165d80d6SHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || 785165d80d6SHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || 786165d80d6SHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { 787165d80d6SHenry Tieman if (a->ip.v6.dst_port == b->ip.v6.dst_port && 788165d80d6SHenry Tieman a->ip.v6.src_port == b->ip.v6.src_port && 789165d80d6SHenry Tieman !ice_cmp_ipv6_addr(a->ip.v6.dst_ip, 790165d80d6SHenry Tieman b->ip.v6.dst_ip) && 791165d80d6SHenry Tieman !ice_cmp_ipv6_addr(a->ip.v6.src_ip, 792165d80d6SHenry Tieman b->ip.v6.src_ip)) 793165d80d6SHenry Tieman return true; 794165d80d6SHenry Tieman } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 795165d80d6SHenry Tieman if (a->ip.v6.dst_port == b->ip.v6.dst_port && 796165d80d6SHenry Tieman a->ip.v6.src_port == b->ip.v6.src_port) 797165d80d6SHenry Tieman return true; 798165d80d6SHenry Tieman } 799165d80d6SHenry Tieman } 800cac2a27cSHenry Tieman 801cac2a27cSHenry Tieman return false; 802cac2a27cSHenry Tieman } 803cac2a27cSHenry Tieman 804cac2a27cSHenry Tieman /** 805cac2a27cSHenry Tieman * ice_fdir_is_dup_fltr - test if filter is already in list for PF 806cac2a27cSHenry Tieman * @hw: hardware data structure 807cac2a27cSHenry Tieman * @input: Flow Director filter data structure 808cac2a27cSHenry Tieman * 809cac2a27cSHenry Tieman * Returns true if the filter is found in the list 810cac2a27cSHenry Tieman */ 811cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) 812cac2a27cSHenry Tieman { 813cac2a27cSHenry Tieman struct ice_fdir_fltr *rule; 814cac2a27cSHenry Tieman bool ret = false; 815cac2a27cSHenry Tieman 816cac2a27cSHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 817cac2a27cSHenry Tieman enum ice_fltr_ptype flow_type; 818cac2a27cSHenry Tieman 819cac2a27cSHenry Tieman if (rule->flow_type != input->flow_type) 820cac2a27cSHenry Tieman continue; 821cac2a27cSHenry Tieman 822cac2a27cSHenry Tieman flow_type = input->flow_type; 823cac2a27cSHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 824cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 825cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || 826cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 827165d80d6SHenry Tieman ret = ice_fdir_comp_rules(rule, input, false); 828165d80d6SHenry Tieman else 829165d80d6SHenry Tieman ret = ice_fdir_comp_rules(rule, input, true); 830cac2a27cSHenry Tieman if (ret) { 831cac2a27cSHenry Tieman if (rule->fltr_id == input->fltr_id && 832cac2a27cSHenry Tieman rule->q_index != input->q_index) 833cac2a27cSHenry Tieman ret = false; 834cac2a27cSHenry Tieman else 835cac2a27cSHenry Tieman break; 836cac2a27cSHenry Tieman } 837cac2a27cSHenry Tieman } 838cac2a27cSHenry Tieman 839cac2a27cSHenry Tieman return ret; 840cac2a27cSHenry Tieman } 841