net: Integrate 6lo and 802.15.4 fragmentation
Change-Id: I348656e0049d79f4dfdaba7909ad0b770f3ee922 Signed-off-by: Ravi kumar Veeramally <ravikumar.veeramally@linux.intel.com>
This commit is contained in:
parent
3f69b42c9f
commit
dc36bdb89d
3 changed files with 22 additions and 7 deletions
|
@ -93,7 +93,8 @@ static inline bool net_6lo_maddr_48_bit_compressible(struct in6_addr *addr)
|
|||
* context based (dst) address compression
|
||||
* Mesh header compression
|
||||
*/
|
||||
static inline bool compress_IPHC_header(struct net_buf *buf)
|
||||
static inline bool compress_IPHC_header(struct net_buf *buf,
|
||||
fragment_handler_t fragment)
|
||||
{
|
||||
struct net_buf *frag;
|
||||
struct net_ipv6_hdr *ipv6 = NET_IPV6_BUF(buf);
|
||||
|
@ -431,6 +432,10 @@ end:
|
|||
/* compact the fragments, so that gaps will be filled */
|
||||
net_nbuf_compact(buf->frags);
|
||||
|
||||
if (fragment) {
|
||||
return fragment(buf, compressed - offset);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -752,7 +757,8 @@ fail:
|
|||
}
|
||||
|
||||
/* Adds IPv6 dispatch as first byte and adjust fragments */
|
||||
static inline bool compress_ipv6_header(struct net_buf *buf)
|
||||
static inline bool compress_ipv6_header(struct net_buf *buf,
|
||||
fragment_handler_t fragment)
|
||||
{
|
||||
struct net_buf *frag;
|
||||
|
||||
|
@ -769,6 +775,10 @@ static inline bool compress_ipv6_header(struct net_buf *buf)
|
|||
/* compact the fragments, so that gaps will be filled */
|
||||
buf->frags = net_nbuf_compact(buf->frags);
|
||||
|
||||
if (fragment) {
|
||||
return fragment(buf, -1);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -783,12 +793,13 @@ static inline bool uncompress_ipv6_header(struct net_buf *buf)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool net_6lo_compress(struct net_buf *buf, bool iphc)
|
||||
bool net_6lo_compress(struct net_buf *buf, bool iphc,
|
||||
fragment_handler_t fragment)
|
||||
{
|
||||
if (iphc) {
|
||||
return compress_IPHC_header(buf);
|
||||
return compress_IPHC_header(buf, fragment);
|
||||
} else {
|
||||
return compress_ipv6_header(buf);
|
||||
return compress_ipv6_header(buf, fragment);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
|
||||
#include <net/nbuf.h>
|
||||
|
||||
typedef bool (*fragment_handler_t)(struct net_buf *, int);
|
||||
|
||||
/**
|
||||
* @brief Compress IPv6 packet as per RFC 6282
|
||||
*
|
||||
|
@ -37,10 +39,12 @@
|
|||
*
|
||||
* @param Pointer to network buffer
|
||||
* @param iphc true for IPHC compression, false for IPv6 dispatch header
|
||||
* @param Pointer to fragment function
|
||||
*
|
||||
* @return True on success, false otherwise
|
||||
*/
|
||||
bool net_6lo_compress(struct net_buf *buf, bool iphc);
|
||||
bool net_6lo_compress(struct net_buf *buf, bool iphc,
|
||||
fragment_handler_t fragment);
|
||||
|
||||
/**
|
||||
* @brief Unompress IPv6 packet as per RFC 6282
|
||||
|
|
|
@ -415,7 +415,7 @@ static int test_6lo(struct net_6lo_data *data)
|
|||
net_hexdump_frags("before-compression", buf);
|
||||
#endif
|
||||
|
||||
if (!net_6lo_compress(buf, data->iphc)) {
|
||||
if (!net_6lo_compress(buf, data->iphc, NULL)) {
|
||||
TC_PRINT("compression failed\n");
|
||||
goto end;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue