You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2023/08/22 07:34:33 UTC
[nuttx] 03/04: netdev/upper: Add netpkt_to_iov() interface
This is an automated email from the ASF dual-hosted git repository.
masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 318d136320a5b297404380c1b393f4b69342b86d
Author: Zhe Weng <we...@xiaomi.com>
AuthorDate: Wed May 17 17:30:40 2023 +0800
netdev/upper: Add netpkt_to_iov() interface
Some driver like virtio-net can offload fragmented IOBs, so an interface
to support this feature is needed.
Signed-off-by: Zhe Weng <we...@xiaomi.com>
---
drivers/net/netdev_upperhalf.c | 39 ++++++++++++++++++++++++++++++++++++
include/nuttx/net/netdev_lowerhalf.h | 35 +++++++++++++++++++++++++++++++-
2 files changed, 73 insertions(+), 1 deletion(-)
diff --git a/drivers/net/netdev_upperhalf.c b/drivers/net/netdev_upperhalf.c
index e2cede4d47..8c1c3244d2 100644
--- a/drivers/net/netdev_upperhalf.c
+++ b/drivers/net/netdev_upperhalf.c
@@ -1359,3 +1359,42 @@ bool netpkt_is_fragmented(FAR netpkt_t *pkt)
{
return pkt->io_flink != NULL;
}
+
+/****************************************************************************
+ * Name: netpkt_to_iov
+ *
+ * Description:
+ * Write each piece of data/len into iov array.
+ *
+ * Input Parameters:
+ * dev - The lower half device driver structure
+ * pkt - The net packet
+ * iov - The iov array to write
+ * iovcnt - The number of elements in the iov array
+ *
+ * Returned Value:
+ * The actual written count of iov entries.
+ *
+ ****************************************************************************/
+
+int netpkt_to_iov(FAR struct netdev_lowerhalf_s *dev, FAR netpkt_t *pkt,
+ FAR struct iovec *iov, int iovcnt)
+{
+ int i;
+
+ for (i = 0; pkt != NULL && i < iovcnt; pkt = pkt->io_flink, i++)
+ {
+ if (i == 0)
+ {
+ iov[i].iov_base = IOB_DATA(pkt) - NET_LL_HDRLEN(&dev->netdev);
+ iov[i].iov_len = pkt->io_len + NET_LL_HDRLEN(&dev->netdev);
+ }
+ else
+ {
+ iov[i].iov_base = IOB_DATA(pkt);
+ iov[i].iov_len = pkt->io_len;
+ }
+ }
+
+ return i;
+}
diff --git a/include/nuttx/net/netdev_lowerhalf.h b/include/nuttx/net/netdev_lowerhalf.h
index d47f324739..f29f9b4337 100644
--- a/include/nuttx/net/netdev_lowerhalf.h
+++ b/include/nuttx/net/netdev_lowerhalf.h
@@ -47,7 +47,9 @@
* Pre-processor Definitions
****************************************************************************/
-/* | <-------------- NETPKT_BUFLEN ---------------> |
+/* Layout for net packet:
+ *
+ * | <-------------- NETPKT_BUFLEN ---------------> |
* +---------------------+-------------------+------+ +-------------+
* | reserved for driver | data | free | ---> | next netpkt |
* +---------------------+-------------------+------+ +-------------+
@@ -55,6 +57,17 @@
* ^base ^data
*/
+/* Layout for linked net packet, you can get list of (data, len) by
+ * netpkt_to_iov() interface:
+ *
+ * | <----------- datalen = sum(len) ------------> |
+ * +----------+-----------+ +-----------+ +-----------+------+
+ * | reserved | data | --> | data | --> | data | free |
+ * +----------+-----------+ +-----------+ +-----------+------+
+ * | | <- len -> | | <- len -> | | <- len -> |
+ * ^base ^data ^data ^data
+ */
+
#define NETPKT_BUFLEN CONFIG_IOB_BUFSIZE
/****************************************************************************
@@ -478,4 +491,24 @@ void netpkt_reset_reserved(FAR struct netdev_lowerhalf_s *dev,
bool netpkt_is_fragmented(FAR netpkt_t *pkt);
+/****************************************************************************
+ * Name: netpkt_to_iov
+ *
+ * Description:
+ * Write each piece of data/len into iov array.
+ *
+ * Input Parameters:
+ * dev - The lower half device driver structure
+ * pkt - The net packet
+ * iov - The iov array to write
+ * iovcnt - The number of elements in the iov array
+ *
+ * Returned Value:
+ * The actual written count of iov entries.
+ *
+ ****************************************************************************/
+
+int netpkt_to_iov(FAR struct netdev_lowerhalf_s *dev, FAR netpkt_t *pkt,
+ FAR struct iovec *iov, int iovcnt);
+
#endif /* __INCLUDE_NUTTX_NET_NETDEV_LOWERHALF_H */