mirror of
https://github.com/oliverschmidt/contiki.git
synced 2025-01-03 11:30:53 +00:00
Added MAC header to handle padding
This commit is contained in:
parent
0d5b01d304
commit
d761b6e89a
@ -28,7 +28,7 @@
|
|||||||
*
|
*
|
||||||
* This file is part of the Contiki operating system.
|
* This file is part of the Contiki operating system.
|
||||||
*
|
*
|
||||||
* $Id: contikimac.c,v 1.33 2010/04/20 11:41:16 nifi Exp $
|
* $Id: contikimac.c,v 1.34 2010/04/26 17:46:21 nifi Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,6 +69,9 @@
|
|||||||
#ifndef WITH_STREAMING
|
#ifndef WITH_STREAMING
|
||||||
#define WITH_STREAMING 1
|
#define WITH_STREAMING 1
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef WITH_CONTIKIMAC_HEADER
|
||||||
|
#define WITH_CONTIKIMAC_HEADER 1
|
||||||
|
#endif
|
||||||
|
|
||||||
struct announcement_data {
|
struct announcement_data {
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
@ -79,6 +82,15 @@ struct announcement_data {
|
|||||||
message - may need to be increased in the future. */
|
message - may need to be increased in the future. */
|
||||||
#define ANNOUNCEMENT_MAX 10
|
#define ANNOUNCEMENT_MAX 10
|
||||||
|
|
||||||
|
#if WITH_CONTIKIMAC_HEADER
|
||||||
|
#define CONTIKIMAC_ID 0x00
|
||||||
|
|
||||||
|
struct hdr {
|
||||||
|
uint8_t id;
|
||||||
|
uint8_t len;
|
||||||
|
};
|
||||||
|
#endif /* WITH_CONTIKIMAC_HEADER */
|
||||||
|
|
||||||
/* The structure of the announcement messages. */
|
/* The structure of the announcement messages. */
|
||||||
struct announcement_msg {
|
struct announcement_msg {
|
||||||
uint8_t announcement_magic[2];
|
uint8_t announcement_magic[2];
|
||||||
@ -550,6 +562,9 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||||||
int transmit_len;
|
int transmit_len;
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
#if WITH_CONTIKIMAC_HEADER
|
||||||
|
struct hdr *chdr;
|
||||||
|
#endif /* WITH_CONTIKIMAC_HEADER */
|
||||||
|
|
||||||
if(packetbuf_totlen() == 0) {
|
if(packetbuf_totlen() == 0) {
|
||||||
PRINTF("contikimac: send_packet data len 0\n");
|
PRINTF("contikimac: send_packet data len 0\n");
|
||||||
@ -606,6 +621,28 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||||||
if(is_streaming) {
|
if(is_streaming) {
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_PENDING, 1);
|
packetbuf_set_attr(PACKETBUF_ATTR_PENDING, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WITH_CONTIKIMAC_HEADER
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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 /* WITH_CONTIKIMAC_HEADER */
|
||||||
/* Create the MAC header for the data packet. */
|
/* Create the MAC header for the data packet. */
|
||||||
hdrlen = NETSTACK_FRAMER.create();
|
hdrlen = NETSTACK_FRAMER.create();
|
||||||
if(hdrlen == 0) {
|
if(hdrlen == 0) {
|
||||||
@ -613,19 +650,27 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr)
|
|||||||
PRINTF("contikimac: send failed, too large header\n");
|
PRINTF("contikimac: send failed, too large header\n");
|
||||||
return MAC_TX_ERR_FATAL;
|
return MAC_TX_ERR_FATAL;
|
||||||
}
|
}
|
||||||
|
#endif /* WITH_CONTIKIMAC_HEADER */
|
||||||
|
|
||||||
/* Make sure that the packet is longer or equal to the shorest
|
/* Make sure that the packet is longer or equal to the shortest
|
||||||
packet length. */
|
packet length. */
|
||||||
if(packetbuf_totlen() < SHORTEST_PACKET_SIZE) {
|
transmit_len = packetbuf_totlen();
|
||||||
|
if(transmit_len < SHORTEST_PACKET_SIZE) {
|
||||||
|
#if 0
|
||||||
|
/* Pad with zeroes */
|
||||||
|
uint8_t *ptr;
|
||||||
|
ptr = packetbuf_dataptr();
|
||||||
|
memset(ptr + packetbuf_datalen(), 0, SHORTEST_PACKET_SIZE - packetbuf_totlen());
|
||||||
|
#endif
|
||||||
|
|
||||||
PRINTF("contikimac: shorter than shortest (%d)\n", packetbuf_totlen());
|
PRINTF("contikimac: shorter than shortest (%d)\n", packetbuf_totlen());
|
||||||
packetbuf_set_datalen(SHORTEST_PACKET_SIZE);
|
transmit_len = SHORTEST_PACKET_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
packetbuf_compact();
|
packetbuf_compact();
|
||||||
|
|
||||||
NETSTACK_RADIO.prepare(packetbuf_hdrptr(), packetbuf_totlen());
|
NETSTACK_RADIO.prepare(packetbuf_hdrptr(), transmit_len);
|
||||||
transmit_len = packetbuf_totlen();
|
|
||||||
|
|
||||||
/* Remove the MAC-layer header since it will be recreated next time around. */
|
/* Remove the MAC-layer header since it will be recreated next time around. */
|
||||||
packetbuf_hdr_remove(hdrlen);
|
packetbuf_hdr_remove(hdrlen);
|
||||||
@ -881,6 +926,18 @@ input_packet(void)
|
|||||||
|
|
||||||
if(packetbuf_totlen() > 0 && NETSTACK_FRAMER.parse()) {
|
if(packetbuf_totlen() > 0 && NETSTACK_FRAMER.parse()) {
|
||||||
|
|
||||||
|
#if WITH_CONTIKIMAC_HEADER
|
||||||
|
struct hdr *chdr;
|
||||||
|
int len;
|
||||||
|
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 &&
|
||||||
(rimeaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
|
(rimeaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_RECEIVER),
|
||||||
@ -963,6 +1020,10 @@ static void
|
|||||||
send_announcement(void *ptr)
|
send_announcement(void *ptr)
|
||||||
{
|
{
|
||||||
int announcement_len;
|
int announcement_len;
|
||||||
|
int transmit_len;
|
||||||
|
#if WITH_CONTIKIMAC_HEADER
|
||||||
|
struct hdr *chdr
|
||||||
|
#endif /* WITH_CONTIKIMAC_HEADER */
|
||||||
|
|
||||||
/* Set up the probe header. */
|
/* Set up the probe header. */
|
||||||
packetbuf_clear();
|
packetbuf_clear();
|
||||||
@ -975,6 +1036,18 @@ send_announcement(void *ptr)
|
|||||||
packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &rimeaddr_null);
|
packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &rimeaddr_null);
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_RADIO_TXPOWER,
|
packetbuf_set_attr(PACKETBUF_ATTR_RADIO_TXPOWER,
|
||||||
announcement_radio_txpower);
|
announcement_radio_txpower);
|
||||||
|
#if WITH_CONTIKIMAC_HEADER
|
||||||
|
transmit_len = packetbuf_totlen();
|
||||||
|
if(packetbuf_hdralloc(sizeof(struct hdr)) == 0) {
|
||||||
|
/* Failed to allocate space for contikimac header */
|
||||||
|
PRINTF("contikimac: send announcement failed, too large header\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chdr = packetbuf_hdrptr();
|
||||||
|
chdr->id = CONTIKIMAC_ID;
|
||||||
|
chdr->len = transmit_len;
|
||||||
|
#endif /* WITH_CONTIKIMAC_HEADER */
|
||||||
|
|
||||||
if(NETSTACK_FRAMER.create()) {
|
if(NETSTACK_FRAMER.create()) {
|
||||||
rtimer_clock_t t;
|
rtimer_clock_t t;
|
||||||
int i, collisions;
|
int i, collisions;
|
||||||
@ -982,9 +1055,17 @@ send_announcement(void *ptr)
|
|||||||
|
|
||||||
/* Make sure that the packet is longer or equal to the shorest
|
/* Make sure that the packet is longer or equal to the shorest
|
||||||
packet length. */
|
packet length. */
|
||||||
if(packetbuf_totlen() < SHORTEST_PACKET_SIZE) {
|
transmit_len = packetbuf_totlen();
|
||||||
|
if(transmit_len < SHORTEST_PACKET_SIZE) {
|
||||||
|
#if 0
|
||||||
|
/* Pad with zeroes */
|
||||||
|
uint8_t *ptr;
|
||||||
|
ptr = packetbuf_dataptr();
|
||||||
|
memset(ptr + packetbuf_datalen(), 0, SHORTEST_PACKET_SIZE - packetbuf_totlen());
|
||||||
|
#endif
|
||||||
|
|
||||||
PRINTF("contikimac: shorter than shortest (%d)\n", packetbuf_totlen());
|
PRINTF("contikimac: shorter than shortest (%d)\n", packetbuf_totlen());
|
||||||
packetbuf_set_datalen(SHORTEST_PACKET_SIZE);
|
transmit_len = packetbuf_totlen() + (SHORTEST_PACKET_SIZE - packetbuf_totlen());
|
||||||
}
|
}
|
||||||
|
|
||||||
collisions = 0;
|
collisions = 0;
|
||||||
@ -1012,16 +1093,16 @@ send_announcement(void *ptr)
|
|||||||
|
|
||||||
if(collisions == 0) {
|
if(collisions == 0) {
|
||||||
|
|
||||||
NETSTACK_RADIO.prepare(packetbuf_hdrptr(), packetbuf_totlen());
|
NETSTACK_RADIO.prepare(packetbuf_hdrptr(), transmit_len);
|
||||||
|
|
||||||
NETSTACK_RADIO.transmit(packetbuf_totlen());
|
NETSTACK_RADIO.transmit(transmit_len);
|
||||||
t = RTIMER_NOW();
|
t = RTIMER_NOW();
|
||||||
#if NURTIMER
|
#if NURTIMER
|
||||||
while(RTIMER_CLOCK_LT(t, RTIMER_NOW(), t + INTER_PACKET_INTERVAL));
|
while(RTIMER_CLOCK_LT(t, RTIMER_NOW(), t + INTER_PACKET_INTERVAL));
|
||||||
#else
|
#else
|
||||||
while(RTIMER_CLOCK_LT(RTIMER_NOW(), t + INTER_PACKET_INTERVAL)) { }
|
while(RTIMER_CLOCK_LT(RTIMER_NOW(), t + INTER_PACKET_INTERVAL)) { }
|
||||||
#endif
|
#endif
|
||||||
NETSTACK_RADIO.transmit(packetbuf_totlen());
|
NETSTACK_RADIO.transmit(transmit_len);
|
||||||
}
|
}
|
||||||
we_are_sending = 0;
|
we_are_sending = 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user