duplicatep.nc

来自「tinyos-2.x.rar」· NC 代码 · 共 147 行

NC
147
字号
/* -*- mode:c++; indent-tabs-mode:nil -*- 
 * Copyright (c) 2007, Technische Universitaet Berlin
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright 
 *   notice, this list of conditions and the following disclaimer in the 
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the Technische Universitaet Berlin nor the names 
 *   of its contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Helper component for MAC protocols to suppress duplicates
 * To do: turn it into a generic?
 * @author: Andreas Koepke (koepke@tkn.tu-berlin.de)
 */

module DuplicateP {
  provides {
      interface Duplicate;
      interface Init;
  }
  uses {
      interface Timer<TMilli> as Timer;
#ifdef DUPLICATE_DEBUG
      interface SerialDebug;
#endif
  }
}
implementation {
    known_t knownTable[TABLE_ENTRIES];
    
#ifdef DUPLICATE_DEBUG
    void sdDebug(uint16_t p) {
        call SerialDebug.putPlace(p);
    }
    known_t dupOldest;
    unsigned last;
    task void dump() {
        sdDebug(3000 + last);
        sdDebug(dupOldest.src);
        sdDebug(dupOldest.dest);
        sdDebug(dupOldest.seqno);
        sdDebug(dupOldest.age);
        sdDebug(4000);
        sdDebug(knownTable[last].src);
        sdDebug(knownTable[last].dest);
        sdDebug(knownTable[last].seqno);
        sdDebug(knownTable[last].age);
        sdDebug(5000);
    }
#else
    void sdDebug(uint16_t p) {};
#endif
    
    /** helper functions */
    task void ageMsgsTask() {
        unsigned i;
        for(i = 0; i < TABLE_ENTRIES; i++) {
            atomic {
                if(knownTable[i].age < MAX_AGE) ++knownTable[i].age;
            }
        }
    }
    
    unsigned findOldest() {
        unsigned i;
        unsigned oldIndex = 0;
        unsigned age = knownTable[oldIndex].age;
        for(i = 1; i < TABLE_ENTRIES; i++) {
            if(age < knownTable[i].age) {
                oldIndex = i;
                age = knownTable[i].age;
            }
        }
        return oldIndex;
    }

    /*** duplicate interface */
    async command bool Duplicate.isNew(am_addr_t src, am_addr_t dest, uint8_t seqno) {
        bool rVal = TRUE;
        unsigned i;
        for(i=0; i < TABLE_ENTRIES; i++) {
            if((knownTable[i].age < MAX_AGE) &&
               (src == knownTable[i].src) &&
               (dest == knownTable[i].dest) &&
               (seqno == knownTable[i].seqno)) {
                knownTable[i].age = 0;
                rVal = FALSE;
                break;
            }
        }
        sdDebug(100 + rVal);
        sdDebug(200 + i);
        return rVal;
    }
    
    async command void Duplicate.remember(am_addr_t src, am_addr_t dest, uint8_t seqno) {
        unsigned oldest = findOldest();
#ifdef DUPLICATE_DEBUG
        dupOldest = knownTable[oldest];
        last = oldest;
        post dump();
#endif
        knownTable[oldest].src = src;
        knownTable[oldest].dest = dest;
        knownTable[oldest].seqno = seqno;
        knownTable[oldest].age = 0;
        post ageMsgsTask();
    }

    /** helper interfaces */
    event void Timer.fired() {
        call Timer.startOneShot(AGE_INTERVALL);
        post ageMsgsTask();
    }

    command error_t Init.init(){
        uint8_t i;
        for(i = 0; i < TABLE_ENTRIES; i++) {
            atomic {
                knownTable[i].age = MAX_AGE;
            }
        }
        call Timer.startOneShot(AGE_INTERVALL);
        return SUCCESS;
    }
}

⌨️ 快捷键说明

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