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
This commit is contained in:
@@ -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_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
|
* qdf_nbuf_peek_header() - return the data pointer & length of the header
|
||||||
* @buf: Network nbuf
|
* @buf: Network nbuf
|
||||||
|
@@ -897,6 +897,45 @@ static inline struct sk_buff *__qdf_nbuf_copy(struct sk_buff *skb)
|
|||||||
|
|
||||||
#define __qdf_nbuf_reserve skb_reserve
|
#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
|
* __qdf_nbuf_head() - return the pointer the skb's head pointer
|
||||||
|
Reference in New Issue
Block a user