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
这个提交包含在:
Alok Kumar
2018-08-21 14:31:18 +05:30
提交者 nshrivas
父节点 e03102f60d
当前提交 d32e9abf63
修改 2 个文件,包含 52 行新增0 行删除

查看文件

@@ -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

查看文件

@@ -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