📄 p802_15_4sscs.cc
字号:
mac->MLME_SET_request(macAssociationPermit,&t_mpib); sscsTaskP.startDevice_Channel = ch; fprintf(stdout,"[%f](node %d) sending association request to [channel:%d] [PAN_ID:%d] [CoordAddr:%d] ... \n",CURRENT_TIME,mac->index_,ch,T_PANDescriptorList[i].CoordPANId,T_PANDescriptorList[i].CoordAddress_64); sscsTaskP.taskStep(sscsTP_startDevice)++; sscsTaskP.startDevice_panDes = T_PANDescriptorList[i]; mac->MLME_ASSOCIATE_request(ch,T_PANDescriptorList[i].CoordAddrMode,T_PANDescriptorList[i].CoordPANId,T_PANDescriptorList[i].CoordAddress_64,mac->capability.cap,false); } break; case 2: sfSpec.SuperSpec = sscsTaskP.startDevice_panDes.SuperframeSpec; sfSpec.parse(); if (sfSpec.BO != 15) strcpy(tmpstr,"beacon enabled"); else strcpy(tmpstr,"non-beacon enabled"); if (status != m_SUCCESS) { //reset association permission t_mpib.macAssociationPermit = false; mac->MLME_SET_request(macAssociationPermit,&t_mpib); fprintf(stdout,"<!>[%f](node %d) association failed -> %s (%s) [channel:%d] [PAN_ID:%d] [CoordAddr:%d]\n",CURRENT_TIME,mac->index_,statusName(status),tmpstr,sscsTaskP.startDevice_panDes.LogicalChannel,sscsTaskP.startDevice_panDes.CoordPANId,sscsTaskP.startDevice_panDes.CoordAddress_64); assoH.start(assoRetryInterval); sscsTaskP.taskStatus(sscsTP_startDevice) = false;#ifdef ZigBeeIF if (isClusterTree) { assertZBR(); zbr->sscs_nb_insert(sscsTaskP.startDevice_panDes.CoordAddress_64,NEIGHBOR); if (status == m_PAN_at_capacity) chkAddUpdHListLink(&hlistLink1,&hlistLink2,(UINT_16)sscsTaskP.startDevice_panDes.CoordAddress_64,0); }#endif } else { neverAsso = false; fprintf(stdout,"[%f](node %d) association successful (%s) [channel:%d] [PAN_ID:%d] [CoordAddr:%d]\n",CURRENT_TIME,mac->index_,tmpstr,sscsTaskP.startDevice_panDes.LogicalChannel,sscsTaskP.startDevice_panDes.CoordPANId,sscsTaskP.startDevice_panDes.CoordAddress_64);#ifdef ZigBeeIF if (isClusterTree) { assertZBR(); zbr->myDepth = rt_myDepth; zbr->myNodeID = rt_myNodeID; zbr->myParentNodeID = rt_myParentNodeID; zbr->sscs_nb_insert(sscsTaskP.startDevice_panDes.CoordAddress_64,PARENT); //chkAddCTAddrLink(zbr->myNodeID,mac->index_); //too late -- may result in assigning duplicated addresses activateCTAddrLink(zbr->myNodeID,mac->index_); emptyHListLink(&hlistLink1,&hlistLink2); }#endif if (sfSpec.BO != 15) { fprintf(stdout,"[%f](node %d) begin to synchronize with the coordinator\n",CURRENT_TIME,mac->index_); mac->MLME_SYNC_request(sscsTaskP.startDevice_panDes.LogicalChannel,true); sscsTaskP.taskStatus(sscsTP_startDevice) = false; } if (isFFD && txBeacon) { sscsTaskP.taskStep(sscsTP_startDevice)++; fprintf(stdout,"[%f](node %d) begin to transmit beacons\n",CURRENT_TIME,mac->index_); mac->MLME_START_request(mac->mpib.macPANId,sscsTaskP.startDevice_Channel,BO,SO,false,false,false,false); } else sscsTaskP.taskStatus(sscsTP_startDevice) = false;#ifdef ZigBeeIF if (isClusterTree) zbr->dRate = mac->phy->getRate('d');#endif } break; case 3: sscsTaskP.taskStatus(sscsTP_startDevice) = false; if (status == m_SUCCESS) fprintf(stdout,"[%f](node %d) beacon transmission successful [channel:%d] [PAN_ID:%d]\n",CURRENT_TIME,mac->index_,sscsTaskP.startDevice_Channel,mac->mpib.macPANId); else fprintf(stdout,"<!>[%f](node %d) failed to transmit beacons -> %s [channel:%d] [PAN_ID:%d]\n",CURRENT_TIME,mac->index_,statusName(status),sscsTaskP.startDevice_Channel,mac->mpib.macPANId); break; default: break; }}//--------------------------------------------------------------------------/* The following primitives are availabe from MAC sublayer. You can call these primitives from SSCS or other upper layer * void MCPS_DATA_request(UINT_8 SrcAddrMode,UINT_16 SrcPANId,IE3ADDR SrcAddr, * UINT_8 DstAddrMode,UINT_16 DstPANId,IE3ADDR DstAddr, * UINT_8 msduLength,Packet *msdu,UINT_8 msduHandle,UINT_8 TxOptions); * void 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); * void MCPS_PURGE_request(UINT_8 msduHandle); * void MLME_ASSOCIATE_request(UINT_8 LogicalChannel,UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress, * UINT_8 CapabilityInformation,bool SecurityEnable); * void MLME_ASSOCIATE_response(IE3ADDR DeviceAddress,UINT_16 AssocShortAddress,MACenum status,bool SecurityEnable); * void MLME_DISASSOCIATE_request(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityEnable); * void MLME_DISASSOCIATE_indication(IE3ADDR DeviceAddress,UINT_8 DisassociateReason,bool SecurityUse,UINT_8 ACLEntry); * void MLME_DISASSOCIATE_confirm(MACenum status); * void MLME_GET_request(MPIBAenum PIBAttribute); * void MLME_GTS_request(UINT_8 GTSCharacteristics,bool SecurityEnable); * void MLME_GTS_confirm(UINT_8 GTSCharacteristics,MACenum status); * void MLME_GTS_indication(UINT_16 DevAddress,UINT_8 GTSCharacteristics, * bool SecurityUse, UINT_8 ACLEntry); * void MLME_ORPHAN_indication(IE3ADDR OrphanAddress,bool SecurityUse,UINT_8 ACLEntry); * void MLME_ORPHAN_response(IE3ADDR OrphanAddress,UINT_16 ShortAddress,bool AssociatedMember,bool SecurityEnable); * void MLME_RESET_request(bool SetDefaultPIB); * void MLME_RX_ENABLE_request(bool DeferPermit,UINT_32 RxOnTime,UINT_32 RxOnDuration); * void MLME_RX_ENABLE_confirm(MACenum status); * void MLME_SCAN_request(UINT_8 ScanType,UINT_32 ScanChannels,UINT_8 ScanDuration); * void MLME_SET_request(MPIBAenum PIBAttribute,MAC_PIB *PIBAttributeValue); * void MLME_SET_confirm(MACenum status,MPIBAenum PIBAttribute); * void MLME_START_request(UINT_16 PANId,UINT_8 LogicalChannel,UINT_8 BeaconOrder, * UINT_8 SuperframeOrder,bool PANCoordinator,bool BatteryLifeExtension, * bool CoordRealignment,bool SecurityEnable); * void MLME_SYNC_request(UINT_8 LogicalChannel, bool TrackBeacon); * void MLME_SYNC_LOSS_indication(MACenum LossReason); * void MLME_POLL_request(UINT_8 CoordAddrMode,UINT_16 CoordPANId,IE3ADDR CoordAddress,bool SecurityEnable); * void MLME_POLL_confirm(MACenum status); *///--------------------------------------------------------------------------/* The following commands are available in Tcl scripts -- most of them are the wrap-up of primitives */int SSCS802_15_4::command(int argc, const char*const* argv){ //Commands from Tcl will be one of the following forms: // --- $node sscs startPANCoord <txBeacon = 1> <beaconOrder = 3> <SuperframeOrder = 3> // --- $node sscs startDevice <isFFD = 1> <assoPermit = 1> <txBeacon = 0> <beaconOrder = 3> <SuperframeOrder = 3> // --- $node sscs startCTPANCoord <txBeacon = 1> <beaconOrder = 3> <SuperframeOrder = 3> // --- $node sscs startCTDevice <isFFD = 1> <assoPermit = 1> <txBeacon = 0> <beaconOrder = 3> <SuperframeOrder = 3> // --- $node sscs startBeacon <beaconOrder = 3> <SuperframeOrder = 3> // --- $node sscs stopBeacon int i; if ((strcmp(argv[2], "startPANCoord") == 0) || (strcmp(argv[2], "startCTPANCoord") == 0)) { i = 2; t_isCT = (strcmp(argv[i], "startCTPANCoord") == 0);#ifndef ZigBeeIF t_isCT = false;#endif if (argc == i + 1) { t_txBeacon = true; t_BO = 3; t_SO = 3; } else if (argc == i + 2) { t_txBeacon = (atoi(argv[i+1])!=0); t_BO = 3; t_SO = 3; } else if (argc == i + 3) { t_txBeacon = (atoi(argv[i+1])!=0); t_BO = atoi(argv[i+2]); t_SO = 3; } else { t_txBeacon = (atoi(argv[i+1])!=0); t_BO = atoi(argv[i+2]); t_SO = atoi(argv[i+3]); } startPANCoord(t_isCT,t_txBeacon,t_BO,t_SO,true); } else if ((strcmp(argv[2], "startDevice") == 0) || (strcmp(argv[2], "startCTDevice") == 0)) { i = 2; t_isCT = (strcmp(argv[i], "startCTDevice") == 0);#ifndef ZigBeeIF t_isCT = false;#endif if (argc == i + 1) { t_isFFD = true; t_assoPermit = true; t_txBeacon = false; t_BO = 3; t_SO = 3; } else if (argc == i + 2) { t_isFFD = (atoi(argv[i+1])!=0); t_assoPermit = true; t_txBeacon = false; t_BO = 3; t_SO = 3; } else if (argc == i + 3) { t_isFFD = (atoi(argv[i+1])!=0); t_assoPermit = (atoi(argv[i+2])!=0); t_txBeacon = false; t_BO = 3; t_SO = 3; } else if (argc == i + 4) { t_isFFD = (atoi(argv[i+1])!=0); t_assoPermit = (atoi(argv[i+2])!=0); t_txBeacon = (atoi(argv[i+3])!=0); t_BO = 3; t_SO = 3; } else if (argc == i + 5) { t_isFFD = (atoi(argv[i+1])!=0); t_assoPermit = (atoi(argv[i+2])!=0); t_txBeacon = (atoi(argv[i+3])!=0); t_BO = atoi(argv[i+4]); t_SO = 3; } else { t_isFFD = (atoi(argv[i+1])!=0); t_assoPermit = (atoi(argv[i+2])!=0); t_txBeacon = (atoi(argv[i+3])!=0); t_BO = atoi(argv[i+4]); t_SO = atoi(argv[i+5]); } if (!t_isFFD) t_assoPermit = false; startDevice(t_isCT,t_isFFD,t_assoPermit,t_txBeacon,t_BO,t_SO,true); } else if (strcmp(argv[2], "startBeacon") == 0) { if (argc == 3) { t_BO = 3; t_SO = 3; } else if (argc == 4) { t_BO = atoi(argv[3]); t_SO = 3; } else { t_BO = atoi(argv[3]); t_SO = atoi(argv[4]); } mac->phy->PLME_GET_request(phyCurrentChannel); mac->MLME_START_request(mac->mpib.macPANId,mac->tmp_ppib.phyCurrentChannel,t_BO,t_SO,mac->isPANCoor,false,false,false); } else if (strcmp(argv[2], "stopBeacon") == 0) { mac->phy->PLME_GET_request(phyCurrentChannel); mac->MLME_START_request(mac->mpib.macPANId,mac->tmp_ppib.phyCurrentChannel,15,15,mac->isPANCoor,false,false,false); } return TCL_OK;}#ifdef ZigBeeIFvoid SSCS802_15_4::assertZBR(void){ if (!zbr) zbr = getZBRLink(mac->index_); assert(zbr); zbr->dRate = mac->phy->getRate('d');}int SSCS802_15_4::RNType(void){ if (!t_isCT) return 1; assertZBR(); return zbr->RNType;}void SSCS802_15_4::setGetClusTreePara(char setGet,Packet *p){ hdr_lrwpan *wph = HDR_LRWPAN(p); if (!t_isCT) return; assertZBR(); if (setGet == 's') { wph->clusTreeDepth = zbr->myDepth; wph->clusTreeParentNodeID = zbr->myNodeID; } else { rt_myDepth = wph->clusTreeDepth + 1; rt_myParentNodeID = wph->clusTreeParentNodeID; }}#endif// End of file: p802_15_4sscs.cc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -