net: pkt: Add function to linearize a network packet
This helper copies desired amount of data from network packet buffer info a user provided linear buffer. Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
This commit is contained in:
parent
19868313fc
commit
c77460da53
2 changed files with 59 additions and 0 deletions
|
@ -842,6 +842,23 @@ static inline struct net_buf *net_pkt_copy_all(struct net_pkt *pkt,
|
||||||
int net_frag_linear_copy(struct net_buf *dst, struct net_buf *src,
|
int net_frag_linear_copy(struct net_buf *dst, struct net_buf *src,
|
||||||
u16_t offset, u16_t len);
|
u16_t offset, u16_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy len bytes from src starting from offset to dst buffer
|
||||||
|
*
|
||||||
|
* This routine assumes that dst is large enough to store @a len bytes
|
||||||
|
* starting from offset at src.
|
||||||
|
*
|
||||||
|
* @param dst Destination buffer
|
||||||
|
* @param dst_len Destination buffer max length
|
||||||
|
* @param src Source buffer that may be fragmented
|
||||||
|
* @param offset Starting point to copy from
|
||||||
|
* @param len Number of bytes to copy
|
||||||
|
* @return number of bytes copied if everything is ok
|
||||||
|
* @return -ENOMEM on error
|
||||||
|
*/
|
||||||
|
int net_frag_linearize(u8_t *dst, size_t dst_len,
|
||||||
|
struct net_pkt *src, u16_t offset, u16_t len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Compact the fragment list of a packet.
|
* @brief Compact the fragment list of a packet.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1015,6 +1015,48 @@ int net_frag_linear_copy(struct net_buf *dst, struct net_buf *src,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int net_frag_linearize(u8_t *dst, size_t dst_len, struct net_pkt *src,
|
||||||
|
u16_t offset, u16_t len)
|
||||||
|
{
|
||||||
|
struct net_buf *frag;
|
||||||
|
u16_t to_copy;
|
||||||
|
u16_t copied;
|
||||||
|
|
||||||
|
if (dst_len < (size_t)len) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
frag = src->frags;
|
||||||
|
|
||||||
|
/* find the right fragment to start copying from */
|
||||||
|
while (frag && offset >= frag->len) {
|
||||||
|
offset -= frag->len;
|
||||||
|
frag = frag->frags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* traverse the fragment chain until len bytes are copied */
|
||||||
|
copied = 0;
|
||||||
|
while (frag && len > 0) {
|
||||||
|
to_copy = min(len, frag->len - offset);
|
||||||
|
memcpy(dst + copied, frag->data + offset, to_copy);
|
||||||
|
|
||||||
|
copied += to_copy;
|
||||||
|
|
||||||
|
/* to_copy is always <= len */
|
||||||
|
len -= to_copy;
|
||||||
|
frag = frag->frags;
|
||||||
|
|
||||||
|
/* after the first iteration, this value will be 0 */
|
||||||
|
offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len > 0) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
return copied;
|
||||||
|
}
|
||||||
|
|
||||||
bool net_pkt_compact(struct net_pkt *pkt)
|
bool net_pkt_compact(struct net_pkt *pkt)
|
||||||
{
|
{
|
||||||
struct net_buf *frag, *prev;
|
struct net_buf *frag, *prev;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue