MultiHopEngineM.nc
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:8k
源码类别:

网络

开发平台:

Others

  1. // $Id: MultiHopEngineM.nc,v 1.2 2004/11/29 19:18:54 idgay Exp $
  2. /* tab:4
  3.  * "Copyright (c) 2000-2003 The Regents of the University  of California.  
  4.  * All rights reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for any purpose, without fee, and without written agreement is
  8.  * hereby granted, provided that the above copyright notice, the following
  9.  * two paragraphs and the author appear in all copies of this software.
  10.  * 
  11.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  12.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  13.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  14.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  15.  * 
  16.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  17.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  18.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  19.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  20.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
  21.  *
  22.  * Copyright (c) 2002-2003 Intel Corporation
  23.  * All rights reserved.
  24.  *
  25.  * This file is distributed under the terms in the attached INTEL-LICENSE     
  26.  * file. If you do not find these files, copies can be found by writing to
  27.  * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, 
  28.  * 94704.  Attention:  Intel License Inquiry.
  29.  */
  30. /* 
  31.  * A simple module that handles multihop packet movement.  It accepts 
  32.  * messages from both applications and the network and does the necessary
  33.  * interception and forwarding.
  34.  * It interfaces to an algorithmic componenet via RouteSelect. It also acts
  35.  * as a front end for RouteControl
  36.  */
  37. includes AM;
  38. includes MultiHop;
  39. #ifndef MHOP_QUEUE_SIZE
  40. #define MHOP_QUEUE_SIZE 16
  41. #endif
  42. module MultiHopEngineM {
  43.   provides {
  44.     interface StdControl;
  45.     interface Receive[uint8_t id];
  46.     interface Send[uint8_t id];
  47.     interface Intercept[uint8_t id];
  48.     interface Intercept as Snoop[uint8_t id];
  49.     interface RouteControl;
  50.   }
  51.   uses {
  52.     interface ReceiveMsg[uint8_t id];
  53.     interface SendMsg[uint8_t id];
  54.     interface RouteControl as RouteSelectCntl;
  55.     interface RouteSelect;
  56.     interface StdControl as SubControl;
  57.     interface CommControl;
  58.     interface StdControl as CommStdControl;
  59.   }
  60. }
  61. implementation {
  62.   enum {
  63.     FWD_QUEUE_SIZE = MHOP_QUEUE_SIZE, // Forwarding Queue
  64.     EMPTY = 0xff
  65.   };
  66.   /* Routing status of local node */
  67.   /* Internal storage and scheduling state */
  68.   TOS_Msg FwdBuffers[FWD_QUEUE_SIZE];
  69.   TOS_Msg *FwdBufList[FWD_QUEUE_SIZE];
  70.   uint8_t iFwdBufHead, iFwdBufTail;
  71.   int timer_rate,timer_ticks;
  72.   
  73.   /***********************************************************************
  74.    * Initialization 
  75.    ***********************************************************************/
  76.   static void initialize() {
  77.     int n;
  78.     for (n=0; n < FWD_QUEUE_SIZE; n++) {
  79.       FwdBufList[n] = &FwdBuffers[n];
  80.     } 
  81.     iFwdBufHead = iFwdBufTail = 0;
  82.   }
  83.   command result_t StdControl.init() {
  84.     initialize();
  85.     call CommStdControl.init();
  86.     return call SubControl.init();
  87.   }
  88.   command result_t StdControl.start() {
  89.     call CommStdControl.start();
  90.     call SubControl.start();
  91.     return call CommControl.setPromiscuous(TRUE);
  92.   }
  93.   command result_t StdControl.stop() {
  94.     call SubControl.stop();
  95.     // XXX message doesn't get received if we stop then start radio
  96.     return call CommStdControl.stop();
  97.   }
  98.   /***********************************************************************
  99.    * Commands and events
  100.    ***********************************************************************/
  101.   command result_t Send.send[uint8_t id](TOS_MsgPtr pMsg, uint16_t PayloadLen) {
  102.     uint16_t usMHLength = offsetof(TOS_MHopMsg,data) + PayloadLen;
  103.     if (usMHLength > TOSH_DATA_LENGTH) {
  104.       return FAIL;
  105.     }
  106.     //dbg(DBG_ROUTE,"MHop: sendn");
  107.     call RouteSelect.initializeFields(pMsg,id);
  108.     if (call RouteSelect.selectRoute(pMsg,id) != SUCCESS) {
  109.       return FAIL;
  110.     }
  111.     //dbg(DBG_ROUTE,"MHop: out pkt 0x%xn",((TOS_MHopMsg *)pMsg->data)->seqno);
  112.     
  113.     if (call SendMsg.send[id](pMsg->addr, usMHLength, pMsg) != SUCCESS) {
  114.       return FAIL;
  115.     }
  116.     return SUCCESS;
  117.     
  118.   } 
  119.   command void *Send.getBuffer[uint8_t id](TOS_MsgPtr pMsg, uint16_t* length) {
  120.     
  121.     TOS_MHopMsg *pMHMsg = (TOS_MHopMsg *)pMsg->data;
  122.     
  123.     *length = TOSH_DATA_LENGTH - offsetof(TOS_MHopMsg,data);
  124.     return (&pMHMsg->data[0]);
  125.   }
  126.   
  127.   static TOS_MsgPtr mForward(TOS_MsgPtr pMsg, uint8_t id) {
  128.     TOS_MsgPtr pNewBuf = pMsg;
  129.     
  130.     if (((iFwdBufHead + 1) % FWD_QUEUE_SIZE) == iFwdBufTail) 
  131.       return pNewBuf;
  132.     
  133.     if ((call RouteSelect.selectRoute(pMsg,id)) != SUCCESS) 
  134.       return pNewBuf;
  135.  
  136.     // Failures at the send level do not cause the seq. number space to be 
  137.     // rolled back properly.  This is somewhat broken.
  138.     if (call SendMsg.send[id](pMsg->addr,pMsg->length,pMsg) == SUCCESS) {
  139.       pNewBuf = FwdBufList[iFwdBufHead];
  140.       FwdBufList[iFwdBufHead] = pMsg;
  141.       iFwdBufHead++; iFwdBufHead %= FWD_QUEUE_SIZE;
  142.     }
  143.     
  144.     return pNewBuf;
  145.     
  146.   }
  147.   event TOS_MsgPtr ReceiveMsg.receive[uint8_t id](TOS_MsgPtr pMsg) {
  148.     TOS_MHopMsg *pMHMsg = (TOS_MHopMsg *)pMsg->data;
  149.     uint16_t PayloadLen = pMsg->length - offsetof(TOS_MHopMsg,data);
  150. #if 0
  151.     dbg(DBG_ROUTE, "MHop: Msg Rcvd, src 0x%02x, org 0x%02x, parent 0x%02xn", 
  152.         pMHMsg->sourceaddr, pMHMsg->originaddr, 0 /*pMHMsg->parentaddr*/);
  153. #endif
  154.     // Ordinary message requiring forwarding
  155.     if (pMsg->addr == TOS_LOCAL_ADDRESS) { // Addressed to local node
  156.       if ((signal Intercept.intercept[id](pMsg,&pMHMsg->data[0],PayloadLen)) == SUCCESS) {
  157.         pMsg = mForward(pMsg,id);
  158.       }
  159.     }
  160.     else {
  161.       // Snoop the packet for permiscuous applications
  162.       signal Snoop.intercept[id](pMsg,&pMHMsg->data[0],PayloadLen);
  163.     }
  164.     return pMsg;
  165.   }
  166.   event result_t SendMsg.sendDone[uint8_t id](TOS_MsgPtr pMsg, result_t success) {
  167.     //dbg(DBG_ROUTE, "MHop: senddone 0x%x 0x%xn", pMsg, success);  
  168.     if (pMsg == FwdBufList[iFwdBufTail]) { // Msg was from forwarding queue
  169.       iFwdBufTail++; iFwdBufTail %= FWD_QUEUE_SIZE;
  170.     } else {
  171.       signal Send.sendDone[id](pMsg, success);
  172.     } 
  173.     return SUCCESS;
  174.   }
  175.   command uint16_t RouteControl.getParent() {
  176.     return call RouteSelectCntl.getParent();
  177.   }
  178.   command uint8_t RouteControl.getQuality() {
  179.     return call RouteSelectCntl.getQuality();
  180.   }
  181.   command uint8_t RouteControl.getDepth() {
  182.     return call RouteSelectCntl.getDepth();
  183.   }
  184.   command uint8_t RouteControl.getOccupancy() {
  185.     uint16_t uiOutstanding = (uint16_t)iFwdBufTail - (uint16_t)iFwdBufHead;
  186.     uiOutstanding %= FWD_QUEUE_SIZE;
  187.     return (uint8_t)uiOutstanding;
  188.   }
  189.   command uint16_t RouteControl.getSender(TOS_MsgPtr msg) {
  190.     TOS_MHopMsg  *pMHMsg = (TOS_MHopMsg *)msg->data;
  191.     return pMHMsg->sourceaddr;
  192.   }
  193.   command result_t RouteControl.setUpdateInterval(uint16_t Interval) {
  194.     return call RouteSelectCntl.setUpdateInterval(Interval);
  195.   }
  196.   command result_t RouteControl.manualUpdate() {
  197.     return call RouteSelectCntl.manualUpdate();
  198.   }
  199.   default event result_t Send.sendDone[uint8_t id](TOS_MsgPtr pMsg, result_t success) {
  200.     return SUCCESS;
  201.   }
  202.   default event result_t Intercept.intercept[uint8_t id](TOS_MsgPtr pMsg, void* payload, 
  203.  uint16_t payloadLen) {
  204.     return SUCCESS;
  205.   }
  206.   default event result_t Snoop.intercept[uint8_t id](TOS_MsgPtr pMsg, void* payload, 
  207.                                                      uint16_t payloadLen) {
  208.     return SUCCESS;
  209.   }
  210. }