⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multihopenginem.nc

📁 传感器网络中的嵌入式操作系统源代码
💻 NC
字号:
// $Id: MultiHopEngineM.nc,v 1.2.2.3 2003/08/20 21:51:49 idgay Exp $/*									tab:4 * "Copyright (c) 2000-2003 The Regents of the University  of California.   * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. *  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Copyright (c) 2002-2003 Intel Corporation * All rights reserved. * * This file is distributed under the terms in the attached INTEL-LICENSE      * file. If you do not find these files, copies can be found by writing to * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,  * 94704.  Attention:  Intel License Inquiry. *//*  * A simple module that handles multihop packet movement.  It accepts  * messages from both applications and the network and does the necessary * interception and forwarding. * It interfaces to an algorithmic componenet via RouteSelect. It also acts * as a front end for RouteControl */includes AM;includes MultiHop;#ifndef MHOP_QUEUE_SIZE#define MHOP_QUEUE_SIZE	16#endifmodule MultiHopEngineM {  provides {    interface StdControl;    interface Receive[uint8_t id];    interface Send[uint8_t id];    interface Intercept[uint8_t id];    interface Intercept as Snoop[uint8_t id];    interface RouteControl;  }  uses {    interface ReceiveMsg[uint8_t id];    interface SendMsg[uint8_t id];    interface RouteControl as RouteSelectCntl;    interface RouteSelect;    interface StdControl as SubControl;    interface CommControl;    interface StdControl as CommStdControl;  }}implementation {  enum {    FWD_QUEUE_SIZE = MHOP_QUEUE_SIZE, // Forwarding Queue    EMPTY = 0xff  };  /* Routing status of local node */  /* Internal storage and scheduling state */  struct TOS_Msg FwdBuffers[FWD_QUEUE_SIZE];  struct TOS_Msg *FwdBufList[FWD_QUEUE_SIZE];  uint8_t iFwdBufHead, iFwdBufTail;  int timer_rate,timer_ticks;    /***********************************************************************   * Initialization    ***********************************************************************/  static void initialize() {    int n;    for (n=0; n < FWD_QUEUE_SIZE; n++) {      FwdBufList[n] = &FwdBuffers[n];    }     iFwdBufHead = iFwdBufTail = 0;  }  command result_t StdControl.init() {    initialize();    call CommStdControl.init();    return call SubControl.init();  }  command result_t StdControl.start() {    call CommStdControl.start();    call SubControl.start();    return call CommControl.setPromiscuous(TRUE);  }  command result_t StdControl.stop() {    call SubControl.stop();    // XXX message doesn't get received if we stop then start radio    return call CommStdControl.stop();  }  /***********************************************************************   * Commands and events   ***********************************************************************/  command result_t Send.send[uint8_t id](TOS_MsgPtr pMsg, uint16_t PayloadLen) {    uint16_t usMHLength = offsetof(TOS_MHopMsg,data) + PayloadLen;    if (usMHLength > TOSH_DATA_LENGTH) {      return FAIL;    }    //dbg(DBG_ROUTE,"MHop: send\n");    call RouteSelect.initializeFields(pMsg,id);    if (call RouteSelect.selectRoute(pMsg,id) != SUCCESS) {      return FAIL;    }    //dbg(DBG_ROUTE,"MHop: out pkt 0x%x\n",((TOS_MHopMsg *)pMsg->data)->seqno);        if (call SendMsg.send[id](pMsg->addr, usMHLength, pMsg) != SUCCESS) {      return FAIL;    }    return SUCCESS;      }   command void *Send.getBuffer[uint8_t id](TOS_MsgPtr pMsg, uint16_t* length) {        TOS_MHopMsg *pMHMsg = (TOS_MHopMsg *)pMsg->data;        *length = TOSH_DATA_LENGTH - offsetof(TOS_MHopMsg,data);    return (&pMHMsg->data[0]);  }    static TOS_MsgPtr mForward(TOS_MsgPtr pMsg, uint8_t id) {    TOS_MsgPtr	pNewBuf = pMsg;        if (((iFwdBufHead + 1) % FWD_QUEUE_SIZE) == iFwdBufTail)       return pNewBuf;        if ((call RouteSelect.selectRoute(pMsg,id)) != SUCCESS)       return pNewBuf;     // Failures at the send level do not cause the seq. number space to be     // rolled back properly.  This is somewhat broken.    if (call SendMsg.send[id](pMsg->addr,pMsg->length,pMsg) == SUCCESS) {      pNewBuf = FwdBufList[iFwdBufHead];      FwdBufList[iFwdBufHead] = pMsg;      iFwdBufHead++; iFwdBufHead %= FWD_QUEUE_SIZE;    }        return pNewBuf;      }  event TOS_MsgPtr ReceiveMsg.receive[uint8_t id](TOS_MsgPtr pMsg) {    TOS_MHopMsg		*pMHMsg = (TOS_MHopMsg *)pMsg->data;    uint16_t		PayloadLen = pMsg->length - offsetof(TOS_MHopMsg,data);#if 0    dbg(DBG_ROUTE, "MHop: Msg Rcvd, src 0x%02x, org 0x%02x, parent 0x%02x\n",         pMHMsg->sourceaddr, pMHMsg->originaddr, 0 /*pMHMsg->parentaddr*/);#endif    // Ordinary message requiring forwarding    if (pMsg->addr == TOS_LOCAL_ADDRESS) { // Addressed to local node      if ((signal Intercept.intercept[id](pMsg,&pMHMsg->data[0],PayloadLen)) == SUCCESS) {        pMsg = mForward(pMsg,id);      }    }    else {      // Snoop the packet for permiscuous applications      signal Snoop.intercept[id](pMsg,&pMHMsg->data[0],PayloadLen);    }    return pMsg;  }  event result_t SendMsg.sendDone[uint8_t id](TOS_MsgPtr pMsg, result_t success) {    //dbg(DBG_ROUTE, "MHop: senddone 0x%x 0x%x\n", pMsg, success);      if (pMsg == FwdBufList[iFwdBufTail]) { // Msg was from forwarding queue      iFwdBufTail++; iFwdBufTail %= FWD_QUEUE_SIZE;    } else {      signal Send.sendDone[id](pMsg, success);    }     return SUCCESS;  }  command uint16_t RouteControl.getParent() {    return call RouteSelectCntl.getParent();  }  command uint8_t RouteControl.getQuality() {    return call RouteSelectCntl.getQuality();  }  command uint8_t RouteControl.getDepth() {    return call RouteSelectCntl.getDepth();  }  command uint8_t RouteControl.getOccupancy() {    uint16_t uiOutstanding = (uint16_t)iFwdBufTail - (uint16_t)iFwdBufHead;    uiOutstanding %= FWD_QUEUE_SIZE;    return (uint8_t)uiOutstanding;  }  command uint16_t RouteControl.getSender(TOS_MsgPtr msg) {    TOS_MHopMsg	 *pMHMsg = (TOS_MHopMsg *)msg->data;    return pMHMsg->sourceaddr;  }  command result_t RouteControl.setUpdateInterval(uint16_t Interval) {    return call RouteSelectCntl.setUpdateInterval(Interval);  }  command result_t RouteControl.manualUpdate() {    return call RouteSelectCntl.manualUpdate();  }  default event result_t Send.sendDone[uint8_t id](TOS_MsgPtr pMsg, result_t success) {    return SUCCESS;  }  default event result_t Intercept.intercept[uint8_t id](TOS_MsgPtr pMsg, void* payload, 							 uint16_t payloadLen) {    return SUCCESS;  }  default event result_t Snoop.intercept[uint8_t id](TOS_MsgPtr pMsg, void* payload,                                                      uint16_t payloadLen) {    return SUCCESS;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -