hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 1999 - 2018 Intel Corporation. */
 
#ifndef _IXGBE_MODEL_H_
#define _IXGBE_MODEL_H_
 
#include "ixgbe.h"
#include "ixgbe_type.h"
 
struct ixgbe_mat_field {
   unsigned int off;
   int (*val)(struct ixgbe_fdir_filter *input,
          union ixgbe_atr_input *mask,
          u32 val, u32 m);
   unsigned int type;
};
 
struct ixgbe_jump_table {
   struct ixgbe_mat_field *mat;
   struct ixgbe_fdir_filter *input;
   union ixgbe_atr_input *mask;
   u32 link_hdl;
   unsigned long child_loc_map[32];
};
 
#define IXGBE_MAX_HW_ENTRIES 2045
 
static inline int ixgbe_mat_prgm_sip(struct ixgbe_fdir_filter *input,
                    union ixgbe_atr_input *mask,
                    u32 val, u32 m)
{
   input->filter.formatted.src_ip[0] = (__force __be32)val;
   mask->formatted.src_ip[0] = (__force __be32)m;
   return 0;
}
 
static inline int ixgbe_mat_prgm_dip(struct ixgbe_fdir_filter *input,
                    union ixgbe_atr_input *mask,
                    u32 val, u32 m)
{
   input->filter.formatted.dst_ip[0] = (__force __be32)val;
   mask->formatted.dst_ip[0] = (__force __be32)m;
   return 0;
}
 
static struct ixgbe_mat_field ixgbe_ipv4_fields[] = {
   { .off = 12, .val = ixgbe_mat_prgm_sip,
     .type = IXGBE_ATR_FLOW_TYPE_IPV4},
   { .off = 16, .val = ixgbe_mat_prgm_dip,
     .type = IXGBE_ATR_FLOW_TYPE_IPV4},
   { .val = NULL } /* terminal node */
};
 
static inline int ixgbe_mat_prgm_ports(struct ixgbe_fdir_filter *input,
                      union ixgbe_atr_input *mask,
                      u32 val, u32 m)
{
   input->filter.formatted.src_port = (__force __be16)(val & 0xffff);
   mask->formatted.src_port = (__force __be16)(m & 0xffff);
   input->filter.formatted.dst_port = (__force __be16)(val >> 16);
   mask->formatted.dst_port = (__force __be16)(m >> 16);
 
   return 0;
};
 
static struct ixgbe_mat_field ixgbe_tcp_fields[] = {
   {.off = 0, .val = ixgbe_mat_prgm_ports,
    .type = IXGBE_ATR_FLOW_TYPE_TCPV4},
   { .val = NULL } /* terminal node */
};
 
static struct ixgbe_mat_field ixgbe_udp_fields[] = {
   {.off = 0, .val = ixgbe_mat_prgm_ports,
    .type = IXGBE_ATR_FLOW_TYPE_UDPV4},
   { .val = NULL } /* terminal node */
};
 
struct ixgbe_nexthdr {
   /* offset, shift, and mask of position to next header */
   unsigned int o;
   u32 s;
   u32 m;
   /* match criteria to make this jump*/
   unsigned int off;
   u32 val;
   u32 mask;
   /* location of jump to make */
   struct ixgbe_mat_field *jump;
};
 
static struct ixgbe_nexthdr ixgbe_ipv4_jumps[] = {
   { .o = 0, .s = 6, .m = 0xf,
     .off = 8, .val = 0x600, .mask = 0xff00, .jump = ixgbe_tcp_fields},
   { .o = 0, .s = 6, .m = 0xf,
     .off = 8, .val = 0x1100, .mask = 0xff00, .jump = ixgbe_udp_fields},
   { .jump = NULL } /* terminal node */
};
#endif /* _IXGBE_MODEL_H_ */