43#include "lib/random.h"
47#define LOG_MODULE "Frame 15.4"
48#define LOG_LEVEL LOG_LEVEL_FRAMER
52create_frame(
int do_create)
57 if(frame802154_get_pan_id() == 0xffff) {
62 memset(¶ms, 0,
sizeof(params));
72 packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
76 packetbuf_addr(PACKETBUF_ADDR_SENDER));
88 LOG_INFO_LLADDR((
const linkaddr_t *)params.
dest_addr);
93 LOG_ERR(
"Out: too large header: %u\n", hdr_len);
99framer_802154_setup_params(packetbuf_attr_t (*get_attr)(uint8_t type),
102 if(get_attr == NULL || params == NULL) {
103 LOG_INFO(
"framer-802154: cannot setup params because of invalid argument\n");
113 params->
fcf.
frame_type = get_attr(PACKETBUF_ATTR_FRAME_TYPE);
115 if(dest_is_broadcast) {
130#if LLSEC802154_USES_AUX_HEADER
131 if(get_attr(PACKETBUF_ATTR_SECURITY_LEVEL)) {
136#if LLSEC802154_USES_FRAME_COUNTER
143#if LLSEC802154_USES_EXPLICIT_KEYS
151 params->
seq = get_attr(PACKETBUF_ATTR_MAC_SEQNO);
154 params->
src_pid = frame802154_get_pan_id();
157 if(get_attr(PACKETBUF_ATTR_MAC_NO_SRC_ADDR) == 1) {
160 if(LINKADDR_SIZE == 2) {
168 params->
dest_pid = frame802154_get_pan_id();
171 if(get_attr(PACKETBUF_ATTR_MAC_NO_DEST_ADDR) == 1) {
173 }
else if(dest_is_broadcast) {
177 if(LINKADDR_SIZE == 2) {
196 return create_frame(0);
202 return create_frame(1);
214 packetbuf_set_attr(PACKETBUF_ATTR_FRAME_TYPE, frame.
fcf.
frame_type);
218 if(frame.
dest_pid != frame802154_get_pan_id() &&
219 frame.
dest_pid != FRAME802154_BROADCASTPANDID) {
221 LOG_WARN(
"15.4: for another pan %u\n", frame.
dest_pid);
222 return FRAMER_FAILED;
225 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, (linkaddr_t *)&frame.
dest_addr);
228 packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (linkaddr_t *)&frame.
src_addr);
230 packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, frame.
seq);
232 packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, 0xffff);
234#if NETSTACK_CONF_WITH_RIME
235 packetbuf_set_attr(PACKETBUF_ATTR_PACKET_ID, frame.
seq);
238#if LLSEC802154_USES_AUX_HEADER
241#if LLSEC802154_USES_FRAME_COUNTER
245#if LLSEC802154_USES_EXPLICIT_KEYS
253 LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER));
255 LOG_INFO_LLADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER));
260 return FRAMER_FAILED;
263const struct framer framer_802154 = {
802.15.4 frame creation and parsing functions
A MAC framer for IEEE 802.15.4.
int frame802154_parse(uint8_t *data, int len, frame802154_t *pf)
Parses an input frame.
#define FRAME802154_NOADDR
Only valid for ACK or Beacon frames.
int frame802154_create(frame802154_t *p, uint8_t *buf)
Creates a frame for transmission over the air.
int frame802154_hdrlen(frame802154_t *p)
Calculates the length of the frame header.
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a link-layer address.
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
uint16_t packetbuf_totlen(void)
Get the total length of the header and data in the packetbuf.
uint16_t packetbuf_datalen(void)
Get the length of the data in the packetbuf.
void * packetbuf_hdrptr(void)
Get a pointer to the header in the packetbuf, for outbound packets.
bool packetbuf_holds_broadcast(void)
Checks whether the current packet is a broadcast.
int packetbuf_hdralloc(int size)
Extend the header of the packetbuf, for outbound packets.
int packetbuf_hdrreduce(int size)
Reduce the header in the packetbuf, for incoming packets.
Common functionality of 802.15.4-compliant llsec_drivers.
Header file for the logging system.
Header file for the Packet buffer (packetbuf) management.
frame802154_scf_t security_control
Security control bitfield.
frame802154_frame_counter_t frame_counter
Frame counter, used for security.
uint8_t key_index
Key Index subfield.
uint8_t frame_version
2 bit.
uint8_t ie_list_present
1 bit.
uint8_t security_enabled
1 bit.
uint8_t sequence_number_suppression
< 1 bit.
uint8_t src_addr_mode
2 bit.
uint8_t panid_compression
1 bit.
uint8_t ack_required
1 bit.
uint8_t dest_addr_mode
2 bit.
uint8_t frame_pending
1 bit.
uint8_t key_id_mode
2 bit.
uint8_t frame_counter_size
1 bit.
uint8_t frame_counter_suppression
1 bit.
uint8_t security_level
3 bit.
Parameters used by the frame802154_create() function.
uint8_t seq
Sequence number.
uint8_t dest_addr[8]
Destination address.
frame802154_aux_hdr_t aux_hdr
Aux security header.
uint8_t * payload
Pointer to 802.15.4 payload.
uint8_t src_addr[8]
Source address.
uint16_t src_pid
Source PAN ID.
frame802154_fcf_t fcf
Frame control field
uint16_t dest_pid
Destination PAN ID.
int payload_len
Length of payload field.