blob: 4a93e23121e30c8f281ef6db1a7debd5cf7709ca (
plain) (
blame)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
.\" $FreeBSD$
.Dd March 23, 2017
.Dt IFLIBTXTX 9
.Os
.Sh NAME
.Nm iflibtxrx
.Nd Device Dependent Transmit and Receive Functions
.Sh SYNOPSIS
.In "ifdi_if.h"
.Ss "Interface Manipulation Functions"
.Ft int
.Fo isc_txd_encap
.Fa "void *sc"
.Fa "if_pkt_into_t pi"
.Fc
.Ft void
.Fo isc_txd_flush
.Fa "void *sc"
.Fa "uint16_t qid"
.Fa "uint32_t _pidx_or_credits_"
.Fc
.Ft int *
.Fo isc_txd_credits_update
.Fa "void *sc"
.Fa "uint16_t qid"
.Fa "uint32_t credits"
.Fc
.Ft int *
.Fo isc_rxd_available
.Fa "void *sc"
.Fa "uint16_t qsid"
.Fa "uint32_t cidx"
.Fc
.Ft void *
.Fo isc_rxd_refill
.Fa "void *sc"
.Fa "uint16_t qsid"
.Fa "uint8_t flid"
.Fa "uint32_t pidx"
.Fa "uint64_t *paddrs"
.Fa "caddr_t *vaddrs"
.Fa "uint16_t count"
.Fc
.Ft void *
.Fo isc_rxd_flush
.Fa "void *sc"
.Fa "uint16_t qsid"
.Fa "uint8_t flid"
.Fa "uint32_t pidx"
.Fc
.Ft int
.Fo isc_rxd_pkt_get
.Fa "void *sc"
.Fa "if_rxd_info_t ri"
.Fc
.Ss "Global Variables"
.Vt extern struct if_txrx
.Sh DATA STRUCTURES
The device dependent mechanisms for handling packet transmit and receive are
primarily defined by the functions named above.
The if_pkt_info data structure contains statistics and identifying info
necessary for packet transmission.
While the data structure for packet receipt is the if_rxd_info structure.
.Pp
.Ss The if_pkt_info Structure
The fields of
.Vt "struct if_pkt_info"
are as follows:
.Bl -tag -width ".Va if_capabilities" -offset indent
.It Va ipi_len
.Pq Vt "uint32_t"
Denotes the size of packet to be sent on the transmit queue.
.It Va ipi_segs
.Pq Vt "bus_dma_segment_t *"
A pointer to the bus_dma_segment of the device independent transfer queue
defined in iflib.
.It Va ipi_qsidx
Unique index value assigned sequentially to each transmit queue.
Used to reference the currently transmitting queue.
.It Va ipi_nsegs
.Pq Vt "uint16_t"
Number of descriptors to be read into the device dependent transfer
descriptors.
.It Va ipi_ndescs
.Pq Vt "uint16_t"
Number of descriptors in use.
Calculated by subtracting the old pidx value from the new pidx value.
.It Va ipi_flags
.Pq Vt "uint16_t"
Flags defined on a per packet basis.
.It Va ipi_pidx
.Pq Vt "uint32_t"
Value of first pidx sent to the isc_encap function for encapsulation and
subsequent transmission.
.It Va ipi_new_pidx
.Pq Vt "uint32_t"
Value set after the termination of the isc_encap function.
This value will become the first pidx sent to the isc-encap the next time that
the function is called.
.It Va \fBThe Following Fields Are Used For Offload Handling\fP
.It Va ipi_csum_flags
.Pq Vt "uint64_t"
Flags describing the checksum values, used on a per packet basis.
.It Va ipi_tso_segsz
.Pq Vt "uint16_t"
Size of the TSO Segment Size.
.It Va ipi_mflags
.Pq Vt "uint16_t"
Flags describing the operational parameters of the mbuf.
.It Va ipi_vtag
.Pq Vt "uint16_t"
Contains the VLAN information in the Ethernet Frame.
.It Va ipi_etype
.Pq Vt "uint16_t"
Type of ethernet header protocol as contained by the struct ether_vlan_header.
.It Va ipi_ehrdlen
.Pq Vt "uint8_t"
Length of the Ethernet Header.
.It Va ipi_ip_hlen
.Pq Vt "uint8_t"
Length of the TCP Header
.It Va ipi_tcp_hlen
.Pq Vt "uint8_t"
Length of the TCP Header.
.It Va ipi_tcp_hflags
.Pq Vt "uint8_t"
Flags describing the operational parameters of the TCP Header.
.It Va ipi_ipproto
.Pq Vt "uint8_t"
Specifies the type of IP Protocol in use.
Example TCP, UDP, or SCTP.
.El
.Ss The if_rxd_info Structure
The fields of
.Vt "struct if_rxd_info"
are as follows:
.Bl -tag -width ".Va if_capabilities" -offset indent
.It Va iri_qsidx
.Pq Vt "uint16_t"
Unique index value assigned sequentially to each receive queue.
Used to reference the currently receiving queue.
.It Va iri_vtag
.Pq Vt "uint16_t"
Contains the VLAN information in the Ethernet Frame.
.It Va iri_len
.Pq Vt "uint16_t"
Denotes the size of a received packet.
.It Va iri_next_offset
.Pq Vt "uint16_t"
Denotes the offset value for the next packet to be receive.
A Null value signifies the end of packet.
.It Va iri_cidx
.Pq Vt "uint32_t"
Denotes the index value of the packet currently being processed in the
consumer queue.
.It Va iri_flowid
.Pq Vt "uint32_t"
Value of the RSS hash for the packet.
.It Va iri_flags
.Pq Vt "uint"
Flags describing the operational parameters of the mbuf contained in the
receive packet.
.It Va iri_csum_flags
.Pq Vt "uint32_t"
Flags describing the checksum value contained in the receive packet.
.It Va iri_csum_data
.Pq Vt "uint32_t"
Checksum data contained in the
.Xr mbuf 9
packet header.
.It Va iri_m
.Pq Vt "struct mbuf *"
A mbuf for drivers that manage their own receive queues.
.It Va iri_ifp
.Pq Vt "struct ifnet *"
A link back to the interface structure.
Utilized by drivers that have multiple interface per softc.
.It Va iri_rsstype
.Pq Vt "uint8_t"
The value of the RSS hash type.
.It Va iri_pad
.Pq Vt "uint8_t"
The length of any padding contained by the received data.
.It Va iri_qidx
.Pq Vt "uint8_t"
Represents the type of queue event.
If value >= 0 then it is the freelist id otherwise it is a completion queue
event.
.El
.Sh FUNCTIONS
All function calls are associated exclusively with either packet transmission
or receipt.
The void *sc passed as the first argument to all of the following functions
represents the driver's softc.
.Ss Transmit Packet Functions
.Bl -ohang -offset indent
.It Fn isc_txd_encap
Transmit function that sends a packet on an interface.
The if_pkt_info data structure contains data information fields describing the
packet.
This function returns 0 if successful, otherwise an error value is returned.
.It Fn isc_txd_flush
Flush function is called immediately after the isc_txd_encap function transmits
a packet.
It updates the hardware producer index or increments the descriptors used to
pidx_or_credits in the queue designated by the qid number.
This is often referred to as poking the doorbell register.
.It Fn isc_txd_credits_update
Credit function advances the buffer ring and calculates the credits
(descriptors) processed.
Until the I/O is complete it cleans the range in case of multisegments and
updates the count of processed packets.
The function returns the number of processed credits.
.El
.Ss Receive Packet Functions
.Bl -ohang -offset indent
.It Fn isc_rxd_available
Function calculates the remaining number of descriptors from a position given
by idx.
The function returns this value.
.It Fn isc_rxd_refill
Starting with the physical address paddrs, the function reads a packet into the
rx_ring until a value designated by count is reached.
vaddrs is typically not needed and is provided for devices that place their own
metadata in the packet header.
.It Fn isc_rxd_flush
Flush function updates the producer pointer on the free list flid in queue set
number qid to pidx to reflect the presence of new buffers.
.It Fn isc_rxd_pkt_get
Process a single software descriptor.
rxr->rx_base[i] contains a descriptor that describes a received packet.
Hardware specific information about the buffer referred to by ri is returned in
the data structure if_rxd_info
.El
.Sh SEE ALSO
.Xr iflibdd 9 ,
.Xr iflibdi 9 ,
.Xr mbuf 9
.Sh AUTHORS
This manual page was written by
.An Nicole Graziano
|