X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Flib%2Fnet%2Fctp%2FCtpRoutingEngineP.nc;h=eb9eddc43ac3a4dad0b59e15c45a0119d67bded6;hb=944d0d12c88dc9d03de1356c0d598a45f0d1f611;hp=352938035f3999a048507887ac81a4e00eaca311;hpb=c8cde358722d987ebd2bec726cf45fff5e6ad5f6;p=tinyos-2.x.git diff --git a/tos/lib/net/ctp/CtpRoutingEngineP.nc b/tos/lib/net/ctp/CtpRoutingEngineP.nc index 35293803..eb9eddc4 100644 --- a/tos/lib/net/ctp/CtpRoutingEngineP.nc +++ b/tos/lib/net/ctp/CtpRoutingEngineP.nc @@ -151,19 +151,22 @@ implementation { uint32_t parentChanges; /* end statistics */ - uint32_t routeUpdateTimerCount; - - // Maximimum it takes to hear four beacons - enum { - DEATH_TEST_INTERVAL = (maxInterval * 4) / (BEACON_INTERVAL / 1024), - }; - // forward declarations void routingTableInit(); uint8_t routingTableFind(am_addr_t); error_t routingTableUpdateEntry(am_addr_t, am_addr_t , uint16_t); error_t routingTableEvict(am_addr_t neighbor); + + + /* + For each interval t, you set a timer to fire between t/2 and t + (chooseAdvertiseTime), and you wait until t (remainingInterval). Once + you are at t, you double the interval (decayInterval) if you haven't + reached the max. For reasons such as topological inconsistency, you + reset the timer to a small value (resetInterval). + */ + uint32_t currentInterval = minInterval; uint32_t t; bool tHasPassed; @@ -173,7 +176,6 @@ implementation { t /= 2; t += call Random.rand32() % t; tHasPassed = FALSE; - call BeaconTimer.stop(); call BeaconTimer.startOneShot(t); } @@ -199,7 +201,6 @@ implementation { command error_t Init.init() { uint8_t maxLength; - routeUpdateTimerCount = 0; radioOn = FALSE; running = FALSE; parentChanges = 0; @@ -238,7 +239,6 @@ implementation { uint16_t nextInt; nextInt = call Random.rand16() % BEACON_INTERVAL; nextInt += BEACON_INTERVAL >> 1; - call BeaconTimer.startOneShot(nextInt); } } @@ -250,16 +250,9 @@ implementation { /* Is this quality measure better than the minimum threshold? */ // Implemented assuming quality is EETX bool passLinkEtxThreshold(uint16_t etx) { - return TRUE; return (etx < ETX_THRESHOLD); } - /* Converts the output of the link estimator to path metric - * units, that can be *added* to form path metric measures */ - uint16_t evaluateEtx(uint16_t quality) { - //dbg("TreeRouting","%s %d -> %d\n",__FUNCTION__,quality, quality+10); - return (quality + 10); - } /* updates the routing information, using the info that has been received * from neighbor beacons. Two things can cause this info to change: @@ -294,8 +287,8 @@ implementation { i, entry->neighbor, entry->info.parent); continue; } - /* Compute this neighbor's path metric */ - linkEtx = evaluateEtx(call LinkEstimator.getLinkQuality(entry->neighbor)); + + linkEtx = call LinkEstimator.getLinkQuality(entry->neighbor); dbg("TreeRouting", "routingTable[%d]: neighbor: [id: %d parent: %d etx: %d retx: %d]\n", i, entry->neighbor, entry->info.parent, linkEtx, entry->info.etx); @@ -408,8 +401,7 @@ implementation { beaconMsg->etx = routeInfo.etx; beaconMsg->options |= CTP_OPT_PULL; } else { - beaconMsg->etx = routeInfo.etx + - evaluateEtx(call LinkEstimator.getLinkQuality(routeInfo.parent)); + beaconMsg->etx = routeInfo.etx + call LinkEstimator.getLinkQuality(routeInfo.parent); } dbg("TreeRouting", "%s parent: %d etx: %d\n", @@ -552,8 +544,7 @@ implementation { if (state_is_root == 1) { *etx = 0; } else { - // path etx = etx(parent) + etx(link to the parent) - *etx = routeInfo.etx + evaluateEtx(call LinkEstimator.getLinkQuality(routeInfo.parent)); + *etx = routeInfo.etx + call LinkEstimator.getLinkQuality(routeInfo.parent); } return SUCCESS; } @@ -636,26 +627,20 @@ implementation { } - /* This should see if the node should be inserted in the table. - * If the white_bit is set, this means the LL believes this is a good - * first hop link. - * The link will be recommended for insertion if it is better* than some + /* The link will be recommended for insertion if it is better* than some * link in the routing table that is not our parent. * We are comparing the path quality up to the node, and ignoring the link * quality from us to the node. This is because of a couple of things: - * 1. because of the white bit, we assume that the 1-hop to the candidate - * link is good (say, etx=1) + * 1. we expect this call only for links with white bit set * 2. we are being optimistic to the nodes in the table, by ignoring the * 1-hop quality to them (which means we are assuming it's 1 as well) * This actually sets the bar a little higher for replacement * 3. this is faster - * 4. it doesn't require the link estimator to have stabilized on a link */ - event bool CompareBit.shouldInsert(message_t *msg, void* payload, uint8_t len, bool white_bit) { + event bool CompareBit.shouldInsert(message_t *msg, void* payload, uint8_t len) { bool found = FALSE; uint16_t pathEtx; - //uint16_t linkEtx = evaluateEtx(0); uint16_t neighEtx; int i; routing_table_entry* entry; @@ -684,7 +669,6 @@ implementation { if (entry->neighbor == routeInfo.parent) continue; neighEtx = entry->info.etx; - //neighEtx = evaluateEtx(call LinkEstimator.getLinkQuality(entry->neighbor)); found |= (pathEtx < neighEtx); } return found; @@ -723,7 +707,7 @@ implementation { error_t routingTableUpdateEntry(am_addr_t from, am_addr_t parent, uint16_t etx) { uint8_t idx; uint16_t linkEtx; - linkEtx = evaluateEtx(call LinkEstimator.getLinkQuality(from)); + linkEtx = call LinkEstimator.getLinkQuality(from); idx = routingTableFind(from); if (idx == routingTableSize) { @@ -823,7 +807,7 @@ implementation { command uint16_t CtpRoutingPacket.getEtx(message_t* msg) { return getHeader(msg)->etx; } - command void CtpRoutingPacket.setEtx(message_t* msg, uint8_t etx) { + command void CtpRoutingPacket.setEtx(message_t* msg, uint16_t etx) { getHeader(msg)->etx = etx; }