diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 534d63b58e..f0608aae20 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 113d6b7b28..d37cb7e164 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