49 #if CONTIKI_TARGET_COOJA
50 #include "lib/simEnvChange.h"
56 #define PRINTF(...) printf(__VA_ARGS__)
61 #ifdef NULLRDC_CONF_ADDRESS_FILTER
62 #define NULLRDC_ADDRESS_FILTER NULLRDC_CONF_ADDRESS_FILTER
64 #define NULLRDC_ADDRESS_FILTER 1
67 #ifndef NULLRDC_802154_AUTOACK
68 #ifdef NULLRDC_CONF_802154_AUTOACK
69 #define NULLRDC_802154_AUTOACK NULLRDC_CONF_802154_AUTOACK
71 #define NULLRDC_802154_AUTOACK 0
75 #ifndef NULLRDC_802154_AUTOACK_HW
76 #ifdef NULLRDC_CONF_802154_AUTOACK_HW
77 #define NULLRDC_802154_AUTOACK_HW NULLRDC_CONF_802154_AUTOACK_HW
79 #define NULLRDC_802154_AUTOACK_HW 0
83 #if NULLRDC_802154_AUTOACK
85 #include "dev/watchdog.h"
87 #ifdef NULLRDC_CONF_ACK_WAIT_TIME
88 #define ACK_WAIT_TIME NULLRDC_CONF_ACK_WAIT_TIME
90 #define ACK_WAIT_TIME RTIMER_SECOND / 2500
92 #ifdef NULLRDC_CONF_AFTER_ACK_DETECTED_WAIT_TIME
93 #define AFTER_ACK_DETECTED_WAIT_TIME NULLRDC_CONF_AFTER_ACK_DETECTED_WAIT_TIME
95 #define AFTER_ACK_DETECTED_WAIT_TIME RTIMER_SECOND / 1500
99 #ifdef NULLRDC_CONF_SEND_802154_ACK
100 #define NULLRDC_SEND_802154_ACK NULLRDC_CONF_SEND_802154_ACK
102 #define NULLRDC_SEND_802154_ACK 0
105 #if NULLRDC_SEND_802154_ACK
113 send_one_packet(mac_callback_t sent,
void *ptr)
116 int last_sent_ok = 0;
119 #if NULLRDC_802154_AUTOACK || NULLRDC_802154_AUTOACK_HW
120 packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1);
123 if(NETSTACK_FRAMER.create() < 0) {
125 PRINTF(
"nullrdc: send failed, too large header\n");
126 ret = MAC_TX_ERR_FATAL;
129 #ifdef NETSTACK_ENCRYPT
133 #if NULLRDC_802154_AUTOACK
140 is_broadcast =
linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
143 if(NETSTACK_RADIO.receiving_packet() ||
144 (!is_broadcast && NETSTACK_RADIO.pending_packet())) {
152 RIMESTATS_ADD(reliabletx);
165 while(RTIMER_CLOCK_LT(
RTIMER_NOW(), wt + ACK_WAIT_TIME)) {
166 #if CONTIKI_TARGET_COOJA
167 simProcessRunValue = 1;
173 if(NETSTACK_RADIO.receiving_packet() ||
174 NETSTACK_RADIO.pending_packet() ||
175 NETSTACK_RADIO.channel_clear() == 0) {
177 uint8_t ackbuf[ACK_LEN];
179 if(AFTER_ACK_DETECTED_WAIT_TIME > 0) {
183 wt + AFTER_ACK_DETECTED_WAIT_TIME)) {
184 #if CONTIKI_TARGET_COOJA
185 simProcessRunValue = 1;
191 if(NETSTACK_RADIO.pending_packet()) {
192 len = NETSTACK_RADIO.read(ackbuf, ACK_LEN);
193 if(len == ACK_LEN && ackbuf[2] == dsn) {
195 RIMESTATS_ADD(ackrx);
203 PRINTF(
"nullrdc tx noack\n");
207 case RADIO_TX_COLLISION:
222 case RADIO_TX_COLLISION:
238 mac_call_sent_callback(sent, ptr, ret, 1);
243 send_packet(mac_callback_t sent,
void *ptr)
245 send_one_packet(sent, ptr);
249 send_list(mac_callback_t sent,
void *ptr,
struct rdc_buf_list *buf_list)
251 while(buf_list !=
NULL) {
254 struct rdc_buf_list *next = buf_list->next;
257 queuebuf_to_packetbuf(buf_list->buf);
258 last_sent_ok = send_one_packet(sent, ptr);
273 int original_datalen;
274 uint8_t *original_dataptr;
278 #ifdef NETSTACK_DECRYPT
282 #if NULLRDC_802154_AUTOACK
285 PRINTF(
"nullrdc: ignored ack\n");
288 if(NETSTACK_FRAMER.parse() < 0) {
290 #if NULLRDC_ADDRESS_FILTER
291 }
else if(!
linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
295 PRINTF(
"nullrdc: not for us\n");
300 #if NULLRDC_802154_AUTOACK || NULLRDC_802154_AUTOACK_HW
305 PRINTF(
"nullrdc: drop duplicate link layer packet %u\n",
306 packetbuf_attr(PACKETBUF_ATTR_PACKET_ID));
312 #if NULLRDC_SEND_802154_ACK
320 uint8_t ackdata[ACK_LEN] = {0, 0, 0};
322 ackdata[0] = FRAME802154_ACKFRAME;
324 ackdata[2] = info154.
seq;
325 NETSTACK_RADIO.send(ackdata, ACK_LEN);
330 NETSTACK_MAC.input();
338 return NETSTACK_RADIO.on();
342 off(
int keep_radio_on)
345 return NETSTACK_RADIO.on();
347 return NETSTACK_RADIO.off();
351 static unsigned short
352 channel_check_interval(
void)