zephyr/subsys/net/l2/ieee802154/ieee802154_6lo.h

67 lines
2.3 KiB
C

/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief 802.15.4 6LoWPAN adaptation layer
*
* This is not to be included by the application.
*/
#ifndef __NET_IEEE802154_6LO_H__
#define __NET_IEEE802154_6LO_H__
#include <zephyr/net/net_pkt.h>
#include <zephyr/types.h>
struct ieee802154_6lo_fragment_ctx {
struct net_buf *buf; /* current original fragment pointer */
uint8_t *pos; /* current position in buf */
uint16_t pkt_size; /* overall datagram size */
uint16_t processed; /* in bytes */
uint8_t hdr_diff; /* 6lo header size reduction due to compression in bytes */
uint8_t offset; /* in multiples of 8 bytes */
};
/**
* @brief Decode and reassemble 6LoWPAN packets to IPv6 as per RFC 6282
*
* @details Decompress and (if fragmented) reassemble 6LoWPAN packets for
* received over 802.15.4.
*
* @param iface A valid pointer on the network interface the package was
* received from
* @param pkt A valid pointer on a 6LoWPAN compressed packet to receive
*
* @return NET_CONTINUE decoding successful, pkt is decompressed
* NET_OK waiting for other fragments,
* NET_DROP invalid fragment.
*/
enum net_verdict ieee802154_6lo_decode_pkt(struct net_if *iface, struct net_pkt *pkt);
/**
* @brief Encode IPv6 packates to 6LoWPAN 802.15.4 as per RFC 6282
*
* @details Compress IPv6 packet for transmission over 802.15.4 and
* check whether additional fragmentation is needed.
*
* @param iface A valid pointer on the network interface the package is
* sent to
* @param pkt A valid pointer on a non-compressed IPv6 packet
* @param frag_ctx A valid pointer on a fragmentation context.
* @param ll_hdr_len required headroom for the LL header (after fragmentation)
* @param authtag_len required tailroom for the authentication tag in the frame (after
* fragmentation)
*
* @return 1 if additional 6LoWPAN fragmentation is needed, 0 if no
* fragmentation is needed, negative value on error
*/
int ieee802154_6lo_encode_pkt(struct net_if *iface, struct net_pkt *pkt,
struct ieee802154_6lo_fragment_ctx *frag_ctx, uint8_t ll_hdr_len,
uint8_t authtag_len);
#endif /* __NET_IEEE802154_6LO_H__ */