From d32e9abf63db099a2f0114e804e1645a67e075a7 Mon Sep 17 00:00:00 2001 From: Alok Kumar Date: Tue, 21 Aug 2018 14:31:18 +0530 Subject: [PATCH] qcacmn: Add API qdf_nbuf_reset to reset netbuf This API makes the reuse of sk_buff possible, by resetting it with the reserve and align arguments passed by the caller. This brings back the skb to the original state as returned by qdf_nbuf_alloc without allocating the skb again. Change-Id: Idefcbd4be9fae5d140805d55207dec01bdc90237 CRs-Fixed: 2301899 --- qdf/inc/qdf_nbuf.h | 13 +++++++++++++ qdf/linux/src/i_qdf_nbuf.h | 39 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 534d63b58e4d..f0608aae2023 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -1569,6 +1569,19 @@ static inline void qdf_nbuf_reserve(qdf_nbuf_t buf, qdf_size_t size) __qdf_nbuf_reserve(buf, size); } +/** + * qdf_nbuf_reset() - reset the buffer data and pointer + * @buf: Network buf instance + * @reserve: reserve + * @align: align + * + * Return: none + */ +static inline void qdf_nbuf_reset(qdf_nbuf_t buf, int reserve, int align) +{ + __qdf_nbuf_reset(buf, reserve, align); +} + /** * qdf_nbuf_peek_header() - return the data pointer & length of the header * @buf: Network nbuf diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index 113d6b7b2837..d37cb7e16482 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -897,6 +897,45 @@ static inline struct sk_buff *__qdf_nbuf_copy(struct sk_buff *skb) #define __qdf_nbuf_reserve skb_reserve +/** + * __qdf_nbuf_reset() - reset the buffer data and pointer + * @buf: Network buf instance + * @reserve: reserve + * @align: align + * + * Return: none + */ +static inline void +__qdf_nbuf_reset(struct sk_buff *skb, int reserve, int align) +{ + int offset; + + skb_push(skb, skb_headroom(skb)); + skb_put(skb, skb_tailroom(skb)); + memset(skb->data, 0x0, skb->len); + skb_trim(skb, 0); + skb_reserve(skb, NET_SKB_PAD); + memset(skb->cb, 0x0, sizeof(skb->cb)); + + /* + * The default is for netbuf fragments to be interpreted + * as wordstreams rather than bytestreams. + */ + QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_EFRAG(skb) = 1; + QDF_NBUF_CB_TX_EXTRA_FRAG_WORDSTR_NBUF(skb) = 1; + + /* + * Align & make sure that the tail & data are adjusted properly + */ + + if (align) { + offset = ((unsigned long)skb->data) % align; + if (offset) + skb_reserve(skb, align - offset); + } + + skb_reserve(skb, reserve); +} /** * __qdf_nbuf_head() - return the pointer the skb's head pointer