mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-22 10:30:13 +00:00
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:
parent
477a4a7178
commit
4deba89f81
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user