51 #include <avr/eeprom.h>
52 #include <util/delay.h>
68 #define PRINTF(...) printf(__VA_ARGS__)
69 #define SICSLOW_CORRECTION_DELAY 70
72 #define SICSLOW_CORRECTION_DELAY 7
76 #include "sicslow_ethernet.h"
77 #define LOG_FRAME(x,y) mac_logTXtoEthernet(x,y)
79 #define LOG_FRAME(x,y)
84 static struct mac_driver *pmac_driver = &mac_driver_struct;
86 static parsed_frame_t *parsed_frame;
103 event_object_t event_object[MAX_EVENTS];
107 static void setinput(
void (*r)(
const struct mac_driver *d));
109 void sicslowmac_unknownIndication(
void);
112 void (*sicslowmac_snifferhook)(
const struct mac_driver *r) =
NULL;
124 return (event_queue.head != event_queue.tail);
137 if ((event_queue.head + 1) % MAX_EVENTS == event_queue.tail){
142 newhead = event_queue.head;
145 event_queue.event_object[newhead] = *object;
149 if (newhead >= MAX_EVENTS){
152 event_queue.head = newhead;
164 event_object_t *
object =
NULL;
165 volatile uint8_t newtail;
167 newtail = event_queue.tail;
169 object = &(event_queue.event_object[newtail]);
173 if (newtail >= MAX_EVENTS){
177 event_queue.tail = newtail;
182 void mac_pollhandler(
void)
196 event_object_t *event;
205 if (event->event == MAC_EVENT_RX){
207 parsed_frame = (parsed_frame_t *)event->data;
208 if (parsed_frame->fcf->frameType == DATAFRAME){
209 sicslowmac_dataIndication();
213 sicslowmac_unknownIndication();
218 parsed_frame->in_use =
false;
221 if (event->event == MAC_EVENT_DROPPED){
223 PRINTF(
"sicslowmac: Frame Dropped!\n");
230 setinput(
void (*r)(
const struct mac_driver *d))
235 static uint8_t dest_reversed[UIP_LLADDR_LEN];
236 static uint8_t src_reversed[UIP_LLADDR_LEN];
238 # define MSB(u16) (((uint8_t* )&u16)[1])
239 # define LSB(u16) (((uint8_t* )&u16)[0])
242 sicslowmac_dataIndication(
void)
247 #if UIP_LLADDR_LEN == 8
252 memcpy(dest_reversed, (uint8_t *)parsed_frame->dest_addr, UIP_LLADDR_LEN);
253 memcpy(src_reversed, (uint8_t *)parsed_frame->src_addr, UIP_LLADDR_LEN);
256 byte_reverse((uint8_t *)dest_reversed, UIP_LLADDR_LEN);
257 byte_reverse((uint8_t *)src_reversed, UIP_LLADDR_LEN);
259 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, (
const linkaddr_t *)dest_reversed);
260 packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (
const linkaddr_t *)src_reversed);
262 #elif UIP_CONF_USE_RUM
264 packetbuf_copyfrom(parsed_frame->payload + UIP_DATA_RUM_OFFSET, parsed_frame->payload_length - UIP_DATA_RUM_OFFSET);
267 dest_reversed[0] =
MSB(parsed_frame->dest_pid);
268 dest_reversed[1] =
LSB(parsed_frame->dest_pid);
269 dest_reversed[2] = 0;
270 dest_reversed[3] = 0;
271 dest_reversed[4] =
MSB(parsed_frame->payload[0]);
272 dest_reversed[5] =
LSB(parsed_frame->payload[1]);
274 src_reversed[0] =
MSB(parsed_frame->src_pid);
275 src_reversed[1] =
LSB(parsed_frame->src_pid);
278 src_reversed[4] =
MSB(parsed_frame->payload[2]);
279 src_reversed[5] =
LSB(parsed_frame->payload[3]);
286 dest_reversed[0] =
MSB(parsed_frame->dest_pid);
287 dest_reversed[1] =
LSB(parsed_frame->dest_pid);
288 dest_reversed[2] = 0;
289 dest_reversed[3] = 0;
290 dest_reversed[4] =
MSB(parsed_frame->dest_addr->addr16);
291 dest_reversed[5] =
LSB(parsed_frame->dest_addr->addr16);
293 src_reversed[0] =
MSB(parsed_frame->src_pid);
294 src_reversed[1] =
LSB(parsed_frame->src_pid);
297 src_reversed[4] =
MSB(parsed_frame->src_addr->addr16);
298 src_reversed[5] =
LSB(parsed_frame->src_addr->addr16);
300 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, (
const linkaddr_t *)dest_reversed);
301 packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (
const linkaddr_t *)src_reversed);
305 PRINTF(
"sicslowmac: hand off frame to sicslowpan \n");
310 sicslowmac_unknownIndication(
void)
312 if (sicslowmac_snifferhook) {
320 #if UIP_LLADDR_LEN == 8
321 memcpy(dest_reversed, (uint8_t *)parsed_frame->dest_addr, UIP_LLADDR_LEN);
322 memcpy(src_reversed, (uint8_t *)parsed_frame->src_addr, UIP_LLADDR_LEN);
325 byte_reverse((uint8_t *)dest_reversed, UIP_LLADDR_LEN);
326 byte_reverse((uint8_t *)src_reversed, UIP_LLADDR_LEN);
328 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, (
const linkaddr_t *)dest_reversed);
329 packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (
const linkaddr_t *)src_reversed);
331 #elif UIP_CONF_USE_RUM
333 dest_reversed[0] =
MSB(parsed_frame->dest_pid);
334 dest_reversed[1] =
LSB(parsed_frame->dest_pid);
335 dest_reversed[2] = 0;
336 dest_reversed[3] = 0;
337 dest_reversed[4] =
MSB(parsed_frame->payload[0]);
338 dest_reversed[5] =
LSB(parsed_frame->payload[1]);
340 src_reversed[0] =
MSB(parsed_frame->src_pid);
341 src_reversed[1] =
LSB(parsed_frame->src_pid);
344 src_reversed[4] =
MSB(parsed_frame->payload[2]);
345 src_reversed[5] =
LSB(parsed_frame->payload[3]);
349 dest_reversed[0] =
MSB(parsed_frame->dest_pid);
350 dest_reversed[1] =
LSB(parsed_frame->dest_pid);
351 dest_reversed[2] = 0;
352 dest_reversed[3] = 0;
353 dest_reversed[4] =
MSB(parsed_frame->dest_addr->addr16);
354 dest_reversed[5] =
LSB(parsed_frame->dest_addr->addr16);
356 src_reversed[0] =
MSB(parsed_frame->src_pid);
357 src_reversed[1] =
LSB(parsed_frame->src_pid);
360 src_reversed[4] =
MSB(parsed_frame->src_addr->addr16);
361 src_reversed[5] =
LSB(parsed_frame->src_addr->addr16);
363 packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, (
const linkaddr_t *)dest_reversed);
364 packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (
const linkaddr_t *)src_reversed);
368 PRINTF(
"sicslowmac: hand off frame to sniffer \n");
370 sicslowmac_snifferhook(pmac_driver);
399 _delay_ms(SICSLOW_CORRECTION_DELAY);
406 msduHandle = packetbuf_attr(PACKETBUF_ATTR_PACKET_ID);
442 memcpy(¶ms.
dest_addr, (uint8_t *)packetbuf_addr(PACKETBUF_ADDR_RECEIVER), LONG_ADDR_LEN);
469 LOG_FRAME(¶ms, &result);
472 uint8_t retry_count = 3;
476 PRINTF(
"sicslowmac: sending packet of length %d to radio, result:", result.
length);
484 PRINTF(
" Success\n");
495 PRINTF(
" Radio busy, retrying\n");
501 if (retry_count == 3) {
503 }
else if (retry_count == 2) {
505 }
else if (retry_count == 1) {
512 PRINTF(
"sicslowmac: Unable to send packet, dropped\n");
545 return &sicslowmac_driver;
571 eeprom_read_block ((
void *)&
macLongAddr, EEPROMMACADDRESS, 8);
580 parsed_frame_t * sicslowmac_get_frame(
void)
586 struct mac_driver * sicslowmac_get_driver(
void)
591 PROCESS(mac_process,
"802.15.4 MAC process");
608 printf(
"Radio init successful.\n");
610 printf(
"Radio init failed with return: %d\n", return_value);
614 uint8_t eeprom_channel;
615 uint8_t eeprom_check;
617 eeprom_channel = eeprom_read_byte((uint8_t *)9);
618 eeprom_check = eeprom_read_byte((uint8_t *)10);
620 if ((eeprom_channel < 11) || (eeprom_channel > 26) || ((uint8_t)eeprom_channel != (uint8_t)~eeprom_check)) {
635 pmac_driver->set_receive_function = setinput;
637 sicslowpan_init(pmac_driver);
652 void byte_reverse(uint8_t * bytes, uint8_t num)