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 43ef9e4cc5SQi Zhang static const u8 ice_fdir_udp4_gtpu4_pkt[] = { 44ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 46ef9e4cc5SQi Zhang 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 47ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48ef9e4cc5SQi Zhang 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 49ef9e4cc5SQi Zhang 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 50ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 51ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 52ef9e4cc5SQi Zhang 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 53ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55ef9e4cc5SQi Zhang 0x00, 0x00, 56ef9e4cc5SQi Zhang }; 57ef9e4cc5SQi Zhang 58ef9e4cc5SQi Zhang static const u8 ice_fdir_tcp4_gtpu4_pkt[] = { 59ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 60ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 61ef9e4cc5SQi Zhang 0x00, 0x58, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 62ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63ef9e4cc5SQi Zhang 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 64ef9e4cc5SQi Zhang 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 65ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 66ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 67ef9e4cc5SQi Zhang 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 68ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72ef9e4cc5SQi Zhang }; 73ef9e4cc5SQi Zhang 74ef9e4cc5SQi Zhang static const u8 ice_fdir_icmp4_gtpu4_pkt[] = { 75ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 76ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 77ef9e4cc5SQi Zhang 0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 78ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79ef9e4cc5SQi Zhang 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 80ef9e4cc5SQi Zhang 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 81ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 82ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 83ef9e4cc5SQi Zhang 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 84ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86ef9e4cc5SQi Zhang 0x00, 0x00, 87ef9e4cc5SQi Zhang }; 88ef9e4cc5SQi Zhang 89ef9e4cc5SQi Zhang static const u8 ice_fdir_ipv4_gtpu4_pkt[] = { 90ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 92ef9e4cc5SQi Zhang 0x00, 0x44, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 93ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94ef9e4cc5SQi Zhang 0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00, 95ef9e4cc5SQi Zhang 0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00, 96ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00, 97ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 98ef9e4cc5SQi Zhang 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 99ef9e4cc5SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100ef9e4cc5SQi Zhang 0x00, 0x00, 101ef9e4cc5SQi Zhang }; 102ef9e4cc5SQi Zhang 103213528feSQi Zhang static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = { 104213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 106213528feSQi Zhang 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73, 107213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 108213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 109213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 110213528feSQi Zhang }; 111213528feSQi Zhang 112213528feSQi Zhang static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = { 113213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 114213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 115213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00, 116213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 118213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 120213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121213528feSQi Zhang 0x00, 0x00, 122213528feSQi Zhang }; 123213528feSQi Zhang 124213528feSQi Zhang static const u8 ice_fdir_ipv4_esp_pkt[] = { 125213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 127213528feSQi Zhang 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32, 128213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 129213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 130213528feSQi Zhang 0x00, 0x00 131213528feSQi Zhang }; 132213528feSQi Zhang 133213528feSQi Zhang static const u8 ice_fdir_ipv6_esp_pkt[] = { 134213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 136213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 137213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 138213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 139213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 140213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 141213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 142213528feSQi Zhang }; 143213528feSQi Zhang 144213528feSQi Zhang static const u8 ice_fdir_ipv4_ah_pkt[] = { 145213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 146213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 147213528feSQi Zhang 0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33, 148213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 149213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 150213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 151213528feSQi Zhang 0x00, 0x00 152213528feSQi Zhang }; 153213528feSQi Zhang 154213528feSQi Zhang static const u8 ice_fdir_ipv6_ah_pkt[] = { 155213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 156213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 157213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00, 158213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 159213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 160213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 161213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 162213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164213528feSQi Zhang }; 165213528feSQi Zhang 166213528feSQi Zhang static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = { 167213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 168213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 169213528feSQi Zhang 0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 170213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 171213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00, 172213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173213528feSQi Zhang 0x00, 0x00, 174213528feSQi Zhang }; 175213528feSQi Zhang 176213528feSQi Zhang static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = { 177213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 178213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 179213528feSQi Zhang 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 180213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 181213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 182213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 183213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 184213528feSQi Zhang 0x11, 0x94, 0x00, 0x00, 0x00, 0x08, 185213528feSQi Zhang }; 186213528feSQi Zhang 187213528feSQi Zhang static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = { 188213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 189213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 190213528feSQi Zhang 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 191213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 192213528feSQi Zhang 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 193213528feSQi Zhang 0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00, 194213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 195213528feSQi Zhang 0x00, 0x00, 196213528feSQi Zhang }; 197213528feSQi Zhang 198213528feSQi Zhang static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = { 199213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 200213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 201213528feSQi Zhang 0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 202213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 203213528feSQi Zhang 0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00, 204213528feSQi Zhang 0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00, 205213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 206213528feSQi Zhang 0x00, 0x00, 207213528feSQi Zhang }; 208213528feSQi Zhang 209213528feSQi Zhang static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = { 210213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 211213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 212213528feSQi Zhang 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 213213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 214213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 215213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 216213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 217213528feSQi Zhang 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 218213528feSQi Zhang 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 219213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 220213528feSQi Zhang }; 221213528feSQi Zhang 222213528feSQi Zhang static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = { 223213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 224213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 225213528feSQi Zhang 0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00, 226213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 227213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 228213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 229213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65, 230213528feSQi Zhang 0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 231213528feSQi Zhang 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 232213528feSQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 233213528feSQi Zhang }; 234213528feSQi Zhang 23521606584SQi Zhang static const u8 ice_fdir_non_ip_l2_pkt[] = { 23621606584SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23721606584SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23821606584SQi Zhang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23921606584SQi Zhang }; 24021606584SQi Zhang 241165d80d6SHenry Tieman static const u8 ice_fdir_tcpv6_pkt[] = { 242165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 243165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 244165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00, 245165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 246165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 247165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 248165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 249165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 250165d80d6SHenry Tieman 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 251165d80d6SHenry Tieman 0x00, 0x00, 252165d80d6SHenry Tieman }; 253165d80d6SHenry Tieman 254165d80d6SHenry Tieman static const u8 ice_fdir_udpv6_pkt[] = { 255165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 256165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 257165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00, 258165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 259165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 260165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 261165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 262165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 263165d80d6SHenry Tieman }; 264165d80d6SHenry Tieman 265165d80d6SHenry Tieman static const u8 ice_fdir_sctpv6_pkt[] = { 266165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 267165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 268165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00, 269165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 270165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 271165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 272165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 273165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 274165d80d6SHenry Tieman 0x00, 0x00, 275165d80d6SHenry Tieman }; 276165d80d6SHenry Tieman 277165d80d6SHenry Tieman static const u8 ice_fdir_ipv6_pkt[] = { 278165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 279165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00, 280165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00, 281165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 282165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 283165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 284165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 285165d80d6SHenry Tieman }; 286165d80d6SHenry Tieman 287cac2a27cSHenry Tieman static const u8 ice_fdir_tcp4_tun_pkt[] = { 288cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 289cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 290cac2a27cSHenry Tieman 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 291cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 292cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 293cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 294cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 295cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 296cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 297cac2a27cSHenry Tieman 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 298cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 299cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 300cac2a27cSHenry Tieman 0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 301cac2a27cSHenry Tieman }; 302cac2a27cSHenry Tieman 303cac2a27cSHenry Tieman static const u8 ice_fdir_udp4_tun_pkt[] = { 304cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 305cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 306cac2a27cSHenry Tieman 0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 307cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 308cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 309cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 310cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 311cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 312cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 313cac2a27cSHenry Tieman 0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 314cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 315cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 316cac2a27cSHenry Tieman }; 317cac2a27cSHenry Tieman 318cac2a27cSHenry Tieman static const u8 ice_fdir_sctp4_tun_pkt[] = { 319cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 320cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 321cac2a27cSHenry Tieman 0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 322cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 323cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 324cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 325cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 326cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 327cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 328cac2a27cSHenry Tieman 0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 329cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 330cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 331cac2a27cSHenry Tieman }; 332cac2a27cSHenry Tieman 333cac2a27cSHenry Tieman static const u8 ice_fdir_ip4_tun_pkt[] = { 334cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 335cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 336cac2a27cSHenry Tieman 0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 337cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 338cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 339cac2a27cSHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 340cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 341cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 342cac2a27cSHenry Tieman 0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 343cac2a27cSHenry Tieman 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 344cac2a27cSHenry Tieman 0x00, 0x00, 0x00, 0x00, 345cac2a27cSHenry Tieman }; 346cac2a27cSHenry Tieman 347165d80d6SHenry Tieman static const u8 ice_fdir_tcp6_tun_pkt[] = { 348165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 349165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 350165d80d6SHenry Tieman 0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 351165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 352165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 353165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 354165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 355165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 356165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 357165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 358165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 359165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 360165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 361165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 362165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 363165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 364165d80d6SHenry Tieman }; 365165d80d6SHenry Tieman 366165d80d6SHenry Tieman static const u8 ice_fdir_udp6_tun_pkt[] = { 367165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 368165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 369165d80d6SHenry Tieman 0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 370165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 371165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 372165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 373165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 374165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 375165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 376165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 377165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 378165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 379165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 380165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 381165d80d6SHenry Tieman }; 382165d80d6SHenry Tieman 383165d80d6SHenry Tieman static const u8 ice_fdir_sctp6_tun_pkt[] = { 384165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 385165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 386165d80d6SHenry Tieman 0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 387165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 388165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 389165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 390165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 391165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 392165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40, 393165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 394165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 395165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 396165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 397165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 398165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 399165d80d6SHenry Tieman }; 400165d80d6SHenry Tieman 401165d80d6SHenry Tieman static const u8 ice_fdir_ip6_tun_pkt[] = { 402165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 403165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00, 404165d80d6SHenry Tieman 0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11, 405165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 407165d80d6SHenry Tieman 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00, 408165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 409165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 410165d80d6SHenry Tieman 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 411165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 412165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 413165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 414165d80d6SHenry Tieman 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 415165d80d6SHenry Tieman }; 416165d80d6SHenry Tieman 417cac2a27cSHenry Tieman /* Flow Director no-op training packet table */ 418cac2a27cSHenry Tieman static const struct ice_fdir_base_pkt ice_fdir_pkt[] = { 419cac2a27cSHenry Tieman { 420cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_TCP, 421cac2a27cSHenry Tieman sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt, 422cac2a27cSHenry Tieman sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt, 423cac2a27cSHenry Tieman }, 424cac2a27cSHenry Tieman { 425cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_UDP, 426cac2a27cSHenry Tieman sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt, 427cac2a27cSHenry Tieman sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt, 428cac2a27cSHenry Tieman }, 429cac2a27cSHenry Tieman { 430cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_SCTP, 431cac2a27cSHenry Tieman sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt, 432cac2a27cSHenry Tieman sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt, 433cac2a27cSHenry Tieman }, 434cac2a27cSHenry Tieman { 435cac2a27cSHenry Tieman ICE_FLTR_PTYPE_NONF_IPV4_OTHER, 436cac2a27cSHenry Tieman sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt, 437cac2a27cSHenry Tieman sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt, 438cac2a27cSHenry Tieman }, 439165d80d6SHenry Tieman { 440ef9e4cc5SQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP, 441ef9e4cc5SQi Zhang sizeof(ice_fdir_udp4_gtpu4_pkt), 442ef9e4cc5SQi Zhang ice_fdir_udp4_gtpu4_pkt, 443ef9e4cc5SQi Zhang sizeof(ice_fdir_udp4_gtpu4_pkt), 444ef9e4cc5SQi Zhang ice_fdir_udp4_gtpu4_pkt, 445ef9e4cc5SQi Zhang }, 446ef9e4cc5SQi Zhang { 447ef9e4cc5SQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP, 448ef9e4cc5SQi Zhang sizeof(ice_fdir_tcp4_gtpu4_pkt), 449ef9e4cc5SQi Zhang ice_fdir_tcp4_gtpu4_pkt, 450ef9e4cc5SQi Zhang sizeof(ice_fdir_tcp4_gtpu4_pkt), 451ef9e4cc5SQi Zhang ice_fdir_tcp4_gtpu4_pkt, 452ef9e4cc5SQi Zhang }, 453ef9e4cc5SQi Zhang { 454ef9e4cc5SQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP, 455ef9e4cc5SQi Zhang sizeof(ice_fdir_icmp4_gtpu4_pkt), 456ef9e4cc5SQi Zhang ice_fdir_icmp4_gtpu4_pkt, 457ef9e4cc5SQi Zhang sizeof(ice_fdir_icmp4_gtpu4_pkt), 458ef9e4cc5SQi Zhang ice_fdir_icmp4_gtpu4_pkt, 459ef9e4cc5SQi Zhang }, 460ef9e4cc5SQi Zhang { 461ef9e4cc5SQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER, 462ef9e4cc5SQi Zhang sizeof(ice_fdir_ipv4_gtpu4_pkt), 463ef9e4cc5SQi Zhang ice_fdir_ipv4_gtpu4_pkt, 464ef9e4cc5SQi Zhang sizeof(ice_fdir_ipv4_gtpu4_pkt), 465ef9e4cc5SQi Zhang ice_fdir_ipv4_gtpu4_pkt, 466ef9e4cc5SQi Zhang }, 467ef9e4cc5SQi Zhang { 468213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3, 469213528feSQi Zhang sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 470213528feSQi Zhang sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt, 471213528feSQi Zhang }, 472213528feSQi Zhang { 473213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3, 474213528feSQi Zhang sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 475213528feSQi Zhang sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt, 476213528feSQi Zhang }, 477213528feSQi Zhang { 478213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_ESP, 479213528feSQi Zhang sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 480213528feSQi Zhang sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt, 481213528feSQi Zhang }, 482213528feSQi Zhang { 483213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV6_ESP, 484213528feSQi Zhang sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 485213528feSQi Zhang sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt, 486213528feSQi Zhang }, 487213528feSQi Zhang { 488213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_AH, 489213528feSQi Zhang sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 490213528feSQi Zhang sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt, 491213528feSQi Zhang }, 492213528feSQi Zhang { 493213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV6_AH, 494213528feSQi Zhang sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 495213528feSQi Zhang sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt, 496213528feSQi Zhang }, 497213528feSQi Zhang { 498213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP, 499213528feSQi Zhang sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 500213528feSQi Zhang ice_fdir_ipv4_nat_t_esp_pkt, 501213528feSQi Zhang sizeof(ice_fdir_ipv4_nat_t_esp_pkt), 502213528feSQi Zhang ice_fdir_ipv4_nat_t_esp_pkt, 503213528feSQi Zhang }, 504213528feSQi Zhang { 505213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP, 506213528feSQi Zhang sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 507213528feSQi Zhang ice_fdir_ipv6_nat_t_esp_pkt, 508213528feSQi Zhang sizeof(ice_fdir_ipv6_nat_t_esp_pkt), 509213528feSQi Zhang ice_fdir_ipv6_nat_t_esp_pkt, 510213528feSQi Zhang }, 511213528feSQi Zhang { 512213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE, 513213528feSQi Zhang sizeof(ice_fdir_ipv4_pfcp_node_pkt), 514213528feSQi Zhang ice_fdir_ipv4_pfcp_node_pkt, 515213528feSQi Zhang sizeof(ice_fdir_ipv4_pfcp_node_pkt), 516213528feSQi Zhang ice_fdir_ipv4_pfcp_node_pkt, 517213528feSQi Zhang }, 518213528feSQi Zhang { 519213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION, 520213528feSQi Zhang sizeof(ice_fdir_ipv4_pfcp_session_pkt), 521213528feSQi Zhang ice_fdir_ipv4_pfcp_session_pkt, 522213528feSQi Zhang sizeof(ice_fdir_ipv4_pfcp_session_pkt), 523213528feSQi Zhang ice_fdir_ipv4_pfcp_session_pkt, 524213528feSQi Zhang }, 525213528feSQi Zhang { 526213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE, 527213528feSQi Zhang sizeof(ice_fdir_ipv6_pfcp_node_pkt), 528213528feSQi Zhang ice_fdir_ipv6_pfcp_node_pkt, 529213528feSQi Zhang sizeof(ice_fdir_ipv6_pfcp_node_pkt), 530213528feSQi Zhang ice_fdir_ipv6_pfcp_node_pkt, 531213528feSQi Zhang }, 532213528feSQi Zhang { 533213528feSQi Zhang ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION, 534213528feSQi Zhang sizeof(ice_fdir_ipv6_pfcp_session_pkt), 535213528feSQi Zhang ice_fdir_ipv6_pfcp_session_pkt, 536213528feSQi Zhang sizeof(ice_fdir_ipv6_pfcp_session_pkt), 537213528feSQi Zhang ice_fdir_ipv6_pfcp_session_pkt, 538213528feSQi Zhang }, 539213528feSQi Zhang { 54021606584SQi Zhang ICE_FLTR_PTYPE_NON_IP_L2, 54121606584SQi Zhang sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 54221606584SQi Zhang sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt, 54321606584SQi Zhang }, 54421606584SQi Zhang { 545165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_TCP, 546165d80d6SHenry Tieman sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt, 547165d80d6SHenry Tieman sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt, 548165d80d6SHenry Tieman }, 549165d80d6SHenry Tieman { 550165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_UDP, 551165d80d6SHenry Tieman sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt, 552165d80d6SHenry Tieman sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt, 553165d80d6SHenry Tieman }, 554165d80d6SHenry Tieman { 555165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_SCTP, 556165d80d6SHenry Tieman sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt, 557165d80d6SHenry Tieman sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt, 558165d80d6SHenry Tieman }, 559165d80d6SHenry Tieman { 560165d80d6SHenry Tieman ICE_FLTR_PTYPE_NONF_IPV6_OTHER, 561165d80d6SHenry Tieman sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt, 562165d80d6SHenry Tieman sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt, 563165d80d6SHenry Tieman }, 564cac2a27cSHenry Tieman }; 565cac2a27cSHenry Tieman 566cac2a27cSHenry Tieman #define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt) 567cac2a27cSHenry Tieman 568cac2a27cSHenry Tieman /** 569cac2a27cSHenry Tieman * ice_set_dflt_val_fd_desc 570cac2a27cSHenry Tieman * @fd_fltr_ctx: pointer to fd filter descriptor 571cac2a27cSHenry Tieman */ 572cac2a27cSHenry Tieman static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx) 573cac2a27cSHenry Tieman { 574cac2a27cSHenry Tieman fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 575cac2a27cSHenry Tieman fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL; 576cac2a27cSHenry Tieman fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST; 577cac2a27cSHenry Tieman fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS; 578cac2a27cSHenry Tieman fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE; 579cac2a27cSHenry Tieman fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX; 580cac2a27cSHenry Tieman fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1; 581cac2a27cSHenry Tieman fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT; 582cac2a27cSHenry Tieman fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO; 583cac2a27cSHenry Tieman fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE; 584cac2a27cSHenry Tieman fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0; 585cac2a27cSHenry Tieman fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0; 586cac2a27cSHenry Tieman fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG; 587cac2a27cSHenry Tieman fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO; 588cac2a27cSHenry Tieman fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO; 589cac2a27cSHenry Tieman fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET; 590cac2a27cSHenry Tieman fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE; 591cac2a27cSHenry Tieman fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD; 592cac2a27cSHenry Tieman fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO; 593cac2a27cSHenry Tieman } 594cac2a27cSHenry Tieman 595cac2a27cSHenry Tieman /** 596cac2a27cSHenry Tieman * ice_set_fd_desc_val 597cac2a27cSHenry Tieman * @ctx: pointer to fd filter descriptor context 598cac2a27cSHenry Tieman * @fdir_desc: populated with fd filter descriptor values 599cac2a27cSHenry Tieman */ 600cac2a27cSHenry Tieman static void 601cac2a27cSHenry Tieman ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx, 602cac2a27cSHenry Tieman struct ice_fltr_desc *fdir_desc) 603cac2a27cSHenry Tieman { 604cac2a27cSHenry Tieman u64 qword; 605cac2a27cSHenry Tieman 606cac2a27cSHenry Tieman /* prep QW0 of FD filter programming desc */ 607cac2a27cSHenry Tieman qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) & 608cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_QINDEX_M; 609cac2a27cSHenry Tieman qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) & 610cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_COMP_Q_M; 611cac2a27cSHenry Tieman qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) & 612cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_COMP_REPORT_M; 613cac2a27cSHenry Tieman qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) & 614cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FD_SPACE_M; 615cac2a27cSHenry Tieman qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) & 616cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_STAT_CNT_M; 617cac2a27cSHenry Tieman qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) & 618cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_STAT_ENA_M; 619cac2a27cSHenry Tieman qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) & 620cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_EVICT_ENA_M; 621cac2a27cSHenry Tieman qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) & 622cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_TO_Q_M; 623cac2a27cSHenry Tieman qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) & 624cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_TO_Q_PRI_M; 625cac2a27cSHenry Tieman qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) & 626cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_DPU_RECIPE_M; 627cac2a27cSHenry Tieman qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) & 628cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_DROP_M; 629cac2a27cSHenry Tieman qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) & 630cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FLEX_PRI_M; 631cac2a27cSHenry Tieman qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) & 632cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FLEX_MDID_M; 633cac2a27cSHenry Tieman qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) & 634cac2a27cSHenry Tieman ICE_FXD_FLTR_QW0_FLEX_VAL_M; 635cac2a27cSHenry Tieman fdir_desc->qidx_compq_space_stat = cpu_to_le64(qword); 636cac2a27cSHenry Tieman 637cac2a27cSHenry Tieman /* prep QW1 of FD filter programming desc */ 638cac2a27cSHenry Tieman qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) & 639cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_DTYPE_M; 640cac2a27cSHenry Tieman qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) & 641cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PCMD_M; 642cac2a27cSHenry Tieman qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) & 643cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PROF_PRI_M; 644cac2a27cSHenry Tieman qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) & 645cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PROF_M; 646cac2a27cSHenry Tieman qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) & 647cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FD_VSI_M; 648cac2a27cSHenry Tieman qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) & 649cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_SWAP_M; 650cac2a27cSHenry Tieman qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) & 651cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FDID_PRI_M; 652cac2a27cSHenry Tieman qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) & 653cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FDID_MDID_M; 654cac2a27cSHenry Tieman qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) & 655cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_FDID_M; 656cac2a27cSHenry Tieman fdir_desc->dtype_cmd_vsi_fdid = cpu_to_le64(qword); 657cac2a27cSHenry Tieman } 658cac2a27cSHenry Tieman 659cac2a27cSHenry Tieman /** 660cac2a27cSHenry Tieman * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct 661cac2a27cSHenry Tieman * @hw: pointer to the hardware structure 662cac2a27cSHenry Tieman * @input: filter 663cac2a27cSHenry Tieman * @fdesc: filter descriptor 664cac2a27cSHenry Tieman * @add: if add is true, this is an add operation, false implies delete 665cac2a27cSHenry Tieman */ 666cac2a27cSHenry Tieman void 667cac2a27cSHenry Tieman ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input, 668cac2a27cSHenry Tieman struct ice_fltr_desc *fdesc, bool add) 669cac2a27cSHenry Tieman { 670cac2a27cSHenry Tieman struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 }; 671cac2a27cSHenry Tieman 672cac2a27cSHenry Tieman /* set default context info */ 673cac2a27cSHenry Tieman ice_set_dflt_val_fd_desc(&fdir_fltr_ctx); 674cac2a27cSHenry Tieman 675cac2a27cSHenry Tieman /* change sideband filtering values */ 676cac2a27cSHenry Tieman fdir_fltr_ctx.fdid = input->fltr_id; 677cac2a27cSHenry Tieman if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) { 678cac2a27cSHenry Tieman fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES; 679cac2a27cSHenry Tieman fdir_fltr_ctx.qindex = 0; 680346bf250SQi Zhang } else if (input->dest_ctl == 681346bf250SQi Zhang ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) { 682346bf250SQi Zhang fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 683346bf250SQi Zhang fdir_fltr_ctx.qindex = 0; 684cac2a27cSHenry Tieman } else { 685346bf250SQi Zhang if (input->dest_ctl == 686346bf250SQi Zhang ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP) 687346bf250SQi Zhang fdir_fltr_ctx.toq = input->q_region; 688cac2a27cSHenry Tieman fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO; 689cac2a27cSHenry Tieman fdir_fltr_ctx.qindex = input->q_index; 690cac2a27cSHenry Tieman } 6911f7ea1cdSQi Zhang fdir_fltr_ctx.cnt_ena = input->cnt_ena; 692cac2a27cSHenry Tieman fdir_fltr_ctx.cnt_index = input->cnt_index; 693cac2a27cSHenry Tieman fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi); 694cac2a27cSHenry Tieman fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE; 695346bf250SQi Zhang if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) 696346bf250SQi Zhang fdir_fltr_ctx.toq_prio = 0; 697346bf250SQi Zhang else 698cac2a27cSHenry Tieman fdir_fltr_ctx.toq_prio = 3; 699cac2a27cSHenry Tieman fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD : 700cac2a27cSHenry Tieman ICE_FXD_FLTR_QW1_PCMD_REMOVE; 701cac2a27cSHenry Tieman fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET; 702cac2a27cSHenry Tieman fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO; 7031f7ea1cdSQi Zhang fdir_fltr_ctx.comp_report = input->comp_report; 7041f7ea1cdSQi Zhang fdir_fltr_ctx.fdid_prio = input->fdid_prio; 705cac2a27cSHenry Tieman fdir_fltr_ctx.desc_prof = 1; 706cac2a27cSHenry Tieman fdir_fltr_ctx.desc_prof_prio = 3; 707cac2a27cSHenry Tieman ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc); 708cac2a27cSHenry Tieman } 709cac2a27cSHenry Tieman 710148beb61SHenry Tieman /** 711148beb61SHenry Tieman * ice_alloc_fd_res_cntr - obtain counter resource for FD type 712148beb61SHenry Tieman * @hw: pointer to the hardware structure 713148beb61SHenry Tieman * @cntr_id: returns counter index 714148beb61SHenry Tieman */ 715*5e24d598STony Nguyen int ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id) 716148beb61SHenry Tieman { 717148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 718148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 719148beb61SHenry Tieman } 720148beb61SHenry Tieman 721148beb61SHenry Tieman /** 722148beb61SHenry Tieman * ice_free_fd_res_cntr - Free counter resource for FD type 723148beb61SHenry Tieman * @hw: pointer to the hardware structure 724148beb61SHenry Tieman * @cntr_id: counter index to be freed 725148beb61SHenry Tieman */ 726*5e24d598STony Nguyen int ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id) 727148beb61SHenry Tieman { 728148beb61SHenry Tieman return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK, 729148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id); 730148beb61SHenry Tieman } 731148beb61SHenry Tieman 732148beb61SHenry Tieman /** 733148beb61SHenry Tieman * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries 734148beb61SHenry Tieman * @hw: pointer to the hardware structure 735148beb61SHenry Tieman * @cntr_id: returns counter index 736148beb61SHenry Tieman * @num_fltr: number of filter entries to be allocated 737148beb61SHenry Tieman */ 738*5e24d598STony Nguyen int 739148beb61SHenry Tieman ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 740148beb61SHenry Tieman { 741148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES, 742148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 743148beb61SHenry Tieman cntr_id); 744148beb61SHenry Tieman } 745148beb61SHenry Tieman 746148beb61SHenry Tieman /** 747148beb61SHenry Tieman * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries 748148beb61SHenry Tieman * @hw: pointer to the hardware structure 749148beb61SHenry Tieman * @cntr_id: returns counter index 750148beb61SHenry Tieman * @num_fltr: number of filter entries to be allocated 751148beb61SHenry Tieman */ 752*5e24d598STony Nguyen int 753148beb61SHenry Tieman ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr) 754148beb61SHenry Tieman { 755148beb61SHenry Tieman return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES, 756148beb61SHenry Tieman ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr, 757148beb61SHenry Tieman cntr_id); 758148beb61SHenry Tieman } 7594ab95646SHenry Tieman 7604ab95646SHenry Tieman /** 7614ab95646SHenry Tieman * ice_get_fdir_cnt_all - get the number of Flow Director filters 7624ab95646SHenry Tieman * @hw: hardware data structure 7634ab95646SHenry Tieman * 7644ab95646SHenry Tieman * Returns the number of filters available on device 7654ab95646SHenry Tieman */ 7664ab95646SHenry Tieman int ice_get_fdir_cnt_all(struct ice_hw *hw) 7674ab95646SHenry Tieman { 7684ab95646SHenry Tieman return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort; 7694ab95646SHenry Tieman } 7704ab95646SHenry Tieman 7714ab95646SHenry Tieman /** 772165d80d6SHenry Tieman * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer 773165d80d6SHenry Tieman * @pkt: packet buffer 774165d80d6SHenry Tieman * @offset: offset into buffer 775165d80d6SHenry Tieman * @addr: IPv6 address to convert and insert into pkt at offset 776165d80d6SHenry Tieman */ 777165d80d6SHenry Tieman static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr) 778165d80d6SHenry Tieman { 779165d80d6SHenry Tieman int idx; 780165d80d6SHenry Tieman 781165d80d6SHenry Tieman for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++) 782165d80d6SHenry Tieman memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx], 783165d80d6SHenry Tieman sizeof(*addr)); 784165d80d6SHenry Tieman } 785165d80d6SHenry Tieman 786165d80d6SHenry Tieman /** 787ef9e4cc5SQi Zhang * ice_pkt_insert_u6_qfi - insert a u6 value QFI into a memory buffer for GTPU 788ef9e4cc5SQi Zhang * @pkt: packet buffer 789ef9e4cc5SQi Zhang * @offset: offset into buffer 790ef9e4cc5SQi Zhang * @data: 8 bit value to convert and insert into pkt at offset 791ef9e4cc5SQi Zhang * 792ef9e4cc5SQi Zhang * This function is designed for inserting QFI (6 bits) for GTPU. 793ef9e4cc5SQi Zhang */ 794ef9e4cc5SQi Zhang static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data) 795ef9e4cc5SQi Zhang { 796ef9e4cc5SQi Zhang u8 ret; 797ef9e4cc5SQi Zhang 798ef9e4cc5SQi Zhang ret = (data & 0x3F) + (*(pkt + offset) & 0xC0); 799ef9e4cc5SQi Zhang memcpy(pkt + offset, &ret, sizeof(ret)); 800ef9e4cc5SQi Zhang } 801ef9e4cc5SQi Zhang 802ef9e4cc5SQi Zhang /** 803b199dddbSQi Zhang * ice_pkt_insert_u8 - insert a u8 value into a memory buffer. 804b199dddbSQi Zhang * @pkt: packet buffer 805b199dddbSQi Zhang * @offset: offset into buffer 806b199dddbSQi Zhang * @data: 8 bit value to convert and insert into pkt at offset 807b199dddbSQi Zhang */ 808b199dddbSQi Zhang static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data) 809b199dddbSQi Zhang { 810b199dddbSQi Zhang memcpy(pkt + offset, &data, sizeof(data)); 811b199dddbSQi Zhang } 812b199dddbSQi Zhang 813b199dddbSQi Zhang /** 814b199dddbSQi Zhang * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6. 815b199dddbSQi Zhang * @pkt: packet buffer 816b199dddbSQi Zhang * @offset: offset into buffer 817b199dddbSQi Zhang * @data: 8 bit value to convert and insert into pkt at offset 818b199dddbSQi Zhang * 819b199dddbSQi Zhang * This function is designed for inserting Traffic Class (TC) for IPv6, 820b199dddbSQi Zhang * since that TC is not aligned in number of bytes. Here we split it out 821b199dddbSQi Zhang * into two part and fill each byte with data copy from pkt, then insert 822b199dddbSQi Zhang * the two bytes data one by one. 823b199dddbSQi Zhang */ 824b199dddbSQi Zhang static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data) 825b199dddbSQi Zhang { 826b199dddbSQi Zhang u8 high, low; 827b199dddbSQi Zhang 828b199dddbSQi Zhang high = (data >> 4) + (*(pkt + offset) & 0xF0); 829b199dddbSQi Zhang memcpy(pkt + offset, &high, sizeof(high)); 830b199dddbSQi Zhang 831b199dddbSQi Zhang low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4); 832b199dddbSQi Zhang memcpy(pkt + offset + 1, &low, sizeof(low)); 833b199dddbSQi Zhang } 834b199dddbSQi Zhang 835b199dddbSQi Zhang /** 836cac2a27cSHenry Tieman * ice_pkt_insert_u16 - insert a be16 value into a memory buffer 837cac2a27cSHenry Tieman * @pkt: packet buffer 838cac2a27cSHenry Tieman * @offset: offset into buffer 839cac2a27cSHenry Tieman * @data: 16 bit value to convert and insert into pkt at offset 840cac2a27cSHenry Tieman */ 841cac2a27cSHenry Tieman static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data) 842cac2a27cSHenry Tieman { 843cac2a27cSHenry Tieman memcpy(pkt + offset, &data, sizeof(data)); 844cac2a27cSHenry Tieman } 845cac2a27cSHenry Tieman 846cac2a27cSHenry Tieman /** 847cac2a27cSHenry Tieman * ice_pkt_insert_u32 - insert a be32 value into a memory buffer 848cac2a27cSHenry Tieman * @pkt: packet buffer 849cac2a27cSHenry Tieman * @offset: offset into buffer 850cac2a27cSHenry Tieman * @data: 32 bit value to convert and insert into pkt at offset 851cac2a27cSHenry Tieman */ 852cac2a27cSHenry Tieman static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data) 853cac2a27cSHenry Tieman { 854cac2a27cSHenry Tieman memcpy(pkt + offset, &data, sizeof(data)); 855cac2a27cSHenry Tieman } 856cac2a27cSHenry Tieman 857cac2a27cSHenry Tieman /** 858390bd141SQi Zhang * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer. 859390bd141SQi Zhang * @pkt: packet buffer 860390bd141SQi Zhang * @addr: MAC address to convert and insert into pkt at offset 861390bd141SQi Zhang */ 862390bd141SQi Zhang static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr) 863390bd141SQi Zhang { 864390bd141SQi Zhang ether_addr_copy(pkt, addr); 865390bd141SQi Zhang } 866390bd141SQi Zhang 867390bd141SQi Zhang /** 868cac2a27cSHenry Tieman * ice_fdir_get_gen_prgm_pkt - generate a training packet 869cac2a27cSHenry Tieman * @hw: pointer to the hardware structure 870cac2a27cSHenry Tieman * @input: flow director filter data structure 871cac2a27cSHenry Tieman * @pkt: pointer to return filter packet 872cac2a27cSHenry Tieman * @frag: generate a fragment packet 873cac2a27cSHenry Tieman * @tun: true implies generate a tunnel packet 874cac2a27cSHenry Tieman */ 875*5e24d598STony Nguyen int 876cac2a27cSHenry Tieman ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input, 877cac2a27cSHenry Tieman u8 *pkt, bool frag, bool tun) 878cac2a27cSHenry Tieman { 879cac2a27cSHenry Tieman enum ice_fltr_ptype flow; 880cac2a27cSHenry Tieman u16 tnl_port; 881cac2a27cSHenry Tieman u8 *loc; 882cac2a27cSHenry Tieman u16 idx; 883cac2a27cSHenry Tieman 884cac2a27cSHenry Tieman if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 885165d80d6SHenry Tieman switch (input->ip.v4.proto) { 886cac2a27cSHenry Tieman case IPPROTO_TCP: 887cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP; 888cac2a27cSHenry Tieman break; 889cac2a27cSHenry Tieman case IPPROTO_UDP: 890cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP; 891cac2a27cSHenry Tieman break; 892cac2a27cSHenry Tieman case IPPROTO_SCTP: 893cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP; 894cac2a27cSHenry Tieman break; 895b199dddbSQi Zhang default: 896cac2a27cSHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER; 897cac2a27cSHenry Tieman break; 898cac2a27cSHenry Tieman } 899165d80d6SHenry Tieman } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 900165d80d6SHenry Tieman switch (input->ip.v6.proto) { 901165d80d6SHenry Tieman case IPPROTO_TCP: 902165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP; 903165d80d6SHenry Tieman break; 904165d80d6SHenry Tieman case IPPROTO_UDP: 905165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP; 906165d80d6SHenry Tieman break; 907165d80d6SHenry Tieman case IPPROTO_SCTP: 908165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP; 909165d80d6SHenry Tieman break; 910b199dddbSQi Zhang default: 911165d80d6SHenry Tieman flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER; 912165d80d6SHenry Tieman break; 913165d80d6SHenry Tieman } 914cac2a27cSHenry Tieman } else { 915cac2a27cSHenry Tieman flow = input->flow_type; 916cac2a27cSHenry Tieman } 917cac2a27cSHenry Tieman 918cac2a27cSHenry Tieman for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++) 919cac2a27cSHenry Tieman if (ice_fdir_pkt[idx].flow == flow) 920cac2a27cSHenry Tieman break; 921cac2a27cSHenry Tieman if (idx == ICE_FDIR_NUM_PKT) 922cac2a27cSHenry Tieman return ICE_ERR_PARAM; 923cac2a27cSHenry Tieman if (!tun) { 924cac2a27cSHenry Tieman memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len); 925cac2a27cSHenry Tieman loc = pkt; 926cac2a27cSHenry Tieman } else { 927de6acd1cSMichal Swiatkowski if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL)) 928cac2a27cSHenry Tieman return ICE_ERR_DOES_NOT_EXIST; 929cac2a27cSHenry Tieman if (!ice_fdir_pkt[idx].tun_pkt) 930cac2a27cSHenry Tieman return ICE_ERR_PARAM; 931cac2a27cSHenry Tieman memcpy(pkt, ice_fdir_pkt[idx].tun_pkt, 932cac2a27cSHenry Tieman ice_fdir_pkt[idx].tun_pkt_len); 933cac2a27cSHenry Tieman ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET, 934cac2a27cSHenry Tieman htons(tnl_port)); 935cac2a27cSHenry Tieman loc = &pkt[ICE_FDIR_TUN_PKT_OFF]; 936cac2a27cSHenry Tieman } 937cac2a27cSHenry Tieman 938cac2a27cSHenry Tieman /* Reverse the src and dst, since the HW expects them to be from Tx 939cac2a27cSHenry Tieman * perspective. The input from user is from Rx filter perspective. 940cac2a27cSHenry Tieman */ 941cac2a27cSHenry Tieman switch (flow) { 942cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_TCP: 943cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 944165d80d6SHenry Tieman input->ip.v4.src_ip); 945cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET, 946165d80d6SHenry Tieman input->ip.v4.src_port); 947cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 948165d80d6SHenry Tieman input->ip.v4.dst_ip); 949cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET, 950165d80d6SHenry Tieman input->ip.v4.dst_port); 951b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 952b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 953390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 954cac2a27cSHenry Tieman if (frag) 955b37e4e94SJeff Guo loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF; 956cac2a27cSHenry Tieman break; 957cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_UDP: 958cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 959165d80d6SHenry Tieman input->ip.v4.src_ip); 960cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET, 961165d80d6SHenry Tieman input->ip.v4.src_port); 962cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 963165d80d6SHenry Tieman input->ip.v4.dst_ip); 964cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 965165d80d6SHenry Tieman input->ip.v4.dst_port); 966b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 967b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 968390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 969390bd141SQi Zhang ice_pkt_insert_mac_addr(loc + ETH_ALEN, 970390bd141SQi Zhang input->ext_data.src_mac); 971cac2a27cSHenry Tieman break; 972cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_SCTP: 973cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 974165d80d6SHenry Tieman input->ip.v4.src_ip); 975cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET, 976165d80d6SHenry Tieman input->ip.v4.src_port); 977cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 978165d80d6SHenry Tieman input->ip.v4.dst_ip); 979cac2a27cSHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET, 980165d80d6SHenry Tieman input->ip.v4.dst_port); 981b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 982b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 983390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 984cac2a27cSHenry Tieman break; 985cac2a27cSHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV4_OTHER: 986cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 987165d80d6SHenry Tieman input->ip.v4.src_ip); 988cac2a27cSHenry Tieman ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 989165d80d6SHenry Tieman input->ip.v4.dst_ip); 990b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos); 991b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl); 992b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET, 993b199dddbSQi Zhang input->ip.v4.proto); 994390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 995cac2a27cSHenry Tieman break; 996ef9e4cc5SQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP: 997ef9e4cc5SQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP: 998ef9e4cc5SQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP: 999ef9e4cc5SQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER: 1000ef9e4cc5SQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1001ef9e4cc5SQi Zhang input->ip.v4.src_ip); 1002ef9e4cc5SQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1003ef9e4cc5SQi Zhang input->ip.v4.dst_ip); 1004ef9e4cc5SQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET, 1005ef9e4cc5SQi Zhang input->gtpu_data.teid); 1006ef9e4cc5SQi Zhang ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET, 1007ef9e4cc5SQi Zhang input->gtpu_data.qfi); 1008ef9e4cc5SQi Zhang break; 1009213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3: 1010213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET, 1011213528feSQi Zhang input->l2tpv3_data.session_id); 1012213528feSQi Zhang break; 1013213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3: 1014213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET, 1015213528feSQi Zhang input->l2tpv3_data.session_id); 1016213528feSQi Zhang break; 1017213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_ESP: 1018213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET, 1019213528feSQi Zhang input->ip.v4.sec_parm_idx); 1020213528feSQi Zhang break; 1021213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV6_ESP: 1022213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET, 1023213528feSQi Zhang input->ip.v6.sec_parm_idx); 1024213528feSQi Zhang break; 1025213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_AH: 1026213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET, 1027213528feSQi Zhang input->ip.v4.sec_parm_idx); 1028213528feSQi Zhang break; 1029213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV6_AH: 1030213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET, 1031213528feSQi Zhang input->ip.v6.sec_parm_idx); 1032213528feSQi Zhang break; 1033213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP: 1034213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET, 1035213528feSQi Zhang input->ip.v4.src_ip); 1036213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET, 1037213528feSQi Zhang input->ip.v4.dst_ip); 1038213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET, 1039213528feSQi Zhang input->ip.v4.sec_parm_idx); 1040213528feSQi Zhang break; 1041213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP: 1042213528feSQi Zhang ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1043213528feSQi Zhang input->ip.v6.src_ip); 1044213528feSQi Zhang ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1045213528feSQi Zhang input->ip.v6.dst_ip); 1046213528feSQi Zhang ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET, 1047213528feSQi Zhang input->ip.v6.sec_parm_idx); 1048213528feSQi Zhang break; 1049213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE: 1050213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION: 1051213528feSQi Zhang ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET, 1052213528feSQi Zhang input->ip.v4.dst_port); 1053213528feSQi Zhang break; 1054213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE: 1055213528feSQi Zhang case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION: 1056213528feSQi Zhang ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1057213528feSQi Zhang input->ip.v6.dst_port); 1058213528feSQi Zhang break; 105921606584SQi Zhang case ICE_FLTR_PTYPE_NON_IP_L2: 106021606584SQi Zhang ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET, 106121606584SQi Zhang input->ext_data.ether_type); 106221606584SQi Zhang break; 1063165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_TCP: 1064165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1065165d80d6SHenry Tieman input->ip.v6.src_ip); 1066165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1067165d80d6SHenry Tieman input->ip.v6.dst_ip); 1068165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET, 1069165d80d6SHenry Tieman input->ip.v6.src_port); 1070165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET, 1071165d80d6SHenry Tieman input->ip.v6.dst_port); 1072b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1073b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1074390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1075165d80d6SHenry Tieman break; 1076165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_UDP: 1077165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1078165d80d6SHenry Tieman input->ip.v6.src_ip); 1079165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1080165d80d6SHenry Tieman input->ip.v6.dst_ip); 1081165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET, 1082165d80d6SHenry Tieman input->ip.v6.src_port); 1083165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET, 1084165d80d6SHenry Tieman input->ip.v6.dst_port); 1085b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1086b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1087390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1088165d80d6SHenry Tieman break; 1089165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_SCTP: 1090165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1091165d80d6SHenry Tieman input->ip.v6.src_ip); 1092165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1093165d80d6SHenry Tieman input->ip.v6.dst_ip); 1094165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET, 1095165d80d6SHenry Tieman input->ip.v6.src_port); 1096165d80d6SHenry Tieman ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET, 1097165d80d6SHenry Tieman input->ip.v6.dst_port); 1098b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1099b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1100390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1101165d80d6SHenry Tieman break; 1102165d80d6SHenry Tieman case ICE_FLTR_PTYPE_NONF_IPV6_OTHER: 1103165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET, 1104165d80d6SHenry Tieman input->ip.v6.src_ip); 1105165d80d6SHenry Tieman ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET, 1106165d80d6SHenry Tieman input->ip.v6.dst_ip); 1107b199dddbSQi Zhang ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc); 1108b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim); 1109b199dddbSQi Zhang ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET, 1110b199dddbSQi Zhang input->ip.v6.proto); 1111390bd141SQi Zhang ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac); 1112165d80d6SHenry Tieman break; 1113cac2a27cSHenry Tieman default: 1114cac2a27cSHenry Tieman return ICE_ERR_PARAM; 1115cac2a27cSHenry Tieman } 1116cac2a27cSHenry Tieman 11172c57ffcbSHenry Tieman if (input->flex_fltr) 11182c57ffcbSHenry Tieman ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word); 11192c57ffcbSHenry Tieman 1120cac2a27cSHenry Tieman return 0; 1121cac2a27cSHenry Tieman } 1122cac2a27cSHenry Tieman 1123cac2a27cSHenry Tieman /** 1124cac2a27cSHenry Tieman * ice_fdir_has_frag - does flow type have 2 ptypes 1125cac2a27cSHenry Tieman * @flow: flow ptype 1126cac2a27cSHenry Tieman * 1127cac2a27cSHenry Tieman * returns true is there is a fragment packet for this ptype 1128cac2a27cSHenry Tieman */ 1129cac2a27cSHenry Tieman bool ice_fdir_has_frag(enum ice_fltr_ptype flow) 1130cac2a27cSHenry Tieman { 1131cac2a27cSHenry Tieman if (flow == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1132cac2a27cSHenry Tieman return true; 1133cac2a27cSHenry Tieman else 1134cac2a27cSHenry Tieman return false; 1135cac2a27cSHenry Tieman } 1136cac2a27cSHenry Tieman 1137cac2a27cSHenry Tieman /** 1138ef860480STony Nguyen * ice_fdir_find_fltr_by_idx - find filter with idx 11394ab95646SHenry Tieman * @hw: pointer to hardware structure 11404ab95646SHenry Tieman * @fltr_idx: index to find. 11414ab95646SHenry Tieman * 11424ab95646SHenry Tieman * Returns pointer to filter if found or null 11434ab95646SHenry Tieman */ 11444ab95646SHenry Tieman struct ice_fdir_fltr * 11454ab95646SHenry Tieman ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx) 11464ab95646SHenry Tieman { 11474ab95646SHenry Tieman struct ice_fdir_fltr *rule; 11484ab95646SHenry Tieman 11494ab95646SHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 11504ab95646SHenry Tieman /* rule ID found in the list */ 11514ab95646SHenry Tieman if (fltr_idx == rule->fltr_id) 11524ab95646SHenry Tieman return rule; 11534ab95646SHenry Tieman if (fltr_idx < rule->fltr_id) 11544ab95646SHenry Tieman break; 11554ab95646SHenry Tieman } 11564ab95646SHenry Tieman return NULL; 11574ab95646SHenry Tieman } 1158cac2a27cSHenry Tieman 1159cac2a27cSHenry Tieman /** 1160cac2a27cSHenry Tieman * ice_fdir_list_add_fltr - add a new node to the flow director filter list 1161cac2a27cSHenry Tieman * @hw: hardware structure 1162cac2a27cSHenry Tieman * @fltr: filter node to add to structure 1163cac2a27cSHenry Tieman */ 1164cac2a27cSHenry Tieman void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr) 1165cac2a27cSHenry Tieman { 1166cac2a27cSHenry Tieman struct ice_fdir_fltr *rule, *parent = NULL; 1167cac2a27cSHenry Tieman 1168cac2a27cSHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 1169cac2a27cSHenry Tieman /* rule ID found or pass its spot in the list */ 1170cac2a27cSHenry Tieman if (rule->fltr_id >= fltr->fltr_id) 1171cac2a27cSHenry Tieman break; 1172cac2a27cSHenry Tieman parent = rule; 1173cac2a27cSHenry Tieman } 1174cac2a27cSHenry Tieman 1175cac2a27cSHenry Tieman if (parent) 1176cac2a27cSHenry Tieman list_add(&fltr->fltr_node, &parent->fltr_node); 1177cac2a27cSHenry Tieman else 1178cac2a27cSHenry Tieman list_add(&fltr->fltr_node, &hw->fdir_list_head); 1179cac2a27cSHenry Tieman } 1180cac2a27cSHenry Tieman 1181cac2a27cSHenry Tieman /** 1182cac2a27cSHenry Tieman * ice_fdir_update_cntrs - increment / decrement filter counter 1183cac2a27cSHenry Tieman * @hw: pointer to hardware structure 1184cac2a27cSHenry Tieman * @flow: filter flow type 1185cac2a27cSHenry Tieman * @add: true implies filters added 1186cac2a27cSHenry Tieman */ 1187cac2a27cSHenry Tieman void 1188cac2a27cSHenry Tieman ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow, bool add) 1189cac2a27cSHenry Tieman { 1190cac2a27cSHenry Tieman int incr; 1191cac2a27cSHenry Tieman 1192cac2a27cSHenry Tieman incr = add ? 1 : -1; 1193cac2a27cSHenry Tieman hw->fdir_active_fltr += incr; 1194cac2a27cSHenry Tieman 1195cac2a27cSHenry Tieman if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) 1196cac2a27cSHenry Tieman ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow); 1197cac2a27cSHenry Tieman else 1198cac2a27cSHenry Tieman hw->fdir_fltr_cnt[flow] += incr; 1199cac2a27cSHenry Tieman } 1200cac2a27cSHenry Tieman 1201cac2a27cSHenry Tieman /** 1202165d80d6SHenry Tieman * ice_cmp_ipv6_addr - compare 2 IP v6 addresses 1203165d80d6SHenry Tieman * @a: IP v6 address 1204165d80d6SHenry Tieman * @b: IP v6 address 1205165d80d6SHenry Tieman * 1206165d80d6SHenry Tieman * Returns 0 on equal, returns non-0 if different 1207165d80d6SHenry Tieman */ 1208165d80d6SHenry Tieman static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b) 1209165d80d6SHenry Tieman { 1210165d80d6SHenry Tieman return memcmp(a, b, 4 * sizeof(__be32)); 1211165d80d6SHenry Tieman } 1212165d80d6SHenry Tieman 1213165d80d6SHenry Tieman /** 1214cac2a27cSHenry Tieman * ice_fdir_comp_rules - compare 2 filters 1215cac2a27cSHenry Tieman * @a: a Flow Director filter data structure 1216cac2a27cSHenry Tieman * @b: a Flow Director filter data structure 1217165d80d6SHenry Tieman * @v6: bool true if v6 filter 1218cac2a27cSHenry Tieman * 1219cac2a27cSHenry Tieman * Returns true if the filters match 1220cac2a27cSHenry Tieman */ 1221cac2a27cSHenry Tieman static bool 1222165d80d6SHenry Tieman ice_fdir_comp_rules(struct ice_fdir_fltr *a, struct ice_fdir_fltr *b, bool v6) 1223cac2a27cSHenry Tieman { 1224cac2a27cSHenry Tieman enum ice_fltr_ptype flow_type = a->flow_type; 1225cac2a27cSHenry Tieman 1226cac2a27cSHenry Tieman /* The calling function already checks that the two filters have the 1227cac2a27cSHenry Tieman * same flow_type. 1228cac2a27cSHenry Tieman */ 1229165d80d6SHenry Tieman if (!v6) { 1230cac2a27cSHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1231cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1232cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) { 1233165d80d6SHenry Tieman if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1234165d80d6SHenry Tieman a->ip.v4.src_ip == b->ip.v4.src_ip && 1235165d80d6SHenry Tieman a->ip.v4.dst_port == b->ip.v4.dst_port && 1236165d80d6SHenry Tieman a->ip.v4.src_port == b->ip.v4.src_port) 1237cac2a27cSHenry Tieman return true; 1238cac2a27cSHenry Tieman } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) { 1239165d80d6SHenry Tieman if (a->ip.v4.dst_ip == b->ip.v4.dst_ip && 1240165d80d6SHenry Tieman a->ip.v4.src_ip == b->ip.v4.src_ip && 1241165d80d6SHenry Tieman a->ip.v4.l4_header == b->ip.v4.l4_header && 1242165d80d6SHenry Tieman a->ip.v4.proto == b->ip.v4.proto && 1243165d80d6SHenry Tieman a->ip.v4.ip_ver == b->ip.v4.ip_ver && 1244165d80d6SHenry Tieman a->ip.v4.tos == b->ip.v4.tos) 1245cac2a27cSHenry Tieman return true; 1246cac2a27cSHenry Tieman } 1247165d80d6SHenry Tieman } else { 1248165d80d6SHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP || 1249165d80d6SHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP || 1250165d80d6SHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) { 1251165d80d6SHenry Tieman if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1252165d80d6SHenry Tieman a->ip.v6.src_port == b->ip.v6.src_port && 1253165d80d6SHenry Tieman !ice_cmp_ipv6_addr(a->ip.v6.dst_ip, 1254165d80d6SHenry Tieman b->ip.v6.dst_ip) && 1255165d80d6SHenry Tieman !ice_cmp_ipv6_addr(a->ip.v6.src_ip, 1256165d80d6SHenry Tieman b->ip.v6.src_ip)) 1257165d80d6SHenry Tieman return true; 1258165d80d6SHenry Tieman } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) { 1259165d80d6SHenry Tieman if (a->ip.v6.dst_port == b->ip.v6.dst_port && 1260165d80d6SHenry Tieman a->ip.v6.src_port == b->ip.v6.src_port) 1261165d80d6SHenry Tieman return true; 1262165d80d6SHenry Tieman } 1263165d80d6SHenry Tieman } 1264cac2a27cSHenry Tieman 1265cac2a27cSHenry Tieman return false; 1266cac2a27cSHenry Tieman } 1267cac2a27cSHenry Tieman 1268cac2a27cSHenry Tieman /** 1269cac2a27cSHenry Tieman * ice_fdir_is_dup_fltr - test if filter is already in list for PF 1270cac2a27cSHenry Tieman * @hw: hardware data structure 1271cac2a27cSHenry Tieman * @input: Flow Director filter data structure 1272cac2a27cSHenry Tieman * 1273cac2a27cSHenry Tieman * Returns true if the filter is found in the list 1274cac2a27cSHenry Tieman */ 1275cac2a27cSHenry Tieman bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input) 1276cac2a27cSHenry Tieman { 1277cac2a27cSHenry Tieman struct ice_fdir_fltr *rule; 1278cac2a27cSHenry Tieman bool ret = false; 1279cac2a27cSHenry Tieman 1280cac2a27cSHenry Tieman list_for_each_entry(rule, &hw->fdir_list_head, fltr_node) { 1281cac2a27cSHenry Tieman enum ice_fltr_ptype flow_type; 1282cac2a27cSHenry Tieman 1283cac2a27cSHenry Tieman if (rule->flow_type != input->flow_type) 1284cac2a27cSHenry Tieman continue; 1285cac2a27cSHenry Tieman 1286cac2a27cSHenry Tieman flow_type = input->flow_type; 1287cac2a27cSHenry Tieman if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP || 1288cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP || 1289cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP || 1290cac2a27cSHenry Tieman flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) 1291165d80d6SHenry Tieman ret = ice_fdir_comp_rules(rule, input, false); 1292165d80d6SHenry Tieman else 1293165d80d6SHenry Tieman ret = ice_fdir_comp_rules(rule, input, true); 1294cac2a27cSHenry Tieman if (ret) { 1295cac2a27cSHenry Tieman if (rule->fltr_id == input->fltr_id && 1296cac2a27cSHenry Tieman rule->q_index != input->q_index) 1297cac2a27cSHenry Tieman ret = false; 1298cac2a27cSHenry Tieman else 1299cac2a27cSHenry Tieman break; 1300cac2a27cSHenry Tieman } 1301cac2a27cSHenry Tieman } 1302cac2a27cSHenry Tieman 1303cac2a27cSHenry Tieman return ret; 1304cac2a27cSHenry Tieman } 1305