blob: 7aa5e6d5b9a51bb8f69f2ab50d8fd5c978080bb8 [file] [log] [blame]
Damjan Marion83243a02016-02-29 13:09:30 +01001/*
2 *------------------------------------------------------------------
3 * af_packet.h - linux kernel packet interface header file
4 *
5 * Copyright (c) 2016 Cisco and/or its affiliates.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *------------------------------------------------------------------
18 */
19
Mohsin Kazmi219cbcb2022-03-18 16:58:31 +000020#include <linux/if_packet.h>
21
Damjan Marion1927da22017-03-27 17:08:20 +020022#include <vppinfra/lock.h>
Mohsin Kazmiacba9f72018-05-17 15:42:27 +020023#include <vlib/log.h>
24
Mohsin Kazmi219cbcb2022-03-18 16:58:31 +000025typedef struct tpacket_block_desc block_desc_t;
Mohsin Kazmi8b90d892022-09-08 17:21:20 +000026typedef struct tpacket_req tpacket_req_t;
Mohsin Kazmi219cbcb2022-03-18 16:58:31 +000027typedef struct tpacket_req3 tpacket_req3_t;
Mohsin Kazmi8b90d892022-09-08 17:21:20 +000028typedef struct tpacket2_hdr tpacket2_hdr_t;
Mohsin Kazmi219cbcb2022-03-18 16:58:31 +000029typedef struct tpacket3_hdr tpacket3_hdr_t;
30
Mohsin Kazmi8b90d892022-09-08 17:21:20 +000031typedef union _tpacket_req_u
32{
33 tpacket_req_t req;
34 tpacket_req3_t req3;
35} tpacket_req_u_t;
36
Mohsin Kazmicae84fa2021-10-08 15:10:49 +000037typedef enum
38{
39 AF_PACKET_IF_MODE_ETHERNET = 1,
40 AF_PACKET_IF_MODE_IP = 2
41} af_packet_if_mode_t;
42
Mohsin Kazmi2b6479c2022-04-05 12:03:47 +000043typedef enum
44{
45 AF_PACKET_IF_FLAGS_QDISC_BYPASS = 1,
Mohsin Kazmi788676b2022-04-05 12:43:13 +000046 AF_PACKET_IF_FLAGS_CKSUM_GSO = 2,
Mohsin Kazmic73984a2022-04-05 13:08:53 +000047 AF_PACKET_IF_FLAGS_FANOUT = 4,
Mohsin Kazmi8b90d892022-09-08 17:21:20 +000048 AF_PACKET_IF_FLAGS_VERSION_2 = 8,
Mohsin Kazmi2b6479c2022-04-05 12:03:47 +000049} af_packet_if_flags_t;
50
Damjan Marion00a9dca2016-08-17 17:05:46 +020051typedef struct
52{
Mohsin Kazmi04e0bb22018-05-28 18:55:37 +020053 u32 sw_if_index;
54 u8 host_if_name[64];
55} af_packet_if_detail_t;
56
57typedef struct
58{
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000059 u8 *ring_start_addr;
60 u32 ring_size;
61} af_packet_ring_t;
Mohsin Kazmi89d74bd2022-03-25 00:33:27 +000062
63typedef struct
64{
Damjan Marion00a9dca2016-08-17 17:05:46 +020065 CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
Damjan Marion1927da22017-03-27 17:08:20 +020066 clib_spinlock_t lockp;
Damjan Marion83243a02016-02-29 13:09:30 +010067 int fd;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000068 union
69 {
Mohsin Kazmi8b90d892022-09-08 17:21:20 +000070 tpacket_req_u_t *rx_req;
71 tpacket_req_u_t *tx_req;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000072 };
73
74 union
75 {
76 u8 **rx_ring;
77 u8 **tx_ring;
78 };
79
80 union
81 {
82 u32 next_rx_block;
Mohsin Kazmi8b90d892022-09-08 17:21:20 +000083 u32 next_rx_frame;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000084 u32 next_tx_frame;
85 };
86
87 u16 queue_id;
88 u32 queue_index;
89
Damjan Marion56dd5432017-09-08 19:52:02 +020090 u32 clib_file_index;
Damjan Marion83243a02016-02-29 13:09:30 +010091
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000092 u32 rx_frame_offset;
93 u16 num_rx_pkts;
94 u8 is_rx_pending;
Mohammed Hawari8a419d52022-02-24 15:19:01 +010095 u8 is_tx_pending;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000096 vnet_hw_if_rx_mode mode;
97} af_packet_queue_t;
Damjan Marion83243a02016-02-29 13:09:30 +010098
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +000099typedef struct
100{
101 CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
102 u32 hw_if_index;
103 u32 sw_if_index;
Damjan Marion83243a02016-02-29 13:09:30 +0100104 u32 per_interface_next_index;
Mohsin Kazmicae84fa2021-10-08 15:10:49 +0000105 af_packet_if_mode_t mode;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +0000106 u8 is_admin_up;
107 u8 is_cksum_gso_enabled;
Mohsin Kazmi8b90d892022-09-08 17:21:20 +0000108 u8 version;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +0000109 af_packet_queue_t *rx_queues;
110 af_packet_queue_t *tx_queues;
111
112 u8 num_rxqs;
113 u8 num_txqs;
114
115 u8 *host_if_name;
116 int host_if_index;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +0000117
118 u32 host_mtu;
119 u32 dev_instance;
120
121 af_packet_ring_t *rings;
Mohsin Kazmi2b6479c2022-04-05 12:03:47 +0000122 u8 is_qdisc_bypass_enabled;
Mohsin Kazmic73984a2022-04-05 13:08:53 +0000123 u8 is_fanout_enabled;
Damjan Marion83243a02016-02-29 13:09:30 +0100124} af_packet_if_t;
125
Damjan Marion00a9dca2016-08-17 17:05:46 +0200126typedef struct
127{
128 CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
129 af_packet_if_t *interfaces;
Damjan Marion83243a02016-02-29 13:09:30 +0100130
Mohsin Kazmi89733a12022-08-30 13:29:06 +0000131 u32 polling_count;
Damjan Marion83243a02016-02-29 13:09:30 +0100132 /* rx buffer cache */
Damjan Marion553f6bd2016-09-07 11:54:22 +0200133 u32 **rx_buffers;
Damjan Marion83243a02016-02-29 13:09:30 +0100134
135 /* hash of host interface names */
136 mhash_t if_index_by_host_if_name;
Mohsin Kazmiacba9f72018-05-17 15:42:27 +0200137
138 /** log class */
139 vlib_log_class_t log_class;
Damjan Marion83243a02016-02-29 13:09:30 +0100140} af_packet_main_t;
141
Nathan Skrzypczak7d0e30b2021-06-23 11:28:39 +0200142typedef struct
143{
144 u8 *host_if_name;
145 u8 *hw_addr;
146 u32 rx_frame_size;
147 u32 tx_frame_size;
148 u32 rx_frames_per_block;
149 u32 tx_frames_per_block;
Mohsin Kazmi5a7aa512022-03-25 14:27:45 +0000150 u8 num_rxqs;
151 u8 num_txqs;
Mohsin Kazmi8b90d892022-09-08 17:21:20 +0000152 u8 is_v2;
Mohsin Kazmicae84fa2021-10-08 15:10:49 +0000153 af_packet_if_mode_t mode;
Mohsin Kazmi2b6479c2022-04-05 12:03:47 +0000154 af_packet_if_flags_t flags;
Nathan Skrzypczak7d0e30b2021-06-23 11:28:39 +0200155
156 /* return */
157 u32 sw_if_index;
158} af_packet_create_if_arg_t;
159
Dave Wallace71612d62017-10-24 01:32:41 -0400160extern af_packet_main_t af_packet_main;
Damjan Marion83243a02016-02-29 13:09:30 +0100161extern vnet_device_class_t af_packet_device_class;
162extern vlib_node_registration_t af_packet_input_node;
163
Nathan Skrzypczak7d0e30b2021-06-23 11:28:39 +0200164int af_packet_create_if (af_packet_create_if_arg_t *arg);
165int af_packet_delete_if (u8 *host_if_name);
166int af_packet_set_l4_cksum_offload (u32 sw_if_index, u8 set);
Mohsin Kazmi04e0bb22018-05-28 18:55:37 +0200167int af_packet_dump_ifs (af_packet_if_detail_t ** out_af_packet_ifs);
Damjan Marion00a9dca2016-08-17 17:05:46 +0200168
Damjan Marionceab7882018-01-19 20:56:12 +0100169format_function_t format_af_packet_device_name;
170
Mohsin Kazmi04e0bb22018-05-28 18:55:37 +0200171#define MIN(x,y) (((x)<(y))?(x):(y))
172
Damjan Marion00a9dca2016-08-17 17:05:46 +0200173/*
174 * fd.io coding-style-patch-verification: ON
175 *
176 * Local Variables:
177 * eval: (c-set-style "gnu")
178 * End:
179 */