Merge pull request #743 from kkrentz/csma-improvements-pr
General improvements to CSMA
This commit is contained in:
commit
d4022a5628
|
@ -50,6 +50,7 @@
|
||||||
#include "net/netstack.h"
|
#include "net/netstack.h"
|
||||||
#include "lib/list.h"
|
#include "lib/list.h"
|
||||||
#include "lib/memb.h"
|
#include "lib/memb.h"
|
||||||
|
#include "lib/assert.h"
|
||||||
|
|
||||||
/* Log configuration */
|
/* Log configuration */
|
||||||
#include "sys/log.h"
|
#include "sys/log.h"
|
||||||
|
@ -131,7 +132,10 @@ MEMB(packet_memb, struct packet_queue, MAX_QUEUED_PACKETS);
|
||||||
MEMB(metadata_memb, struct qbuf_metadata, MAX_QUEUED_PACKETS);
|
MEMB(metadata_memb, struct qbuf_metadata, MAX_QUEUED_PACKETS);
|
||||||
LIST(neighbor_list);
|
LIST(neighbor_list);
|
||||||
|
|
||||||
static void packet_sent(void *ptr, int status, int num_transmissions);
|
static void packet_sent(struct neighbor_queue *n,
|
||||||
|
struct packet_queue *q,
|
||||||
|
int status,
|
||||||
|
int num_transmissions);
|
||||||
static void transmit_from_queue(void *ptr);
|
static void transmit_from_queue(void *ptr);
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static struct neighbor_queue *
|
static struct neighbor_queue *
|
||||||
|
@ -162,7 +166,7 @@ backoff_period(void)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static int
|
static int
|
||||||
send_one_packet(void *ptr)
|
send_one_packet(struct neighbor_queue *n, struct packet_queue *q)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int last_sent_ok = 0;
|
int last_sent_ok = 0;
|
||||||
|
@ -245,7 +249,7 @@ send_one_packet(void *ptr)
|
||||||
last_sent_ok = 1;
|
last_sent_ok = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
packet_sent(ptr, ret, 1);
|
packet_sent(n, q, ret, 1);
|
||||||
return last_sent_ok;
|
return last_sent_ok;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
@ -263,7 +267,7 @@ transmit_from_queue(void *ptr)
|
||||||
n->transmissions, list_length(n->packet_queue));
|
n->transmissions, list_length(n->packet_queue));
|
||||||
/* Send first packet in the neighbor queue */
|
/* Send first packet in the neighbor queue */
|
||||||
queuebuf_to_packetbuf(q->buf);
|
queuebuf_to_packetbuf(q->buf);
|
||||||
send_one_packet(n);
|
send_one_packet(n, q);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -396,30 +400,15 @@ tx_ok(struct packet_queue *q, struct neighbor_queue *n, int num_transmissions)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void
|
static void
|
||||||
packet_sent(void *ptr, int status, int num_transmissions)
|
packet_sent(struct neighbor_queue *n,
|
||||||
|
struct packet_queue *q,
|
||||||
|
int status,
|
||||||
|
int num_transmissions)
|
||||||
{
|
{
|
||||||
struct neighbor_queue *n;
|
assert(n != NULL);
|
||||||
struct packet_queue *q;
|
assert(q != NULL);
|
||||||
|
|
||||||
n = ptr;
|
if(q->ptr == NULL) {
|
||||||
if(n == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find out what packet this callback refers to */
|
|
||||||
for(q = list_head(n->packet_queue);
|
|
||||||
q != NULL; q = list_item_next(q)) {
|
|
||||||
if(queuebuf_attr(q->buf, PACKETBUF_ATTR_MAC_SEQNO) ==
|
|
||||||
packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(q == NULL) {
|
|
||||||
LOG_WARN("packet sent: seqno %u not found\n",
|
|
||||||
packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO));
|
|
||||||
return;
|
|
||||||
} else if(q->ptr == NULL) {
|
|
||||||
LOG_WARN("packet sent: no metadata\n");
|
LOG_WARN("packet sent: no metadata\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,11 +75,7 @@ static void
|
||||||
input_packet(void)
|
input_packet(void)
|
||||||
{
|
{
|
||||||
#if CSMA_SEND_SOFT_ACK
|
#if CSMA_SEND_SOFT_ACK
|
||||||
int original_datalen;
|
uint8_t ackdata[CSMA_ACK_LEN];
|
||||||
uint8_t *original_dataptr;
|
|
||||||
|
|
||||||
original_datalen = packetbuf_datalen();
|
|
||||||
original_dataptr = packetbuf_dataptr();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(packetbuf_datalen() == CSMA_ACK_LEN) {
|
if(packetbuf_datalen() == CSMA_ACK_LEN) {
|
||||||
|
@ -91,6 +87,8 @@ input_packet(void)
|
||||||
&linkaddr_node_addr) &&
|
&linkaddr_node_addr) &&
|
||||||
!packetbuf_holds_broadcast()) {
|
!packetbuf_holds_broadcast()) {
|
||||||
LOG_WARN("not for us\n");
|
LOG_WARN("not for us\n");
|
||||||
|
} else if(linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER), &linkaddr_node_addr)) {
|
||||||
|
LOG_WARN("frame from ourselves\n");
|
||||||
} else {
|
} else {
|
||||||
int duplicate = 0;
|
int duplicate = 0;
|
||||||
|
|
||||||
|
@ -106,20 +104,11 @@ input_packet(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CSMA_SEND_SOFT_ACK
|
#if CSMA_SEND_SOFT_ACK
|
||||||
{
|
if(packetbuf_attr(PACKETBUF_ATTR_MAC_ACK)) {
|
||||||
frame802154_t info154;
|
ackdata[0] = FRAME802154_ACKFRAME;
|
||||||
frame802154_parse(original_dataptr, original_datalen, &info154);
|
ackdata[1] = 0;
|
||||||
if(info154.fcf.frame_type == FRAME802154_DATAFRAME &&
|
ackdata[2] = ((uint8_t *)packetbuf_hdrptr())[2];
|
||||||
info154.fcf.ack_required != 0 &&
|
NETSTACK_RADIO.send(ackdata, CSMA_ACK_LEN);
|
||||||
linkaddr_cmp((linkaddr_t *)&info154.dest_addr,
|
|
||||||
&linkaddr_node_addr)) {
|
|
||||||
uint8_t ackdata[CSMA_ACK_LEN] = {0, 0, 0};
|
|
||||||
|
|
||||||
ackdata[0] = FRAME802154_ACKFRAME;
|
|
||||||
ackdata[1] = 0;
|
|
||||||
ackdata[2] = info154.seq;
|
|
||||||
NETSTACK_RADIO.send(ackdata, CSMA_ACK_LEN);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* CSMA_SEND_SOFT_ACK */
|
#endif /* CSMA_SEND_SOFT_ACK */
|
||||||
if(!duplicate) {
|
if(!duplicate) {
|
||||||
|
|
|
@ -240,6 +240,7 @@ parse(void)
|
||||||
|
|
||||||
if(hdr_len && packetbuf_hdrreduce(hdr_len)) {
|
if(hdr_len && packetbuf_hdrreduce(hdr_len)) {
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_FRAME_TYPE, frame.fcf.frame_type);
|
packetbuf_set_attr(PACKETBUF_ATTR_FRAME_TYPE, frame.fcf.frame_type);
|
||||||
|
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, frame.fcf.ack_required);
|
||||||
|
|
||||||
if(frame.fcf.dest_addr_mode) {
|
if(frame.fcf.dest_addr_mode) {
|
||||||
if(frame.dest_pid != frame802154_get_pan_id() &&
|
if(frame.dest_pid != frame802154_get_pan_id() &&
|
||||||
|
|
|
@ -87,6 +87,7 @@ parse(void)
|
||||||
}
|
}
|
||||||
packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (linkaddr_t *)&frame.src_addr);
|
packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (linkaddr_t *)&frame.src_addr);
|
||||||
packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, frame.seq);
|
packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, frame.seq);
|
||||||
|
packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, frame.fcf.ack_required);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue