X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=tos%2Flib%2Fnet%2Fctp%2FCtpRoutingEngineP.nc;h=4657a00f20ccffc96657bcd4079e827f207a80b0;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=342f2f53d52360a21c53579416adb7a65a0bf6d4;hpb=adf1de6c009d13b7b52e68535c63b28f59c97400;p=tinyos-2.x.git diff --git a/tos/lib/net/ctp/CtpRoutingEngineP.nc b/tos/lib/net/ctp/CtpRoutingEngineP.nc index 342f2f53..4657a00f 100644 --- a/tos/lib/net/ctp/CtpRoutingEngineP.nc +++ b/tos/lib/net/ctp/CtpRoutingEngineP.nc @@ -151,13 +151,6 @@ 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); @@ -199,7 +192,6 @@ implementation { command error_t Init.init() { uint8_t maxLength; - routeUpdateTimerCount = 0; radioOn = FALSE; running = FALSE; parentChanges = 0; @@ -250,16 +242,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,11 +279,11 @@ 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]\n", - i, entry->neighbor, entry->info.parent, linkEtx); + "routingTable[%d]: neighbor: [id: %d parent: %d etx: %d retx: %d]\n", + i, entry->neighbor, entry->info.parent, linkEtx, entry->info.etx); pathEtx = linkEtx + entry->info.etx; /* Operations specific to the current parent */ if (entry->neighbor == routeInfo.parent) { @@ -321,6 +306,7 @@ implementation { } if (pathEtx < minEtx) { + dbg("TreeRouting", " best is %d, setting to %d\n", pathEtx, entry->neighbor); minEtx = pathEtx; best = entry; } @@ -354,11 +340,15 @@ implementation { call LinkEstimator.unpinNeighbor(routeInfo.parent); call LinkEstimator.pinNeighbor(best->neighbor); call LinkEstimator.clearDLQ(best->neighbor); - atomic { + + atomic { routeInfo.parent = best->neighbor; routeInfo.etx = best->info.etx; routeInfo.congested = best->info.congested; } + if (currentEtx - minEtx > 20) { + call CtpInfo.triggerRouteUpdate(); + } } } @@ -403,8 +393,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", @@ -547,8 +536,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; } @@ -631,26 +619,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; @@ -679,7 +661,6 @@ implementation { if (entry->neighbor == routeInfo.parent) continue; neighEtx = entry->info.etx; - //neighEtx = evaluateEtx(call LinkEstimator.getLinkQuality(entry->neighbor)); found |= (pathEtx < neighEtx); } return found; @@ -718,7 +699,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) { @@ -818,7 +799,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; }