📄 bt-host.cc
字号:
lm_ = (Baseband*)TclObject::lookup(argv[2]); if (lm_ == 0) { tcl.resultf("no such object %s", argv[2]); return (TCL_ERROR); } return (TCL_OK); } } if (argc == 4) { if (strcmp(argv[1], "connect-app") == 0) { int slot = atoi(argv[2]); trafgen_[slot] = (NsObject*)TclObject::lookup(argv[3]); numApps_++; return (TCL_OK); } if (strcmp(argv[1], "linkq") == 0) { int slot = atoi(argv[2]); linkq_[slot] = (LMP*)TclObject::lookup(argv[3]); return (TCL_OK); } } return (Connector::command(argc, argv));}/* master operation */voidBTHost::HCI_Inquiry_Result (vector<FHS_payload*>& addr_vec){ vec_addr_ = addr_vec; if (numInqResp_ = vec_addr_.size()) { sendHCICreateConnection(); }}/* called only for master side */voidBTHost::HCI_Connection_Complete_Event (char ch){ /* master operation */ if (ch > -1) { active_addr_[ch] = currPaged_; ch = (master_) ? ch : 0; //linkq_[ch]->HCI_change_connection_packet_type(15); linkq_[ch]->HCI_QoS_Setup(appFlowSpec_[currPaged_-1]); } else { sendHCICreateConnection(); }}/* QoS complete Event */voidBTHost::HCI_QoS_Setup_Complete_Event(char ch, bt_packet_type type){ if (ch != -1) { type_[ch] = type; numConnections_++; } else printf("QoS not satisfied CH %d BD_ADDR %d\n", ch, currPaged_); sendHCICreateConnection();}voidBTHost::sendHCICreateConnection(){ if (numPaged_ == numInqResp_) { // if all devices have been paged initiate L2CAP connection establishment for (int i=0; i<numConnections_; i++) l2cap_->L2CA_ConnectReq(0, i, type_[i]); // send L2CAP connection requests } else if (numPaged_ < numInqResp_) { // otherwise try paging next device FHS_payload* info = vec_addr_[numPaged_]; currPaged_ = info->addr; lm_->HCI_Create_Connection (info->addr, info->clock); } numPaged_++;}// L2CAP connection establishment completevoidBTHost::L2CA_ConnectCfm (int scid, uchar ch, uchar psm){ Tcl& tcl = Tcl::instance(); uchar ip_addr; int bd_addr = active_addr_[ch]; BD2IP_ADDR(ip_addr,bd_addr); if (psm == proto1_.value) { proto1_.arp_table_[ip_addr] = scid; //TrafficGenerator* trafgen = (TrafficGenerator*)trafgen_[ch]; //trafgen->start(); tcl.evalf("%s start", trafgen_[ip_addr-1]->name()); } else proto2_.arp_table_[ip_addr] = scid; /*** TESTING DATA TRANSFER OVER L2CAP *** Packet* p = Packet::alloc(); hdr_cmn* hdr = HDR_CMN(p); hdr->size() = 1000; l2cap_->dataWrite(p,ch+2); ************* END TEST *****************/}/* slave operation */void BTHost::L2CA_ConnectInd (CID_attr* cid_attr, uchar psm){ if (psm == proto1_.value) { //cid_attr->proto = proto1_; proto1_.cid = cid_attr->lcid; } else { //cid_attr->proto = proto2_; proto2_.cid = cid_attr->lcid; } // add logic for accepting/rejecting here, accept for now l2cap_->L2CA_ConnectRsp(cid_attr, 1);}voidBTHost::HCI_ConnectionRequestEvent(uchar ch){ // put logic for accepting/rejecting the request here, accept for now // am_addr_ =ch+1; ch = (master_) ? ch : 0; linkq_[ch]->HCI_accept_connection_request();} /* if a packet is received from upper layer call the dataWrite primitive of L2CAP */voidBTHost::recv(Packet* p, Handler* h) { Scheduler& s = Scheduler::instance(); hdr_cmn* ch = HDR_CMN(p); ch->direction() = hdr_cmn::DOWN; //ch->size() += TcpIpHdrSize; if (master_) { hdr_ip* iph = HDR_IP(p); uchar cid = proto1_.arp_table_[iph->daddr()]; printf("L2CA_DATA_WRITE\t\tSIZE: %-10d CID: %d\tDEST_IP %d clock %e\n", ch->size(), cid, iph->daddr(), s.clock()); ch->timestamp() = s.clock(); l2cap_->dataWrite(p, cid); } else l2cap_->dataWrite(p, proto1_.cid); }// using only one higher layer protocol presently voidBTHost::dataRead (Packet* p, CID_attr* cid){ Scheduler& s = Scheduler::instance(); hdr_cmn* ch = HDR_CMN(p); uchar psm = cid->psm; if (psm == proto1_.value) { //proto1_.uptarget_->recv(p,this); double delay = s.clock() - ch->timestamp(); printf("BD_ADDR %d DELAY %e SIZE %d clock %e\n", bd_addr_, delay,ch->size(), s.clock()); target_->recv(p,this); } else proto2_.uptarget_->recv(p,this);}// find application names and fill flowSpecs for well known applicationsvoidBTHost::findAppNames(){ Tcl& tcl = Tcl::instance(); for (int i=0; i<numApps_; i++) { tcl.evalf("%s info class", trafgen_[i]->name()); appNames_[i] = tcl.result(); const char* p = appNames_[i].c_str(); if (strcmp(p,"Application/Traffic/Exponential")==0) { tcl.evalf("%s set packetSize_", trafgen_[i]->name()); int mtu = atoi(tcl.result()); appFlowSpec_[i]->mtu = mtu; appFlowSpec_[i]->token_rate = 64; appFlowSpec_[i]->token_bucket = 30000; appFlowSpec_[i]->input_qlen = 30; appFlowSpec_[i]->peak_bw = 100000; appFlowSpec_[i]->latency = 100; appFlowSpec_[i]->loss_sensitivity = 1; } if (strcmp(p,"Application/Telnet") == 0) { appFlowSpec_[i]->mtu = 100; // Don't care appFlowSpec_[i]->token_rate = 0; // Don't care appFlowSpec_[i]->token_bucket = 0; // Don't care appFlowSpec_[i]->input_qlen = 0; // Don't care appFlowSpec_[i]->peak_bw = 0; // Don't care appFlowSpec_[i]->latency = -1; // Minimize appFlowSpec_[i]->loss_sensitivity = 1; } if (strcmp(p,"Application/FTP") == 0) { appFlowSpec_[i]->mtu = 1000; // large appFlowSpec_[i]->token_rate = -1; // MAX appFlowSpec_[i]->token_bucket = -1; // MAX appFlowSpec_[i]->input_qlen = -1; // MAX appFlowSpec_[i]->peak_bw = -1; // MAX appFlowSpec_[i]->latency = 0; // Don't care appFlowSpec_[i]->loss_sensitivity = 0; } //const char* p = appNames_[i].c_str(); //printf("appname[%d] = %s, MTU = %d\n", i, p, mtu); printf("appname[%d] = %s\n", i, p); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -