iflibtxrx
— Device
Dependent Transmit and Receive Functions
#include
<ifdi_if.h>
int
isc_txd_encap
(void *sc,
if_pkt_into_t pi);
void
isc_txd_flush
(void *sc,
uint16_t qid, uint32_t
_pidx_or_credits_);
int *
isc_txd_credits_update
(void *sc,
uint16_t qid, uint32_t
credits);
int *
isc_rxd_available
(void *sc,
uint16_t qsid, uint32_t
cidx);
void *
isc_rxd_refill
(void *sc,
uint16_t qsid, uint8_t flid,
uint32_t pidx, uint64_t *paddrs,
caddr_t *vaddrs, uint16_t
count);
void *
isc_rxd_flush
(void *sc,
uint16_t qsid, uint8_t flid,
uint32_t pidx);
int
isc_rxd_pkt_get
(void *sc,
if_rxd_info_t ri);
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.
The fields of struct if_pkt_info are as
follows:
- ipi_len
- (uint32_t) Denotes the size of packet to be sent on
the transmit queue.
- ipi_segs
- (bus_dma_segment_t *) A pointer to the
bus_dma_segment of the device independent transfer queue defined in
iflib.
- ipi_qsidx
- Unique index value assigned sequentially to each transmit queue. Used to
reference the currently transmitting queue.
- ipi_nsegs
- (uint16_t) Number of descriptors to be read into the
device dependent transfer descriptors.
- ipi_ndescs
- (uint16_t) Number of descriptors in use. Calculated
by subtracting the old pidx value from the new pidx value.
- ipi_flags
- (uint16_t) Flags defined on a per packet basis.
- ipi_pidx
- (uint32_t) Value of first pidx sent to the isc_encap
function for encapsulation and subsequent transmission.
- ipi_new_pidx
- (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.
- The Following Fields Are
Used For Offload Handling
-
- ipi_csum_flags
- (uint64_t) Flags describing the checksum values,
used on a per packet basis.
- ipi_tso_segsz
- (uint16_t) Size of the TSO Segment Size.
- ipi_mflags
- (uint16_t) Flags describing the operational
parameters of the mbuf.
- ipi_vtag
- (uint16_t) Contains the VLAN information in the
Ethernet Frame.
- ipi_etype
- (uint16_t) Type of ethernet header protocol as
contained by the struct ether_vlan_header.
- ipi_ehrdlen
- (uint8_t) Length of the Ethernet Header.
- ipi_ip_hlen
- (uint8_t) Length of the TCP Header
- ipi_tcp_hlen
- (uint8_t) Length of the TCP Header.
- ipi_tcp_hflags
- (uint8_t) Flags describing the operational
parameters of the TCP Header.
- ipi_ipproto
- (uint8_t) Specifies the type of IP Protocol in use.
Example TCP, UDP, or SCTP.
The fields of struct if_rxd_info are as
follows:
- iri_qsidx
- (uint16_t) Unique index value assigned sequentially
to each receive queue. Used to reference the currently receiving
queue.
- iri_vtag
- (uint16_t) Contains the VLAN information in the
Ethernet Frame.
- iri_len
- (uint16_t) Denotes the size of a received
packet.
- iri_next_offset
- (uint16_t) Denotes the offset value for the next
packet to be receive. A Null value signifies the end of packet.
- iri_cidx
- (uint32_t) Denotes the index value of the packet
currently being processed in the consumer queue.
- iri_flowid
- (uint32_t) Value of the RSS hash for the
packet.
- iri_flags
- (uint)
Flags describing the operational parameters of the mbuf contained in the
receive packet.
- iri_csum_flags
- (uint32_t) Flags describing the checksum value
contained in the receive packet.
- iri_csum_data
- (uint32_t) Checksum data contained in the
mbuf(9) packet header.
- iri_m
- (struct mbuf *) A mbuf for drivers that manage their
own receive queues.
- iri_ifp
- (struct ifnet *) A link back to the interface
structure. Utilized by drivers that have multiple interface per
softc.
- (uint8_t) The value of the RSS hash type.
- iri_pad
- (uint8_t) The length of any padding contained by the
received data.
- iri_qidx
- (uint8_t) Represents the type of queue event. If
value >= 0 then it is the freelist id otherwise it is a completion
queue event.
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.
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.
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.
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.
isc_rxd_available
()
- Function calculates the remaining number of descriptors from a position
given by idx. The function returns this value.
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.
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.
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
This manual page was written by Nicole
Graziano