📄 p802_15_4sscs.cc
字号:
/********************************************//* NS2 Simulator for IEEE 802.15.4 *//* (per P802.15.4/D18) *//*------------------------------------------*//* by: Jianliang Zheng *//* (zheng@ee.ccny.cuny.edu) *//* Myung J. Lee *//* (lee@ccny.cuny.edu) *//* ~~~~~~~~~~~~~~~~~~~~~~~~~ *//* SAIT-CUNY Joint Lab *//********************************************/// File: p802_15_4sscs.cc// Mode: C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t// $Header: p802_15_4sscs.cc,v 1.1 2004/10/15 17:32:08 zheng Exp $// Functions in this file are out of the scope of 802.15.4.// But they elaborate how a higher layer interfaces with 802.15.4.// You can modify this file at will to fit your need./* * Copyright (c) 2003-2004 Samsung Advanced Institute of Technology and * The City University of New York. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the Joint Lab of Samsung * Advanced Institute of Technology and The City University of New York. * 4. Neither the name of Samsung Advanced Institute of Technology nor of * The City University of New York may be used to endorse or promote * products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE JOINT LAB OF SAMSUNG ADVANCED INSTITUTE * OF TECHNOLOGY AND THE CITY UNIVERSITY OF NEW YORK ``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 SAMSUNG ADVANCED INSTITUTE OR THE CITY UNIVERSITY OF NEW YORK * 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. */#include "p802_15_4sscs.h"#ifdef ZigBeeIF#include "../zbr/zbr_link.h"#include "../zbr/zbr.h"#endif#define assoRetryInterval 1.0//UINT_32 SSCS802_15_4::ScanChannels = 0x07ffffff;UINT_32 SSCS802_15_4::ScanChannels = 0x00003800; //only scan the first 3 channels in 2.4Gvoid SSCS802_15_4Timer::start(double wtime){ assert(!active); active = true; nullEvent.uid_ = 0; Scheduler::instance().schedule(this,&nullEvent,wtime);}void SSCS802_15_4Timer::cancel(void){ active = false; Scheduler::instance().cancel(&nullEvent);}void SSCS802_15_4Timer::handle(Event* e){ active = false; if (sscs->neverAsso) sscs->startDevice(sscs->t_isCT,sscs->t_isFFD,sscs->t_assoPermit,sscs->t_txBeacon,sscs->t_BO,sscs->t_SO,true);}char *statusName(MACenum status){ switch(status) { case m_SUCCESS: return "SUCCESS"; case m_PAN_at_capacity: return "PAN_at_capacity"; case m_PAN_access_denied: return "PAN_access_denied"; case m_BEACON_LOSS: return "BEACON_LOSS"; case m_CHANNEL_ACCESS_FAILURE: return "CHANNEL_ACCESS_FAILURE"; case m_DENIED: return "DENIED"; case m_DISABLE_TRX_FAILURE: return "DISABLE_TRX_FAILURE"; case m_FAILED_SECURITY_CHECK: return "FAILED_SECURITY_CHECK"; case m_FRAME_TOO_LONG: return "FRAME_TOO_LONG"; case m_INVALID_GTS: return "INVALID_GTS"; case m_INVALID_HANDLE: return "INVALID_HANDLE"; case m_INVALID_PARAMETER: return "INVALID_PARAMETER"; case m_NO_ACK: return "NO_ACK"; case m_NO_BEACON: return "NO_BEACON"; case m_NO_DATA: return "NO_DATA"; case m_NO_SHORT_ADDRESS: return "NO_SHORT_ADDRESS"; case m_OUT_OF_CAP: return "OUT_OF_CAP"; case m_PAN_ID_CONFLICT: return "PAN_ID_CONFLICT"; case m_REALIGNMENT: return "REALIGNMENT"; case m_TRANSACTION_EXPIRED: return "TRANSACTION_EXPIRED"; case m_TRANSACTION_OVERFLOW: return "TRANSACTION_OVERFLOW"; case m_TX_ACTIVE: return "TX_ACTIVE"; case m_UNAVAILABLE_KEY: return "UNAVAILABLE_KEY"; case m_UNSUPPORTED_ATTRIBUTE: return "UNSUPPORTED_ATTRIBUTE"; case m_UNDEFINED: default: return "UNDEFINED"; }}SSCS802_15_4::SSCS802_15_4(Mac802_15_4 *m):assoH(this){ Tcl& tcl = Tcl::instance(); Node *node; MobileNode* mnode; mac = m; neverAsso = true;#ifdef ZigBeeIF zbr = getZBRLink(mac->index_);#endif hlistLink1 = NULL; hlistLink2 = NULL;}SSCS802_15_4::~SSCS802_15_4(){}void SSCS802_15_4::MCPS_DATA_confirm(UINT_8 msduHandle,MACenum status){}void SSCS802_15_4::MCPS_DATA_indication(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr, UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr, UINT_8 msduLength,Packet *msdu,UINT_8 mpduLinkQuality, bool SecurityUse,UINT_8 ACLEntry){ Packet::free(msdu);}void SSCS802_15_4::MCPS_PURGE_confirm(UINT_8 msduHandle,MACenum status){}#ifdef ZigBeeIFextern NET_SYSTEM_CONFIG NetSystemConfig;#endifvoid SSCS802_15_4::MLME_ASSOCIATE_indication(IE3ADDR DeviceAddress,UINT_8 CapabilityInformation,bool SecurityUse,UINT_8 ACLEntry){ //we assign the cluster tree address as the MAC short address unsigned int child_num,logAddr; bool noCapacity;#ifdef ZigBeeIF if (t_isCT) //need to assign a cluster tree logic address { assertZBR(); noCapacity = false; if (zbr->myDepth >= NetSystemConfig.Lm) noCapacity = true; else { child_num = 1; logAddr = zbr->myNodeID + 1; while (!updateCTAddrLink(zbr_oper_est,logAddr)) { if (getIpAddrFrLogAddr(logAddr,false) == (UINT_16)DeviceAddress) break; logAddr += ZBR::c_skip(zbr->myDepth); child_num++; if (child_num > NetSystemConfig.Cm) break; } if (child_num > NetSystemConfig.Cm) noCapacity = true; } if (noCapacity) //no capacity {#ifdef DEBUG802_15_4 fprintf(stdout,"[%s::%s][%f](node %d) no capacity for cluster-tree: request from %d\n",__FILE__,__FUNCTION__,CURRENT_TIME,mac->index_,DeviceAddress);#endif zbr->sscs_nb_insert((UINT_16)DeviceAddress,NEIGHBOR); mac->MLME_ASSOCIATE_response(DeviceAddress,0,m_PAN_at_capacity,false); } else { chkAddCTAddrLink(logAddr,DeviceAddress); chkAddDeviceLink(&mac->deviceLink1,&mac->deviceLink2,DeviceAddress,CapabilityInformation); zbr->sscs_nb_insert((UINT_16)DeviceAddress,CHILD); mac->MLME_ASSOCIATE_response(DeviceAddress,logAddr,m_SUCCESS,false); } } else //just assign the IP address as the MAC short address for non-cluster tree#endif { chkAddDeviceLink(&mac->deviceLink1,&mac->deviceLink2,DeviceAddress,CapabilityInformation); mac->MLME_ASSOCIATE_response(DeviceAddress,(UINT_16)DeviceAddress,m_SUCCESS,false); }}void SSCS802_15_4::MLME_ASSOCIATE_confirm(UINT_16 AssocShortAddress,MACenum status){ MAC_PIB t_mpib; if (status == m_SUCCESS) { rt_myNodeID = AssocShortAddress; /* if (!sscsTaskP.startDevice_isCluster_Tree) t_mpib.macShortAddress = AssocShortAddress; else */ t_mpib.macShortAddress = mac->index_; //don't use cluster tree logic address mac->MLME_SET_request(macShortAddress,&t_mpib); } dispatch(status,"MLME_ASSOCIATE_confirm");}void SSCS802_15_4::MLME_DISASSOCIATE_confirm(MACenum status){}void SSCS802_15_4::MLME_BEACON_NOTIFY_indication(UINT_8 BSN,PAN_ELE *PANDescriptor,UINT_8 PendAddrSpec,IE3ADDR *AddrList,UINT_8 sduLength,UINT_8 *sdu){}void SSCS802_15_4::MLME_GET_confirm(MACenum status,MPIBAenum PIBAttribute,MAC_PIB *PIBAttributeValue){}void SSCS802_15_4::MLME_ORPHAN_indication(IE3ADDR OrphanAddress,bool SecurityUse,UINT_8 ACLEntry){ if (updateDeviceLink(tr_oper_est,&mac->deviceLink1,&mac->deviceLink2,OrphanAddress) == 0) mac->MLME_ORPHAN_response(OrphanAddress,(UINT_16)OrphanAddress,true,false); else mac->MLME_ORPHAN_response(OrphanAddress,0,false,false);}void SSCS802_15_4::MLME_RESET_confirm(MACenum status){}void SSCS802_15_4::MLME_RX_ENABLE_confirm(MACenum status){}void SSCS802_15_4::MLME_SET_confirm(MACenum status,MPIBAenum PIBAttribute){}void SSCS802_15_4::MLME_SCAN_confirm(MACenum status,UINT_8 ScanType,UINT_32 UnscannedChannels, UINT_8 ResultListSize,UINT_8 *EnergyDetectList, PAN_ELE *PANDescriptorList){ MAC_PIB t_mpib; T_UnscannedChannels = UnscannedChannels; T_ResultListSize = ResultListSize; T_EnergyDetectList = EnergyDetectList; T_PANDescriptorList = PANDescriptorList; if (ScanType == 0x01) dispatch(status,"MLME_SCAN_confirm"); if (ScanType == 0x03) if (status == m_SUCCESS)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -