📄 ll.cc
字号:
llhsp->seqno_ = 0; llhsp->bopno_ = bopno; llhsp->eopno_ = eopno; llhsp->psize_ = ch->size_; chsp->size_ = psize; if((acked_==0)||(chsp->next_hop()==-1)){ if(i==eopno) llhsp->seqno_=eopno; // XXX HACK for now - Padma, 03/99. nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ihsp->daddr()); int tx = 0; switch(chsp->addr_type()) { case NS_AF_ILINK: mac_->hdr_dst((char*) HDR_MAC(sp), chsp->next_hop()); break; case NS_AF_INET: dst = chsp->next_hop(); /* FALL THROUGH */ case NS_AF_NONE: if (IP_BROADCAST == (u_int32_t) dst) { mac_->hdr_dst((char*) HDR_MAC(sp), MAC_BROADCAST); break; } /* Assuming arptable is present, send query */ if (arptable_) { tx = arptable_->arpresolve(dst, sp, this); break; } /* FALL THROUGH */ default: int IPnh = (lanrouter_) ? lanrouter_->next_hop(sp) : -1; if (IPnh < 0) mac_->hdr_dst((char*) HDR_MAC(sp),macDA_); else if (varp_) tx = varp_->arpresolve(IPnh, sp); else mac_->hdr_dst((char*) HDR_MAC(sp), IPnh); break; } if(tx==0){ Scheduler& s = Scheduler::instance(); s.schedule(downtarget_, sp, delay_); if (llverbose_==1) fprintf(stderr,"<%d> %f LL: send down NON-ack uid=%d\n", mac_->addr(), NOW ,chsp->uid_); } }else{ llhsp->seqno_=i; seqno_++; buf_->enque(sp); if (llverbose_==1) fprintf(stderr,"<%d> %f LL: buffering ll_seq=%d pktuid=%d bufq_length=%d \n", mac_->addr(), NOW, llhsp->seqno_, chsp->uid_, buf_->length() ); } } if(acked_==1) sendDownDATA();}void LL::sendDownDATA(void){ Packet* sp; if(!(sp = buf_->deque())){ if (llverbose_==1) fprintf(stderr,"<%d> %f LL: bufq is empty\n", mac_->addr(), NOW ); return; } hdr_cmn *chsp = HDR_CMN(sp); hdr_ll *llhsp = HDR_LL(sp); hdr_ip *ihsp = HDR_IP(sp); if (ackno_ == llhsp->seqno_){ //send new pkt if ack no matches with new pkt to be sent if (llverbose_==1) fprintf(stderr ,"<%d> %f LL: last ack=%d, send down pktuid=%d ll_seq=%d bopno=%d eopno=%d\n", mac_->addr(), NOW ,ackno_, chsp->uid_,llhsp->seqno_,llhsp->bopno_,llhsp->eopno_); pktTx_ = sp->copy(); // moved frm above due to arp schedules // XXX HACK for now - Padma, 03/99. nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ihsp->daddr()); int tx = 0; switch(chsp->addr_type()) { case NS_AF_ILINK: mac_->hdr_dst((char*) HDR_MAC(sp), chsp->next_hop()); break; case NS_AF_INET: dst = chsp->next_hop(); /* FALL THROUGH */ case NS_AF_NONE: if (IP_BROADCAST == (u_int32_t) dst) { mac_->hdr_dst((char*) HDR_MAC(sp), MAC_BROADCAST); break; } /* Assuming arptable is present, send query */ if (arptable_) { tx = arptable_->arpresolve(dst, sp, this); break; } //if (varp_) { //tx = varp_->arpresolve(dst, p); //break; //} /* FALL THROUGH */ default: int IPnh = (lanrouter_) ? lanrouter_->next_hop(sp) : -1; if (IPnh < 0) mac_->hdr_dst((char*) HDR_MAC(sp),macDA_); else if (varp_) tx = varp_->arpresolve(IPnh, sp); else mac_->hdr_dst((char*) HDR_MAC(sp), IPnh); break; } if(tx==0){ Scheduler& s = Scheduler::instance(); // let mac decide when to take a new packet from the queue. s.schedule(downtarget_, sp, delay_); lhSend_.stop(); lhSend_.start(0.5);//?? why 1.5 rj } } else{ if (llverbose_==1) fprintf(stderr,"<%d> %f LL: expected pkt(last ack)=%d, this pkt=%d\n", mac_->addr(), NOW, ackno_, llhsp->seqno_); buf_->enqueHead(sp); }}void LL::recvACK(Packet* p){ hdr_ll *llh = HDR_LL(p); if(ackno_ < llh->ackno_){ ackno_ = llh->ackno_; lhSend_.stop(); datacounter=0; } if (llverbose_==1) fprintf(stderr,"<%d> %f LL: recvd ACK num %d\n", mac_->addr(), NOW, llh->ackno_); sendDownDATA();}void LL::sendUpDATA(Packet* p){ acSend_.stop(); ackcounter=0; //see if req...was working fine if (hdr_cmn::access(p)->error() > 0) drop(p); else{ hdr_cmn *ch = HDR_CMN(p); hdr_ll *llh = HDR_LL(p); hdr_ip *iph = HDR_IP(p); if(((ch->next_hop_)!=-1)&&(acked_==1)){ sendACK(p); } if ( llh->seqno_ == llh->eopno_ ){ ch->size_=llh->psize_; if (llverbose_==1) fprintf(stderr , "<%d> %f LL: all LL frags for pkt uid=%d recvd. sending up.ll_seqno=ll_eopno=%d \n", mac_->addr(), NOW, ch->uid_, llh->eopno_); Scheduler& s = Scheduler::instance(); s.schedule(uptarget_, p, delay_); } else { if (llverbose_==1) fprintf(stderr , "<%d> %f LL: frag with ll_seqno=%d recvd. for pkt uid=%d ll_eopno=%d\n", mac_->addr(), NOW, llh->seqno_, ch->uid_, llh->eopno_); Packet::free(p); } }}void LL::sendACK(Packet* p){ hdr_cmn *ch = HDR_CMN(p); hdr_ll *llh = HDR_LL(p); hdr_ip *iph = HDR_IP(p); hdr_mac_gprs *dh = HDR_MAC_GPRS(p); char *mh = (char*)p->access(hdr_mac::offset_); Packet* sp = Packet::alloc(); hdr_cmn *chsp = HDR_CMN(sp); hdr_ll *llhsp = HDR_LL(sp); hdr_ip *iphsp = HDR_IP(sp); char *mhsp = (char *)HDR_MAC(sp);// char *mhsp = (char*)sp->access(hdr_mac::offset_); iphsp->src_ = iph->dst_; iphsp->dst_ = iph->src_;// chsp->next_hop_ = ch->prev_hop_; chsp->next_hop_=Address::instance().get_nodeaddr(iph->saddr()); // chsp->prev_hop_ = ch->next_hop_; chsp->prev_hop_=Address::instance().get_nodeaddr(iph->daddr()); chsp->addr_type_ = ch->addr_type_; chsp->direction_ = hdr_cmn::DOWN; chsp->ptype_=PT_LLACK; chsp->size_=6; chsp->iface()= -2; chsp->error()= 0; chsp->uid()= 0;// if (llverbose_==1) fprintf(stderr,"<%d> %fnexthop=%x; prevhop=%x, lasthop=%x",chsp->next_hop_,chsp->prev_hop_,chsp->last_hop_); // if (llverbose_==1) fprintf(stderr,"<%d> %f LL:test:recv pkt_type=%s uid=%d src=%d dst=%d\n", mac_->addr(), NOW ,packet_info.name(ch->ptype()),ch->uid_,Address::instance().get_nodeaddr(iph->saddr()),Address::instance().get_nodeaddr(iph->daddr()));// mhsp->set(mh->ftype(),mh->macDA(),mh->macSA());// mhsp->dh_da=mh->dh_sa;// mhsp->dh_sa=mh->dh_da;// mhsp->hdr_type_=mh->hdr_type_;// mhsp->ftype_=mh->ftype_; int dst_=ETHER_ADDR(dh->dh_sa); mac_->hdr_src(mhsp, mac_->addr()); mac_->hdr_type(mhsp, ETHERTYPE_IP); mac_->hdr_dst(mhsp, dst_);// mac_->hdr_dst((char*) HDR_MAC(sp), chsp->next_hop()); llhsp->lltype() = LL_ACK; llhsp->ackno_ = llh->seqno_+1; pktRx_ = sp->copy(); Scheduler& s = Scheduler::instance(); s.schedule(downtarget_, sp, delay_); acSend_.stop(); acSend_.start(0.5);//why 1.5 ?? rj if (llverbose_==1) fprintf(stderr,"<%d> %f LL: recvd a LL frag. sending LL ack num %d\n", mac_->addr(), NOW, llhsp->ackno_); //Packet::free(p); }void LL::sendHandler(){ send_timer();}void LL::sendackHandler(){ send_acktimer();}void LL::send_timer(){ RetransmitDATA();// RetransmitACK();}void LL::send_acktimer(){ RetransmitACK();}void LL::RetransmitDATA(){ datacounter =datacounter + 1; assert(pktTx_); hdr_ll* llh=HDR_LL(pktTx_); if (datacounter <4){ if (llverbose_==1) fprintf(stderr,"<%d> %f LL: wait for ack timed out. retxing ll_seqno=%d bopno=%d eopno=%d for %dth time\n", mac_->addr(), NOW, llh->seqno_, llh->bopno_, llh->eopno_, datacounter); Scheduler& s = Scheduler::instance(); s.schedule(downtarget_, pktTx_->copy(), delay_); lhSend_.stop(); lhSend_.start(0.5); } else{ if (llverbose_==1) fprintf(stderr,"<%d> %f LL: retxed 5 times. ditched ll_seqno=%d bopno=%d eopno=%d\n", mac_->addr(), NOW, llh->seqno_, llh->bopno_, llh->eopno_); datacounter=0; //check this up...was good without it ackno_ ++; sendDownDATA(); }}void LL::RetransmitACK(){ ackcounter =ackcounter +1; assert(pktRx_); hdr_ll *llh=HDR_LL(pktRx_); if (ackcounter < 4){ if (llverbose_==1) fprintf(stderr,"<%d> %f LL: retx ack=%d for %dth time\n", mac_->addr(), NOW, llh->ackno_, ackcounter); Scheduler& s = Scheduler::instance(); s.schedule(downtarget_,pktRx_->copy(),delay_); acSend_.stop(); acSend_.start(0.5); } else{ if (llverbose_==1) fprintf(stderr,"<%d> %f LL: retx ack 5 times. ditching\n", mac_->addr(), NOW ); }}/* hack for the sendDown being called directly from snoop and satlink*/void LL::sendDown(Packet* p){ enqueDATA(p);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -