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; 377*346bf250SQi Zhang } else if (input->dest_ctl == 378*346bf250SQi Zhang ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) { 379*346bf250SQi Zhang fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 380*346bf250SQi Zhang fdir_fltr_ctx.qindex = 0; 381cac2a27cSHenry Tieman } else { 382*346bf250SQi Zhang if (input->dest_ctl == 383*346bf250SQi Zhang ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP) 384*346bf250SQi Zhang fdir_fltr_ctx.toq = input->q_region; 385cac2a27cSHenry Tieman fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 386cac2a27cSHenry Tieman fdir_fltr_ctx.qindex = input->q_index; 387cac2a27cSHenry Tieman } 3881f7ea1cdSQi Zhang fdir_fltr_ctx.cnt_ena = input->cnt_ena; 389cac2a27cSHenry Tieman fdir_fltr_ctx.cnt_index = input->cnt_index; 390cac2a27cSHenry Tieman fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi); 391cac2a27cSHenry Tieman fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE; 392*346bf250SQi Zhang if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) 393*346bf250SQi Zhang fdir_fltr_ctx.toq_prio = 0; 394*346bf250SQi Zhang else 395cac2a27cSHenry Tieman fdir_fltr_ctx.toq_prio = 3; 396cac2a27cSHenry Tieman fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD : 397cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PCMD_REMOVE; 398cac2a27cSHenry Tieman fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET; 399cac2a27cSHenry Tieman fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 4001f7ea1cdSQi Zhang fdir_fltr_ctx.comp_report = input->comp_report; 4011f7ea1cdSQi Zhang fdir_fltr_ctx.fdid_prio = input->fdid_prio; 402cac2a27cSHenry Tieman fdir_fltr_ctx.desc_prof = 1; 403cac2a27cSHenry Tieman fdir_fltr_ctx.desc_prof_prio = 3; 404cac2a27cSHenry Tieman ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc); 405cac2a27cSHenry Tieman } 406cac2a27cSHenry Tieman 407148beb61SHenry Tieman /** 408148beb61SHenry Tieman * ice_alloc_fd_res_cntr - obtain counter resource for FD type 409148beb61SHenry Tieman * @hw: pointer to the hardware structure 410148beb61SHenry Tieman * @cntr_id: returns counter index 411148beb61SHenry Tieman */ 412148beb61SHenry Tieman enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id) 413148beb61SHenry Tieman { 414148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 415148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 416148beb61SHenry Tieman } 417148beb61SHenry Tieman 418148beb61SHenry Tieman /** 419148beb61SHenry Tieman * ice_free_fd_res_cntr - Free counter resource for FD type 420148beb61SHenry Tieman * @hw: pointer to the hardware structure 421148beb61SHenry Tieman * @cntr_id: counter index to be freed 422148beb61SHenry Tieman */ 423148beb61SHenry Tieman enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id) 424148beb61SHenry Tieman { 425148beb61SHenry Tieman return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 426148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 427148beb61SHenry Tieman } 428148beb61SHenry Tieman 429148beb61SHenry Tieman /** 430148beb61SHenry Tieman * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries 431148beb61SHenry Tieman * @hw: pointer to the hardware structure 432148beb61SHenry Tieman * @cntr_id: returns counter index 433148beb61SHenry Tieman * @num_fltr: number of filter entries to be allocated 434148beb61SHenry Tieman */ 435148beb61SHenry Tieman enum ice_status 436148beb61SHenry Tieman ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 437148beb61SHenry Tieman { 438148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 439148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 440148beb61SHenry Tieman cntr_id); 441148beb61SHenry Tieman } 442148beb61SHenry Tieman 443148beb61SHenry Tieman /** 444148beb61SHenry Tieman * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries 445148beb61SHenry Tieman * @hw: pointer to the hardware structure 446148beb61SHenry Tieman * @cntr_id: returns counter index 447148beb61SHenry Tieman * @num_fltr: number of filter entries to be allocated 448148beb61SHenry Tieman */ 449148beb61SHenry Tieman enum ice_status 450148beb61SHenry Tieman ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 451148beb61SHenry Tieman { 452148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 453148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 454148beb61SHenry Tieman cntr_id); 455148beb61SHenry Tieman } 4564ab95646SHenry Tieman 4574ab95646SHenry Tieman /** 4584ab95646SHenry Tieman * ice_get_fdir_cnt_all - get the number of Flow Director filters 4594ab95646SHenry Tieman * @hw: hardware data structure 4604ab95646SHenry Tieman * 4614ab95646SHenry Tieman * Returns the number of filters available on device 4624ab95646SHenry Tieman */ 4634ab95646SHenry Tieman int ice_get_fdir_cnt_all(struct ice_hw *hw) 4644ab95646SHenry Tieman { 4654ab95646SHenry Tieman return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; 4664ab95646SHenry Tieman } 4674ab95646SHenry Tieman 4684ab95646SHenry Tieman /** 469165d80d6SHenry Tieman * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer 470165d80d6SHenry Tieman * @pkt: packet buffer 471165d80d6SHenry Tieman * @offset: offset into buffer 472165d80d6SHenry Tieman * @addr: IPv6 address to convert and insert into pkt at offset 473165d80d6SHenry Tieman */ 474165d80d6SHenry Tieman static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) 475165d80d6SHenry Tieman { 476165d80d6SHenry Tieman int idx; 477165d80d6SHenry Tieman 478165d80d6SHenry Tieman for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) 479165d80d6SHenry Tieman memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], 480165d80d6SHenry Tieman sizeof(*addr)); 481165d80d6SHenry Tieman } 482165d80d6SHenry Tieman 483165d80d6SHenry Tieman /** 484b199dddbSQi Zhang * ice_pkt_insert_u8 - insert a u8 value into a memory buffer. 485b199dddbSQi Zhang * @pkt: packet buffer 486b199dddbSQi Zhang * @offset: offset into buffer 487b199dddbSQi Zhang * @data: 8 bit value to convert and insert into pkt at offset 488b199dddbSQi Zhang */ 489b199dddbSQi Zhang static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data) 490b199dddbSQi Zhang { 491b199dddbSQi Zhang memcpy(pkt + offset, &data, sizeof(data)); 492b199dddbSQi Zhang } 493b199dddbSQi Zhang 494b199dddbSQi Zhang /** 495b199dddbSQi Zhang * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6. 496b199dddbSQi Zhang * @pkt: packet buffer 497b199dddbSQi Zhang * @offset: offset into buffer 498b199dddbSQi Zhang * @data: 8 bit value to convert and insert into pkt at offset 499b199dddbSQi Zhang * 500b199dddbSQi Zhang * This function is designed for inserting Traffic Class (TC) for IPv6, 501b199dddbSQi Zhang * since that TC is not aligned in number of bytes. Here we split it out 502b199dddbSQi Zhang * into two part and fill each byte with data copy from pkt, then insert 503b199dddbSQi Zhang * the two bytes data one by one. 504b199dddbSQi Zhang */ 505b199dddbSQi Zhang static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data) 506b199dddbSQi Zhang { 507b199dddbSQi Zhang u8 high, low; 508b199dddbSQi Zhang 509b199dddbSQi Zhang high = (data >> 4) + (*(pkt + offset) & 0xF0); 510b199dddbSQi Zhang memcpy(pkt + offset, &high, sizeof(high)); 511b199dddbSQi Zhang 512b199dddbSQi Zhang low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4); 513b199dddbSQi Zhang memcpy(pkt + offset + 1, &low, sizeof(low)); 514b199dddbSQi Zhang } 515b199dddbSQi Zhang 516b199dddbSQi Zhang /** 517cac2a27cSHenry Tieman * ice_pkt_insert_u16 - insert a be16 value into a memory buffer 518cac2a27cSHenry Tieman * @pkt: packet buffer 519cac2a27cSHenry Tieman * @offset: offset into buffer 520cac2a27cSHenry Tieman * @data: 16 bit value to convert and insert into pkt at offset 521cac2a27cSHenry Tieman */ 522cac2a27cSHenry Tieman static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) 523cac2a27cSHenry Tieman { 524cac2a27cSHenry Tieman memcpy(pkt + offset, &data, sizeof(data)); 525cac2a27cSHenry Tieman } 526cac2a27cSHenry Tieman 527cac2a27cSHenry Tieman /** 528cac2a27cSHenry Tieman * ice_pkt_insert_u32 - insert a be32 value into a memory buffer 529cac2a27cSHenry Tieman * @pkt: packet buffer 530cac2a27cSHenry Tieman * @offset: offset into buffer 531cac2a27cSHenry Tieman * @data: 32 bit value to convert and insert into pkt at offset 532cac2a27cSHenry Tieman */ 533cac2a27cSHenry Tieman static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) 534cac2a27cSHenry Tieman { 535cac2a27cSHenry Tieman memcpy(pkt + offset, &data, sizeof(data)); 536cac2a27cSHenry Tieman } 537cac2a27cSHenry Tieman 538cac2a27cSHenry Tieman /** 539390bd141SQi Zhang * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer. 540390bd141SQi Zhang * @pkt: packet buffer 541390bd141SQi Zhang * @addr: MAC address to convert and insert into pkt at offset 542390bd141SQi Zhang */ 543390bd141SQi Zhang static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr) 544390bd141SQi Zhang { 545390bd141SQi Zhang ether_addr_copy(pkt, addr); 546390bd141SQi Zhang } 547390bd141SQi Zhang 548390bd141SQi Zhang /** 549cac2a27cSHenry Tieman * ice_fdir_get_gen_prgm_pkt - generate a training packet 550cac2a27cSHenry Tieman * @hw: pointer to the hardware structure 551cac2a27cSHenry Tieman * @input: flow director filter data structure 552cac2a27cSHenry Tieman * @pkt: pointer to return filter packet 553cac2a27cSHenry Tieman * @frag: generate a fragment packet 554cac2a27cSHenry Tieman * @tun: true implies generate a tunnel packet 555cac2a27cSHenry Tieman */ 556cac2a27cSHenry Tieman enum ice_status 557cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 558cac2a27cSHenry Tieman u8 *pkt, bool frag, bool tun) 559cac2a27cSHenry Tieman { 560cac2a27cSHenry Tieman enum ice_fltr_ptype flow; 561cac2a27cSHenry Tieman u16 tnl_port; 562cac2a27cSHenry Tieman u8 *loc; 563cac2a27cSHenry Tieman u16 idx; 564cac2a27cSHenry Tieman 565cac2a27cSHenry Tieman if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 566165d80d6SHenry Tieman switch (input->ip.v4.proto) { 567cac2a27cSHenry Tieman case IPPROTO_TCP: 568cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; 569cac2a27cSHenry Tieman break; 570cac2a27cSHenry Tieman case IPPROTO_UDP: 571cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; 572cac2a27cSHenry Tieman break; 573cac2a27cSHenry Tieman case IPPROTO_SCTP: 574cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; 575cac2a27cSHenry Tieman break; 576b199dddbSQi Zhang default: 577cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; 578cac2a27cSHenry Tieman break; 579cac2a27cSHenry Tieman } 580165d80d6SHenry Tieman } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 581165d80d6SHenry Tieman switch (input->ip.v6.proto) { 582165d80d6SHenry Tieman case IPPROTO_TCP: 583165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; 584165d80d6SHenry Tieman break; 585165d80d6SHenry Tieman case IPPROTO_UDP: 586165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; 587165d80d6SHenry Tieman break; 588165d80d6SHenry Tieman case IPPROTO_SCTP: 589165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; 590165d80d6SHenry Tieman break; 591b199dddbSQi Zhang default: 592165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; 593165d80d6SHenry Tieman break; 594165d80d6SHenry Tieman } 595cac2a27cSHenry Tieman } else { 596cac2a27cSHenry Tieman flow = input->flow_type; 597cac2a27cSHenry Tieman } 598cac2a27cSHenry Tieman 599cac2a27cSHenry Tieman for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) 600cac2a27cSHenry Tieman if (ice_fdir_pkt[idx].flow == flow) 601cac2a27cSHenry Tieman break; 602cac2a27cSHenry Tieman if (idx == ICE_FDIR_NUM_PKT) 603cac2a27cSHenry Tieman return ICE_ERR_PARAM; 604cac2a27cSHenry Tieman if (!tun) { 605cac2a27cSHenry Tieman memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len); 606cac2a27cSHenry Tieman loc = pkt; 607cac2a27cSHenry Tieman } else { 608f049b826SJakub Kicinski if (!ice_get_open_tunnel_port(hw, &tnl_port)) 609cac2a27cSHenry Tieman return ICE_ERR_DOES_NOT_EXIST; 610cac2a27cSHenry Tieman if (!ice_fdir_pkt[idx].tun_pkt) 611cac2a27cSHenry Tieman return ICE_ERR_PARAM; 612cac2a27cSHenry Tieman memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 613cac2a27cSHenry Tieman ice_fdir_pkt[idx].tun_pkt_len); 614cac2a27cSHenry Tieman ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, 615cac2a27cSHenry Tieman htons(tnl_port)); 616cac2a27cSHenry Tieman loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; 617cac2a27cSHenry Tieman } 618cac2a27cSHenry Tieman 619cac2a27cSHenry Tieman /* Reverse the src and dst, since the HW expects them to be from Tx 620cac2a27cSHenry Tieman * perspective. The input from user is from Rx filter perspective. 621cac2a27cSHenry Tieman */ 622cac2a27cSHenry Tieman switch (flow) { 623cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_TCP: 624cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 625165d80d6SHenry Tieman input->ip.v4.src_ip); 626cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET, 627165d80d6SHenry Tieman input->ip.v4.src_port); 628cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 629165d80d6SHenry Tieman input->ip.v4.dst_ip); 630cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, 631165d80d6SHenry Tieman input->ip.v4.dst_port); 632b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 633b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 634390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 635cac2a27cSHenry Tieman if (frag) 636cac2a27cSHenry Tieman loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF; 637cac2a27cSHenry Tieman break; 638cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_UDP: 639cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 640165d80d6SHenry Tieman input->ip.v4.src_ip); 641cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 642165d80d6SHenry Tieman input->ip.v4.src_port); 643cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 644165d80d6SHenry Tieman input->ip.v4.dst_ip); 645cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 646165d80d6SHenry Tieman input->ip.v4.dst_port); 647b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 648b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 649390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 650390bd141SQi Zhang ice_pkt_insert_mac_addr(loc + ETH_ALEN, 651390bd141SQi Zhang input->ext_data.src_mac); 652cac2a27cSHenry Tieman break; 653cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: 654cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 655165d80d6SHenry Tieman input->ip.v4.src_ip); 656cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, 657165d80d6SHenry Tieman input->ip.v4.src_port); 658cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 659165d80d6SHenry Tieman input->ip.v4.dst_ip); 660cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, 661165d80d6SHenry Tieman input->ip.v4.dst_port); 662b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 663b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 664390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 665cac2a27cSHenry Tieman break; 666cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: 667cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 668165d80d6SHenry Tieman input->ip.v4.src_ip); 669cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 670165d80d6SHenry Tieman input->ip.v4.dst_ip); 671b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 672b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 673b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET, 674b199dddbSQi Zhang input->ip.v4.proto); 675390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 676cac2a27cSHenry Tieman break; 677165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_TCP: 678165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 679165d80d6SHenry Tieman input->ip.v6.src_ip); 680165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 681165d80d6SHenry Tieman input->ip.v6.dst_ip); 682165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET, 683165d80d6SHenry Tieman input->ip.v6.src_port); 684165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, 685165d80d6SHenry Tieman input->ip.v6.dst_port); 686b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 687b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 688390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 689165d80d6SHenry Tieman break; 690165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_UDP: 691165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 692165d80d6SHenry Tieman input->ip.v6.src_ip); 693165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 694165d80d6SHenry Tieman input->ip.v6.dst_ip); 695165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET, 696165d80d6SHenry Tieman input->ip.v6.src_port); 697165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 698165d80d6SHenry Tieman input->ip.v6.dst_port); 699b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 700b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 701390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 702165d80d6SHenry Tieman break; 703165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: 704165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 705165d80d6SHenry Tieman input->ip.v6.src_ip); 706165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 707165d80d6SHenry Tieman input->ip.v6.dst_ip); 708165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, 709165d80d6SHenry Tieman input->ip.v6.src_port); 710165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, 711165d80d6SHenry Tieman input->ip.v6.dst_port); 712b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 713b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 714390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 715165d80d6SHenry Tieman break; 716165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: 717165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 718165d80d6SHenry Tieman input->ip.v6.src_ip); 719165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 720165d80d6SHenry Tieman input->ip.v6.dst_ip); 721b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 722b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 723b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET, 724b199dddbSQi Zhang input->ip.v6.proto); 725390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 726165d80d6SHenry Tieman break; 727cac2a27cSHenry Tieman default: 728cac2a27cSHenry Tieman return ICE_ERR_PARAM; 729cac2a27cSHenry Tieman } 730cac2a27cSHenry Tieman 7312c57ffcbSHenry Tieman if (input->flex_fltr) 7322c57ffcbSHenry Tieman ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word); 7332c57ffcbSHenry Tieman 734cac2a27cSHenry Tieman return 0; 735cac2a27cSHenry Tieman } 736cac2a27cSHenry Tieman 737cac2a27cSHenry Tieman /** 738cac2a27cSHenry Tieman * ice_fdir_has_frag - does flow type have 2 ptypes 739cac2a27cSHenry Tieman * @flow: flow ptype 740cac2a27cSHenry Tieman * 741cac2a27cSHenry Tieman * returns true is there is a fragment packet for this ptype 742cac2a27cSHenry Tieman */ 743cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow) 744cac2a27cSHenry Tieman { 745cac2a27cSHenry Tieman if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 746cac2a27cSHenry Tieman return true; 747cac2a27cSHenry Tieman else 748cac2a27cSHenry Tieman return false; 749cac2a27cSHenry Tieman } 750cac2a27cSHenry Tieman 751cac2a27cSHenry Tieman /** 7524ab95646SHenry Tieman * ice_fdir_find_by_idx - find filter with idx 7534ab95646SHenry Tieman * @hw: pointer to hardware structure 7544ab95646SHenry Tieman * @fltr_idx: index to find. 7554ab95646SHenry Tieman * 7564ab95646SHenry Tieman * Returns pointer to filter if found or null 7574ab95646SHenry Tieman */ 7584ab95646SHenry Tieman struct ice_fdir_fltr * 7594ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) 7604ab95646SHenry Tieman { 7614ab95646SHenry Tieman struct ice_fdir_fltr *rule; 7624ab95646SHenry Tieman 7634ab95646SHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 7644ab95646SHenry Tieman /* rule ID found in the list */ 7654ab95646SHenry Tieman if (fltr_idx == rule->fltr_id) 7664ab95646SHenry Tieman return rule; 7674ab95646SHenry Tieman if (fltr_idx < rule->fltr_id) 7684ab95646SHenry Tieman break; 7694ab95646SHenry Tieman } 7704ab95646SHenry Tieman return NULL; 7714ab95646SHenry Tieman } 772cac2a27cSHenry Tieman 773cac2a27cSHenry Tieman /** 774cac2a27cSHenry Tieman * ice_fdir_list_add_fltr - add a new node to the flow director filter list 775cac2a27cSHenry Tieman * @hw: hardware structure 776cac2a27cSHenry Tieman * @fltr: filter node to add to structure 777cac2a27cSHenry Tieman */ 778cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) 779cac2a27cSHenry Tieman { 780cac2a27cSHenry Tieman struct ice_fdir_fltr *rule, *parent = NULL; 781cac2a27cSHenry Tieman 782cac2a27cSHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 783cac2a27cSHenry Tieman /* rule ID found or pass its spot in the list */ 784cac2a27cSHenry Tieman if (rule->fltr_id >= fltr->fltr_id) 785cac2a27cSHenry Tieman break; 786cac2a27cSHenry Tieman parent = rule; 787cac2a27cSHenry Tieman } 788cac2a27cSHenry Tieman 789cac2a27cSHenry Tieman if (parent) 790cac2a27cSHenry Tieman list_add(&fltr->fltr_node, &parent->fltr_node); 791cac2a27cSHenry Tieman else 792cac2a27cSHenry Tieman list_add(&fltr->fltr_node, &hw->fdir_list_head); 793cac2a27cSHenry Tieman } 794cac2a27cSHenry Tieman 795cac2a27cSHenry Tieman /** 796cac2a27cSHenry Tieman * ice_fdir_update_cntrs - increment / decrement filter counter 797cac2a27cSHenry Tieman * @hw: pointer to hardware structure 798cac2a27cSHenry Tieman * @flow: filter flow type 799cac2a27cSHenry Tieman * @add: true implies filters added 800cac2a27cSHenry Tieman */ 801cac2a27cSHenry Tieman void 802cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add) 803cac2a27cSHenry Tieman { 804cac2a27cSHenry Tieman int incr; 805cac2a27cSHenry Tieman 806cac2a27cSHenry Tieman incr = add ? 1 : -1; 807cac2a27cSHenry Tieman hw->fdir_active_fltr += incr; 808cac2a27cSHenry Tieman 809cac2a27cSHenry Tieman if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) 810cac2a27cSHenry Tieman ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow); 811cac2a27cSHenry Tieman else 812cac2a27cSHenry Tieman hw->fdir_fltr_cnt[flow] += incr; 813cac2a27cSHenry Tieman } 814cac2a27cSHenry Tieman 815cac2a27cSHenry Tieman /** 816165d80d6SHenry Tieman * ice_cmp_ipv6_addr - compare 2 IP v6 addresses 817165d80d6SHenry Tieman * @a: IP v6 address 818165d80d6SHenry Tieman * @b: IP v6 address 819165d80d6SHenry Tieman * 820165d80d6SHenry Tieman * Returns 0 on equal, returns non-0 if different 821165d80d6SHenry Tieman */ 822165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) 823165d80d6SHenry Tieman { 824165d80d6SHenry Tieman return memcmp(a, b, 4 * sizeof(__be32)); 825165d80d6SHenry Tieman } 826165d80d6SHenry Tieman 827165d80d6SHenry Tieman /** 828cac2a27cSHenry Tieman * ice_fdir_comp_rules - compare 2 filters 829cac2a27cSHenry Tieman * @a: a Flow Director filter data structure 830cac2a27cSHenry Tieman * @b: a Flow Director filter data structure 831165d80d6SHenry Tieman * @v6: bool true if v6 filter 832cac2a27cSHenry Tieman * 833cac2a27cSHenry Tieman * Returns true if the filters match 834cac2a27cSHenry Tieman */ 835cac2a27cSHenry Tieman static bool 836165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) 837cac2a27cSHenry Tieman { 838cac2a27cSHenry Tieman enum ice_fltr_ptype flow_type = a->flow_type; 839cac2a27cSHenry Tieman 840cac2a27cSHenry Tieman /* The calling function already checks that the two filters have the 841cac2a27cSHenry Tieman * same flow_type. 842cac2a27cSHenry Tieman */ 843165d80d6SHenry Tieman if (!v6) { 844cac2a27cSHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 845cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 846cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { 847165d80d6SHenry Tieman if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 848165d80d6SHenry Tieman a->ip.v4.src_ip == b->ip.v4.src_ip && 849165d80d6SHenry Tieman a->ip.v4.dst_port == b->ip.v4.dst_port && 850165d80d6SHenry Tieman a->ip.v4.src_port == b->ip.v4.src_port) 851cac2a27cSHenry Tieman return true; 852cac2a27cSHenry Tieman } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 853165d80d6SHenry Tieman if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 854165d80d6SHenry Tieman a->ip.v4.src_ip == b->ip.v4.src_ip && 855165d80d6SHenry Tieman a->ip.v4.l4_header == b->ip.v4.l4_header && 856165d80d6SHenry Tieman a->ip.v4.proto == b->ip.v4.proto && 857165d80d6SHenry Tieman a->ip.v4.ip_ver == b->ip.v4.ip_ver && 858165d80d6SHenry Tieman a->ip.v4.tos == b->ip.v4.tos) 859cac2a27cSHenry Tieman return true; 860cac2a27cSHenry Tieman } 861165d80d6SHenry Tieman } else { 862165d80d6SHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || 863165d80d6SHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || 864165d80d6SHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { 865165d80d6SHenry Tieman if (a->ip.v6.dst_port == b->ip.v6.dst_port && 866165d80d6SHenry Tieman a->ip.v6.src_port == b->ip.v6.src_port && 867165d80d6SHenry Tieman !ice_cmp_ipv6_addr(a->ip.v6.dst_ip, 868165d80d6SHenry Tieman b->ip.v6.dst_ip) && 869165d80d6SHenry Tieman !ice_cmp_ipv6_addr(a->ip.v6.src_ip, 870165d80d6SHenry Tieman b->ip.v6.src_ip)) 871165d80d6SHenry Tieman return true; 872165d80d6SHenry Tieman } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 873165d80d6SHenry Tieman if (a->ip.v6.dst_port == b->ip.v6.dst_port && 874165d80d6SHenry Tieman a->ip.v6.src_port == b->ip.v6.src_port) 875165d80d6SHenry Tieman return true; 876165d80d6SHenry Tieman } 877165d80d6SHenry Tieman } 878cac2a27cSHenry Tieman 879cac2a27cSHenry Tieman return false; 880cac2a27cSHenry Tieman } 881cac2a27cSHenry Tieman 882cac2a27cSHenry Tieman /** 883cac2a27cSHenry Tieman * ice_fdir_is_dup_fltr - test if filter is already in list for PF 884cac2a27cSHenry Tieman * @hw: hardware data structure 885cac2a27cSHenry Tieman * @input: Flow Director filter data structure 886cac2a27cSHenry Tieman * 887cac2a27cSHenry Tieman * Returns true if the filter is found in the list 888cac2a27cSHenry Tieman */ 889cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) 890cac2a27cSHenry Tieman { 891cac2a27cSHenry Tieman struct ice_fdir_fltr *rule; 892cac2a27cSHenry Tieman bool ret = false; 893cac2a27cSHenry Tieman 894cac2a27cSHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 895cac2a27cSHenry Tieman enum ice_fltr_ptype flow_type; 896cac2a27cSHenry Tieman 897cac2a27cSHenry Tieman if (rule->flow_type != input->flow_type) 898cac2a27cSHenry Tieman continue; 899cac2a27cSHenry Tieman 900cac2a27cSHenry Tieman flow_type = input->flow_type; 901cac2a27cSHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 902cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 903cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || 904cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 905165d80d6SHenry Tieman ret = ice_fdir_comp_rules(rule, input, false); 906165d80d6SHenry Tieman else 907165d80d6SHenry Tieman ret = ice_fdir_comp_rules(rule, input, true); 908cac2a27cSHenry Tieman if (ret) { 909cac2a27cSHenry Tieman if (rule->fltr_id == input->fltr_id && 910cac2a27cSHenry Tieman rule->q_index != input->q_index) 911cac2a27cSHenry Tieman ret = false; 912cac2a27cSHenry Tieman else 913cac2a27cSHenry Tieman break; 914cac2a27cSHenry Tieman } 915cac2a27cSHenry Tieman } 916cac2a27cSHenry Tieman 917cac2a27cSHenry Tieman return ret; 918cac2a27cSHenry Tieman } 919