dpdk/drivers/net/ice/base/ice_fdir.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2001-2021 Intel Corporation
   3 */
   4
   5#include "ice_common.h"
   6#include "ice_fdir.h"
   7
   8/* These are training packet headers used to program flow director filters. */
   9static const u8 ice_fdir_tcpv4_pkt[] = {
  10        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  11        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  12        0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06,
  13        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  14        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  15        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00,
  16        0x20, 0x00, 0x00, 0x00, 0x00, 0x00
  17};
  18
  19static const u8 ice_fdir_udpv4_pkt[] = {
  20        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  21        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  22        0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  23        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  24        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  25        0x00, 0x00,
  26};
  27
  28static const u8 ice_fdir_sctpv4_pkt[] = {
  29        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  30        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  31        0x00, 0x20, 0x00, 0x00, 0x40, 0x00, 0x40, 0x84,
  32        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  33        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  34        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  35};
  36
  37static const u8 ice_fdir_ipv4_pkt[] = {
  38        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  39        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  40        0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x10,
  41        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  42        0x00, 0x00
  43};
  44
  45static const u8 ice_fdir_udp4_vxlan_pkt[] = {
  46        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  47        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  48        0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
  49        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  50        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  51        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
  52        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  53        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  54        0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
  55        0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  56        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57        0x00, 0x00, 0x00, 0x00,
  58};
  59
  60static const u8 ice_fdir_ipv4_gtpu4_pkt[] = {
  61        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  62        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  63        0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
  64        0x7c, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  65        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x24,
  66        0xbf, 0xc0, 0x30, 0xff, 0x00, 0x14, 0x00, 0x00,
  67        0x00, 0x00, 0x45, 0x00, 0x00, 0x14, 0x00, 0x01,
  68        0x00, 0x00, 0x40, 0x00, 0x3a, 0x3d, 0x00, 0x00,
  69        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  70};
  71
  72static const u8 ice_fdir_udp4_gtpu4_pkt[] = {
  73        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  74        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  75        0x00, 0x40, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
  76        0x7c, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  77        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2c,
  78        0x00, 0x6f, 0x30, 0xff, 0x00, 0x1c, 0x00, 0x00,
  79        0x00, 0x00, 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01,
  80        0x00, 0x00, 0x40, 0x11, 0x3a, 0x24, 0x00, 0x00,
  81        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  82        0x00, 0x00, 0x00, 0x08, 0xbe, 0xc7, 0x00, 0x00,
  83};
  84
  85static const u8 ice_fdir_tcp4_gtpu4_pkt[] = {
  86        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
  88        0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
  89        0x7c, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  90        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38,
  91        0x00, 0x4c, 0x30, 0xff, 0x00, 0x28, 0x00, 0x00,
  92        0x00, 0x00, 0x45, 0x00, 0x00, 0x28, 0x00, 0x01,
  93        0x00, 0x00, 0x40, 0x06, 0x3a, 0x23, 0x00, 0x00,
  94        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  95        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  96        0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x4e, 0xd2,
  97        0x00, 0x00, 0x00, 0x00,
  98};
  99
 100static const u8 ice_fdir_ipv4_gtpu4_eh_pkt[] = {
 101        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 102        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 103        0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 104        0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 105        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2e,
 106        0xba, 0x1d, 0x34, 0xff, 0x00, 0x1e, 0x00, 0x00,
 107        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00,
 108        0x00, 0x00, 0x45, 0x00, 0x00, 0x16, 0x00, 0x01,
 109        0x00, 0x00, 0x40, 0x00, 0x7c, 0xe5, 0x7f, 0x00,
 110        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 111};
 112
 113static const u8 ice_fdir_udp4_gtpu4_eh_pkt[] = {
 114        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 115        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 116        0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 117        0x7c, 0xa0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 118        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x36,
 119        0xb8, 0x23, 0x34, 0xff, 0x00, 0x26, 0x00, 0x00,
 120        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00,
 121        0x00, 0x00, 0x45, 0x00, 0x00, 0x1e, 0x00, 0x01,
 122        0x00, 0x00, 0x40, 0x11, 0x7c, 0xcc, 0x7f, 0x00,
 123        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 124        0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x00, 0x00,
 125};
 126
 127static const u8 ice_fdir_tcp4_gtpu4_eh_pkt[] = {
 128        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 129        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 130        0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 131        0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 132        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x42,
 133        0xb8, 0x00, 0x34, 0xff, 0x00, 0x32, 0x00, 0x00,
 134        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00,
 135        0x00, 0x00, 0x45, 0x00, 0x00, 0x2a, 0x00, 0x01,
 136        0x00, 0x00, 0x40, 0x06, 0x7c, 0xcb, 0x7f, 0x00,
 137        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 138        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 139        0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x91, 0xde,
 140        0x00, 0x00, 0x00, 0x00,
 141};
 142
 143static const u8 ice_fdir_ipv4_gtpu4_eh_dw_pkt[] = {
 144        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 145        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 146        0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 147        0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 148        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2e,
 149        0xba, 0x1d, 0x34, 0xff, 0x00, 0x1e, 0x00, 0x00,
 150        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00,
 151        0x00, 0x00, 0x45, 0x00, 0x00, 0x16, 0x00, 0x01,
 152        0x00, 0x00, 0x40, 0x00, 0x7c, 0xe5, 0x7f, 0x00,
 153        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 154};
 155
 156static const u8 ice_fdir_udp4_gtpu4_eh_dw_pkt[] = {
 157        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 158        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 159        0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 160        0x7c, 0xa0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 161        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x36,
 162        0xb8, 0x23, 0x34, 0xff, 0x00, 0x26, 0x00, 0x00,
 163        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00,
 164        0x00, 0x00, 0x45, 0x00, 0x00, 0x1e, 0x00, 0x01,
 165        0x00, 0x00, 0x40, 0x11, 0x7c, 0xcc, 0x7f, 0x00,
 166        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 167        0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x00, 0x00,
 168};
 169
 170static const u8 ice_fdir_tcp4_gtpu4_eh_dw_pkt[] = {
 171        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 172        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 173        0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 174        0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 175        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x42,
 176        0xb8, 0x00, 0x34, 0xff, 0x00, 0x32, 0x00, 0x00,
 177        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x00,
 178        0x00, 0x00, 0x45, 0x00, 0x00, 0x2a, 0x00, 0x01,
 179        0x00, 0x00, 0x40, 0x06, 0x7c, 0xcb, 0x7f, 0x00,
 180        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 181        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 182        0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x91, 0xde,
 183        0x00, 0x00, 0x00, 0x00,
 184};
 185
 186static const u8 ice_fdir_ipv4_gtpu4_eh_up_pkt[] = {
 187        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 188        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 189        0x00, 0x42, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 190        0x7c, 0xa8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 191        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x2e,
 192        0xba, 0x0d, 0x34, 0xff, 0x00, 0x1e, 0x00, 0x00,
 193        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x10,
 194        0x00, 0x00, 0x45, 0x00, 0x00, 0x16, 0x00, 0x01,
 195        0x00, 0x00, 0x40, 0x00, 0x7c, 0xe5, 0x7f, 0x00,
 196        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 197};
 198
 199static const u8 ice_fdir_udp4_gtpu4_eh_up_pkt[] = {
 200        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 201        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 202        0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 203        0x7c, 0xa0, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 204        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x36,
 205        0xb8, 0x13, 0x34, 0xff, 0x00, 0x26, 0x00, 0x00,
 206        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x10,
 207        0x00, 0x00, 0x45, 0x00, 0x00, 0x1e, 0x00, 0x01,
 208        0x00, 0x00, 0x40, 0x11, 0x7c, 0xcc, 0x7f, 0x00,
 209        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 210        0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x00, 0x00,
 211};
 212
 213static const u8 ice_fdir_tcp4_gtpu4_eh_up_pkt[] = {
 214        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 215        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 216        0x00, 0x56, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 217        0x7c, 0x94, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
 218        0x00, 0x01, 0x08, 0x68, 0x08, 0x68, 0x00, 0x42,
 219        0xb7, 0xf0, 0x34, 0xff, 0x00, 0x32, 0x00, 0x00,
 220        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x01, 0x10,
 221        0x00, 0x00, 0x45, 0x00, 0x00, 0x2a, 0x00, 0x01,
 222        0x00, 0x00, 0x40, 0x06, 0x7c, 0xcb, 0x7f, 0x00,
 223        0x00, 0x01, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x00,
 224        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 225        0x00, 0x00, 0x50, 0x02, 0x20, 0x00, 0x91, 0xde,
 226        0x00, 0x00, 0x00, 0x00,
 227};
 228
 229static const u8 ice_fdir_icmp4_gtpu4_pkt[] = {
 230        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 231        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 232        0x00, 0x4c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 233        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 234        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
 235        0x00, 0x00, 0x34, 0xff, 0x00, 0x28, 0x00, 0x00,
 236        0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x02, 0x00,
 237        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
 238        0x00, 0x1c, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01,
 239        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 240        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 241        0x00, 0x00,
 242};
 243
 244static const u8 ice_fdir_ipv6_gtpu4_pkt[] = {
 245        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 246        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 247        0x00, 0x4c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 248        0x7c, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 249        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x38,
 250        0x24, 0x42, 0x30, 0xff, 0x00, 0x28, 0x00, 0x00,
 251        0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
 252        0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 253        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 254        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 255        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 256        0x00, 0x00, 0x00, 0x00,
 257};
 258
 259static const u8 ice_fdir_udp6_gtpu4_pkt[] = {
 260        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 261        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 262        0x00, 0x54, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 263        0x7c, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 264        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x40,
 265        0x4e, 0x3d, 0x30, 0xff, 0x00, 0x30, 0x00, 0x00,
 266        0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x08,
 267        0x11, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 268        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 269        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 270        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 271        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
 272        0xff, 0xdc, 0x00, 0x00,
 273};
 274
 275static const u8 ice_fdir_tcp6_gtpu4_pkt[] = {
 276        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 277        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 278        0x00, 0x62, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
 279        0x7c, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 280        0x00, 0x00, 0x08, 0x68, 0x08, 0x68, 0x00, 0x4e,
 281        0x59, 0x08, 0x30, 0xff, 0x00, 0x3e, 0x00, 0x00,
 282        0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x16,
 283        0x06, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 284        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 285        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 286        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 287        0x00, 0x00, 0x00, 0x14, 0x00, 0x50, 0x00, 0x00,
 288        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02,
 289        0x20, 0x00, 0x8f, 0x7b, 0x00, 0x00, 0x00, 0x00,
 290};
 291
 292static const u8 ice_fdir_ipv6_gtpu6_pkt[] = {
 293        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 294        0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
 295        0x00, 0x00, 0x00, 0x38, 0x11, 0x40, 0x00, 0x00,
 296        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 297        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 298        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 299        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
 300        0x08, 0x68, 0x00, 0x38, 0x22, 0x43, 0x30, 0xff,
 301        0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
 302        0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 0x00, 0x00,
 303        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 304        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 305        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 306        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 307};
 308
 309static const u8 ice_fdir_ipv6_gtpu6_eh_pkt[] = {
 310        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 311        0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
 312        0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
 313        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 314        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 315        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 316        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
 317        0x08, 0x68, 0x00, 0x44, 0x1b, 0x9a, 0x34, 0xff,
 318        0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 319        0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
 320        0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
 321        0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 322        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 323        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 324        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 325        0x00, 0x00, 0x00, 0x00,
 326};
 327
 328static const u8 ice_fdir_ipv6_gtpu6_eh_dw_pkt[] = {
 329        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 330        0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
 331        0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
 332        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 333        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 334        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 335        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
 336        0x08, 0x68, 0x00, 0x44, 0x1b, 0x9a, 0x34, 0xff,
 337        0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 338        0x00, 0x85, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
 339        0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
 340        0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 341        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 342        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 343        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 344        0x00, 0x00, 0x00, 0x00,
 345};
 346
 347static const u8 ice_fdir_ipv6_gtpu6_eh_up_pkt[] = {
 348        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 349        0x00, 0x00, 0x00, 0x00, 0x86, 0xdd, 0x60, 0x00,
 350        0x00, 0x00, 0x00, 0x44, 0x11, 0x40, 0x00, 0x00,
 351        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 352        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 353        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 354        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68,
 355        0x08, 0x68, 0x00, 0x44, 0x1b, 0x8a, 0x34, 0xff,
 356        0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 357        0x00, 0x85, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00,
 358        0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
 359        0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 360        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 361        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 362        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 363        0x00, 0x00, 0x00, 0x00,
 364};
 365
 366static const u8 ice_fdir_ipv4_l2tpv3_pkt[] = {
 367        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 368        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 369        0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x73,
 370        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 371        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 372        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 373};
 374
 375static const u8 ice_fdir_ipv6_l2tpv3_pkt[] = {
 376        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 377        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 378        0x00, 0x00, 0x00, 0x00, 0x73, 0x40, 0x00, 0x00,
 379        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 380        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 381        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 382        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 383        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 384        0x00, 0x00,
 385};
 386
 387static const u8 ice_fdir_ipv4_esp_pkt[] = {
 388        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 389        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 390        0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x32,
 391        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 392        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 393        0x00, 0x00
 394};
 395
 396static const u8 ice_fdir_ipv6_esp_pkt[] = {
 397        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 398        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 399        0x00, 0x00, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00,
 400        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 401        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 402        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 403        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 404        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 405};
 406
 407static const u8 ice_fdir_ipv4_ah_pkt[] = {
 408        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 409        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 410        0x00, 0x14, 0x00, 0x00, 0x40, 0x00, 0x40, 0x33,
 411        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 412        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 413        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 414        0x00, 0x00
 415};
 416
 417static const u8 ice_fdir_ipv6_ah_pkt[] = {
 418        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 419        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 420        0x00, 0x00, 0x00, 0x00, 0x33, 0x40, 0x00, 0x00,
 421        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 422        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 423        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 424        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 425        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 426        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 427};
 428
 429static const u8 ice_fdir_ipv4_nat_t_esp_pkt[] = {
 430        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 431        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 432        0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 433        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 434        0x00, 0x00, 0x00, 0x00, 0x11, 0x94, 0x00, 0x00,
 435        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 436        0x00, 0x00,
 437};
 438
 439static const u8 ice_fdir_ipv6_nat_t_esp_pkt[] = {
 440        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 441        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 442        0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
 443        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 444        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 445        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 446        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 447        0x11, 0x94, 0x00, 0x00, 0x00, 0x08,
 448};
 449
 450static const u8 ice_fdir_ipv4_pfcp_node_pkt[] = {
 451        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 452        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 453        0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 454        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 455        0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
 456        0x00, 0x00, 0x20, 0x00, 0x00, 0x10, 0x00, 0x00,
 457        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 458        0x00, 0x00,
 459};
 460
 461static const u8 ice_fdir_ipv4_pfcp_session_pkt[] = {
 462        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 463        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 464        0x00, 0x2C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 465        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 466        0x00, 0x00, 0x22, 0x65, 0x22, 0x65, 0x00, 0x00,
 467        0x00, 0x00, 0x21, 0x00, 0x00, 0x10, 0x00, 0x00,
 468        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 469        0x00, 0x00,
 470};
 471
 472static const u8 ice_fdir_ipv6_pfcp_node_pkt[] = {
 473        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 474        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 475        0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
 476        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 477        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 478        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 479        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
 480        0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
 481        0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 482        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 483};
 484
 485static const u8 ice_fdir_ipv6_pfcp_session_pkt[] = {
 486        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 487        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 488        0x00, 0x00, 0x00, 0x18, 0x11, 0x40, 0x00, 0x00,
 489        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 490        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 491        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 492        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x65,
 493        0x22, 0x65, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00,
 494        0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 495        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 496};
 497
 498static const u8 ice_fdir_non_ip_l2_pkt[] = {
 499        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 500        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 501        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 502};
 503
 504static const u8 ice_fdir_ecpri_tp0_pkt[] = {
 505        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 506        0x00, 0x00, 0x00, 0x00, 0xAE, 0xFE, 0x10, 0x00,
 507        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 508        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 509};
 510
 511static const u8 ice_fdir_ipv4_udp_ecpri_tp0_pkt[] = {
 512        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 513        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 514        0x00, 0x1C, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 515        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 516        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 517        0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
 518        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 519};
 520
 521static const u8 ice_fdir_ipv6_frag_pkt[] = {
 522        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 523        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 524        0x00, 0x00, 0x00, 0x00, 0x2C, 0x40, 0x00, 0x00,
 525        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 526        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 527        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 528        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00,
 529        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 530};
 531
 532static const u8 ice_fdir_ipv4_frag_pkt[] = {
 533        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 534        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 535        0x00, 0x14, 0x00, 0x00, 0x20, 0x00, 0x40, 0x10,
 536        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 537        0x00, 0x00
 538};
 539
 540static const u8 ice_fdir_tcpv6_pkt[] = {
 541        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 542        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 543        0x00, 0x00, 0x00, 0x14, 0x06, 0x40, 0x00, 0x00,
 544        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 545        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 546        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 547        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 548        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 549        0x00, 0x00, 0x50, 0x00, 0x20, 0x00, 0x00, 0x00,
 550        0x00, 0x00,
 551};
 552
 553static const u8 ice_fdir_udpv6_pkt[] = {
 554        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 555        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 556        0x00, 0x00, 0x00, 0x08, 0x11, 0x40, 0x00, 0x00,
 557        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 558        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 559        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 560        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 561        0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
 562};
 563
 564static const u8 ice_fdir_sctpv6_pkt[] = {
 565        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 566        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 567        0x00, 0x00, 0x00, 0x0C, 0x84, 0x40, 0x00, 0x00,
 568        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 569        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 570        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 571        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 572        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 573        0x00, 0x00,
 574};
 575
 576static const u8 ice_fdir_ipv6_pkt[] = {
 577        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 578        0x00, 0x00, 0x00, 0x00, 0x86, 0xDD, 0x60, 0x00,
 579        0x00, 0x00, 0x00, 0x00, 0x3B, 0x40, 0x00, 0x00,
 580        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 581        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 582        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 583        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 584};
 585
 586static const u8 ice_fdir_tcp4_tun_pkt[] = {
 587        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 588        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 589        0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 590        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 591        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 592        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 593        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 594        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
 595        0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00,
 596        0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 597        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 598        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 599        0x50, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
 600};
 601
 602static const u8 ice_fdir_udp4_tun_pkt[] = {
 603        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 604        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 605        0x00, 0x4e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 606        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 607        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 608        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 609        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 610        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
 611        0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x40, 0x00,
 612        0x40, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 613        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 614        0x00, 0x00, 0x00, 0x00,
 615};
 616
 617static const u8 ice_fdir_sctp4_tun_pkt[] = {
 618        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 619        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 620        0x00, 0x52, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 621        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 622        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 623        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 624        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 625        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
 626        0x45, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
 627        0x40, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 628        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 629        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 630};
 631
 632static const u8 ice_fdir_ip4_tun_pkt[] = {
 633        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 634        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 635        0x00, 0x46, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 636        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 637        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 638        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 639        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 640        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
 641        0x45, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00,
 642        0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 643        0x00, 0x00, 0x00, 0x00,
 644};
 645
 646static const u8 ice_fdir_tcp6_tun_pkt[] = {
 647        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 648        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 649        0x00, 0x6e, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 650        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 651        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 652        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 653        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 654        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
 655        0x60, 0x00, 0x00, 0x00, 0x00, 0x14, 0x06, 0x40,
 656        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 657        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 658        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 659        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 660        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 661        0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x20, 0x00,
 662        0x00, 0x00, 0x00, 0x00,
 663};
 664
 665static const u8 ice_fdir_udp6_tun_pkt[] = {
 666        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 667        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 668        0x00, 0x62, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 669        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 670        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 671        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 672        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 673        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
 674        0x60, 0x00, 0x00, 0x00, 0x00, 0x08, 0x11, 0x40,
 675        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 676        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 677        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 678        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 679        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 680};
 681
 682static const u8 ice_fdir_sctp6_tun_pkt[] = {
 683        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 684        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 685        0x00, 0x66, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 686        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 687        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 688        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 689        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 690        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
 691        0x60, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x84, 0x40,
 692        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 693        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 694        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 695        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 696        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 697        0x00, 0x00, 0x00, 0x00,
 698};
 699
 700static const u8 ice_fdir_ip6_tun_pkt[] = {
 701        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 702        0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
 703        0x00, 0x5a, 0x00, 0x00, 0x40, 0x00, 0x40, 0x11,
 704        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 705        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 706        0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0x00,
 707        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 708        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xdd,
 709        0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40,
 710        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 711        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 712        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 713        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 714};
 715
 716/* Flow Director no-op training packet table */
 717static const struct ice_fdir_base_pkt ice_fdir_pkt[] = {
 718        {
 719                ICE_FLTR_PTYPE_NONF_IPV4_TCP,
 720                sizeof(ice_fdir_tcpv4_pkt), ice_fdir_tcpv4_pkt,
 721                sizeof(ice_fdir_tcp4_tun_pkt), ice_fdir_tcp4_tun_pkt,
 722        },
 723        {
 724                ICE_FLTR_PTYPE_NONF_IPV4_UDP,
 725                sizeof(ice_fdir_udpv4_pkt), ice_fdir_udpv4_pkt,
 726                sizeof(ice_fdir_udp4_tun_pkt), ice_fdir_udp4_tun_pkt,
 727        },
 728        {
 729                ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
 730                sizeof(ice_fdir_sctpv4_pkt), ice_fdir_sctpv4_pkt,
 731                sizeof(ice_fdir_sctp4_tun_pkt), ice_fdir_sctp4_tun_pkt,
 732        },
 733        {
 734                ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
 735                sizeof(ice_fdir_ipv4_pkt), ice_fdir_ipv4_pkt,
 736                sizeof(ice_fdir_ip4_tun_pkt), ice_fdir_ip4_tun_pkt,
 737        },
 738        {
 739                ICE_FLTR_PTYPE_FRAG_IPV4,
 740                sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
 741                sizeof(ice_fdir_ipv4_frag_pkt), ice_fdir_ipv4_frag_pkt,
 742        },
 743        {
 744                ICE_FLTR_PTYPE_FRAG_IPV6,
 745                sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
 746                sizeof(ice_fdir_ipv6_frag_pkt), ice_fdir_ipv6_frag_pkt,
 747        },
 748        {
 749                ICE_FLTR_PTYPE_NONF_IPV4_GTPU,
 750                sizeof(ice_fdir_ipv4_gtpu4_pkt),
 751                ice_fdir_ipv4_gtpu4_pkt,
 752                sizeof(ice_fdir_ipv4_gtpu4_pkt),
 753                ice_fdir_ipv4_gtpu4_pkt,
 754        },
 755        {
 756                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH,
 757                sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
 758                ice_fdir_ipv4_gtpu4_eh_pkt,
 759                sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
 760                ice_fdir_ipv4_gtpu4_eh_pkt,
 761        },
 762        {
 763                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW,
 764                sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
 765                ice_fdir_ipv4_gtpu4_eh_dw_pkt,
 766                sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
 767                ice_fdir_ipv4_gtpu4_eh_dw_pkt,
 768        },
 769        {
 770                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP,
 771                sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
 772                ice_fdir_ipv4_gtpu4_eh_up_pkt,
 773                sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
 774                ice_fdir_ipv4_gtpu4_eh_up_pkt,
 775        },
 776        {
 777                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4,
 778                sizeof(ice_fdir_ipv4_gtpu4_pkt),
 779                ice_fdir_ipv4_gtpu4_pkt,
 780                sizeof(ice_fdir_ipv4_gtpu4_pkt),
 781                ice_fdir_ipv4_gtpu4_pkt,
 782        },
 783        {
 784                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP,
 785                sizeof(ice_fdir_udp4_gtpu4_pkt),
 786                ice_fdir_udp4_gtpu4_pkt,
 787                sizeof(ice_fdir_udp4_gtpu4_pkt),
 788                ice_fdir_udp4_gtpu4_pkt,
 789        },
 790        {
 791                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP,
 792                sizeof(ice_fdir_tcp4_gtpu4_pkt),
 793                ice_fdir_tcp4_gtpu4_pkt,
 794                sizeof(ice_fdir_tcp4_gtpu4_pkt),
 795                ice_fdir_tcp4_gtpu4_pkt,
 796        },
 797        {
 798                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4,
 799                sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
 800                ice_fdir_ipv4_gtpu4_eh_pkt,
 801                sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
 802                ice_fdir_ipv4_gtpu4_eh_pkt,
 803        },
 804        {
 805                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP,
 806                sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
 807                ice_fdir_udp4_gtpu4_eh_pkt,
 808                sizeof(ice_fdir_udp4_gtpu4_eh_pkt),
 809                ice_fdir_udp4_gtpu4_eh_pkt,
 810        },
 811        {
 812                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP,
 813                sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
 814                ice_fdir_tcp4_gtpu4_eh_pkt,
 815                sizeof(ice_fdir_tcp4_gtpu4_eh_pkt),
 816                ice_fdir_tcp4_gtpu4_eh_pkt,
 817        },
 818        {
 819                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4,
 820                sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
 821                ice_fdir_ipv4_gtpu4_eh_dw_pkt,
 822                sizeof(ice_fdir_ipv4_gtpu4_eh_dw_pkt),
 823                ice_fdir_ipv4_gtpu4_eh_dw_pkt,
 824        },
 825        {
 826                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP,
 827                sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
 828                ice_fdir_udp4_gtpu4_eh_dw_pkt,
 829                sizeof(ice_fdir_udp4_gtpu4_eh_dw_pkt),
 830                ice_fdir_udp4_gtpu4_eh_dw_pkt,
 831        },
 832        {
 833                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP,
 834                sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
 835                ice_fdir_tcp4_gtpu4_eh_dw_pkt,
 836                sizeof(ice_fdir_tcp4_gtpu4_eh_dw_pkt),
 837                ice_fdir_tcp4_gtpu4_eh_dw_pkt,
 838        },
 839        {
 840                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4,
 841                sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
 842                ice_fdir_ipv4_gtpu4_eh_up_pkt,
 843                sizeof(ice_fdir_ipv4_gtpu4_eh_up_pkt),
 844                ice_fdir_ipv4_gtpu4_eh_up_pkt,
 845        },
 846        {
 847                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP,
 848                sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
 849                ice_fdir_udp4_gtpu4_eh_up_pkt,
 850                sizeof(ice_fdir_udp4_gtpu4_eh_up_pkt),
 851                ice_fdir_udp4_gtpu4_eh_up_pkt,
 852        },
 853        {
 854                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP,
 855                sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
 856                ice_fdir_tcp4_gtpu4_eh_up_pkt,
 857                sizeof(ice_fdir_tcp4_gtpu4_eh_up_pkt),
 858                ice_fdir_tcp4_gtpu4_eh_up_pkt,
 859        },
 860        {
 861                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_ICMP,
 862                sizeof(ice_fdir_icmp4_gtpu4_pkt),
 863                ice_fdir_icmp4_gtpu4_pkt,
 864                sizeof(ice_fdir_icmp4_gtpu4_pkt),
 865                ice_fdir_icmp4_gtpu4_pkt,
 866        },
 867        {
 868                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_OTHER,
 869                sizeof(ice_fdir_ipv4_gtpu4_pkt),
 870                ice_fdir_ipv4_gtpu4_pkt,
 871                sizeof(ice_fdir_ipv4_gtpu4_pkt),
 872                ice_fdir_ipv4_gtpu4_pkt,
 873        },
 874        {
 875                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6,
 876                sizeof(ice_fdir_ipv6_gtpu4_pkt),
 877                ice_fdir_ipv6_gtpu4_pkt,
 878                sizeof(ice_fdir_ipv6_gtpu4_pkt),
 879                ice_fdir_ipv6_gtpu4_pkt,
 880        },
 881        {
 882                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP,
 883                sizeof(ice_fdir_udp6_gtpu4_pkt),
 884                ice_fdir_udp6_gtpu4_pkt,
 885                sizeof(ice_fdir_udp6_gtpu4_pkt),
 886                ice_fdir_udp6_gtpu4_pkt,
 887        },
 888        {
 889                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP,
 890                sizeof(ice_fdir_tcp6_gtpu4_pkt),
 891                ice_fdir_tcp6_gtpu4_pkt,
 892                sizeof(ice_fdir_tcp6_gtpu4_pkt),
 893                ice_fdir_tcp6_gtpu4_pkt,
 894        },
 895        {
 896                ICE_FLTR_PTYPE_NONF_IPV6_GTPU,
 897                sizeof(ice_fdir_ipv6_gtpu6_pkt),
 898                ice_fdir_ipv6_gtpu6_pkt,
 899                sizeof(ice_fdir_ipv6_gtpu6_pkt),
 900                ice_fdir_ipv6_gtpu6_pkt,
 901        },
 902        {
 903                ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH,
 904                sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
 905                ice_fdir_ipv6_gtpu6_eh_pkt,
 906                sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
 907                ice_fdir_ipv6_gtpu6_eh_pkt,
 908        },
 909        {
 910                ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW,
 911                sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
 912                ice_fdir_ipv6_gtpu6_eh_dw_pkt,
 913                sizeof(ice_fdir_ipv6_gtpu6_eh_dw_pkt),
 914                ice_fdir_ipv6_gtpu6_eh_dw_pkt,
 915        },
 916        {
 917                ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP,
 918                sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
 919                ice_fdir_ipv6_gtpu6_eh_up_pkt,
 920                sizeof(ice_fdir_ipv6_gtpu6_eh_up_pkt),
 921                ice_fdir_ipv6_gtpu6_eh_up_pkt,
 922        },
 923        {
 924                ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER,
 925                sizeof(ice_fdir_ipv6_gtpu6_pkt),
 926                ice_fdir_ipv6_gtpu6_pkt,
 927                sizeof(ice_fdir_ipv6_gtpu6_pkt),
 928                ice_fdir_ipv6_gtpu6_pkt,
 929        },
 930        {
 931                ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_OTHER,
 932                sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
 933                ice_fdir_ipv4_gtpu4_eh_pkt,
 934                sizeof(ice_fdir_ipv4_gtpu4_eh_pkt),
 935                ice_fdir_ipv4_gtpu4_eh_pkt,
 936        },
 937        {
 938                ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER,
 939                sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
 940                ice_fdir_ipv6_gtpu6_eh_pkt,
 941                sizeof(ice_fdir_ipv6_gtpu6_eh_pkt),
 942                ice_fdir_ipv6_gtpu6_eh_pkt,
 943        },
 944        {
 945                ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3,
 946                sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
 947                sizeof(ice_fdir_ipv4_l2tpv3_pkt), ice_fdir_ipv4_l2tpv3_pkt,
 948        },
 949        {
 950                ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3,
 951                sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
 952                sizeof(ice_fdir_ipv6_l2tpv3_pkt), ice_fdir_ipv6_l2tpv3_pkt,
 953        },
 954        {
 955                ICE_FLTR_PTYPE_NONF_IPV4_ESP,
 956                sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
 957                sizeof(ice_fdir_ipv4_esp_pkt), ice_fdir_ipv4_esp_pkt,
 958        },
 959        {
 960                ICE_FLTR_PTYPE_NONF_IPV6_ESP,
 961                sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
 962                sizeof(ice_fdir_ipv6_esp_pkt), ice_fdir_ipv6_esp_pkt,
 963        },
 964        {
 965                ICE_FLTR_PTYPE_NONF_IPV4_AH,
 966                sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
 967                sizeof(ice_fdir_ipv4_ah_pkt), ice_fdir_ipv4_ah_pkt,
 968        },
 969        {
 970                ICE_FLTR_PTYPE_NONF_IPV6_AH,
 971                sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
 972                sizeof(ice_fdir_ipv6_ah_pkt), ice_fdir_ipv6_ah_pkt,
 973        },
 974        {
 975                ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP,
 976                sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
 977                ice_fdir_ipv4_nat_t_esp_pkt,
 978                sizeof(ice_fdir_ipv4_nat_t_esp_pkt),
 979                ice_fdir_ipv4_nat_t_esp_pkt,
 980        },
 981        {
 982                ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP,
 983                sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
 984                ice_fdir_ipv6_nat_t_esp_pkt,
 985                sizeof(ice_fdir_ipv6_nat_t_esp_pkt),
 986                ice_fdir_ipv6_nat_t_esp_pkt,
 987        },
 988        {
 989                ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE,
 990                sizeof(ice_fdir_ipv4_pfcp_node_pkt),
 991                ice_fdir_ipv4_pfcp_node_pkt,
 992                sizeof(ice_fdir_ipv4_pfcp_node_pkt),
 993                ice_fdir_ipv4_pfcp_node_pkt,
 994        },
 995        {
 996                ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION,
 997                sizeof(ice_fdir_ipv4_pfcp_session_pkt),
 998                ice_fdir_ipv4_pfcp_session_pkt,
 999                sizeof(ice_fdir_ipv4_pfcp_session_pkt),
1000                ice_fdir_ipv4_pfcp_session_pkt,
1001        },
1002        {
1003                ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE,
1004                sizeof(ice_fdir_ipv6_pfcp_node_pkt),
1005                ice_fdir_ipv6_pfcp_node_pkt,
1006                sizeof(ice_fdir_ipv6_pfcp_node_pkt),
1007                ice_fdir_ipv6_pfcp_node_pkt,
1008        },
1009        {
1010                ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION,
1011                sizeof(ice_fdir_ipv6_pfcp_session_pkt),
1012                ice_fdir_ipv6_pfcp_session_pkt,
1013                sizeof(ice_fdir_ipv6_pfcp_session_pkt),
1014                ice_fdir_ipv6_pfcp_session_pkt,
1015        },
1016        {
1017                ICE_FLTR_PTYPE_NON_IP_L2,
1018                sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
1019                sizeof(ice_fdir_non_ip_l2_pkt), ice_fdir_non_ip_l2_pkt,
1020        },
1021        {
1022                ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN,
1023                sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
1024                sizeof(ice_fdir_udp4_vxlan_pkt), ice_fdir_udp4_vxlan_pkt,
1025        },
1026        {
1027                ICE_FLTR_PTYPE_NONF_ECPRI_TP0,
1028                sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1029                sizeof(ice_fdir_ecpri_tp0_pkt), ice_fdir_ecpri_tp0_pkt,
1030        },
1031        {
1032                ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0,
1033                sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1034                ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1035                sizeof(ice_fdir_ipv4_udp_ecpri_tp0_pkt),
1036                ice_fdir_ipv4_udp_ecpri_tp0_pkt,
1037        },
1038        {
1039                ICE_FLTR_PTYPE_NONF_IPV6_TCP,
1040                sizeof(ice_fdir_tcpv6_pkt), ice_fdir_tcpv6_pkt,
1041                sizeof(ice_fdir_tcp6_tun_pkt), ice_fdir_tcp6_tun_pkt,
1042        },
1043        {
1044                ICE_FLTR_PTYPE_NONF_IPV6_UDP,
1045                sizeof(ice_fdir_udpv6_pkt), ice_fdir_udpv6_pkt,
1046                sizeof(ice_fdir_udp6_tun_pkt), ice_fdir_udp6_tun_pkt,
1047        },
1048        {
1049                ICE_FLTR_PTYPE_NONF_IPV6_SCTP,
1050                sizeof(ice_fdir_sctpv6_pkt), ice_fdir_sctpv6_pkt,
1051                sizeof(ice_fdir_sctp6_tun_pkt), ice_fdir_sctp6_tun_pkt,
1052        },
1053        {
1054                ICE_FLTR_PTYPE_NONF_IPV6_OTHER,
1055                sizeof(ice_fdir_ipv6_pkt), ice_fdir_ipv6_pkt,
1056                sizeof(ice_fdir_ip6_tun_pkt), ice_fdir_ip6_tun_pkt,
1057        },
1058};
1059
1060#define ICE_FDIR_NUM_PKT ARRAY_SIZE(ice_fdir_pkt)
1061
1062/**
1063 * ice_set_dflt_val_fd_desc
1064 * @fd_fltr_ctx: pointer to fd filter descriptor
1065 */
1066static void ice_set_dflt_val_fd_desc(struct ice_fd_fltr_desc_ctx *fd_fltr_ctx)
1067{
1068        fd_fltr_ctx->comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1069        fd_fltr_ctx->comp_report = ICE_FXD_FLTR_QW0_COMP_REPORT_SW_FAIL;
1070        fd_fltr_ctx->fd_space = ICE_FXD_FLTR_QW0_FD_SPACE_GUAR_BEST;
1071        fd_fltr_ctx->cnt_ena = ICE_FXD_FLTR_QW0_STAT_ENA_PKTS;
1072        fd_fltr_ctx->evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_TRUE;
1073        fd_fltr_ctx->toq = ICE_FXD_FLTR_QW0_TO_Q_EQUALS_QINDEX;
1074        fd_fltr_ctx->toq_prio = ICE_FXD_FLTR_QW0_TO_Q_PRIO1;
1075        fd_fltr_ctx->dpu_recipe = ICE_FXD_FLTR_QW0_DPU_RECIPE_DFLT;
1076        fd_fltr_ctx->drop = ICE_FXD_FLTR_QW0_DROP_NO;
1077        fd_fltr_ctx->flex_prio = ICE_FXD_FLTR_QW0_FLEX_PRI_NONE;
1078        fd_fltr_ctx->flex_mdid = ICE_FXD_FLTR_QW0_FLEX_MDID0;
1079        fd_fltr_ctx->flex_val = ICE_FXD_FLTR_QW0_FLEX_VAL0;
1080        fd_fltr_ctx->dtype = ICE_TX_DESC_DTYPE_FLTR_PROG;
1081        fd_fltr_ctx->desc_prof_prio = ICE_FXD_FLTR_QW1_PROF_PRIO_ZERO;
1082        fd_fltr_ctx->desc_prof = ICE_FXD_FLTR_QW1_PROF_ZERO;
1083        fd_fltr_ctx->swap = ICE_FXD_FLTR_QW1_SWAP_SET;
1084        fd_fltr_ctx->fdid_prio = ICE_FXD_FLTR_QW1_FDID_PRI_ONE;
1085        fd_fltr_ctx->fdid_mdid = ICE_FXD_FLTR_QW1_FDID_MDID_FD;
1086        fd_fltr_ctx->fdid = ICE_FXD_FLTR_QW1_FDID_ZERO;
1087}
1088
1089/**
1090 * ice_set_fd_desc_val
1091 * @ctx: pointer to fd filter descriptor context
1092 * @fdir_desc: populated with fd filter descriptor values
1093 */
1094static void
1095ice_set_fd_desc_val(struct ice_fd_fltr_desc_ctx *ctx,
1096                    struct ice_fltr_desc *fdir_desc)
1097{
1098        u64 qword;
1099
1100        /* prep QW0 of FD filter programming desc */
1101        qword = ((u64)ctx->qindex << ICE_FXD_FLTR_QW0_QINDEX_S) &
1102                ICE_FXD_FLTR_QW0_QINDEX_M;
1103        qword |= ((u64)ctx->comp_q << ICE_FXD_FLTR_QW0_COMP_Q_S) &
1104                 ICE_FXD_FLTR_QW0_COMP_Q_M;
1105        qword |= ((u64)ctx->comp_report << ICE_FXD_FLTR_QW0_COMP_REPORT_S) &
1106                 ICE_FXD_FLTR_QW0_COMP_REPORT_M;
1107        qword |= ((u64)ctx->fd_space << ICE_FXD_FLTR_QW0_FD_SPACE_S) &
1108                 ICE_FXD_FLTR_QW0_FD_SPACE_M;
1109        qword |= ((u64)ctx->cnt_index << ICE_FXD_FLTR_QW0_STAT_CNT_S) &
1110                 ICE_FXD_FLTR_QW0_STAT_CNT_M;
1111        qword |= ((u64)ctx->cnt_ena << ICE_FXD_FLTR_QW0_STAT_ENA_S) &
1112                 ICE_FXD_FLTR_QW0_STAT_ENA_M;
1113        qword |= ((u64)ctx->evict_ena << ICE_FXD_FLTR_QW0_EVICT_ENA_S) &
1114                 ICE_FXD_FLTR_QW0_EVICT_ENA_M;
1115        qword |= ((u64)ctx->toq << ICE_FXD_FLTR_QW0_TO_Q_S) &
1116                 ICE_FXD_FLTR_QW0_TO_Q_M;
1117        qword |= ((u64)ctx->toq_prio << ICE_FXD_FLTR_QW0_TO_Q_PRI_S) &
1118                 ICE_FXD_FLTR_QW0_TO_Q_PRI_M;
1119        qword |= ((u64)ctx->dpu_recipe << ICE_FXD_FLTR_QW0_DPU_RECIPE_S) &
1120                 ICE_FXD_FLTR_QW0_DPU_RECIPE_M;
1121        qword |= ((u64)ctx->drop << ICE_FXD_FLTR_QW0_DROP_S) &
1122                 ICE_FXD_FLTR_QW0_DROP_M;
1123        qword |= ((u64)ctx->flex_prio << ICE_FXD_FLTR_QW0_FLEX_PRI_S) &
1124                 ICE_FXD_FLTR_QW0_FLEX_PRI_M;
1125        qword |= ((u64)ctx->flex_mdid << ICE_FXD_FLTR_QW0_FLEX_MDID_S) &
1126                 ICE_FXD_FLTR_QW0_FLEX_MDID_M;
1127        qword |= ((u64)ctx->flex_val << ICE_FXD_FLTR_QW0_FLEX_VAL_S) &
1128                 ICE_FXD_FLTR_QW0_FLEX_VAL_M;
1129        fdir_desc->qidx_compq_space_stat = CPU_TO_LE64(qword);
1130
1131        /* prep QW1 of FD filter programming desc */
1132        qword = ((u64)ctx->dtype << ICE_FXD_FLTR_QW1_DTYPE_S) &
1133                ICE_FXD_FLTR_QW1_DTYPE_M;
1134        qword |= ((u64)ctx->pcmd << ICE_FXD_FLTR_QW1_PCMD_S) &
1135                 ICE_FXD_FLTR_QW1_PCMD_M;
1136        qword |= ((u64)ctx->desc_prof_prio << ICE_FXD_FLTR_QW1_PROF_PRI_S) &
1137                 ICE_FXD_FLTR_QW1_PROF_PRI_M;
1138        qword |= ((u64)ctx->desc_prof << ICE_FXD_FLTR_QW1_PROF_S) &
1139                 ICE_FXD_FLTR_QW1_PROF_M;
1140        qword |= ((u64)ctx->fd_vsi << ICE_FXD_FLTR_QW1_FD_VSI_S) &
1141                 ICE_FXD_FLTR_QW1_FD_VSI_M;
1142        qword |= ((u64)ctx->swap << ICE_FXD_FLTR_QW1_SWAP_S) &
1143                 ICE_FXD_FLTR_QW1_SWAP_M;
1144        qword |= ((u64)ctx->fdid_prio << ICE_FXD_FLTR_QW1_FDID_PRI_S) &
1145                 ICE_FXD_FLTR_QW1_FDID_PRI_M;
1146        qword |= ((u64)ctx->fdid_mdid << ICE_FXD_FLTR_QW1_FDID_MDID_S) &
1147                 ICE_FXD_FLTR_QW1_FDID_MDID_M;
1148        qword |= ((u64)ctx->fdid << ICE_FXD_FLTR_QW1_FDID_S) &
1149                 ICE_FXD_FLTR_QW1_FDID_M;
1150        fdir_desc->dtype_cmd_vsi_fdid = CPU_TO_LE64(qword);
1151}
1152
1153/**
1154 * ice_fdir_get_prgm_desc - set a fdir descriptor from a fdir filter struct
1155 * @hw: pointer to the hardware structure
1156 * @input: filter
1157 * @fdesc: filter descriptor
1158 * @add: if add is true, this is an add operation, false implies delete
1159 */
1160void
1161ice_fdir_get_prgm_desc(struct ice_hw *hw, struct ice_fdir_fltr *input,
1162                       struct ice_fltr_desc *fdesc, bool add)
1163{
1164        struct ice_fd_fltr_desc_ctx fdir_fltr_ctx = { 0 };
1165
1166        /* set default context info */
1167        ice_set_dflt_val_fd_desc(&fdir_fltr_ctx);
1168
1169        /* change sideband filtering values */
1170        fdir_fltr_ctx.fdid = input->fltr_id;
1171        if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DROP_PKT) {
1172                fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_YES;
1173                fdir_fltr_ctx.qindex = 0;
1174        } else if (input->dest_ctl ==
1175                   ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER) {
1176                fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1177                fdir_fltr_ctx.qindex = 0;
1178        } else {
1179                if (input->dest_ctl ==
1180                    ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QGROUP)
1181                        fdir_fltr_ctx.toq = input->q_region;
1182                fdir_fltr_ctx.drop = ICE_FXD_FLTR_QW0_DROP_NO;
1183                fdir_fltr_ctx.qindex = input->q_index;
1184        }
1185        fdir_fltr_ctx.cnt_ena = input->cnt_ena;
1186        fdir_fltr_ctx.cnt_index = input->cnt_index;
1187        fdir_fltr_ctx.fd_vsi = ice_get_hw_vsi_num(hw, input->dest_vsi);
1188        fdir_fltr_ctx.evict_ena = ICE_FXD_FLTR_QW0_EVICT_ENA_FALSE;
1189        if (input->dest_ctl == ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_OTHER)
1190                fdir_fltr_ctx.toq_prio = 0;
1191        else
1192                fdir_fltr_ctx.toq_prio = 3;
1193        fdir_fltr_ctx.pcmd = add ? ICE_FXD_FLTR_QW1_PCMD_ADD :
1194                ICE_FXD_FLTR_QW1_PCMD_REMOVE;
1195        fdir_fltr_ctx.swap = ICE_FXD_FLTR_QW1_SWAP_NOT_SET;
1196        fdir_fltr_ctx.comp_q = ICE_FXD_FLTR_QW0_COMP_Q_ZERO;
1197        fdir_fltr_ctx.comp_report = input->comp_report;
1198        fdir_fltr_ctx.fdid_prio = input->fdid_prio;
1199        fdir_fltr_ctx.desc_prof = 1;
1200        fdir_fltr_ctx.desc_prof_prio = 3;
1201        ice_set_fd_desc_val(&fdir_fltr_ctx, fdesc);
1202}
1203
1204/**
1205 * ice_alloc_fd_res_cntr - obtain counter resource for FD type
1206 * @hw: pointer to the hardware structure
1207 * @cntr_id: returns counter index
1208 */
1209enum ice_status ice_alloc_fd_res_cntr(struct ice_hw *hw, u16 *cntr_id)
1210{
1211        return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1212                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1213}
1214
1215/**
1216 * ice_free_fd_res_cntr - Free counter resource for FD type
1217 * @hw: pointer to the hardware structure
1218 * @cntr_id: counter index to be freed
1219 */
1220enum ice_status ice_free_fd_res_cntr(struct ice_hw *hw, u16 cntr_id)
1221{
1222        return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_COUNTER_BLOCK,
1223                                 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1, cntr_id);
1224}
1225
1226/**
1227 * ice_alloc_fd_guar_item - allocate resource for FD guaranteed entries
1228 * @hw: pointer to the hardware structure
1229 * @cntr_id: returns counter index
1230 * @num_fltr: number of filter entries to be allocated
1231 */
1232enum ice_status
1233ice_alloc_fd_guar_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1234{
1235        return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1236                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1237                                  cntr_id);
1238}
1239
1240/**
1241 * ice_free_fd_guar_item - Free flow director guaranteed entries
1242 * @hw: pointer to the hardware structure
1243 * @cntr_id: counter index that needs to be freed
1244 * @num_fltr: number of filters to be freed
1245 */
1246enum ice_status
1247ice_free_fd_guar_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1248{
1249        return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_GUARANTEED_ENTRIES,
1250                                 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1251                                 cntr_id);
1252}
1253
1254/**
1255 * ice_alloc_fd_shrd_item - allocate resource for flow director shared entries
1256 * @hw: pointer to the hardware structure
1257 * @cntr_id: returns counter index
1258 * @num_fltr: number of filter entries to be allocated
1259 */
1260enum ice_status
1261ice_alloc_fd_shrd_item(struct ice_hw *hw, u16 *cntr_id, u16 num_fltr)
1262{
1263        return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1264                                  ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1265                                  cntr_id);
1266}
1267
1268/**
1269 * ice_free_fd_shrd_item - Free flow director shared entries
1270 * @hw: pointer to the hardware structure
1271 * @cntr_id: counter index that needs to be freed
1272 * @num_fltr: number of filters to be freed
1273 */
1274enum ice_status
1275ice_free_fd_shrd_item(struct ice_hw *hw, u16 cntr_id, u16 num_fltr)
1276{
1277        return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_FDIR_SHARED_ENTRIES,
1278                                 ICE_AQC_RES_TYPE_FLAG_DEDICATED, num_fltr,
1279                                 cntr_id);
1280}
1281
1282/**
1283 * ice_get_fdir_cnt_all - get the number of Flow Director filters
1284 * @hw: hardware data structure
1285 *
1286 * Returns the number of filters available on device
1287 */
1288int ice_get_fdir_cnt_all(struct ice_hw *hw)
1289{
1290        return hw->func_caps.fd_fltr_guar + hw->func_caps.fd_fltr_best_effort;
1291}
1292
1293/**
1294 * ice_pkt_insert_ipv6_addr - insert a be32 IPv6 address into a memory buffer.
1295 * @pkt: packet buffer
1296 * @offset: offset into buffer
1297 * @addr: IPv6 address to convert and insert into pkt at offset
1298 */
1299static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
1300{
1301        int idx;
1302
1303        for (idx = 0; idx < ICE_IPV6_ADDR_LEN_AS_U32; idx++)
1304                ice_memcpy(pkt + offset + idx * sizeof(*addr), &addr[idx],
1305                           sizeof(*addr), ICE_NONDMA_TO_NONDMA);
1306}
1307
1308/**
1309 * ice_pkt_insert_u6_qfi - insert a u6 value qfi into a memory buffer for gtpu
1310 * @pkt: packet buffer
1311 * @offset: offset into buffer
1312 * @data: 8 bit value to convert and insert into pkt at offset
1313 *
1314 * This function is designed for inserting qfi (6 bits) for gtpu.
1315 */
1316static void ice_pkt_insert_u6_qfi(u8 *pkt, int offset, u8 data)
1317{
1318        u8 ret;
1319
1320        ret = (data & 0x3F) + (*(pkt + offset) & 0xC0);
1321        ice_memcpy(pkt + offset, &ret, sizeof(ret), ICE_NONDMA_TO_NONDMA);
1322}
1323
1324/**
1325 * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
1326 * @pkt: packet buffer
1327 * @offset: offset into buffer
1328 * @data: 8 bit value to convert and insert into pkt at offset
1329 */
1330static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
1331{
1332        ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1333}
1334
1335/**
1336 * ice_pkt_insert_u8_tc - insert a u8 value into a memory buffer for TC ipv6.
1337 * @pkt: packet buffer
1338 * @offset: offset into buffer
1339 * @data: 8 bit value to convert and insert into pkt at offset
1340 *
1341 * This function is designed for inserting Traffic Class (TC) for IPv6,
1342 * since that TC is not aligned in number of bytes. Here we split it out
1343 * into two part and fill each byte with data copy from pkt, then insert
1344 * the two bytes data one by one.
1345 */
1346static void ice_pkt_insert_u8_tc(u8 *pkt, int offset, u8 data)
1347{
1348        u8 high, low;
1349
1350        high = (data >> 4) + (*(pkt + offset) & 0xF0);
1351        ice_memcpy(pkt + offset, &high, sizeof(high), ICE_NONDMA_TO_NONDMA);
1352
1353        low = (*(pkt + offset + 1) & 0x0F) + ((data & 0x0F) << 4);
1354        ice_memcpy(pkt + offset + 1, &low, sizeof(low), ICE_NONDMA_TO_NONDMA);
1355}
1356
1357/**
1358 * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
1359 * @pkt: packet buffer
1360 * @offset: offset into buffer
1361 * @data: 16 bit value to convert and insert into pkt at offset
1362 */
1363static void ice_pkt_insert_u16(u8 *pkt, int offset, __be16 data)
1364{
1365        ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1366}
1367
1368/**
1369 * ice_pkt_insert_u32 - insert a be32 value into a memory buffer.
1370 * @pkt: packet buffer
1371 * @offset: offset into buffer
1372 * @data: 32 bit value to convert and insert into pkt at offset
1373 */
1374static void ice_pkt_insert_u32(u8 *pkt, int offset, __be32 data)
1375{
1376        ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
1377}
1378
1379/**
1380 * ice_pkt_insert_mac_addr - insert a MAC addr into a memory buffer.
1381 * @pkt: packet buffer
1382 * @addr: MAC address to convert and insert into pkt at offset
1383 */
1384static void ice_pkt_insert_mac_addr(u8 *pkt, u8 *addr)
1385{
1386        ice_memcpy(pkt, addr, ETH_ALEN, ICE_NONDMA_TO_NONDMA);
1387}
1388
1389/**
1390 * ice_fdir_get_open_tunnel_port
1391 * @hw: pointer to the hardware structure
1392 * @flow: flow ptype
1393 * @port: returns open port
1394 *
1395 * returns an open tunnel port specified for this flow type
1396 */
1397static enum ice_status
1398ice_fdir_get_open_tunnel_port(struct ice_hw *hw, enum ice_fltr_ptype flow,
1399                              u16 *port)
1400{
1401        switch (flow) {
1402        case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1403                /* eCPRI tunnel */
1404                if (!ice_get_open_tunnel_port(hw, TNL_ECPRI, port))
1405                        return ICE_ERR_DOES_NOT_EXIST;
1406                break;
1407        default:
1408                if (!ice_get_open_tunnel_port(hw, TNL_VXLAN, port) &&
1409                    !ice_get_open_tunnel_port(hw, TNL_GENEVE, port))
1410                        return ICE_ERR_DOES_NOT_EXIST;
1411        }
1412
1413        return ICE_SUCCESS;
1414}
1415
1416/**
1417 * ice_fdir_get_gen_prgm_pkt - generate a training packet
1418 * @hw: pointer to the hardware structure
1419 * @input: flow director filter data structure
1420 * @pkt: pointer to return filter packet
1421 * @frag: generate a fragment packet
1422 * @tun: true implies generate a tunnel packet
1423 */
1424enum ice_status
1425ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
1426                          u8 *pkt, bool frag, bool tun)
1427{
1428        enum ice_fltr_ptype flow;
1429        u16 tnl_port;
1430        u8 *loc;
1431        u16 idx;
1432
1433        if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
1434                switch (input->ip.v4.proto) {
1435                case ICE_IP_PROTO_TCP:
1436                        flow = ICE_FLTR_PTYPE_NONF_IPV4_TCP;
1437                        break;
1438                case ICE_IP_PROTO_UDP:
1439                        flow = ICE_FLTR_PTYPE_NONF_IPV4_UDP;
1440                        break;
1441                case ICE_IP_PROTO_SCTP:
1442                        flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
1443                        break;
1444                default:
1445                        flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
1446                        break;
1447                }
1448        } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
1449                switch (input->ip.v6.proto) {
1450                case ICE_IP_PROTO_TCP:
1451                        flow = ICE_FLTR_PTYPE_NONF_IPV6_TCP;
1452                        break;
1453                case ICE_IP_PROTO_UDP:
1454                        flow = ICE_FLTR_PTYPE_NONF_IPV6_UDP;
1455                        break;
1456                case ICE_IP_PROTO_SCTP:
1457                        flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
1458                        break;
1459                default:
1460                        flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
1461                        break;
1462                }
1463        } else {
1464                flow = input->flow_type;
1465        }
1466
1467        for (idx = 0; idx < ICE_FDIR_NUM_PKT; idx++)
1468                if (ice_fdir_pkt[idx].flow == flow)
1469                        break;
1470        if (idx == ICE_FDIR_NUM_PKT)
1471                return ICE_ERR_PARAM;
1472        if (!tun) {
1473                ice_memcpy(pkt, ice_fdir_pkt[idx].pkt,
1474                           ice_fdir_pkt[idx].pkt_len, ICE_NONDMA_TO_NONDMA);
1475                loc = pkt;
1476        } else {
1477                if (!ice_fdir_pkt[idx].tun_pkt)
1478                        return ICE_ERR_PARAM;
1479
1480                switch (flow) {
1481                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1482                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1483                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1484                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1485                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1486                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1487                        ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1488                                   ice_fdir_pkt[idx].tun_pkt_len,
1489                                   ICE_NONDMA_TO_NONDMA);
1490                        loc = &pkt[ICE_FDIR_GTPU_IP_INNER_PKT_OFF];
1491                        break;
1492                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1493                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1494                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1495                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1496                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1497                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1498                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1499                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1500                case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1501                        ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1502                                   ice_fdir_pkt[idx].tun_pkt_len,
1503                                   ICE_NONDMA_TO_NONDMA);
1504                        loc = &pkt[ICE_FDIR_GTPU_EH_INNER_PKT_OFF];
1505                        break;
1506                default:
1507                        if (ice_fdir_get_open_tunnel_port(hw, flow, &tnl_port))
1508                                return ICE_ERR_DOES_NOT_EXIST;
1509
1510                        ice_memcpy(pkt, ice_fdir_pkt[idx].tun_pkt,
1511                                   ice_fdir_pkt[idx].tun_pkt_len,
1512                                   ICE_NONDMA_TO_NONDMA);
1513                        ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_DST_PORT_OFFSET,
1514                                           HTONS(tnl_port));
1515                        loc = &pkt[ICE_FDIR_TUN_PKT_OFF];
1516                        break;
1517                }
1518        }
1519
1520        /* Reverse the src and dst, since the HW expects them to be from Tx
1521         * perspective. The input from user is from Rx filter perspective.
1522         */
1523        switch (flow) {
1524        case ICE_FLTR_PTYPE_NONF_IPV4_TCP:
1525                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1526                                   input->ip.v4.src_ip);
1527                ice_pkt_insert_u16(loc, ICE_IPV4_TCP_DST_PORT_OFFSET,
1528                                   input->ip.v4.src_port);
1529                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1530                                   input->ip.v4.dst_ip);
1531                ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
1532                                   input->ip.v4.dst_port);
1533                ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1534                ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1535                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1536                if (frag)
1537                        loc[20] = ICE_FDIR_IPV4_PKT_FLAG_MF;
1538                break;
1539        case ICE_FLTR_PTYPE_NONF_IPV4_UDP:
1540                ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1541                ice_pkt_insert_mac_addr(pkt + ETH_ALEN,
1542                                        input->ext_data_outer.src_mac);
1543                ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1544                                   input->ip_outer.v4.dst_ip);
1545                ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1546                                   input->ip_outer.v4.src_ip);
1547                ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1548                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1549                                   input->ip.v4.src_ip);
1550                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1551                                   input->ip.v4.src_port);
1552                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1553                                   input->ip.v4.dst_ip);
1554                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1555                                   input->ip.v4.dst_port);
1556                ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1557                ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1558                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1559                ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1560                break;
1561        case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
1562                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1563                                   input->ip.v4.src_ip);
1564                ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_DST_PORT_OFFSET,
1565                                   input->ip.v4.src_port);
1566                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1567                                   input->ip.v4.dst_ip);
1568                ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
1569                                   input->ip.v4.dst_port);
1570                ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1571                ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1572                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1573                break;
1574        case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
1575                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1576                                   input->ip.v4.src_ip);
1577                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1578                                   input->ip.v4.dst_ip);
1579                ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1580                ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1581                ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1582                                  input->ip.v4.proto);
1583                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1584                break;
1585        case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
1586                ice_pkt_insert_mac_addr(pkt, input->ext_data_outer.dst_mac);
1587                ice_pkt_insert_mac_addr(pkt + ETH_ALEN, input->ext_data_outer.src_mac);
1588                ice_pkt_insert_u32(pkt, ICE_IPV4_SRC_ADDR_OFFSET,
1589                                   input->ip_outer.v4.dst_ip);
1590                ice_pkt_insert_u32(pkt, ICE_IPV4_DST_ADDR_OFFSET,
1591                                   input->ip_outer.v4.src_ip);
1592                ice_pkt_insert_u8(pkt, ICE_IPV4_TOS_OFFSET, input->ip_outer.v4.tos);
1593                ice_pkt_insert_u32(pkt, ICE_IPV4_VXLAN_VNI_OFFSET,
1594                                   input->vxlan_data.vni);
1595                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1596                                   input->ip.v4.src_ip);
1597                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_DST_PORT_OFFSET,
1598                                   input->ip.v4.src_port);
1599                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1600                                   input->ip.v4.dst_ip);
1601                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1602                                   input->ip.v4.dst_port);
1603                ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1604                ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1605                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1606                ice_pkt_insert_mac_addr(loc + ETH_ALEN, input->ext_data.src_mac);
1607                break;
1608        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
1609                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1610                                   input->ip.v4.src_ip);
1611                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1612                                   input->ip.v4.dst_ip);
1613                ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1614                                   input->gtpu_data.teid);
1615                break;
1616        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4:
1617        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4:
1618        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4:
1619        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4:
1620                ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1621                                   input->ip.v4.src_ip);
1622                ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1623                                   input->ip.v4.dst_ip);
1624                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1625                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1626                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_PROTO_OFFSET,
1627                                  input->ip.v4.proto);
1628                break;
1629        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH:
1630        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW:
1631        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP:
1632                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1633                                   input->ip.v4.src_ip);
1634                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1635                                   input->ip.v4.dst_ip);
1636                ice_pkt_insert_u32(loc, ICE_IPV4_GTPU_TEID_OFFSET,
1637                                   input->gtpu_data.teid);
1638                ice_pkt_insert_u6_qfi(loc, ICE_IPV4_GTPU_QFI_OFFSET,
1639                                      input->gtpu_data.qfi);
1640                break;
1641        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_UDP:
1642        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_UDP:
1643        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_UDP:
1644        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_UDP:
1645                ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1646                                   input->ip.v4.src_ip);
1647                ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_DST_PORT_OFFSET,
1648                                   input->ip.v4.src_port);
1649                ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1650                                   input->ip.v4.dst_ip);
1651                ice_pkt_insert_u16(loc, ICE_UDP4_NO_MAC_SRC_PORT_OFFSET,
1652                                   input->ip.v4.dst_port);
1653                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1654                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1655                break;
1656        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV4_TCP:
1657        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_IPV4_TCP:
1658        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_DW_IPV4_TCP:
1659        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_EH_UP_IPV4_TCP:
1660                ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_DST_ADDR_OFFSET,
1661                                   input->ip.v4.src_ip);
1662                ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_DST_PORT_OFFSET,
1663                                   input->ip.v4.src_port);
1664                ice_pkt_insert_u32(loc, ICE_IPV4_NO_MAC_SRC_ADDR_OFFSET,
1665                                   input->ip.v4.dst_ip);
1666                ice_pkt_insert_u16(loc, ICE_TCP4_NO_MAC_SRC_PORT_OFFSET,
1667                                   input->ip.v4.dst_port);
1668                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TOS_OFFSET, input->ip.v4.tos);
1669                ice_pkt_insert_u8(loc, ICE_IPV4_NO_MAC_TTL_OFFSET, input->ip.v4.ttl);
1670                break;
1671        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6:
1672                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1673                                         input->ip.v6.src_ip);
1674                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1675                                         input->ip.v6.dst_ip);
1676                ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1677                ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1678                ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_PROTO_OFFSET,
1679                                  input->ip.v6.proto);
1680                break;
1681        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_UDP:
1682                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1683                                         input->ip.v6.src_ip);
1684                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1685                                         input->ip.v6.dst_ip);
1686                ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_DST_PORT_OFFSET,
1687                                   input->ip.v6.src_port);
1688                ice_pkt_insert_u16(loc, ICE_UDP6_NO_MAC_SRC_PORT_OFFSET,
1689                                   input->ip.v6.dst_port);
1690                ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1691                ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1692                break;
1693        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU_IPV6_TCP:
1694                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_DST_ADDR_OFFSET,
1695                                         input->ip.v6.src_ip);
1696                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_NO_MAC_SRC_ADDR_OFFSET,
1697                                         input->ip.v6.dst_ip);
1698                ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_DST_PORT_OFFSET,
1699                                   input->ip.v6.src_port);
1700                ice_pkt_insert_u16(loc, ICE_TCP6_NO_MAC_SRC_PORT_OFFSET,
1701                                   input->ip.v6.dst_port);
1702                ice_pkt_insert_u8_tc(loc, ICE_IPV6_NO_MAC_TC_OFFSET, input->ip.v6.tc);
1703                ice_pkt_insert_u8(loc, ICE_IPV6_NO_MAC_HLIM_OFFSET, input->ip.v6.hlim);
1704                break;
1705        case ICE_FLTR_PTYPE_NONF_IPV6_GTPU:
1706        case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_IPV6_OTHER:
1707                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1708                                         input->ip.v6.src_ip);
1709                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1710                                         input->ip.v6.dst_ip);
1711                ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1712                                   input->gtpu_data.teid);
1713                break;
1714        case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH:
1715        case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_DW:
1716        case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_UP:
1717        case ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH_IPV6_OTHER:
1718                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1719                                         input->ip.v6.src_ip);
1720                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1721                                         input->ip.v6.dst_ip);
1722                ice_pkt_insert_u32(loc, ICE_IPV6_GTPU_TEID_OFFSET,
1723                                   input->gtpu_data.teid);
1724                ice_pkt_insert_u6_qfi(loc, ICE_IPV6_GTPU_QFI_OFFSET,
1725                                      input->gtpu_data.qfi);
1726                break;
1727        case ICE_FLTR_PTYPE_NONF_IPV4_L2TPV3:
1728                ice_pkt_insert_u32(loc, ICE_IPV4_L2TPV3_SESS_ID_OFFSET,
1729                                   input->l2tpv3_data.session_id);
1730                break;
1731        case ICE_FLTR_PTYPE_NONF_IPV6_L2TPV3:
1732                ice_pkt_insert_u32(loc, ICE_IPV6_L2TPV3_SESS_ID_OFFSET,
1733                                   input->l2tpv3_data.session_id);
1734                break;
1735        case ICE_FLTR_PTYPE_NONF_IPV4_ESP:
1736                ice_pkt_insert_u32(loc, ICE_IPV4_ESP_SPI_OFFSET,
1737                                   input->ip.v4.sec_parm_idx);
1738                break;
1739        case ICE_FLTR_PTYPE_NONF_IPV6_ESP:
1740                ice_pkt_insert_u32(loc, ICE_IPV6_ESP_SPI_OFFSET,
1741                                   input->ip.v6.sec_parm_idx);
1742                break;
1743        case ICE_FLTR_PTYPE_NONF_IPV4_AH:
1744                ice_pkt_insert_u32(loc, ICE_IPV4_AH_SPI_OFFSET,
1745                                   input->ip.v4.sec_parm_idx);
1746                break;
1747        case ICE_FLTR_PTYPE_NONF_IPV6_AH:
1748                ice_pkt_insert_u32(loc, ICE_IPV6_AH_SPI_OFFSET,
1749                                   input->ip.v6.sec_parm_idx);
1750                break;
1751        case ICE_FLTR_PTYPE_NONF_IPV4_NAT_T_ESP:
1752                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1753                                   input->ip.v4.src_ip);
1754                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1755                                   input->ip.v4.dst_ip);
1756                ice_pkt_insert_u32(loc, ICE_IPV4_NAT_T_ESP_SPI_OFFSET,
1757                                   input->ip.v4.sec_parm_idx);
1758                break;
1759        case ICE_FLTR_PTYPE_NONF_IPV6_NAT_T_ESP:
1760                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1761                                         input->ip.v6.src_ip);
1762                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1763                                         input->ip.v6.dst_ip);
1764                ice_pkt_insert_u32(loc, ICE_IPV6_NAT_T_ESP_SPI_OFFSET,
1765                                   input->ip.v6.sec_parm_idx);
1766                break;
1767        case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_NODE:
1768        case ICE_FLTR_PTYPE_NONF_IPV4_PFCP_SESSION:
1769                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
1770                                   input->ip.v4.dst_port);
1771                break;
1772        case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_NODE:
1773        case ICE_FLTR_PTYPE_NONF_IPV6_PFCP_SESSION:
1774                ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1775                                   input->ip.v6.dst_port);
1776                break;
1777        case ICE_FLTR_PTYPE_NON_IP_L2:
1778                ice_pkt_insert_u16(loc, ICE_MAC_ETHTYPE_OFFSET,
1779                                   input->ext_data.ether_type);
1780                break;
1781        case ICE_FLTR_PTYPE_NONF_ECPRI_TP0:
1782                ice_pkt_insert_u16(loc, ICE_ECPRI_TP0_PC_ID_OFFSET,
1783                                   input->ecpri_data.pc_id);
1784                break;
1785        case ICE_FLTR_PTYPE_NONF_IPV4_UDP_ECPRI_TP0:
1786                /* Use pkt instead of loc, since PC_ID is in outer part */
1787                ice_pkt_insert_u16(pkt, ICE_IPV4_UDP_ECPRI_TP0_PC_ID_OFFSET,
1788                                   input->ecpri_data.pc_id);
1789                break;
1790        case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
1791                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1792                                         input->ip.v6.src_ip);
1793                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1794                                         input->ip.v6.dst_ip);
1795                ice_pkt_insert_u16(loc, ICE_IPV6_TCP_DST_PORT_OFFSET,
1796                                   input->ip.v6.src_port);
1797                ice_pkt_insert_u16(loc, ICE_IPV6_TCP_SRC_PORT_OFFSET,
1798                                   input->ip.v6.dst_port);
1799                ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1800                ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1801                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1802                break;
1803        case ICE_FLTR_PTYPE_NONF_IPV6_UDP:
1804                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1805                                         input->ip.v6.src_ip);
1806                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1807                                         input->ip.v6.dst_ip);
1808                ice_pkt_insert_u16(loc, ICE_IPV6_UDP_DST_PORT_OFFSET,
1809                                   input->ip.v6.src_port);
1810                ice_pkt_insert_u16(loc, ICE_IPV6_UDP_SRC_PORT_OFFSET,
1811                                   input->ip.v6.dst_port);
1812                ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1813                ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1814                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1815                break;
1816        case ICE_FLTR_PTYPE_NONF_IPV6_SCTP:
1817                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1818                                         input->ip.v6.src_ip);
1819                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1820                                         input->ip.v6.dst_ip);
1821                ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_DST_PORT_OFFSET,
1822                                   input->ip.v6.src_port);
1823                ice_pkt_insert_u16(loc, ICE_IPV6_SCTP_SRC_PORT_OFFSET,
1824                                   input->ip.v6.dst_port);
1825                ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1826                ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1827                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1828                break;
1829        case ICE_FLTR_PTYPE_NONF_IPV6_OTHER:
1830                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
1831                                         input->ip.v6.src_ip);
1832                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_SRC_ADDR_OFFSET,
1833                                         input->ip.v6.dst_ip);
1834                ice_pkt_insert_u8_tc(loc, ICE_IPV6_TC_OFFSET, input->ip.v6.tc);
1835                ice_pkt_insert_u8(loc, ICE_IPV6_HLIM_OFFSET, input->ip.v6.hlim);
1836                ice_pkt_insert_u8(loc, ICE_IPV6_PROTO_OFFSET,
1837                                  input->ip.v6.proto);
1838                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1839                break;
1840        case ICE_FLTR_PTYPE_FRAG_IPV4:
1841                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
1842                                   input->ip.v4.src_ip);
1843                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
1844                                   input->ip.v4.dst_ip);
1845                ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
1846                ice_pkt_insert_u16(loc, ICE_IPV4_ID_OFFSET,
1847                                   input->ip.v4.packet_id);
1848                ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
1849                ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
1850                                  input->ip.v4.proto);
1851                ice_pkt_insert_mac_addr(loc, input->ext_data.dst_mac);
1852                break;
1853        case ICE_FLTR_PTYPE_FRAG_IPV6:
1854                ice_pkt_insert_u32(loc, ICE_IPV6_ID_OFFSET,
1855                                   input->ip.v6.packet_id);
1856                break;
1857        default:
1858                return ICE_ERR_PARAM;
1859        }
1860
1861        if (input->flex_fltr)
1862                ice_pkt_insert_u16(loc, input->flex_offset, input->flex_word);
1863
1864        return ICE_SUCCESS;
1865}
1866
1867/**
1868 * ice_fdir_get_prgm_pkt - generate a training packet
1869 * @input: flow director filter data structure
1870 * @pkt: pointer to return filter packet
1871 * @frag: generate a fragment packet
1872 */
1873enum ice_status
1874ice_fdir_get_prgm_pkt(struct ice_fdir_fltr *input, u8 *pkt, bool frag)
1875{
1876        return ice_fdir_get_gen_prgm_pkt(NULL, input, pkt, frag, false);
1877}
1878
1879/**
1880 * ice_fdir_has_frag - does flow type have 2 ptypes
1881 * @flow: flow ptype
1882 *
1883 * returns true is there is a fragment packet for this ptype
1884 */
1885bool ice_fdir_has_frag(enum ice_fltr_ptype flow)
1886{
1887        if (flow == ICE_FLTR_PTYPE_FRAG_IPV4 ||
1888            flow == ICE_FLTR_PTYPE_FRAG_IPV6)
1889                return true;
1890        else
1891                return false;
1892}
1893
1894/**
1895 * ice_fdir_find_fltr_by_idx - find filter with idx
1896 * @hw: pointer to hardware structure
1897 * @fltr_idx: index to find.
1898 *
1899 * Returns pointer to filter if found or null
1900 */
1901struct ice_fdir_fltr *
1902ice_fdir_find_fltr_by_idx(struct ice_hw *hw, u32 fltr_idx)
1903{
1904        struct ice_fdir_fltr *rule;
1905
1906        LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1907                            fltr_node) {
1908                /* rule ID found in the list */
1909                if (fltr_idx == rule->fltr_id)
1910                        return rule;
1911                if (fltr_idx < rule->fltr_id)
1912                        break;
1913        }
1914        return NULL;
1915}
1916
1917/**
1918 * ice_fdir_list_add_fltr - add a new node to the flow director filter list
1919 * @hw: hardware structure
1920 * @fltr: filter node to add to structure
1921 */
1922void ice_fdir_list_add_fltr(struct ice_hw *hw, struct ice_fdir_fltr *fltr)
1923{
1924        struct ice_fdir_fltr *rule, *parent = NULL;
1925
1926        LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
1927                            fltr_node) {
1928                /* rule ID found or pass its spot in the list */
1929                if (rule->fltr_id >= fltr->fltr_id)
1930                        break;
1931                parent = rule;
1932        }
1933
1934        if (parent)
1935                LIST_ADD_AFTER(&fltr->fltr_node, &parent->fltr_node);
1936        else
1937                LIST_ADD(&fltr->fltr_node, &hw->fdir_list_head);
1938}
1939
1940/**
1941 * ice_fdir_update_cntrs - increment / decrement filter counter
1942 * @hw: pointer to hardware structure
1943 * @flow: filter flow type
1944 * @acl_fltr: true indicates an ACL filter
1945 * @add: true implies filters added
1946 */
1947void
1948ice_fdir_update_cntrs(struct ice_hw *hw, enum ice_fltr_ptype flow,
1949                      bool acl_fltr, bool add)
1950{
1951        int incr;
1952
1953        incr = add ? 1 : -1;
1954        hw->fdir_active_fltr += incr;
1955        if (flow == ICE_FLTR_PTYPE_NONF_NONE || flow >= ICE_FLTR_PTYPE_MAX) {
1956                ice_debug(hw, ICE_DBG_SW, "Unknown filter type %d\n", flow);
1957        } else {
1958                if (acl_fltr)
1959                        hw->acl_fltr_cnt[flow] += incr;
1960                else
1961                        hw->fdir_fltr_cnt[flow] += incr;
1962        }
1963}
1964
1965/**
1966 * ice_cmp_ipv6_addr - compare 2 IP v6 addresses
1967 * @a: IP v6 address
1968 * @b: IP v6 address
1969 *
1970 * Returns 0 on equal, returns non-0 if different
1971 */
1972static int ice_cmp_ipv6_addr(__be32 *a, __be32 *b)
1973{
1974        return memcmp(a, b, 4 * sizeof(__be32));
1975}
1976
1977/**
1978 * ice_fdir_comp_rules - compare 2 filters
1979 * @a: a Flow Director filter data structure
1980 * @b: a Flow Director filter data structure
1981 * @v6: bool true if v6 filter
1982 *
1983 * Returns true if the filters match
1984 */
1985static bool
1986ice_fdir_comp_rules(struct ice_fdir_fltr *a,  struct ice_fdir_fltr *b, bool v6)
1987{
1988        enum ice_fltr_ptype flow_type = a->flow_type;
1989
1990        /* The calling function already checks that the two filters have the
1991         * same flow_type.
1992         */
1993        if (!v6) {
1994                if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
1995                    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
1996                    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP) {
1997                        if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
1998                            a->ip.v4.src_ip == b->ip.v4.src_ip &&
1999                            a->ip.v4.dst_port == b->ip.v4.dst_port &&
2000                            a->ip.v4.src_port == b->ip.v4.src_port)
2001                                return true;
2002                } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER) {
2003                        if (a->ip.v4.dst_ip == b->ip.v4.dst_ip &&
2004                            a->ip.v4.src_ip == b->ip.v4.src_ip &&
2005                            a->ip.v4.l4_header == b->ip.v4.l4_header &&
2006                            a->ip.v4.proto == b->ip.v4.proto &&
2007                            a->ip.v4.ip_ver == b->ip.v4.ip_ver &&
2008                            a->ip.v4.tos == b->ip.v4.tos)
2009                                return true;
2010                }
2011        } else {
2012                if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP ||
2013                    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_TCP ||
2014                    flow_type == ICE_FLTR_PTYPE_NONF_IPV6_SCTP) {
2015                        if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2016                            a->ip.v6.src_port == b->ip.v6.src_port &&
2017                            !ice_cmp_ipv6_addr(a->ip.v6.dst_ip,
2018                                               b->ip.v6.dst_ip) &&
2019                            !ice_cmp_ipv6_addr(a->ip.v6.src_ip,
2020                                               b->ip.v6.src_ip))
2021                                return true;
2022                } else if (flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
2023                        if (a->ip.v6.dst_port == b->ip.v6.dst_port &&
2024                            a->ip.v6.src_port == b->ip.v6.src_port)
2025                                return true;
2026                }
2027        }
2028
2029        return false;
2030}
2031
2032/**
2033 * ice_fdir_is_dup_fltr - test if filter is already in list for PF
2034 * @hw: hardware data structure
2035 * @input: Flow Director filter data structure
2036 *
2037 * Returns true if the filter is found in the list
2038 */
2039bool ice_fdir_is_dup_fltr(struct ice_hw *hw, struct ice_fdir_fltr *input)
2040{
2041        struct ice_fdir_fltr *rule;
2042        bool ret = false;
2043
2044        LIST_FOR_EACH_ENTRY(rule, &hw->fdir_list_head, ice_fdir_fltr,
2045                            fltr_node) {
2046                enum ice_fltr_ptype flow_type;
2047
2048                if (rule->flow_type != input->flow_type)
2049                        continue;
2050
2051                flow_type = input->flow_type;
2052                if (flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP ||
2053                    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP ||
2054                    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP ||
2055                    flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
2056                        ret = ice_fdir_comp_rules(rule, input, false);
2057                else
2058                        ret = ice_fdir_comp_rules(rule, input, true);
2059                if (ret) {
2060                        if (rule->fltr_id == input->fltr_id &&
2061                            rule->q_index != input->q_index)
2062                                ret = false;
2063                        else
2064                                break;
2065                }
2066        }
2067
2068        return ret;
2069}
2070
2071/**
2072 * ice_clear_pf_fd_table - admin command to clear FD table for PF
2073 * @hw: hardware data structure
2074 *
2075 * Clears FD table entries for a PF by issuing admin command (direct, 0x0B06)
2076 */
2077enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw)
2078{
2079        struct ice_aqc_clear_fd_table *cmd;
2080        struct ice_aq_desc desc;
2081
2082        cmd = &desc.params.clear_fd_table;
2083        ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_clear_fd_table);
2084        cmd->clear_type = CL_FD_VM_VF_TYPE_PF_IDX;
2085        /* vsi_index must be 0 to clear FD table for a PF */
2086        cmd->vsi_index = CPU_TO_LE16(0);
2087
2088        return ice_aq_send_cmd(hw, &desc, NULL, 0, NULL);
2089}
2090