diff --git a/sys/net/include/ieee802154_frame.h b/sys/net/include/ieee802154_frame.h index 5e2088d4fc7f..132cc052f2bf 100644 --- a/sys/net/include/ieee802154_frame.h +++ b/sys/net/include/ieee802154_frame.h @@ -62,6 +62,20 @@ typedef struct __attribute__((packed)) { uint8_t payload_len; } ieee802154_frame_t; +/** + * Structure to represent an IEEE 802.15.4 packet for the transceiver. + */ +typedef struct __attribute__(( packed )) { + /* @{ */ + uint8_t processing; /** < internal processing state */ + uint8_t length; /** < the length of the frame of the frame including fcs*/ + ieee802154_frame_t frame; /** < the ieee802154 frame */ + int8_t rssi; /** < the rssi value */ + uint8_t crc; /** < 1 if crc was successfull, 0 otherwise */ + uint8_t lqi; /** < the link quality indicator */ + /* @} */ +} ieee802154_packet_t; + uint8_t ieee802154_frame_init(ieee802154_frame_t *frame, uint8_t *buf); uint8_t ieee802154_frame_get_hdr_len(ieee802154_frame_t *frame); uint8_t ieee802154_frame_read(uint8_t *buf, ieee802154_frame_t *frame, uint8_t len); diff --git a/sys/transceiver/Makefile b/sys/transceiver/Makefile index 3c18dcb47842..2828e7bb28cd 100644 --- a/sys/transceiver/Makefile +++ b/sys/transceiver/Makefile @@ -1,3 +1,15 @@ MODULE =transceiver +ifneq (,$(filter cc2420,$(USEMODULE))) + INCLUDES += -I$(RIOTBASE)/sys/net/include +endif + +ifneq (,$(filter at86rf231,$(USEMODULE))) + INCLUDES += -I$(RIOTBASE)/sys/net/include +endif + +ifneq (,$(filter mc1322x,$(USEMODULE))) + INCLUDES += -I$(RIOTBASE)/sys/net/include +endif + include $(MAKEBASE)/Makefile.base diff --git a/sys/transceiver/transceiver.c b/sys/transceiver/transceiver.c index c975a7ec2d6e..34886005ed63 100644 --- a/sys/transceiver/transceiver.c +++ b/sys/transceiver/transceiver.c @@ -40,12 +40,14 @@ #ifdef MODULE_CC2420 #include "cc2420.h" +#include "ieee802154_frame.h" #endif #ifdef MODULE_MC1322X #include "mc1322x.h" #include "maca.h" #include "maca_packet.h" +#include "ieee802154_frame.h" #endif #ifdef MODULE_NATIVENET @@ -55,10 +57,12 @@ #ifdef MODULE_AT86RF231 #include "at86rf231.h" +#include "ieee802154_frame.h" #endif #define ENABLE_DEBUG (0) #if ENABLE_DEBUG +#define DEBUG_ENABLED #undef TRANSCEIVER_STACK_SIZE #define TRANSCEIVER_STACK_SIZE (KERNEL_CONF_STACKSIZE_PRINTF) #endif @@ -72,7 +76,11 @@ transceiver_type_t transceivers = TRANSCEIVER_NONE; registered_t reg[TRANSCEIVER_MAX_REGISTERED]; /* packet buffers */ +#if MODULE_AT86RF231 || MODULE_CC2420 || MODULE_MC1322X +ieee802154_packet_t transceiver_buffer[TRANSCEIVER_BUFFER_SIZE]; +#else radio_packet_t transceiver_buffer[TRANSCEIVER_BUFFER_SIZE]; +#endif uint8_t data_buffer[TRANSCEIVER_BUFFER_SIZE * PAYLOAD_SIZE]; /* message buffer */ @@ -86,10 +94,10 @@ static volatile uint8_t rx_buffer_pos = 0; static volatile uint8_t transceiver_buffer_pos = 0; #ifdef MODULE_CC110X - void *cc1100_payload; - int cc1100_payload_size; - packet_info_t *cc1100_packet_info; - uint8_t cc1100_pkt[CC1100_MAX_DATA_LENGTH]; +void *cc1100_payload; +int cc1100_payload_size; +packet_info_t *cc1100_packet_info; +uint8_t cc1100_pkt[CC1100_MAX_DATA_LENGTH]; #endif @@ -108,13 +116,13 @@ void cc1100_packet_monitor(void *payload, int payload_size, protocol_t protocol, void receive_cc1100_packet(radio_packet_t *trans_p); #endif #ifdef MODULE_CC2420 -static void receive_cc2420_packet(radio_packet_t *trans_p); +static void receive_cc2420_packet(ieee802154_packet_t *trans_p); #endif #ifdef MODULE_NATIVENET static void receive_nativenet_packet(radio_packet_t *trans_p); #endif #ifdef MODULE_AT86RF231 -void receive_at86rf231_packet(radio_packet_t *trans_p); +void receive_at86rf231_packet(ieee802154_packet_t *trans_p); #endif static int8_t send_packet(transceiver_type_t t, void *pkt); static int32_t get_channel(transceiver_type_t t); @@ -148,7 +156,7 @@ void transceiver_init(transceiver_type_t t) } /* Initializing transceiver buffer and data buffer */ - memset(transceiver_buffer, 0, TRANSCEIVER_BUFFER_SIZE * sizeof(radio_packet_t)); + memset(transceiver_buffer, 0, sizeof(transceiver_buffer)); memset(data_buffer, 0, TRANSCEIVER_BUFFER_SIZE * PAYLOAD_SIZE); #ifdef DBG_IGNORE memset(ignored_addr, 0, MAX_IGNORED_ADDR * sizeof(radio_address_t)); @@ -158,6 +166,7 @@ void transceiver_init(transceiver_type_t t) reg[i].transceivers = TRANSCEIVER_NONE; reg[i].pid = 0; } + /* check if a non defined bit is set */ if (t & ~(TRANSCEIVER_CC1100 | TRANSCEIVER_CC2420 | TRANSCEIVER_MC1322X | TRANSCEIVER_NATIVE | TRANSCEIVER_AT86RF231)) { puts("Invalid transceiver type"); @@ -175,11 +184,13 @@ int transceiver_start(void) if (transceiver_pid < 0) { puts("Error creating transceiver thread"); } + #ifdef MODULE_CC110X_NG else if (transceivers & TRANSCEIVER_CC1100) { DEBUG("transceiver: Transceiver started for CC1100\n"); cc110x_init(transceiver_pid); } + #endif #ifdef MODULE_CC110X else if (transceivers & TRANSCEIVER_CC1100) { @@ -187,28 +198,33 @@ int transceiver_start(void) cc1100_init(); cc1100_set_packet_monitor(cc1100_packet_monitor); } + #endif #ifdef MODULE_CC2420 - else if(transceivers & TRANSCEIVER_CC2420) { + else if (transceivers & TRANSCEIVER_CC2420) { DEBUG("transceiver: Transceiver started for CC2420\n"); cc2420_init(transceiver_pid); } + #endif #ifdef MODULE_AT86RF231 - else if(transceivers & TRANSCEIVER_AT86RF231) { + else if (transceivers & TRANSCEIVER_AT86RF231) { DEBUG("transceiver: Transceiver started for AT86RF231\n"); at86rf231_init(transceiver_pid); } + #endif #ifdef MODULE_MC1322X else if (transceivers & TRANSCEIVER_MC1322X) { maca_init(); } + #endif #ifdef MODULE_NATIVENET else if (transceivers & TRANSCEIVER_NATIVE) { nativenet_init(transceiver_pid); } + #endif return transceiver_pid; } @@ -220,8 +236,8 @@ uint8_t transceiver_register(transceiver_type_t t, int pid) /* find pid in registered threads or first unused space */ for (i = 0; ((i < TRANSCEIVER_MAX_REGISTERED) && - (reg[i].pid != pid) && - (reg[i].transceivers != TRANSCEIVER_NONE)); i++); + (reg[i].pid != pid) && + (reg[i].transceivers != TRANSCEIVER_NONE)); i++); if (i >= TRANSCEIVER_MAX_REGISTERED) { return ENOMEM; @@ -256,7 +272,7 @@ void run(void) cmd = (transceiver_command_t *) m.content.ptr; DEBUG("transceiver: Transceiver: Message received, type: %02X\n", m.type); - switch(m.type) { + switch (m.type) { case RCV_PKT_CC1020: case RCV_PKT_CC1100: case RCV_PKT_CC2420: @@ -265,6 +281,7 @@ void run(void) case RCV_PKT_AT86RF231: receive_packet(m.type, m.content.value); break; + case SND_PKT: response = send_packet(cmd->transceivers, cmd->data); m.content.value = response; @@ -302,17 +319,20 @@ void run(void) case SWITCH_RX: switch_to_rx(cmd->transceivers); break; + case GET_PAN: *((int32_t *) cmd->data) = get_pan(cmd->transceivers); msg_reply(&m, &m); break; + case SET_PAN: *((int32_t *) cmd->data) = set_pan(cmd->transceivers, cmd->data); msg_reply(&m, &m); break; #ifdef DBG_IGNORE + case DBG_IGN: - *((int16_t*) cmd->data) = ignore_add(cmd->transceivers, cmd->data); + *((int16_t *) cmd->data) = ignore_add(cmd->transceivers, cmd->data); msg_reply(&m, &m); break; #endif @@ -341,7 +361,7 @@ static void receive_packet(uint16_t type, uint8_t pos) DEBUG("Packet received\n"); - switch(type) { + switch (type) { case RCV_PKT_CC1020: t = TRANSCEIVER_CC1020; break; @@ -349,18 +369,23 @@ static void receive_packet(uint16_t type, uint8_t pos) case RCV_PKT_CC1100: t = TRANSCEIVER_CC1100; break; + case RCV_PKT_CC2420: t = TRANSCEIVER_CC2420; break; + case RCV_PKT_MC1322X: t = TRANSCEIVER_MC1322X; break; - case RCV_PKT_NATIVE: - t = TRANSCEIVER_NATIVE; - break; + + case RCV_PKT_NATIVE: + t = TRANSCEIVER_NATIVE; + break; + case RCV_PKT_AT86RF231: t = TRANSCEIVER_AT86RF231; break; + default: t = TRANSCEIVER_NONE; break; @@ -381,60 +406,59 @@ static void receive_packet(uint16_t type, uint8_t pos) } /* copy packet and handle it */ else { - radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); m.type = PKT_PENDING; /* pass a null pointer if a packet from a undefined transceiver is * received */ if (type == RCV_PKT_CC1100) { #ifdef MODULE_CC110X_NG + radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); receive_cc110x_packet(trans_p); #elif MODULE_CC110X + radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); receive_cc1100_packet(trans_p); -#else - trans_p = NULL; #endif } else if (type == RCV_PKT_MC1322X) { #ifdef MODULE_MC1322X + ieee802154_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); receive_mc1322x_packet(trans_p); -#else - trans_p = NULL; #endif } else if (type == RCV_PKT_CC2420) { #ifdef MODULE_CC2420 + ieee802154_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); receive_cc2420_packet(trans_p); -#else - trans_p = NULL; #endif } else if (type == RCV_PKT_AT86RF231) { #ifdef MODULE_AT86RF231 + ieee802154_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); receive_at86rf231_packet(trans_p); -#else - trans_p = NULL; #endif } else if (type == RCV_PKT_NATIVE) { #ifdef MODULE_NATIVENET + radio_packet_t *trans_p = &(transceiver_buffer[transceiver_buffer_pos]); receive_nativenet_packet(trans_p); -#else - trans_p = NULL; #endif } else { puts("Invalid transceiver type"); return; } + #ifdef DBG_IGNORE + for (uint8_t i = 0; (i < MAX_IGNORED_ADDR) && (ignored_addr[i]); i++) { DEBUG("check if source (%u) is ignored -> %u\n", trans_p->src, ignored_addr[i]); + if (trans_p->src == ignored_addr[i]) { DEBUG("ignored packet from %" PRIu16 "\n", trans_p->src); return; } } + #endif } @@ -444,7 +468,7 @@ static void receive_packet(uint16_t type, uint8_t pos) while (reg[i].transceivers != TRANSCEIVER_NONE) { if (reg[i].transceivers & t) { - m.content.ptr = (char *) & (transceiver_buffer[transceiver_buffer_pos]); + m.content.ptr = (char *) &(transceiver_buffer[transceiver_buffer_pos]); DEBUG("transceiver: Notify thread %i\n", reg[i].pid); if (msg_send(&m, reg[i].pid, false) && (m.type != ENOBUFFER)) { @@ -474,10 +498,10 @@ static void receive_cc110x_packet(radio_packet_t *trans_p) trans_p->rssi = cc110x_rx_buffer[rx_buffer_pos].rssi; trans_p->lqi = cc110x_rx_buffer[rx_buffer_pos].lqi; trans_p->length = p.length - CC1100_HEADER_LENGTH; - memcpy((void *)&(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), p.data, CC1100_MAX_DATA_LENGTH); + memcpy((void *) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), p.data, CC1100_MAX_DATA_LENGTH); eINT(); - trans_p->data = (uint8_t *)&(data_buffer[transceiver_buffer_pos * CC1100_MAX_DATA_LENGTH]); + trans_p->data = (uint8_t *) &(data_buffer[transceiver_buffer_pos * CC1100_MAX_DATA_LENGTH]); DEBUG("transceiver: Packet %p (%p) was from %hu to %hu, size: %u\n", trans_p, trans_p->data, trans_p->src, trans_p->dst, trans_p->length); } #endif @@ -491,51 +515,89 @@ void receive_cc1100_packet(radio_packet_t *trans_p) trans_p->rssi = cc1100_packet_info->rssi; trans_p->lqi = cc1100_packet_info->lqi; trans_p->length = cc1100_payload_size; - memcpy((void *)&(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), cc1100_payload, CC1100_MAX_DATA_LENGTH); + memcpy((void *) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), cc1100_payload, CC1100_MAX_DATA_LENGTH); eINT(); - trans_p->data = (uint8_t *)&(data_buffer[transceiver_buffer_pos * CC1100_MAX_DATA_LENGTH]); + trans_p->data = (uint8_t *) &(data_buffer[transceiver_buffer_pos * CC1100_MAX_DATA_LENGTH]); } #endif #ifdef MODULE_CC2420 -void receive_cc2420_packet(radio_packet_t *trans_p) { +void receive_cc2420_packet(ieee802154_packet_t *trans_p) +{ DEBUG("transceiver: Handling CC2420 packet\n"); dINT(); - cc2420_packet_t p = cc2420_rx_buffer[rx_buffer_pos]; - trans_p->src = (uint16_t)((p.frame.src_addr[1] << 8) | p.frame.src_addr[0]); - trans_p->dst = (uint16_t)((p.frame.dest_addr[1] << 8)| p.frame.dest_addr[0]); - trans_p->rssi = p.rssi; - trans_p->lqi = p.lqi; - trans_p->length = p.frame.payload_len; - memcpy((void*) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), p.frame.payload, CC2420_MAX_DATA_LENGTH); + cc2420_packet_t *p = &cc2420_rx_buffer[rx_buffer_pos]; + trans_p->length = p->length; + memcpy(&trans_p->frame, &p->frame, p->length); + trans_p->rssi = p->rssi; + trans_p->crc = p->crc; + trans_p->lqi = p->lqi; + memcpy(&data_buffer[transceiver_buffer_pos * CC2420_MAX_DATA_LENGTH], + p->frame.payload, p->frame.payload_len); + trans_p->frame.payload = (uint8_t *) & (data_buffer[transceiver_buffer_pos * CC2420_MAX_DATA_LENGTH]); eINT(); - DEBUG("transceiver: Packet %p was from %u to %u, size: %u\n", trans_p, trans_p->src, trans_p->dst, trans_p->length); - trans_p->data = (uint8_t*) &(data_buffer[transceiver_buffer_pos * CC2420_MAX_DATA_LENGTH]); +#ifdef DEBUG_ENABLED + + if (trans_p->frame.fcf.dest_addr_m == IEEE_802154_SHORT_ADDR_M) { + if (trans_p->frame.fcf.src_addr_m == IEEE_802154_SHORT_ADDR_M) { + DEBUG("Packet %p was from %" PRIu16 " to %" PRIu16 ", size: %u\n", trans_p, *((uint16_t *) &trans_p->frame.src_addr[0]), *((uint16_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + } + else if (trans_p->frame.fcf.src_addr_m == IEEE_802154_LONG_ADDR_M) { + DEBUG("Packet %p was from %016" PRIx64 " to %" PRIu16 ", size: %u\n", trans_p, *((uint64_t *) &trans_p->frame.src_addr[0]), *((uint16_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + + } + else { + DEBUG("Illegal source address mode: %d\n", trans_p->frame.fcf.src_addr_m); + return; + } + } + else if (trans_p->frame.fcf.dest_addr_m == IEEE_802154_LONG_ADDR_M) { + if (trans_p->frame.fcf.src_addr_m == IEEE_802154_SHORT_ADDR_M) { + DEBUG("Packet %p was from %" PRIu16 " to %016" PRIx64 ", size: %u\n", trans_p, *((uint16_t *) &trans_p->frame.src_addr[0]), *((uint64_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + } + else if (trans_p->frame.fcf.src_addr_m == IEEE_802154_LONG_ADDR_M) { + DEBUG("Packet %p was from %016" PRIx64 " to %016" PRIx64 ", size: %u\n", trans_p, *((uint64_t *) &trans_p->frame.src_addr[0]), *((uint16_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + + } + else { + DEBUG("Illegal source address mode: %d\n", trans_p->frame.fcf.src_addr_m); + return; + } + } + else { + DEBUG("Illegal destination address mode: %d\n", trans_p->frame.fcf.src_addr_m); + return; + } +#endif + trans_p->frame.payload = (uint8_t *) &(data_buffer[transceiver_buffer_pos * CC2420_MAX_DATA_LENGTH]); + trans_p->frame.payload_len = p->frame.payload_len; DEBUG("transceiver: Content: %s\n", trans_p->data); } #endif #ifdef MODULE_MC1322X -void receive_mc1322x_packet(radio_packet_t *trans_p) { - maca_packet_t* maca_pkt; +void receive_mc1322x_packet(radio_packet_t *trans_p) +{ + maca_packet_t *maca_pkt; dINT(); - maca_pkt = maca_get_rx_packet (); + maca_pkt = maca_get_rx_packet(); trans_p->lqi = maca_pkt->lqi; trans_p->length = maca_pkt->length; - memcpy((void*) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), maca_pkt->data, MACA_MAX_PAYLOAD_SIZE); - maca_free_packet( maca_pkt ); + memcpy((void *) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), maca_pkt->data, MACA_MAX_PAYLOAD_SIZE); + maca_free_packet(maca_pkt); eINT(); - trans_p->data = (uint8_t*) &(data_buffer[transceiver_buffer_pos * MACA_MAX_PAYLOAD_SIZE]); + trans_p->data = (uint8_t *) &(data_buffer[transceiver_buffer_pos * MACA_MAX_PAYLOAD_SIZE]); } #endif #ifdef MODULE_NATIVENET -void receive_nativenet_packet(radio_packet_t *trans_p) { +void receive_nativenet_packet(radio_packet_t *trans_p) +{ unsigned state; radio_packet_t *p = &_nativenet_rx_buffer[rx_buffer_pos].packet; @@ -546,7 +608,7 @@ void receive_nativenet_packet(radio_packet_t *trans_p) { memcpy(trans_p, p, sizeof(radio_packet_t)); memcpy(&(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), p->data, p->length); - trans_p->data = (uint8_t*) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]); + trans_p->data = (uint8_t *) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]); DEBUG("Packet %p was from %" PRIu16 " to %" PRIu16 ", size: %" PRIu8 "\n", trans_p, trans_p->src, trans_p->dst, trans_p->length); @@ -556,21 +618,44 @@ void receive_nativenet_packet(radio_packet_t *trans_p) { #endif #ifdef MODULE_AT86RF231 -void receive_at86rf231_packet(radio_packet_t *trans_p) { +void receive_at86rf231_packet(ieee802154_packet_t *trans_p) +{ DEBUG("Handling AT86RF231 packet\n"); dINT(); - at86rf231_packet_t p = at86rf231_rx_buffer[rx_buffer_pos]; - trans_p->src = (uint16_t)((p.frame.src_addr[1] << 8) | p.frame.src_addr[0]); - trans_p->dst = (uint16_t)((p.frame.dest_addr[1] << 8)| p.frame.dest_addr[0]); - trans_p->rssi = p.rssi; - trans_p->lqi = p.lqi; - trans_p->length = p.frame.payload_len; - memcpy((void*) &(data_buffer[transceiver_buffer_pos * PAYLOAD_SIZE]), p.frame.payload, AT86RF231_MAX_DATA_LENGTH); + at86rf231_packet_t *p = &at86rf231_rx_buffer[rx_buffer_pos]; + trans_p->length = p->length; + trans_p->rssi = p->rssi; + trans_p->crc = p->crc; + trans_p->lqi = p->lqi; + memcpy(&trans_p->frame, &p->frame, p->length); + memcpy(&data_buffer[transceiver_buffer_pos * AT86RF231_MAX_DATA_LENGTH], p->frame.payload, + p->frame.payload_len); + trans_p->frame.payload = (uint8_t *) & (data_buffer[transceiver_buffer_pos * AT86RF231_MAX_DATA_LENGTH]); eINT(); - DEBUG("Packet %p was from %u to %u, size: %u\n", trans_p, trans_p->src, trans_p->dst, trans_p->length); - trans_p->data = (uint8_t*) &(data_buffer[transceiver_buffer_pos * AT86RF231_MAX_DATA_LENGTH]); - DEBUG("Content: %s\n", trans_p->data); +#ifdef DEBUG_ENABLED + + if (trans_p->frame.fcf.dest_addr_m == IEEE_802154_SHORT_ADDR_M) { + if (trans_p->frame.fcf.src_addr_m == IEEE_802154_SHORT_ADDR_M) { + DEBUG("Packet %p was from %" PRIu16 " to %" PRIu16 ", size: %u\n", trans_p, *((uint16_t *) &trans_p->frame.src_addr[0]), *((uint16_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + } + else { + DEBUG("Packet %p was from %016" PRIx64 " to %" PRIu16 ", size: %u\n", trans_p, *((uint64_t *) &trans_p->frame.src_addr[0]), *((uint16_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + + } + } + else { + if (trans_p->frame.fcf.src_addr_m == IEEE_802154_SHORT_ADDR_M) { + DEBUG("Packet %p was from %" PRIu16 " to %016" PRIx64 ", size: %u\n", trans_p, *((uint16_t *) &trans_p->frame.src_addr[0]), *((uint64_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + } + else { + DEBUG("Packet %p was from %016" PRIx64 " to %016" PRIx64 ", size: %u\n", trans_p, *((uint64_t *) &trans_p->frame.src_addr[0]), *((uint16_t *) &trans_p->frame.dest_addr), trans_p->frame.payload_len); + + } + } + +#endif + DEBUG("Content: %s\n", trans_p->frame.payload); } #endif /*------------------------------------------------------------------------------------*/ @@ -578,20 +663,35 @@ void receive_at86rf231_packet(radio_packet_t *trans_p) { * @brief Sends a radio packet to the receiver * * @param t The transceiver device - * @param pkt Generic pointer to the packet + * @param pkt Generic pointer to the packet (use ieee802154_packet_t for + * AT86RF231, CC2420, and MC1322X) * * @return A negative value if operation failed, 0 or the number of bytes sent otherwise. */ static int8_t send_packet(transceiver_type_t t, void *pkt) { int8_t res = -1; - radio_packet_t p = *((radio_packet_t *)pkt); +#if MODULE_AT86RF231 || MODULE_CC2420 || MODULE_MC1322X + ieee802154_packet_t *p = (ieee802154_packet_t *)pkt; + DEBUG("transceiver: Send packet to "); +#ifdef DEBUG_ENABLED + + for (size_t i = 0; i < 8; i++) { + printf("%02x ", p->frame.dest_addr[i]); + } + + printf("\n"); +#endif +#else + radio_packet_t *p = (radio_packet_t *)pkt; + DEBUG("transceiver: Send packet to %" PRIu16 "\n", p->dst); +#endif #ifdef MODULE_CC110X_NG cc110x_packet_t cc110x_pkt; #endif #ifdef MODULE_MC1322X - maca_packet_t* maca_pkt = maca_get_free_packet(); + maca_packet_t *maca_pkt = maca_get_free_packet(); #endif #ifdef MODULE_CC2420 @@ -602,69 +702,55 @@ static int8_t send_packet(transceiver_type_t t, void *pkt) at86rf231_packet_t at86rf231_pkt; #endif - DEBUG("transceiver: Send packet to %" PRIu16 "\n", p.dst); switch (t) { case TRANSCEIVER_CC1100: #ifdef MODULE_CC110X_NG - cc110x_pkt.length = p.length + CC1100_HEADER_LENGTH; - cc110x_pkt.address = p.dst; + cc110x_pkt.length = p->length + CC1100_HEADER_LENGTH; + cc110x_pkt.address = p->dst; cc110x_pkt.flags = 0; - memcpy(cc110x_pkt.data, p.data, p.length); + memcpy(cc110x_pkt.data, p->data, p->length); res = cc110x_send(&cc110x_pkt); #elif MODULE_CC110X - memcpy(cc1100_pkt, p.data, p.length); + memcpy(cc1100_pkt, p->data, p->length); - res = cc1100_send_csmaca(p.dst, 4, 0, (char *) cc1100_pkt, p.length); - DEBUG("transceiver: snd_ret (%u) = %i\n", p.length, snd_ret); + res = cc1100_send_csmaca(p->dst, 4, 0, (char *) cc1100_pkt, p->length); + DEBUG("transceiver: snd_ret (%u) = %i\n", p->length, snd_ret); #else puts("Unknown transceiver"); #endif break; #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: - cc2420_pkt.frame.payload_len = p.length; - cc2420_pkt.frame.dest_addr[1] = (uint8_t)(p.dst >> 8); - cc2420_pkt.frame.dest_addr[0] = (uint8_t)(p.dst & 0xFF); - cc2420_pkt.frame.dest_pan_id = cc2420_get_pan(); - cc2420_pkt.frame.fcf.dest_addr_m = 2; - cc2420_pkt.frame.fcf.src_addr_m = 2; - cc2420_pkt.frame.fcf.ack_req = 0; - cc2420_pkt.frame.fcf.sec_enb = 0; - cc2420_pkt.frame.fcf.frame_type = 1; - cc2420_pkt.frame.fcf.frame_pend = 0; - cc2420_pkt.frame.payload = p.data; + memcpy(&cc2420_pkt.frame, &p->frame, sizeof(ieee802154_frame_t)); + cc2420_pkt.length = p->frame.payload_len + IEEE_802154_FCS_LEN; res = cc2420_send(&cc2420_pkt); break; #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: - maca_pkt->length = p.length; - memcpy(maca_pkt->data, p.data, p.length); - maca_set_tx_packet( maca_pkt ); + maca_pkt->length = p->length; + memcpy(maca_pkt->data, p->data, p->length); + maca_set_tx_packet(maca_pkt); res = 1; break; #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: - res = nativenet_send(&p); + res = nativenet_send(p); break; #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: - at86rf231_pkt.frame.payload_len = p.length; - at86rf231_pkt.frame.dest_addr[1] = (uint8_t)(p.dst >> 8); - at86rf231_pkt.frame.dest_addr[0] = (uint8_t)(p.dst & 0xFF); - at86rf231_pkt.frame.dest_pan_id = at86rf231_get_pan(); - at86rf231_pkt.frame.fcf.dest_addr_m = 2; - at86rf231_pkt.frame.fcf.src_addr_m = 2; - at86rf231_pkt.frame.fcf.ack_req = 0; - at86rf231_pkt.frame.fcf.sec_enb = 0; - at86rf231_pkt.frame.fcf.frame_type = 1; - at86rf231_pkt.frame.fcf.frame_pend = 0; - at86rf231_pkt.frame.payload = p.data; + memcpy(&at86rf231_pkt.frame, &p->frame, sizeof(ieee802154_frame_t)); + at86rf231_pkt.length = p->frame.payload_len + IEEE_802154_FCS_LEN; res = at86rf231_send(&at86rf231_pkt); break; #endif + default: puts("Unknown transceiver"); break; @@ -686,7 +772,7 @@ static int32_t set_channel(transceiver_type_t t, void *channel) { uint8_t c = *((uint8_t *)channel); - switch(t) { + switch (t) { case TRANSCEIVER_CC1100: #ifdef MODULE_CC110X_NG return cc110x_set_channel(c); @@ -696,22 +782,27 @@ static int32_t set_channel(transceiver_type_t t, void *channel) return -1; #endif #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: return cc2420_set_channel(c); #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: maca_set_channel(c); - return c; ///< TODO: should be changed! implement get channel + return c; ///< TODO: should be changed!implement get channel #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: return nativenet_set_channel(c); #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: return at86rf231_set_channel(c); #endif + default: return -1; } @@ -726,7 +817,7 @@ static int32_t set_channel(transceiver_type_t t, void *channel) */ static int32_t get_channel(transceiver_type_t t) { - switch(t) { + switch (t) { case TRANSCEIVER_CC1100: #ifdef MODULE_CC110X_NG return cc110x_get_channel(); @@ -736,22 +827,27 @@ static int32_t get_channel(transceiver_type_t t) return -1; #endif #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: return cc2420_get_channel(); #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: ///< TODO:implement return maca_get_channel(); return -1; #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: return nativenet_get_channel(); #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: return at86rf231_get_channel(); #endif + default: return -1; } @@ -766,25 +862,32 @@ static int32_t get_channel(transceiver_type_t t) * * @return The pan AFTER calling the set command, -1 on error */ -static int32_t set_pan(transceiver_type_t t, void *pan) { - uint16_t c = *((uint16_t*) pan); +static int32_t set_pan(transceiver_type_t t, void *pan) +{ + uint16_t c = *((uint16_t *) pan); + switch (t) { #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: return cc2420_set_pan(c); #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: return nativenet_set_pan(c); #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: return at86rf231_set_pan(c); #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: return maca_set_pan(c); #endif + default: /* get rid of compiler warning about unused variable */ (void) c; @@ -799,24 +902,30 @@ static int32_t set_pan(transceiver_type_t t, void *pan) { * * @return The current pan of the transceiver, -1 on error */ -static int32_t get_pan(transceiver_type_t t) { +static int32_t get_pan(transceiver_type_t t) +{ switch (t) { #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: return cc2420_get_pan(); #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: return nativenet_get_pan(); #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: return at86rf231_get_pan(); #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: return maca_get_pan(); #endif + default: return -1; } @@ -833,7 +942,7 @@ static int32_t get_pan(transceiver_type_t t) { */ static radio_address_t get_address(transceiver_type_t t) { - switch(t) { + switch (t) { case TRANSCEIVER_CC1100: #ifdef MODULE_CC110X_NG return cc110x_get_address(); @@ -843,21 +952,26 @@ static radio_address_t get_address(transceiver_type_t t) return 0; /* XXX see TODO above */ #endif #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: return cc2420_get_address(); #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: return maca_get_address(); #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: return nativenet_get_address(); #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: return at86rf231_get_address(); #endif + default: return 0; /* XXX see TODO above */ } @@ -877,7 +991,7 @@ static radio_address_t set_address(transceiver_type_t t, void *address) { radio_address_t addr = *((radio_address_t *)address); - switch(t) { + switch (t) { case TRANSCEIVER_CC1100: #ifdef MODULE_CC110X_NG return cc110x_set_address(addr); @@ -887,21 +1001,26 @@ static radio_address_t set_address(transceiver_type_t t, void *address) return 0; /* XXX see TODO above */ #endif #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: return cc2420_set_address(addr); #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: return maca_set_address(addr); #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: return nativenet_set_address(addr); #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: return at86rf231_set_address(addr); #endif + default: return 0; /* XXX see TODO above */ } @@ -917,26 +1036,31 @@ static void set_monitor(transceiver_type_t t, void *mode) { (void) mode; - switch(t) { + switch (t) { #ifdef MODULE_CC110X_NG + case TRANSCEIVER_CC1100: cc110x_set_monitor(*((uint8_t *)mode)); break; #endif #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: - cc2420_set_monitor(*((uint8_t*) mode)); + cc2420_set_monitor(*((uint8_t *) mode)); break; #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: - nativenet_set_monitor(*((uint8_t*) mode)); + nativenet_set_monitor(*((uint8_t *) mode)); break; #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: - at86rf231_set_monitor(*((uint8_t*) mode)); + at86rf231_set_monitor(*((uint8_t *) mode)); #endif + default: break; } @@ -957,22 +1081,26 @@ void cc1100_packet_monitor(void *payload, int payload_size, protocol_t protocol, /*------------------------------------------------------------------------------------*/ static void powerdown(transceiver_type_t t) { - switch(t) { + switch (t) { #ifdef MODULE_CC110X_NG + case TRANSCEIVER_CC1100: cc110x_switch_to_pwd(); break; #endif #ifdef MODULE_MC1322X + case TRANSCEIVER_MC1322X: maca_off(); break; #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: nativenet_powerdown(); break; #endif + default: break; } @@ -981,27 +1109,32 @@ static void powerdown(transceiver_type_t t) /*------------------------------------------------------------------------------------*/ static void switch_to_rx(transceiver_type_t t) { - switch(t) { + switch (t) { #ifdef MODULE_CC110X_NG + case TRANSCEIVER_CC1100: cc110x_switch_to_rx(); break; #endif #ifdef MODULE_CC2420 + case TRANSCEIVER_CC2420: cc2420_switch_to_rx(); break; #endif #ifdef MODULE_NATIVENET + case TRANSCEIVER_NATIVE: nativenet_switch_to_rx(); break; #endif #ifdef MODULE_AT86RF231 + case TRANSCEIVER_AT86RF231: at86rf231_switch_to_rx(); #endif + default: break; } @@ -1020,6 +1153,7 @@ static int16_t ignore_add(transceiver_type_t transceiver, void *address) return i; } } + return -1; } #endif