For the complete documentation index, see llms.txt. This page is also available as Markdown.

iflibtxrx(9)

iflibtxrx — 设备相关传输与接收函数

名称

iflibtxrx

概要

#include <ifdi_if.h>

接口操作函数

int
isc_txd_encap(void *sc, if_pkt_info_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, bool clear)

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)

全局变量

数据结构

处理数据包传输和接收的设备相关机制主要由上述命名的函数定义。if_pkt_info 数据结构包含数据包传输所需的统计信息和识别信息。而数据包接收的数据结构是 if_rxd_info 结构。

if_pkt_info 结构

struct if_pkt_info 的字段如下:

ipi_len (uint32_t) 表示要在传输队列上发送的数据包大小。

ipi_segs (bus_dma_segment_t *) 指向 iflib 中定义的设备无关传输队列的 bus_dma_segment 的指针。

ipi_qsidx 按顺序分配给每个传输队列的唯一索引值。用于引用当前正在传输的队列。

ipi_nsegs (uint16_t) 要读入设备相关传输描述符的描述符数。

ipi_ndescs (uint16_t) 使用中的描述符数。通过从新的 pidx 值减去旧的 pidx 值计算。

ipi_flags (uint16_t) 按每包定义的标志。

ipi_pidx (uint32_t) 发送到 isc_encap 函数进行封装和后续传输的第一个 pidx 值。

ipi_new_pidx (uint32_t) isc_encap 函数终止后设置的值。此值将成为下次调用该函数时发送到 isc-encap 的第一个 pidx。

以下字段用于卸载处理

ipi_csum_flags (uint64_t) 描述校验和值的标志,按每包使用。

ipi_tso_segsz (uint16_t) TSO 段大小。

ipi_mflags (uint16_t) 描述 mbuf 操作参数的标志。

ipi_vtag (uint16_t) 包含以太网帧中的 VLAN 信息。

ipi_etype (uint16_t) 由 struct ether_vlan_header 包含的以太网头协议类型。

ipi_ehrdlen (uint8_t) 以太网头的长度。

ipi_ip_hlen (uint8_t) TCP 头的长度。

ipi_tcp_hlen (uint8_t) TCP 头的长度。

ipi_tcp_hflags (uint8_t) 描述 TCP 头操作参数的标志。

ipi_ipproto (uint8_t) 指定使用中的 IP 协议类型。例如 TCP、UDP 或 SCTP。

if_rxd_info 结构

struct if_rxd_info 的字段如下:

iri_qsidx (uint16_t) 按顺序分配给每个接收队列的唯一索引值。用于引用当前正在接收的队列。

iri_vtag (uint16_t) 包含以太网帧中的 VLAN 信息。

iri_len (uint16_t) 表示接收到的数据包大小。

iri_next_offset (uint16_t) 表示下一个要接收的数据包的偏移值。Null 值表示数据包结束。

iri_cidx (uint32_t) 表示消费者队列中当前正在处理的数据包的索引值。

iri_flowid (uint32_t) 数据包的 RSS 哈希值。

iri_flags (uint) 描述接收数据包中包含的 mbuf 操作参数的标志。

iri_csum_flags (uint32_t) 描述接收数据包中包含的校验和值的标志。

iri_csum_data (uint32_t) mbuf(9) 数据包头中包含的校验和数据。

iri_m (struct mbuf *) 用于管理自己接收队列的驱动程序的 mbuf。

iri_ifp (struct ifnet *) 返回接口结构的链接。由每个 softc 具有多个接口的驱动程序使用。

iri_rsstype (uint8_t) RSS 哈希类型的值。

iri_pad (uint8_t) 接收数据包含的任何填充的长度。

iri_qidx (uint8_t) 表示队列事件的类型。如果值 >= 0,则为 freelist id,否则为完成队列事件。

函数

所有函数调用仅与数据包传输或接收关联。作为以下所有函数第一个参数传递的 void *sc 表示驱动程序的 softc。

传输数据包函数

Fn isc_txd_encap 在接口上发送数据包的传输函数。if_pkt_info 数据结构包含描述数据包的数据信息字段。此函数成功返回 0,否则返回错误值。

Fn isc_txd_flush 在 isc_txd_encap 函数传输数据包后立即调用的刷新函数。它更新硬件生产者索引或在 qid 编号指定的队列中递增用于 pidx_or_credits 的描述符。这通常称为戳门铃寄存器。

Fn isc_txd_credits_update 信用函数推进缓冲区环并计算处理过的信用(描述符)。在 I/O 完成之前,它清除多段情况下的范围并更新处理过的数据包计数。函数返回处理过的信用数。

接收数据包函数

Fn isc_rxd_available 函数计算从 idx 给定位置的剩余描述符数。函数返回此值。

Fn isc_rxd_refill 从物理地址 paddrs 开始,函数将数据包读入 rx_ring,直到达到由 count 指定的值。vaddrs 通常不需要,为在数据包头中放置自己元数据的设备提供。

Fn isc_rxd_flush 刷新函数将队列集号 qid 中的空闲列表 flid 上的生产者指针更新为 pidx,以反映新缓冲区的存在。

Fn isc_rxd_pkt_get 处理单个软件描述符。rxr->rx_base[i] 包含描述接收到的数据包的描述符。关于 ri 引用的缓冲区的硬件特定信息在数据结构 if_rxd_info 中返回。

参见

iflibdd(9), iflibdi(9), mbuf(9)

作者

本手册页由 Nicole Graziano 编写。

最后更新于

这有帮助吗?