ContikiMAC: Create and parse ContikiMAC header in special framer; Expanded framer interface
to allow for creating and securing frames in advance; Create and secure frames in advance when sending bursts; Do neither recreate nor resecure frames that come from phase
This commit is contained in:
parent
c15a05aee1
commit
2cf7d98cad
179
core/net/mac/contikimac/contikimac-framer.c
Normal file
179
core/net/mac/contikimac/contikimac-framer.c
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Fraunhofer Heinrich-Hertz-Institut.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Creates and parses the ContikiMAC header.
|
||||||
|
* \author
|
||||||
|
* Konrad Krentz <konrad.krentz@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "net/mac/contikimac/contikimac-framer.h"
|
||||||
|
#include "net/packetbuf.h"
|
||||||
|
#include "net/netstack.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define CONTIKIMAC_ID 0x00
|
||||||
|
|
||||||
|
/* SHORTEST_PACKET_SIZE is the shortest packet that ContikiMAC
|
||||||
|
allows. Packets have to be a certain size to be able to be detected
|
||||||
|
by two consecutive CCA checks, and here is where we define this
|
||||||
|
shortest size.
|
||||||
|
Padded packets will have the wrong ipv6 checksum unless CONTIKIMAC_HEADER
|
||||||
|
is used (on both sides) and the receiver will ignore them.
|
||||||
|
With no header, reduce to transmit a proper multicast RPL DIS. */
|
||||||
|
#ifdef CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE
|
||||||
|
#define SHORTEST_PACKET_SIZE CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE
|
||||||
|
#else /* CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE */
|
||||||
|
#define SHORTEST_PACKET_SIZE 43
|
||||||
|
#endif /* CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE */
|
||||||
|
|
||||||
|
#ifdef CONTIKIMAC_FRAMER_CONF_DECORATED_FRAMER
|
||||||
|
#define DECORATED_FRAMER CONTIKIMAC_FRAMER_CONF_DECORATED_FRAMER
|
||||||
|
#else /* CONTIKIMAC_FRAMER_CONF_DECORATED_FRAMER */
|
||||||
|
#define DECORATED_FRAMER framer_802154
|
||||||
|
#endif /* CONTIKIMAC_FRAMER_CONF_DECORATED_FRAMER */
|
||||||
|
|
||||||
|
extern const struct framer DECORATED_FRAMER;
|
||||||
|
|
||||||
|
#define DEBUG 0
|
||||||
|
#if DEBUG
|
||||||
|
#include <stdio.h>
|
||||||
|
#define PRINTF(...) printf(__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define PRINTF(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 2-byte header for recovering padded packets.
|
||||||
|
Wireshark will not understand such packets at present. */
|
||||||
|
struct hdr {
|
||||||
|
uint8_t id;
|
||||||
|
uint8_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
create(void)
|
||||||
|
{
|
||||||
|
struct hdr *chdr;
|
||||||
|
int hdr_len;
|
||||||
|
|
||||||
|
if(packetbuf_hdralloc(sizeof(struct hdr)) == 0) {
|
||||||
|
PRINTF("contikimac-framer: too large header\n");
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
chdr = packetbuf_hdrptr();
|
||||||
|
chdr->id = CONTIKIMAC_ID;
|
||||||
|
chdr->len = 0;
|
||||||
|
|
||||||
|
hdr_len = DECORATED_FRAMER.create();
|
||||||
|
if(hdr_len < 0) {
|
||||||
|
PRINTF("contikimac-framer: decorated framer failed\n");
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hdr_len + sizeof(struct hdr);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
pad(void)
|
||||||
|
{
|
||||||
|
int transmit_len;
|
||||||
|
uint8_t *ptr;
|
||||||
|
uint8_t zeroes_count;
|
||||||
|
|
||||||
|
transmit_len = packetbuf_totlen();
|
||||||
|
if(transmit_len < SHORTEST_PACKET_SIZE) {
|
||||||
|
/* Padding required */
|
||||||
|
zeroes_count = SHORTEST_PACKET_SIZE - transmit_len;
|
||||||
|
ptr = packetbuf_dataptr();
|
||||||
|
memset(ptr + packetbuf_datalen(), 0, zeroes_count);
|
||||||
|
packetbuf_set_datalen(packetbuf_datalen() + zeroes_count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
create_and_secure(void)
|
||||||
|
{
|
||||||
|
struct hdr *chdr;
|
||||||
|
int hdr_len;
|
||||||
|
|
||||||
|
hdr_len = create();
|
||||||
|
if(hdr_len < 0) {
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
packetbuf_compact();
|
||||||
|
if(!NETSTACK_LLSEC.on_frame_created()) {
|
||||||
|
PRINTF("contikimac-framer: securing failed\n");
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
chdr = (struct hdr *)(((uint8_t *) packetbuf_dataptr()) - sizeof(struct hdr));
|
||||||
|
chdr->len = packetbuf_datalen();
|
||||||
|
pad();
|
||||||
|
|
||||||
|
return hdr_len;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static int
|
||||||
|
parse(void)
|
||||||
|
{
|
||||||
|
int hdr_len;
|
||||||
|
struct hdr *chdr;
|
||||||
|
|
||||||
|
hdr_len = DECORATED_FRAMER.parse();
|
||||||
|
if(hdr_len < 0) {
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
chdr = packetbuf_dataptr();
|
||||||
|
if(chdr->id != CONTIKIMAC_ID) {
|
||||||
|
PRINTF("contikimac-framer: CONTIKIMAC_ID is missing\n");
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!packetbuf_hdrreduce(sizeof(struct hdr))) {
|
||||||
|
PRINTF("contikimac-framer: packetbuf_hdrreduce failed\n");
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
packetbuf_set_datalen(chdr->len);
|
||||||
|
chdr->len = 0;
|
||||||
|
|
||||||
|
return hdr_len + sizeof(struct hdr);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
const struct framer contikimac_framer = {
|
||||||
|
create,
|
||||||
|
create_and_secure,
|
||||||
|
parse
|
||||||
|
};
|
||||||
|
/*---------------------------------------------------------------------------*/
|
45
core/net/mac/contikimac/contikimac-framer.h
Normal file
45
core/net/mac/contikimac/contikimac-framer.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Fraunhofer Heinrich-Hertz-Institut.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Creates and parses the ContikiMAC header.
|
||||||
|
* \author
|
||||||
|
* Konrad Krentz <konrad.krentz@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CONTIKIMAC_FRAMER_H_
|
||||||
|
#define CONTIKIMAC_FRAMER_H_
|
||||||
|
|
||||||
|
#include "net/mac/framer.h"
|
||||||
|
|
||||||
|
extern const struct framer contikimac_framer;
|
||||||
|
|
||||||
|
#endif /* CONTIKIMAC_FRAMER_H_ */
|
|
@ -61,13 +61,6 @@
|
||||||
#else /* CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION */
|
#else /* CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION */
|
||||||
#define WITH_PHASE_OPTIMIZATION 1
|
#define WITH_PHASE_OPTIMIZATION 1
|
||||||
#endif /* CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION */
|
#endif /* CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION */
|
||||||
/* Two byte header added to allow recovery of padded short packets */
|
|
||||||
/* Wireshark will not understand such packets at present */
|
|
||||||
#ifdef CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER
|
|
||||||
#define WITH_CONTIKIMAC_HEADER CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER
|
|
||||||
#else
|
|
||||||
#define WITH_CONTIKIMAC_HEADER 1
|
|
||||||
#endif
|
|
||||||
/* More aggressive radio sleeping when channel is busy with other traffic */
|
/* More aggressive radio sleeping when channel is busy with other traffic */
|
||||||
#ifndef WITH_FAST_SLEEP
|
#ifndef WITH_FAST_SLEEP
|
||||||
#define WITH_FAST_SLEEP 1
|
#define WITH_FAST_SLEEP 1
|
||||||
|
@ -90,15 +83,6 @@
|
||||||
#define WITH_PHASE_OPTIMIZATION 0
|
#define WITH_PHASE_OPTIMIZATION 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if WITH_CONTIKIMAC_HEADER
|
|
||||||
#define CONTIKIMAC_ID 0x00
|
|
||||||
|
|
||||||
struct hdr {
|
|
||||||
uint8_t id;
|
|
||||||
uint8_t len;
|
|
||||||
};
|
|
||||||
#endif /* WITH_CONTIKIMAC_HEADER */
|
|
||||||
|
|
||||||
/* CYCLE_TIME for channel cca checks, in rtimer ticks. */
|
/* CYCLE_TIME for channel cca checks, in rtimer ticks. */
|
||||||
#ifdef CONTIKIMAC_CONF_CYCLE_TIME
|
#ifdef CONTIKIMAC_CONF_CYCLE_TIME
|
||||||
#define CYCLE_TIME (CONTIKIMAC_CONF_CYCLE_TIME)
|
#define CYCLE_TIME (CONTIKIMAC_CONF_CYCLE_TIME)
|
||||||
|
@ -211,21 +195,6 @@ static int we_are_receiving_burst = 0;
|
||||||
to a neighbor for which we have a phase lock. */
|
to a neighbor for which we have a phase lock. */
|
||||||
#define MAX_PHASE_STROBE_TIME RTIMER_ARCH_SECOND / 60
|
#define MAX_PHASE_STROBE_TIME RTIMER_ARCH_SECOND / 60
|
||||||
|
|
||||||
|
|
||||||
/* SHORTEST_PACKET_SIZE is the shortest packet that ContikiMAC
|
|
||||||
allows. Packets have to be a certain size to be able to be detected
|
|
||||||
by two consecutive CCA checks, and here is where we define this
|
|
||||||
shortest size.
|
|
||||||
Padded packets will have the wrong ipv6 checksum unless CONTIKIMAC_HEADER
|
|
||||||
is used (on both sides) and the receiver will ignore them.
|
|
||||||
With no header, reduce to transmit a proper multicast RPL DIS. */
|
|
||||||
#ifdef CONTIKIMAC_CONF_SHORTEST_PACKET_SIZE
|
|
||||||
#define SHORTEST_PACKET_SIZE CONTIKIMAC_CONF_SHORTEST_PACKET_SIZE
|
|
||||||
#else
|
|
||||||
#define SHORTEST_PACKET_SIZE 43
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define ACK_LEN 3
|
#define ACK_LEN 3
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -528,7 +497,7 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr,
|
||||||
rtimer_clock_t encounter_time = 0;
|
rtimer_clock_t encounter_time = 0;
|
||||||
int strobes;
|
int strobes;
|
||||||
uint8_t got_strobe_ack = 0;
|
uint8_t got_strobe_ack = 0;
|
||||||
int hdrlen, len;
|
int len;
|
||||||
uint8_t is_broadcast = 0;
|
uint8_t is_broadcast = 0;
|
||||||
uint8_t is_reliable = 0;
|
uint8_t is_reliable = 0;
|
||||||
uint8_t is_known_receiver = 0;
|
uint8_t is_known_receiver = 0;
|
||||||
|
@ -537,9 +506,6 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr,
|
||||||
int ret;
|
int ret;
|
||||||
uint8_t contikimac_was_on;
|
uint8_t contikimac_was_on;
|
||||||
uint8_t seqno;
|
uint8_t seqno;
|
||||||
#if WITH_CONTIKIMAC_HEADER
|
|
||||||
struct hdr *chdr;
|
|
||||||
#endif /* WITH_CONTIKIMAC_HEADER */
|
|
||||||
|
|
||||||
/* Exit if RDC and radio were explicitly turned off */
|
/* Exit if RDC and radio were explicitly turned off */
|
||||||
if(!contikimac_is_on && !contikimac_keep_radio_on) {
|
if(!contikimac_is_on && !contikimac_keep_radio_on) {
|
||||||
|
@ -583,63 +549,17 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr,
|
||||||
is_reliable = packetbuf_attr(PACKETBUF_ATTR_RELIABLE) ||
|
is_reliable = packetbuf_attr(PACKETBUF_ATTR_RELIABLE) ||
|
||||||
packetbuf_attr(PACKETBUF_ATTR_ERELIABLE);
|
packetbuf_attr(PACKETBUF_ATTR_ERELIABLE);
|
||||||
|
|
||||||
|
if(!packetbuf_attr(PACKETBUF_ATTR_IS_CREATED_AND_SECURED)) {
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
|
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
|
||||||
|
if(NETSTACK_FRAMER.create_and_secure() < 0) {
|
||||||
#if WITH_CONTIKIMAC_HEADER
|
PRINTF("contikimac: framer failed\n");
|
||||||
hdrlen = packetbuf_totlen();
|
|
||||||
if(packetbuf_hdralloc(sizeof(struct hdr)) == 0) {
|
|
||||||
/* Failed to allocate space for contikimac header */
|
|
||||||
PRINTF("contikimac: send failed, too large header\n");
|
|
||||||
return MAC_TX_ERR_FATAL;
|
return MAC_TX_ERR_FATAL;
|
||||||
}
|
}
|
||||||
chdr = packetbuf_hdrptr();
|
|
||||||
chdr->id = CONTIKIMAC_ID;
|
|
||||||
chdr->len = hdrlen;
|
|
||||||
|
|
||||||
/* Create the MAC header for the data packet. */
|
|
||||||
hdrlen = NETSTACK_FRAMER.create();
|
|
||||||
if(hdrlen < 0) {
|
|
||||||
/* Failed to send */
|
|
||||||
PRINTF("contikimac: send failed, too large header\n");
|
|
||||||
packetbuf_hdr_remove(sizeof(struct hdr));
|
|
||||||
return MAC_TX_ERR_FATAL;
|
|
||||||
}
|
|
||||||
hdrlen += sizeof(struct hdr);
|
|
||||||
#else
|
|
||||||
/* Create the MAC header for the data packet. */
|
|
||||||
hdrlen = NETSTACK_FRAMER.create();
|
|
||||||
if(hdrlen < 0) {
|
|
||||||
/* Failed to send */
|
|
||||||
PRINTF("contikimac: send failed, too large header\n");
|
|
||||||
return MAC_TX_ERR_FATAL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
packetbuf_compact();
|
|
||||||
|
|
||||||
if(!NETSTACK_LLSEC.on_frame_created()) {
|
|
||||||
return MAC_TX_ERR_FATAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure that the packet is longer or equal to the shortest
|
|
||||||
packet length. */
|
|
||||||
transmit_len = packetbuf_totlen();
|
|
||||||
if(transmit_len < SHORTEST_PACKET_SIZE) {
|
|
||||||
/* Pad with zeroes */
|
|
||||||
uint8_t *ptr;
|
|
||||||
ptr = packetbuf_dataptr();
|
|
||||||
memset(ptr + packetbuf_datalen(), 0, SHORTEST_PACKET_SIZE - packetbuf_totlen());
|
|
||||||
|
|
||||||
PRINTF("contikimac: shorter than shortest (%d)\n", packetbuf_totlen());
|
|
||||||
transmit_len = SHORTEST_PACKET_SIZE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
transmit_len = packetbuf_totlen();
|
transmit_len = packetbuf_totlen();
|
||||||
|
|
||||||
NETSTACK_RADIO.prepare(packetbuf_hdrptr(), transmit_len);
|
NETSTACK_RADIO.prepare(packetbuf_hdrptr(), transmit_len);
|
||||||
|
|
||||||
/* Remove the MAC-layer header since it will be recreated next time around. */
|
|
||||||
packetbuf_hdr_remove(hdrlen);
|
|
||||||
|
|
||||||
if(!is_broadcast && !is_receiver_awake) {
|
if(!is_broadcast && !is_receiver_awake) {
|
||||||
#if WITH_PHASE_OPTIMIZATION
|
#if WITH_PHASE_OPTIMIZATION
|
||||||
ret = phase_wait(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
|
ret = phase_wait(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
|
||||||
|
@ -863,32 +783,54 @@ qsend_packet(mac_callback_t sent, void *ptr)
|
||||||
static void
|
static void
|
||||||
qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list)
|
qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list)
|
||||||
{
|
{
|
||||||
struct rdc_buf_list *curr = buf_list;
|
struct rdc_buf_list *curr;
|
||||||
struct rdc_buf_list *next;
|
struct rdc_buf_list *next;
|
||||||
int ret;
|
int ret;
|
||||||
int is_receiver_awake;
|
int is_receiver_awake;
|
||||||
|
|
||||||
if(curr == NULL) {
|
if(buf_list == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* Do not send during reception of a burst */
|
/* Do not send during reception of a burst */
|
||||||
if(we_are_receiving_burst) {
|
if(we_are_receiving_burst) {
|
||||||
/* Prepare the packetbuf for callback */
|
/* Prepare the packetbuf for callback */
|
||||||
queuebuf_to_packetbuf(curr->buf);
|
queuebuf_to_packetbuf(buf_list->buf);
|
||||||
/* Return COLLISION so the MAC may try again later */
|
/* Return COLLISION so the MAC may try again later */
|
||||||
mac_call_sent_callback(sent, ptr, MAC_TX_COLLISION, 1);
|
mac_call_sent_callback(sent, ptr, MAC_TX_COLLISION, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create and secure frames in advance */
|
||||||
|
curr = buf_list;
|
||||||
|
do {
|
||||||
|
next = list_item_next(curr);
|
||||||
|
queuebuf_to_packetbuf(curr->buf);
|
||||||
|
if(!packetbuf_attr(PACKETBUF_ATTR_IS_CREATED_AND_SECURED)) {
|
||||||
|
/* create and secure this frame */
|
||||||
|
if(next != NULL) {
|
||||||
|
packetbuf_set_attr(PACKETBUF_ATTR_PENDING, 1);
|
||||||
|
}
|
||||||
|
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
|
||||||
|
if(NETSTACK_FRAMER.create_and_secure() < 0) {
|
||||||
|
PRINTF("contikimac: framer failed\n");
|
||||||
|
mac_call_sent_callback(sent, ptr, MAC_TX_ERR_FATAL, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
packetbuf_set_attr(PACKETBUF_ATTR_IS_CREATED_AND_SECURED, 1);
|
||||||
|
queuebuf_update_from_packetbuf(curr->buf);
|
||||||
|
}
|
||||||
|
curr = next;
|
||||||
|
} while(next != NULL);
|
||||||
|
|
||||||
/* The receiver needs to be awoken before we send */
|
/* The receiver needs to be awoken before we send */
|
||||||
is_receiver_awake = 0;
|
is_receiver_awake = 0;
|
||||||
|
curr = buf_list;
|
||||||
do { /* A loop sending a burst of packets from buf_list */
|
do { /* A loop sending a burst of packets from buf_list */
|
||||||
next = list_item_next(curr);
|
next = list_item_next(curr);
|
||||||
|
|
||||||
/* Prepare the packetbuf */
|
/* Prepare the packetbuf */
|
||||||
queuebuf_to_packetbuf(curr->buf);
|
queuebuf_to_packetbuf(curr->buf);
|
||||||
if(next != NULL) {
|
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_PENDING, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send the current packet */
|
/* Send the current packet */
|
||||||
ret = send_packet(sent, ptr, curr, is_receiver_awake);
|
ret = send_packet(sent, ptr, curr, is_receiver_awake);
|
||||||
|
@ -906,7 +848,7 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list)
|
||||||
/* The transmission failed, we stop the burst */
|
/* The transmission failed, we stop the burst */
|
||||||
next = NULL;
|
next = NULL;
|
||||||
}
|
}
|
||||||
} while(next != NULL);
|
} while((next != NULL) && packetbuf_attr(PACKETBUF_ATTR_PENDING));
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Timer callback triggered when receiving a burst, after having
|
/* Timer callback triggered when receiving a burst, after having
|
||||||
|
@ -930,18 +872,6 @@ input_packet(void)
|
||||||
/* printf("cycle_start 0x%02x 0x%02x\n", cycle_start, cycle_start % CYCLE_TIME);*/
|
/* printf("cycle_start 0x%02x 0x%02x\n", cycle_start, cycle_start % CYCLE_TIME);*/
|
||||||
|
|
||||||
if(packetbuf_totlen() > 0 && NETSTACK_FRAMER.parse() >= 0) {
|
if(packetbuf_totlen() > 0 && NETSTACK_FRAMER.parse() >= 0) {
|
||||||
|
|
||||||
#if WITH_CONTIKIMAC_HEADER
|
|
||||||
struct hdr *chdr;
|
|
||||||
chdr = packetbuf_dataptr();
|
|
||||||
if(chdr->id != CONTIKIMAC_ID) {
|
|
||||||
PRINTF("contikimac: failed to parse hdr (%u)\n", packetbuf_totlen());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
packetbuf_hdrreduce(sizeof(struct hdr));
|
|
||||||
packetbuf_set_datalen(chdr->len);
|
|
||||||
#endif /* WITH_CONTIKIMAC_HEADER */
|
|
||||||
|
|
||||||
if(packetbuf_datalen() > 0 &&
|
if(packetbuf_datalen() > 0 &&
|
||||||
packetbuf_totlen() > 0 &&
|
packetbuf_totlen() > 0 &&
|
||||||
(linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
|
(linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
|
||||||
|
@ -952,6 +882,8 @@ input_packet(void)
|
||||||
broadcast address. */
|
broadcast address. */
|
||||||
|
|
||||||
/* If FRAME_PENDING is set, we are receiving a packets in a burst */
|
/* If FRAME_PENDING is set, we are receiving a packets in a burst */
|
||||||
|
/* TODO To prevent denial-of-sleep attacks, the transceiver should
|
||||||
|
be disabled upon receipt of an unauthentic frame. */
|
||||||
we_are_receiving_burst = packetbuf_attr(PACKETBUF_ATTR_PENDING);
|
we_are_receiving_burst = packetbuf_attr(PACKETBUF_ATTR_PENDING);
|
||||||
if(we_are_receiving_burst) {
|
if(we_are_receiving_burst) {
|
||||||
on();
|
on();
|
||||||
|
|
|
@ -273,5 +273,9 @@ parse(void)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
const struct framer framer_802154 = {
|
const struct framer framer_802154 = {
|
||||||
hdr_length, create, parse
|
hdr_length,
|
||||||
|
create,
|
||||||
|
framer_canonical_create_and_secure,
|
||||||
|
parse
|
||||||
};
|
};
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -97,5 +97,8 @@ parse(void)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
const struct framer framer_nullmac = {
|
const struct framer framer_nullmac = {
|
||||||
hdr_length, create, parse
|
hdr_length,
|
||||||
|
create,
|
||||||
|
framer_canonical_create_and_secure,
|
||||||
|
parse
|
||||||
};
|
};
|
||||||
|
|
50
core/net/mac/framer.c
Normal file
50
core/net/mac/framer.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Fraunhofer Heinrich-Hertz-Institut.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "net/mac/framer.h"
|
||||||
|
#include "net/packetbuf.h"
|
||||||
|
#include "net/netstack.h"
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
framer_canonical_create_and_secure(void)
|
||||||
|
{
|
||||||
|
int hdr_len;
|
||||||
|
|
||||||
|
hdr_len = NETSTACK_FRAMER.create();
|
||||||
|
if(hdr_len >= 0) {
|
||||||
|
packetbuf_compact();
|
||||||
|
if(!NETSTACK_LLSEC.on_frame_created()) {
|
||||||
|
return FRAMER_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hdr_len;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
|
@ -47,8 +47,13 @@ struct framer {
|
||||||
|
|
||||||
int (* length)(void);
|
int (* length)(void);
|
||||||
int (* create)(void);
|
int (* create)(void);
|
||||||
|
|
||||||
|
/** Creates the frame and calls LLSEC.on_frame_created() */
|
||||||
|
int (* create_and_secure)(void);
|
||||||
int (* parse)(void);
|
int (* parse)(void);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int framer_canonical_create_and_secure(void);
|
||||||
|
|
||||||
#endif /* FRAMER_H_ */
|
#endif /* FRAMER_H_ */
|
||||||
|
|
|
@ -120,7 +120,7 @@ send_one_packet(mac_callback_t sent, void *ptr)
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
|
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
|
||||||
#endif /* NULLRDC_802154_AUTOACK || NULLRDC_802154_AUTOACK_HW */
|
#endif /* NULLRDC_802154_AUTOACK || NULLRDC_802154_AUTOACK_HW */
|
||||||
|
|
||||||
if((NETSTACK_FRAMER.create() < 0) || !NETSTACK_LLSEC.on_frame_created()) {
|
if(NETSTACK_FRAMER.create_and_secure() < 0) {
|
||||||
/* Failed to allocate space for headers */
|
/* Failed to allocate space for headers */
|
||||||
PRINTF("nullrdc: send failed, too large header\n");
|
PRINTF("nullrdc: send failed, too large header\n");
|
||||||
ret = MAC_TX_ERR_FATAL;
|
ret = MAC_TX_ERR_FATAL;
|
||||||
|
|
|
@ -217,6 +217,7 @@ phase_wait(const linkaddr_t *neighbor, rtimer_clock_t cycle_time,
|
||||||
p = memb_alloc(&queued_packets_memb);
|
p = memb_alloc(&queued_packets_memb);
|
||||||
if(p != NULL) {
|
if(p != NULL) {
|
||||||
if(buf_list == NULL) {
|
if(buf_list == NULL) {
|
||||||
|
packetbuf_set_attr(PACKETBUF_ATTR_IS_CREATED_AND_SECURED, 1);
|
||||||
p->q = queuebuf_new_from_packetbuf();
|
p->q = queuebuf_new_from_packetbuf();
|
||||||
}
|
}
|
||||||
p->mac_callback = mac_callback;
|
p->mac_callback = mac_callback;
|
||||||
|
|
|
@ -348,6 +348,7 @@ enum {
|
||||||
PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
|
PACKETBUF_ATTR_MAX_MAC_TRANSMISSIONS,
|
||||||
PACKETBUF_ATTR_MAC_SEQNO,
|
PACKETBUF_ATTR_MAC_SEQNO,
|
||||||
PACKETBUF_ATTR_MAC_ACK,
|
PACKETBUF_ATTR_MAC_ACK,
|
||||||
|
PACKETBUF_ATTR_IS_CREATED_AND_SECURED,
|
||||||
|
|
||||||
/* Scope 1 attributes: used between two neighbors only. */
|
/* Scope 1 attributes: used between two neighbors only. */
|
||||||
PACKETBUF_ATTR_RELIABLE,
|
PACKETBUF_ATTR_RELIABLE,
|
||||||
|
|
|
@ -405,6 +405,19 @@ queuebuf_update_attr_from_packetbuf(struct queuebuf *buf)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
|
queuebuf_update_from_packetbuf(struct queuebuf *buf)
|
||||||
|
{
|
||||||
|
struct queuebuf_data *buframptr = queuebuf_load_to_ram(buf);
|
||||||
|
packetbuf_attr_copyto(buframptr->attrs, buframptr->addrs);
|
||||||
|
buframptr->len = packetbuf_copyto(buframptr->data);
|
||||||
|
#if WITH_SWAP
|
||||||
|
if(buf->location == IN_CFS) {
|
||||||
|
queuebuf_flush_tmpdata();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
queuebuf_free(struct queuebuf *buf)
|
queuebuf_free(struct queuebuf *buf)
|
||||||
{
|
{
|
||||||
if(memb_inmemb(&bufmem, buf)) {
|
if(memb_inmemb(&bufmem, buf)) {
|
||||||
|
|
|
@ -96,6 +96,7 @@ struct queuebuf *queuebuf_new_from_packetbuf_debug(const char *file, int line);
|
||||||
struct queuebuf *queuebuf_new_from_packetbuf(void);
|
struct queuebuf *queuebuf_new_from_packetbuf(void);
|
||||||
#endif /* QUEUEBUF_DEBUG */
|
#endif /* QUEUEBUF_DEBUG */
|
||||||
void queuebuf_update_attr_from_packetbuf(struct queuebuf *b);
|
void queuebuf_update_attr_from_packetbuf(struct queuebuf *b);
|
||||||
|
void queuebuf_update_from_packetbuf(struct queuebuf *b);
|
||||||
|
|
||||||
void queuebuf_to_packetbuf(struct queuebuf *b);
|
void queuebuf_to_packetbuf(struct queuebuf *b);
|
||||||
void queuebuf_free(struct queuebuf *b);
|
void queuebuf_free(struct queuebuf *b);
|
||||||
|
|
|
@ -123,5 +123,8 @@ parse(void)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
const struct framer no_framer = {
|
const struct framer no_framer = {
|
||||||
hdr_length, create, parse
|
hdr_length,
|
||||||
|
create,
|
||||||
|
framer_canonical_create_and_secure,
|
||||||
|
parse
|
||||||
};
|
};
|
||||||
|
|
|
@ -237,10 +237,8 @@ typedef unsigned short uip_stats_t;
|
||||||
#define NETSTACK_CONF_RDC contikimac_driver
|
#define NETSTACK_CONF_RDC contikimac_driver
|
||||||
/* Default is two CCA separated by 500 usec */
|
/* Default is two CCA separated by 500 usec */
|
||||||
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
|
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
|
||||||
/* Wireshark won't decode with the header, but padded packets will fail ipv6 checksum */
|
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
/* So without the header this needed for RPL mesh to form */
|
/* So without the header this needed for RPL mesh to form */
|
||||||
#define CONTIKIMAC_CONF_SHORTEST_PACKET_SIZE 43-18 //multicast RPL DIS length
|
#define CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE 43-18 //multicast RPL DIS length
|
||||||
/* Not tested much yet */
|
/* Not tested much yet */
|
||||||
#define WITH_PHASE_OPTIMIZATION 0
|
#define WITH_PHASE_OPTIMIZATION 0
|
||||||
#define CONTIKIMAC_CONF_COMPOWER 1
|
#define CONTIKIMAC_CONF_COMPOWER 1
|
||||||
|
|
|
@ -253,10 +253,8 @@ typedef unsigned short uip_stats_t;
|
||||||
#define NETSTACK_CONF_RDC contikimac_driver
|
#define NETSTACK_CONF_RDC contikimac_driver
|
||||||
/* Default is two CCA separated by 500 usec */
|
/* Default is two CCA separated by 500 usec */
|
||||||
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
|
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
|
||||||
/* Wireshark won't decode with the header, but padded packets will fail ipv6 checksum */
|
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
/* So without the header this needed for RPL mesh to form */
|
/* So without the header this needed for RPL mesh to form */
|
||||||
#define CONTIKIMAC_CONF_SHORTEST_PACKET_SIZE 43-18 //multicast RPL DIS length
|
#define CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE 43-18 //multicast RPL DIS length
|
||||||
/* Not tested much yet */
|
/* Not tested much yet */
|
||||||
#define WITH_PHASE_OPTIMIZATION 0
|
#define WITH_PHASE_OPTIMIZATION 0
|
||||||
#define CONTIKIMAC_CONF_COMPOWER 1
|
#define CONTIKIMAC_CONF_COMPOWER 1
|
||||||
|
|
|
@ -308,7 +308,6 @@ typedef uint32_t rtimer_clock_t;
|
||||||
#define NULLRDC_802154_AUTOACK_HW 1
|
#define NULLRDC_802154_AUTOACK_HW 1
|
||||||
|
|
||||||
/* Configure ContikiMAC for when it's selected */
|
/* Configure ContikiMAC for when it's selected */
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
#define CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION 0
|
#define CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION 0
|
||||||
#define WITH_FAST_SLEEP 1
|
#define WITH_FAST_SLEEP 1
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
larger than a specified size, if no ContikiMAC header should be
|
larger than a specified size, if no ContikiMAC header should be
|
||||||
used. */
|
used. */
|
||||||
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
|
|
||||||
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
||||||
#define XMAC_CONF_ANNOUNCEMENTS 0
|
#define XMAC_CONF_ANNOUNCEMENTS 0
|
||||||
|
|
|
@ -125,7 +125,6 @@
|
||||||
larger than a specified size, if no ContikiMAC header should be
|
larger than a specified size, if no ContikiMAC header should be
|
||||||
used. */
|
used. */
|
||||||
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
|
|
||||||
#define UIP_CONF_UDP 1
|
#define UIP_CONF_UDP 1
|
||||||
|
|
||||||
|
|
|
@ -87,8 +87,6 @@ typedef uint32_t rtimer_clock_t;
|
||||||
|
|
||||||
#define RDC_CONF_HARDWARE_CSMA 1
|
#define RDC_CONF_HARDWARE_CSMA 1
|
||||||
|
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
|
|
||||||
#ifdef WITH_UIP6
|
#ifdef WITH_UIP6
|
||||||
#define UIP_CONF_ROUTER 1
|
#define UIP_CONF_ROUTER 1
|
||||||
#ifndef UIP_CONF_IPV6_RPL
|
#ifndef UIP_CONF_IPV6_RPL
|
||||||
|
|
|
@ -48,7 +48,6 @@
|
||||||
larger than a specified size, if no ContikiMAC header should be
|
larger than a specified size, if no ContikiMAC header should be
|
||||||
used. */
|
used. */
|
||||||
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
|
|
||||||
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
||||||
#define XMAC_CONF_ANNOUNCEMENTS 0
|
#define XMAC_CONF_ANNOUNCEMENTS 0
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
larger than a specified size, if no ContikiMAC header should be
|
larger than a specified size, if no ContikiMAC header should be
|
||||||
used. */
|
used. */
|
||||||
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
|
|
||||||
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
||||||
#define XMAC_CONF_ANNOUNCEMENTS 0
|
#define XMAC_CONF_ANNOUNCEMENTS 0
|
||||||
|
|
|
@ -51,7 +51,6 @@
|
||||||
larger than a specified size, if no ContikiMAC header should be
|
larger than a specified size, if no ContikiMAC header should be
|
||||||
used. */
|
used. */
|
||||||
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
#define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63
|
||||||
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
|
||||||
|
|
||||||
#define CC2420_CONF_AUTOACK 1
|
#define CC2420_CONF_AUTOACK 1
|
||||||
#define NETSTACK_RDC_CHANNEL_CHECK_RATE 8
|
#define NETSTACK_RDC_CHANNEL_CHECK_RATE 8
|
||||||
|
|
Loading…
Reference in a new issue