From e4dcba32c94f28d8576bcf02f2c8f6ccd70dd4d0 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Thu, 21 Jun 2018 05:58:28 -0700 Subject: [PATCH 1/4] CSMA: Do not depend depend on sequence numbers to identify packets --- os/net/mac/csma/csma-output.c | 39 +++++++++++------------------------ 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/os/net/mac/csma/csma-output.c b/os/net/mac/csma/csma-output.c index 0436bacea..b77d9c191 100644 --- a/os/net/mac/csma/csma-output.c +++ b/os/net/mac/csma/csma-output.c @@ -130,7 +130,10 @@ MEMB(packet_memb, struct packet_queue, MAX_QUEUED_PACKETS); MEMB(metadata_memb, struct qbuf_metadata, MAX_QUEUED_PACKETS); 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 struct neighbor_queue * @@ -161,7 +164,7 @@ backoff_period(void) } /*---------------------------------------------------------------------------*/ static int -send_one_packet(void *ptr) +send_one_packet(struct neighbor_queue *n, struct packet_queue *q) { int ret; int last_sent_ok = 0; @@ -237,7 +240,7 @@ send_one_packet(void *ptr) last_sent_ok = 1; } - packet_sent(ptr, ret, 1); + packet_sent(n, q, ret, 1); return last_sent_ok; } /*---------------------------------------------------------------------------*/ @@ -255,7 +258,7 @@ transmit_from_queue(void *ptr) n->transmissions, list_length(n->packet_queue)); /* Send first packet in the neighbor queue */ queuebuf_to_packetbuf(q->buf); - send_one_packet(n); + send_one_packet(n, q); } } } @@ -388,30 +391,12 @@ tx_ok(struct packet_queue *q, struct neighbor_queue *n, int num_transmissions) } /*---------------------------------------------------------------------------*/ 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; - struct packet_queue *q; - - n = ptr; - 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) { + if(q->ptr == NULL) { LOG_WARN("packet sent: no metadata\n"); return; } From 74780d59626492f7dcb1f04a1d08c23532e84d49 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Mon, 30 Apr 2018 06:54:00 -0700 Subject: [PATCH 2/4] CSMA: Do not parse twice/Acknowledge MAC command frames, too --- os/net/mac/csma/csma.c | 25 ++++++------------------- os/net/mac/framer/framer-802154.c | 1 + os/net/mac/framer/nullframer.c | 1 + 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/os/net/mac/csma/csma.c b/os/net/mac/csma/csma.c index 7259e35c8..17606916e 100644 --- a/os/net/mac/csma/csma.c +++ b/os/net/mac/csma/csma.c @@ -60,11 +60,7 @@ static void input_packet(void) { #if CSMA_SEND_SOFT_ACK - int original_datalen; - uint8_t *original_dataptr; - - original_datalen = packetbuf_datalen(); - original_dataptr = packetbuf_dataptr(); + uint8_t ackdata[CSMA_ACK_LEN]; #endif if(packetbuf_datalen() == CSMA_ACK_LEN) { @@ -91,20 +87,11 @@ input_packet(void) } #if CSMA_SEND_SOFT_ACK - { - frame802154_t info154; - frame802154_parse(original_dataptr, original_datalen, &info154); - if(info154.fcf.frame_type == FRAME802154_DATAFRAME && - info154.fcf.ack_required != 0 && - 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); - } + if(packetbuf_attr(PACKETBUF_ATTR_MAC_ACK)) { + ackdata[0] = FRAME802154_ACKFRAME; + ackdata[1] = 0; + ackdata[2] = ((uint8_t *)packetbuf_hdrptr())[2]; + NETSTACK_RADIO.send(ackdata, CSMA_ACK_LEN); } #endif /* CSMA_SEND_SOFT_ACK */ if(!duplicate) { diff --git a/os/net/mac/framer/framer-802154.c b/os/net/mac/framer/framer-802154.c index b4c24da19..8e92b9b2d 100644 --- a/os/net/mac/framer/framer-802154.c +++ b/os/net/mac/framer/framer-802154.c @@ -240,6 +240,7 @@ parse(void) if(hdr_len && packetbuf_hdrreduce(hdr_len)) { 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.dest_pid != frame802154_get_pan_id() && diff --git a/os/net/mac/framer/nullframer.c b/os/net/mac/framer/nullframer.c index 019ed2209..ae7bc925d 100644 --- a/os/net/mac/framer/nullframer.c +++ b/os/net/mac/framer/nullframer.c @@ -87,6 +87,7 @@ parse(void) } 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_ACK, frame.fcf.ack_required); return 0; } #endif From f71db7cc900bddce16335da4bcc604d7dc148651 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Sat, 27 Oct 2018 15:03:40 -0700 Subject: [PATCH 3/4] CSMA: Discard frames that come from ourselves --- os/net/mac/csma/csma.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/os/net/mac/csma/csma.c b/os/net/mac/csma/csma.c index 17606916e..27b720395 100644 --- a/os/net/mac/csma/csma.c +++ b/os/net/mac/csma/csma.c @@ -72,6 +72,8 @@ input_packet(void) &linkaddr_node_addr) && !packetbuf_holds_broadcast()) { 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 { int duplicate = 0; From 0c0d7b3e46cd571c1956c76155768843e1833b02 Mon Sep 17 00:00:00 2001 From: kkrentz Date: Wed, 7 Nov 2018 03:06:50 -0800 Subject: [PATCH 4/4] CSMA: Assert that n and q are non-NULL in csma-output.c#packet_sent --- os/net/mac/csma/csma-output.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/os/net/mac/csma/csma-output.c b/os/net/mac/csma/csma-output.c index b77d9c191..366840455 100644 --- a/os/net/mac/csma/csma-output.c +++ b/os/net/mac/csma/csma-output.c @@ -49,6 +49,7 @@ #include "net/netstack.h" #include "lib/list.h" #include "lib/memb.h" +#include "lib/assert.h" /* Log configuration */ #include "sys/log.h" @@ -396,6 +397,9 @@ packet_sent(struct neighbor_queue *n, int status, int num_transmissions) { + assert(n != NULL); + assert(q != NULL); + if(q->ptr == NULL) { LOG_WARN("packet sent: no metadata\n"); return;