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

📄 mip.cc

📁 ns2--网络仿真软件扩展!·
💻 CC
字号:
/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * Copyright (c) Sun Microsystems, Inc. 1998 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 Sun Microsystems, Inc. * * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or *      promote products derived from this software without specific prior *      written permission. * * SUN MICROSYSTEMS MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS * SOFTWARE FOR ANY PARTICULAR PURPOSE.  The software is provided "as is" * without express or implied warranty of any kind. * * These notices must be retained in any copies of any part of this software. */// #ident "@(#)mip.cc  1.4     98/08/21 SMI"#include <address.h>#include "mip.h"#define IP_HEADER_SIZE	20int hdr_ipinip::offset_;static class IPinIPHeaderClass : public PacketHeaderClass {public:        IPinIPHeaderClass() : PacketHeaderClass("PacketHeader/IPinIP",					    sizeof(hdr_ipinip*)) {		bind_offset(&hdr_ipinip::offset_);	}} class_ipiniphdr;static class MIPEncapsulatorClass : public TclClass {public:	MIPEncapsulatorClass() : TclClass("MIPEncapsulator") {}	TclObject* create(int, const char*const*) {		return (new MIPEncapsulator());	}} class_mipencapsulator;MIPEncapsulator::MIPEncapsulator() : Connector(), mask_(0xffffffff), 	shift_(8), defttl_(32){	bind("addr_", (int*)&(here_.addr_));	bind("port_", (int*)&(here_.port_));	bind("shift_", &shift_);	bind("mask_", &mask_);	bind("ttl_", &defttl_);}void MIPEncapsulator::recv(Packet* p, Handler *h){	Tcl& tcl = Tcl::instance();	hdr_ip* hdr = hdr_ip::access(p);	hdr_ipinip **ppinhdr = (hdr_ipinip**)hdr_ipinip::access(p);	if (--hdr->ttl_ <= 0) {		/*		 * XXX this should be "dropped" somehow.  Right now,		 * these events aren't traced.		 */		hdr_ipinip *ptr = *ppinhdr, *temp;		while (ptr != NULL) {			temp = ptr;			ptr = ptr->next_;			delete temp;		}		*ppinhdr = NULL;		Packet::free(p);		return;	}	hdr_ipinip *inhdr = new hdr_ipinip;	//int dst = ((hdr->dst() >> shift_) & mask_);	int dst = Address::instance().get_nodeaddr(hdr->daddr());	tcl.evalf("%s tunnel-exit %d", name_, dst);	int te = atoi(tcl.result());	inhdr->next_ = *ppinhdr;	*ppinhdr = inhdr;	inhdr->hdr_ = *hdr;	hdr->saddr() = here_.addr_;	hdr->sport() = here_.port_;	//hdr->dst() = addr_ & ~(~(nsaddr_t)0 << shift_) | (te & mask_) << shift_;;	hdr->daddr() = te;	hdr->dport() = 1;	hdr->ttl() = defttl_;	hdr_cmn::access(p)->size() += IP_HEADER_SIZE;	target_->recv(p,h);}static class MIPDecapsulatorClass : public TclClass {public:	MIPDecapsulatorClass() : TclClass("Classifier/Addr/MIPDecapsulator") {}	TclObject* create(int, const char*const*) {		return (new MIPDecapsulator());	}} class_mipdecapsulator;MIPDecapsulator::MIPDecapsulator() : AddressClassifier(){}void MIPDecapsulator::recv(Packet* p, Handler *h){	hdr_ipinip **ppinhdr = (hdr_ipinip **)hdr_ipinip::access(p);	// restore inner header	hdr_ip *pouthdr = hdr_ip::access(p);	assert(ppinhdr);	hdr_ip *pinhdr = &(*ppinhdr)->hdr_;	*ppinhdr = (*ppinhdr)->next_;	*pouthdr = *pinhdr;	NsObject* link = find(p);	// for mobilenodes use default-target which is probably the 	// RA. cannot use node_entry point instead, as hier address	// of MH point to HA. hence hand decapsulated pkt directly 	// to RA.	if (link == NULL || pinhdr->ttl_ <= 0) {		/*		 * XXX this should be "dropped" somehow.  Right now,		 * these events aren't traced.		 */		hdr_ipinip *ptr = *ppinhdr, *temp;		while (ptr != NULL) {			temp = ptr;			ptr = ptr->next_;			delete temp;		}		*ppinhdr = NULL;		delete pinhdr;		Packet::free(p);		return;	}	delete pinhdr;	hdr_cmn::access(p)->size() -= IP_HEADER_SIZE;	link->recv(p,h);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -