Hi all,

I am studying the 4bitle link estimator in the TinyOS 2. In the
tos/lib/net/4bitle/LinkEstimatorP.nc (line 647), the 4bit estimator
signals the CompareBit.shouldInsert() event when it received a beacon
message from a new neighbor when there is no room left in the neighbor
table, and the only implementation of CompareBit.shouldInsert I can
find is in the tos/lib/net/ctp/CtpRoutingEngineP.nc, starting from
line 634:

  /* 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
   * 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)
   *   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) {
        bool found = FALSE;
        uint16_t pathEtx;
        //uint16_t linkEtx = evaluateEtx(0);
        uint16_t neighEtx;
        int i;
        routing_table_entry* entry;
        ctp_routing_header_t* rcvBeacon;

        if ((call AMPacket.type(msg) != AM_CTP_ROUTING) ||
            (len != sizeof(ctp_routing_header_t)))
            return FALSE;

        /* 1.determine this packet's path quality */
        rcvBeacon = (ctp_routing_header_t*)payload;

        if (rcvBeacon->parent == INVALID_ADDR)
            return FALSE;
        /* the node is a root, recommend insertion! */
        if (rcvBeacon->etx == 0) {
            return TRUE;
        }

        pathEtx = rcvBeacon->etx; // + linkEtx;

        /* 2. see if we find some neighbor that is worse */
        for (i = 0; i < routingTableActive && !found; i++) {
            entry = &routingTable[i];
            //ignore parent, since we can't replace it
            if (entry->neighbor == routeInfo.parent)
                continue;
            neighEtx = entry->info.etx;
            //neighEtx = evaluateEtx(call
LinkEstimator.getLinkQuality(entry->neighbor));
            found |= (pathEtx < neighEtx);
        }
        return found;
   }

According to the comment, this event should do the comparison based on
the white_bit argument. However, the actual code here does not take
the white_bit into account. Instead, it just compare the path ETX
value of the new beacon message with the neighbors that is already in
the routing table (different from the neighbor table in the link
estimator).

When the 4bit link estimator signals the CompareBit.shouldInsert
event, the white_bit is set to true if the LQI value in the message
header indicates the wireless channel quality is high; false
otherwise. Can somebody explain why the white_bit is ignored  here? Or
it's just I missed something?

Thanks,

Tao Liu
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to