⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ll.cc

📁 一个很好的LINUX底下的GPRS协议栈
💻 CC
📖 第 1 页 / 共 2 页
字号:
						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 + -