rdc: duplicate packets: Keep only the last sequence number for each address

According to IEEE 802.15.4e (§6.4.3.9), in order to detect duplicate received
MAC-layer frames, only the most recently received frame's sequence number needs
to be stored for each unique device address. Doing so limits the possible false
duplicate packet detections to a single sequence number. This also allows to
keep the last sequence number of more device addresses for the same value of
MAX_SEQNOS.

Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
This commit is contained in:
Benoît Thébaudeau 2013-11-15 19:31:02 +01:00
parent 477a4a7178
commit 4deba89f81

View File

@ -72,11 +72,13 @@ mac_sequence_is_duplicate(void)
* packet with the last few ones we saw. * packet with the last few ones we saw.
*/ */
for(i = 0; i < MAX_SEQNOS; ++i) { for(i = 0; i < MAX_SEQNOS; ++i) {
if(packetbuf_attr(PACKETBUF_ATTR_PACKET_ID) == received_seqnos[i].seqno && if(rimeaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER),
rimeaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER),
&received_seqnos[i].sender)) { &received_seqnos[i].sender)) {
/* Duplicate packet. */ if(packetbuf_attr(PACKETBUF_ATTR_PACKET_ID) == received_seqnos[i].seqno) {
return 1; /* Duplicate packet. */
return 1;
}
break;
} }
} }
return 0; return 0;
@ -85,10 +87,20 @@ mac_sequence_is_duplicate(void)
void void
mac_sequence_register_seqno(void) mac_sequence_register_seqno(void)
{ {
int i; int i, j;
for(i = MAX_SEQNOS - 1; i > 0; --i) { /* Locate possible previous sequence number for this address. */
memcpy(&received_seqnos[i], &received_seqnos[i - 1], sizeof(struct seqno)); for(i = 0; i < MAX_SEQNOS; ++i) {
if(rimeaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER),
&received_seqnos[i].sender)) {
i++;
break;
}
}
/* Keep the last sequence number for each address as per 802.15.4e. */
for(j = i - 1; j > 0; --j) {
memcpy(&received_seqnos[j], &received_seqnos[j - 1], sizeof(struct seqno));
} }
received_seqnos[0].seqno = packetbuf_attr(PACKETBUF_ATTR_PACKET_ID); received_seqnos[0].seqno = packetbuf_attr(PACKETBUF_ATTR_PACKET_ID);
rimeaddr_copy(&received_seqnos[0].sender, rimeaddr_copy(&received_seqnos[0].sender,