亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linkestimatorp.nc

?? tinyos-2.x.rar
?? NC
?? 第 1 頁 / 共 2 頁
字號:

    if (NeighborTable[idx].rcvcnt >= BLQ_PKT_WINDOW) {
      updateNeighborTableEst(NeighborTable[idx].ll_addr);
    }

  }



  // print the neighbor table. for debugging.
  void print_neighbor_table() {
    uint8_t i;
    neighbor_table_entry_t *ne;
    for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) {
      ne = &NeighborTable[i];
      if (ne->flags & VALID_ENTRY) {
	dbg("LI,LITest", "%d:%d inQ=%d, inA=%d, outQ=%d, outA=%d, rcv=%d, fail=%d, biQ=%d\n",
	    i, ne->ll_addr, ne->inquality, ne->inage, ne->outquality, ne->outage,
	    ne->rcvcnt, ne->failcnt, computeBidirEETX(ne->inquality, ne->outquality));
      }
    }
  }

  // print the packet. for debugging.
  void print_packet(message_t* msg, uint8_t len) {
    uint8_t i;
    uint8_t* b;

    b = (uint8_t *)msg->data;
    for(i=0; i<len; i++)
      dbg_clear("LI", "%x ", b[i]);
    dbg_clear("LI", "\n");
  }

  // initialize the neighbor table in the very beginning
  void initNeighborTable() {
    uint8_t i;

    for (i = 0; i < NEIGHBOR_TABLE_SIZE; i++) {
      NeighborTable[i].flags = 0;
    }
  }

  command error_t StdControl.start() {
    dbg("LI", "Link estimator start\n");
    return SUCCESS;
  }

  command error_t StdControl.stop() {
    return SUCCESS;
  }

  // initialize the link estimator
  command error_t Init.init() {
    dbg("LI", "Link estimator init\n");
    initNeighborTable();
    return SUCCESS;
  }

  // return bi-directional link quality to the neighbor
  command uint16_t LinkEstimator.getLinkQuality(am_addr_t neighbor) {
    uint8_t idx;
    idx = findIdx(neighbor);
    if (idx == INVALID_RVAL) {
      return VERY_LARGE_EETX_VALUE;
    } else {
      if (NeighborTable[idx].flags & MATURE_ENTRY) {
	return NeighborTable[idx].eetx;
      } else {
	return VERY_LARGE_EETX_VALUE;
      }
    }
  }

  // return the quality of the link: neighor->self
  command uint16_t LinkEstimator.getReverseQuality(am_addr_t neighbor) {
    uint8_t idx;
    idx = findIdx(neighbor);
    if (idx == INVALID_RVAL) {
      return VERY_LARGE_EETX_VALUE;
    } else {
      if (NeighborTable[idx].flags & MATURE_ENTRY) {
	return computeEETX(NeighborTable[idx].inquality);
      } else {
	return VERY_LARGE_EETX_VALUE;
      }
    }
  }

  // return the quality of the link: self->neighbor
  command uint16_t LinkEstimator.getForwardQuality(am_addr_t neighbor) {
    uint8_t idx;
    idx = findIdx(neighbor);
    if (idx == INVALID_RVAL) {
      return VERY_LARGE_EETX_VALUE;
    } else {
      if (NeighborTable[idx].flags & MATURE_ENTRY) {
	return computeEETX(NeighborTable[idx].outquality);
      } else {
	return VERY_LARGE_EETX_VALUE;
      }
    }
  }

  // insert the neighbor at any cost (if there is a room for it)
  // even if eviction of a perfectly fine neighbor is called for
  command error_t LinkEstimator.insertNeighbor(am_addr_t neighbor) {
    uint8_t nidx;

    nidx = findIdx(neighbor);
    if (nidx != INVALID_RVAL) {
      dbg("LI", "insert: Found the entry, no need to insert\n");
      return SUCCESS;
    }

    nidx = findEmptyNeighborIdx();
    if (nidx != INVALID_RVAL) {
      dbg("LI", "insert: inserted into the empty slot\n");
      initNeighborIdx(nidx, neighbor);
      return SUCCESS;
    } else {
      nidx = findWorstNeighborIdx(BEST_EETX);
      if (nidx != INVALID_RVAL) {
	dbg("LI", "insert: inserted by replacing an entry for neighbor: %d\n",
	    NeighborTable[nidx].ll_addr);
	signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr);
	initNeighborIdx(nidx, neighbor);
	return SUCCESS;
      }
    }
    return FAIL;
  }

  // pin a neighbor so that it does not get evicted
  command error_t LinkEstimator.pinNeighbor(am_addr_t neighbor) {
    uint8_t nidx = findIdx(neighbor);
    if (nidx == INVALID_RVAL) {
      return FAIL;
    }
    NeighborTable[nidx].flags |= PINNED_ENTRY;
    return SUCCESS;
  }

  // pin a neighbor so that it does not get evicted
  command error_t LinkEstimator.unpinNeighbor(am_addr_t neighbor) {
    uint8_t nidx = findIdx(neighbor);
    if (nidx == INVALID_RVAL) {
      return FAIL;
    }
    NeighborTable[nidx].flags &= ~PINNED_ENTRY;
    return SUCCESS;
  }


  // called when an acknowledgement is received; sign of a successful
  // data transmission; to update forward link quality
  command error_t LinkEstimator.txAck(am_addr_t neighbor) {
    neighbor_table_entry_t *ne;
    uint8_t nidx = findIdx(neighbor);
    if (nidx == INVALID_RVAL) {
      return FAIL;
    }
    ne = &NeighborTable[nidx];
    ne->data_success++;
    ne->data_total++;
    if (ne->data_total >= DLQ_PKT_WINDOW) {
      updateDEETX(ne);
    }
    return SUCCESS;
  }

  // called when an acknowledgement is not received; could be due to
  // data pkt or acknowledgement loss; to update forward link quality
  command error_t LinkEstimator.txNoAck(am_addr_t neighbor) {
    neighbor_table_entry_t *ne;
    uint8_t nidx = findIdx(neighbor);
    if (nidx == INVALID_RVAL) {
      return FAIL;
    }

    ne = &NeighborTable[nidx];
    ne->data_total++;
    if (ne->data_total >= DLQ_PKT_WINDOW) {
      updateDEETX(ne);
    }
    return SUCCESS;
  }

  // called when the parent changes; clear state about data-driven link quality
  command error_t LinkEstimator.clearDLQ(am_addr_t neighbor) {
    neighbor_table_entry_t *ne;
    uint8_t nidx = findIdx(neighbor);
    if (nidx == INVALID_RVAL) {
      return FAIL;
    }
    ne = &NeighborTable[nidx];
    ne->data_total = 0;
    ne->data_success = 0;
    return SUCCESS;
  }


  // user of link estimator calls send here
  // slap the header and footer before sending the message
  command error_t Send.send(am_addr_t addr, message_t* msg, uint8_t len) {
    uint8_t newlen;
    newlen = addLinkEstHeaderAndFooter(msg, len);
    dbg("LITest", "%s packet of length %hhu became %hhu\n", __FUNCTION__, len, newlen);
    dbg("LI", "Sending seq: %d\n", linkEstSeq);
    print_packet(msg, newlen);
    return call AMSend.send(addr, msg, newlen);
  }

  // done sending the message that originated by
  // the user of this component
  event void AMSend.sendDone(message_t* msg, error_t error ) {
    return signal Send.sendDone(msg, error);
  }

  // cascade the calls down
  command uint8_t Send.cancel(message_t* msg) {
    return call AMSend.cancel(msg);
  }

  command uint8_t Send.maxPayloadLength() {
    return call Packet.maxPayloadLength();
  }

  command void* Send.getPayload(message_t* msg, uint8_t len) {
    return call Packet.getPayload(msg, len);
  }

  // called when link estimator generator packet or
  // packets from upper layer that are wired to pass through
  // link estimator is received
  void processReceivedMessage(message_t* ONE msg, void* COUNT_NOK(len) payload, uint8_t len) {
    uint8_t nidx;
    uint8_t num_entries;

    dbg("LI", "LI receiving packet, buf addr: %x\n", payload);
    print_packet(msg, len);

    if (call SubAMPacket.destination(msg) == AM_BROADCAST_ADDR) {
      linkest_header_t* hdr = getHeader(msg);
      linkest_footer_t* ONE footer;
      am_addr_t ll_addr;

      ll_addr = call SubAMPacket.source(msg);

      dbg("LI", "Got seq: %d from link: %d\n", hdr->seq, ll_addr);

      num_entries = hdr->flags & NUM_ENTRIES_FLAG;
      print_neighbor_table();

      // update neighbor table with this information
      // find the neighbor
      // if found
      //   update the entry
      // else
      //   find an empty entry
      //   if found
      //     initialize the entry
      //   else
      //     find a bad neighbor to be evicted
      //     if found
      //       evict the neighbor and init the entry
      //     else
      //       we can not accommodate this neighbor in the table
      nidx = findIdx(ll_addr);
      if (nidx != INVALID_RVAL) {
	dbg("LI", "Found the entry so updating\n");
	updateNeighborEntryIdx(nidx, hdr->seq);
      } else {
	nidx = findEmptyNeighborIdx();
	if (nidx != INVALID_RVAL) {
	  dbg("LI", "Found an empty entry\n");
	  initNeighborIdx(nidx, ll_addr);
	  updateNeighborEntryIdx(nidx, hdr->seq);
	} else {
	  nidx = findWorstNeighborIdx(EVICT_EETX_THRESHOLD);
	  if (nidx != INVALID_RVAL) {
	    dbg("LI", "Evicted neighbor %d at idx %d\n",
		NeighborTable[nidx].ll_addr, nidx);
	    signal LinkEstimator.evicted(NeighborTable[nidx].ll_addr);
	    initNeighborIdx(nidx, ll_addr);
	  } else {
	    dbg("LI", "No room in the table\n");
	  }
	}
      }


      /* Graphical explanation of how we get to the head of the
       * footer in the following code 
       * <---------------------- payloadLen ------------------->
       * -------------------------------------------------------
       * linkest_header_t  | payload  | linkest_footer_t* ...|
       * -------------------------------------------------------
       * ^                              ^                      ^
       * |                              |                      |
       * subpayload                     |                      payloadEnd
       *                                |
       *                                payloadEnd - footersize*num footers
      */

      if ((nidx != INVALID_RVAL) && (num_entries > 0)) {
	uint8_t payloadLen = call SubPacket.payloadLength(msg);
	void* COUNT_NOK(payloadLen) subPayload = call SubPacket.getPayload(msg, payloadLen);
	void* payloadEnd = subPayload + payloadLen;
	dbg("LI", "Number of footer entries: %d\n", num_entries);
	
	footer = TCAST(linkest_footer_t* COUNT(num_entries), (payloadEnd - (num_entries*sizeof(linkest_footer_t))));
	{
	  uint8_t i;
	  am_addr_t my_ll_addr;
          neighbor_stat_entry_t * COUNT(num_entries) neighborLists;
	  my_ll_addr = call SubAMPacket.address();
          neighborLists = TCAST(neighbor_stat_entry_t * COUNT(num_entries), footer->neighborList);
	  for (i = 0; i < num_entries; i++) {
	    dbg("LI", "%d %d %d\n", i, neighborLists[i].ll_addr,
	    	neighborLists[i].inquality);
	    if (neighborLists[i].ll_addr == my_ll_addr) {
	      updateReverseQuality(ll_addr, neighborLists[i].inquality);
	    }
	  }
	}
      }
      print_neighbor_table();
    }


  }

  // new messages are received here
  // update the neighbor table with the header
  // and footer in the message
  // then signal the user of this component
  event message_t* SubReceive.receive(message_t* msg,
				      void* payload,
				      uint8_t len) {
    dbg("LI", "Received upper packet. Will signal up\n");
    processReceivedMessage(msg, payload, len);
    return signal Receive.receive(msg,
				  call Packet.getPayload(msg, call Packet.payloadLength(msg)),
				  call Packet.payloadLength(msg));
  }

  command void Packet.clear(message_t* msg) {
    call SubPacket.clear(msg);
  }

  // subtract the space occupied by the link estimation
  // header and footer from the incoming payload size
  command uint8_t Packet.payloadLength(message_t* msg) {
    linkest_header_t *hdr;
    hdr = getHeader(msg);
    return call SubPacket.payloadLength(msg)
      - sizeof(linkest_header_t)
      - sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags);
  }

  // account for the space used by header and footer
  // while setting the payload length
  command void Packet.setPayloadLength(message_t* msg, uint8_t len) {
    linkest_header_t *hdr;
    hdr = getHeader(msg);
    call SubPacket.setPayloadLength(msg,
				    len
				    + sizeof(linkest_header_t)
				    + sizeof(linkest_footer_t)*(NUM_ENTRIES_FLAG & hdr->flags));
  }

  command uint8_t Packet.maxPayloadLength() {
    return call SubPacket.maxPayloadLength() - sizeof(linkest_header_t);
  }

  // application payload pointer is just past the link estimation header
  command void* Packet.getPayload(message_t* msg, uint8_t len) {
    void* payload = call SubPacket.getPayload(msg, len +  sizeof(linkest_header_t));
    if (payload != NULL) {
      payload += sizeof(linkest_header_t);
    }
    return payload;
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久www成人免费无遮挡大片| 亚洲欧美一区二区在线观看| 成人av电影在线网| 天堂成人免费av电影一区| 国产精品久久久久久久浪潮网站| 欧美老肥妇做.爰bbww视频| 成人动漫一区二区在线| 免费黄网站欧美| 亚洲福利一区二区三区| 国产精品福利一区二区| 亚洲福利一区二区三区| 成人免费在线视频| 精品久久国产老人久久综合| 精品视频一区三区九区| www.日韩在线| 国产成人精品一区二| 免费人成在线不卡| 午夜视频一区二区三区| 亚洲欧洲av另类| 久久精品亚洲精品国产欧美 | 欧美在线一区二区| 成人不卡免费av| 另类欧美日韩国产在线| 亚洲成年人网站在线观看| 国产精品不卡在线| 亚洲国产精品国自产拍av| 久久男人中文字幕资源站| 欧美一区二区性放荡片| 91精品国产入口在线| 欧美又粗又大又爽| 欧美综合天天夜夜久久| 色婷婷综合久久久久中文一区二区 | 日韩一区中文字幕| 国产精品网站导航| 国产日本欧美一区二区| 国产日韩精品一区二区三区| 久久日一线二线三线suv| 精品国产电影一区二区| 亚洲精品在线观看网站| 久久日韩粉嫩一区二区三区| 久久网这里都是精品| 国产日韩欧美在线一区| 国产欧美精品一区二区色综合| 久久久91精品国产一区二区三区| www一区二区| 中文字幕成人av| 国产精品麻豆久久久| 亚洲精品自拍动漫在线| 亚洲一区二区三区不卡国产欧美| 亚洲超碰97人人做人人爱| 亚洲成人高清在线| 免播放器亚洲一区| 国产精品一区二区三区99| 播五月开心婷婷综合| 一本大道综合伊人精品热热| 在线观看91视频| 3d动漫精品啪啪1区2区免费| 精品国产三级a在线观看| 国产女同性恋一区二区| 亚洲色图欧美偷拍| 午夜婷婷国产麻豆精品| 蜜桃视频在线一区| 高清不卡一区二区在线| 91香蕉视频在线| 欧美日韩国产影片| 久久亚洲二区三区| 亚洲精品视频一区| 日本视频免费一区| 成人美女在线观看| 欧美午夜理伦三级在线观看| 精品久久国产老人久久综合| 国产精品国产三级国产普通话蜜臀| 亚洲影视在线播放| 国产一区二区三区四 | 日韩欧美另类在线| 日本一区二区三区在线不卡| 亚洲精选视频在线| 精品一区二区成人精品| 色先锋资源久久综合| 日韩欧美中文一区| 亚洲天堂av一区| 奇米精品一区二区三区在线观看一| 成人av在线看| 3d成人动漫网站| 成人免费视频在线观看| 久热成人在线视频| 在线观看中文字幕不卡| 久久婷婷一区二区三区| 亚洲午夜三级在线| 国产精品一区二区视频| 欧美视频三区在线播放| 国产精品热久久久久夜色精品三区| 亚洲成人久久影院| 成人黄页毛片网站| 欧美一级片在线看| 亚洲国产日日夜夜| 成人激情小说乱人伦| 日韩欧美另类在线| 亚洲成人免费观看| 91免费国产视频网站| 久久久亚洲精品石原莉奈| 日韩国产欧美在线播放| 色婷婷综合五月| 国产精品久久久久一区| 久久激情五月婷婷| 6080午夜不卡| 亚洲不卡av一区二区三区| 不卡的av中国片| 国产拍欧美日韩视频二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 91视频观看免费| 国产精品情趣视频| 国产精品一级在线| 日韩欧美成人激情| 日本成人中文字幕在线视频| 在线观看中文字幕不卡| 亚洲三级在线看| 成人av资源下载| 久久精品夜夜夜夜久久| 久久国产精品72免费观看| 欧美一区二区啪啪| 午夜成人在线视频| 欧美日韩激情一区| 亚洲亚洲精品在线观看| 色悠悠久久综合| 亚洲品质自拍视频| 97久久精品人人澡人人爽| 国产精品麻豆欧美日韩ww| 国产aⅴ综合色| 亚洲国产成人私人影院tom| 国产99一区视频免费| 久久看人人爽人人| 国产精品综合在线视频| 久久精品欧美日韩精品| 国产精品一级在线| 中文字幕成人av| 成人黄色777网| 中文字幕一区二区三区av| 成人a区在线观看| 亚洲欧美中日韩| 91麻豆福利精品推荐| 一区二区三区四区高清精品免费观看 | 国产高清精品网站| 国产免费久久精品| 91免费国产在线| 亚洲高清三级视频| 欧美一级日韩免费不卡| 久久国产精品99精品国产| 久久婷婷综合激情| yourporn久久国产精品| 亚洲女与黑人做爰| 欧美日韩精品三区| 蜜臀av一区二区三区| 国产日韩精品久久久| 白白色 亚洲乱淫| 亚洲高清在线精品| 欧美成人vr18sexvr| 国产酒店精品激情| 亚洲图片激情小说| 91精选在线观看| 国产成人av一区二区三区在线观看| 中文字幕一区二区三区精华液| 欧美亚洲动漫制服丝袜| 精品一区二区免费视频| 国产精品国产馆在线真实露脸 | 色婷婷综合久色| 日韩高清一区二区| 欧美国产乱子伦| 欧美伊人久久久久久午夜久久久久| 日本在线不卡一区| 国产日韩欧美在线一区| 欧美在线|欧美| 国产精品99久久久久| 亚洲激情第一区| 亚洲精品一区二区三区福利 | 男人的j进女人的j一区| 久久久久成人黄色影片| 色综合久久综合中文综合网| 免费观看91视频大全| 中文字幕人成不卡一区| 欧美一区二区成人| av电影在线观看一区| 视频一区二区三区中文字幕| 国产精品私房写真福利视频| 6080午夜不卡| 91蜜桃视频在线| 国产一区在线看| 亚洲国产wwwccc36天堂| 国产亚洲精品超碰| 欧美日韩国产高清一区二区| 成人午夜在线视频| 日本特黄久久久高潮| 亚洲欧美乱综合| 欧美极品美女视频| 91.xcao| 色婷婷av一区二区三区软件| 韩国欧美国产1区| 日韩精品乱码av一区二区| 亚洲免费观看高清完整版在线观看| 亚洲精品在线免费播放|