Simplified. Removed the need for an initial guess.
This commit is contained in:
parent
6554e87c00
commit
eee9a68b12
|
@ -46,9 +46,7 @@
|
||||||
#define ETX_LIMIT 15
|
#define ETX_LIMIT 15
|
||||||
#define ETX_SCALE 100
|
#define ETX_SCALE 100
|
||||||
#define ETX_ALPHA 90
|
#define ETX_ALPHA 90
|
||||||
#define ETX_FIRST_GUESS 5
|
#define ETX_NOACK_PENALTY ETX_LIMIT
|
||||||
|
|
||||||
#define NOACK_PACKET_ETX 8
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
NEIGHBOR_ATTRIBUTE(uint8_t, etx, NULL);
|
NEIGHBOR_ATTRIBUTE(uint8_t, etx, NULL);
|
||||||
|
|
||||||
|
@ -61,16 +59,17 @@ update_etx(const rimeaddr_t *dest, int packet_etx)
|
||||||
uint8_t recorded_etx, new_etx;
|
uint8_t recorded_etx, new_etx;
|
||||||
|
|
||||||
etxp = (uint8_t *)neighbor_attr_get_data(&etx, dest);
|
etxp = (uint8_t *)neighbor_attr_get_data(&etx, dest);
|
||||||
|
packet_etx = NEIGHBOR_INFO_ETX2FIX(packet_etx);
|
||||||
if(etxp == NULL || *etxp == 0) {
|
if(etxp == NULL || *etxp == 0) {
|
||||||
recorded_etx = NEIGHBOR_INFO_ETX2FIX(ETX_FIRST_GUESS);
|
recorded_etx = NEIGHBOR_INFO_ETX2FIX(ETX_LIMIT);
|
||||||
|
new_etx = packet_etx;
|
||||||
} else {
|
} else {
|
||||||
recorded_etx = *etxp;
|
recorded_etx = *etxp;
|
||||||
|
/* Update the EWMA of the ETX for the neighbor. */
|
||||||
|
new_etx = ((uint16_t)recorded_etx * ETX_ALPHA +
|
||||||
|
(uint16_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the EWMA of the ETX for the neighbor. */
|
|
||||||
packet_etx = NEIGHBOR_INFO_ETX2FIX(packet_etx);
|
|
||||||
new_etx = ((uint16_t)recorded_etx * ETX_ALPHA +
|
|
||||||
(uint16_t)packet_etx * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE;
|
|
||||||
PRINTF("neighbor-info: ETX changed from %d to %d (packet ETX = %d) %d\n",
|
PRINTF("neighbor-info: ETX changed from %d to %d (packet ETX = %d) %d\n",
|
||||||
NEIGHBOR_INFO_FIX2ETX(recorded_etx),
|
NEIGHBOR_INFO_FIX2ETX(recorded_etx),
|
||||||
NEIGHBOR_INFO_FIX2ETX(new_etx),
|
NEIGHBOR_INFO_FIX2ETX(new_etx),
|
||||||
|
@ -96,9 +95,6 @@ add_neighbor(const rimeaddr_t *addr)
|
||||||
PRINTF("neighbor-info: The neighbor is already known\n");
|
PRINTF("neighbor-info: The neighbor is already known\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if(subscriber_callback != NULL) {
|
|
||||||
subscriber_callback(addr, 1, NEIGHBOR_INFO_ETX2FIX(ETX_FIRST_GUESS));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,18 +123,15 @@ neighbor_info_packet_sent(int status, int numtx)
|
||||||
packet_etx = numtx;
|
packet_etx = numtx;
|
||||||
break;
|
break;
|
||||||
case MAC_TX_NOACK:
|
case MAC_TX_NOACK:
|
||||||
packet_etx = NOACK_PACKET_ETX;
|
packet_etx = ETX_NOACK_PENALTY;
|
||||||
/* error and collissions will not cause high hits ??? */
|
|
||||||
break;
|
break;
|
||||||
case MAC_TX_ERR:
|
|
||||||
default:
|
default:
|
||||||
packet_etx = 0;
|
/* Do not penalize the ETX when collisions or transmission
|
||||||
break;
|
errors occur. */
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet_etx > 0) {
|
update_etx(dest, packet_etx);
|
||||||
update_etx(dest, packet_etx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
|
@ -175,6 +168,6 @@ neighbor_info_get_etx(const rimeaddr_t *addr)
|
||||||
uint8_t *etxp;
|
uint8_t *etxp;
|
||||||
|
|
||||||
etxp = (uint8_t *)neighbor_attr_get_data(&etx, addr);
|
etxp = (uint8_t *)neighbor_attr_get_data(&etx, addr);
|
||||||
return etxp == NULL ? 0 : *etxp;
|
return etxp == NULL ? ETX_LIMIT : *etxp;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in a new issue