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

📄 dsr-io.c

📁 DSR-UU is a DSR implementation that runs in Linux and in the ns-2 network simulator. DSR-UU imple
💻 C
字号:
/* Copyright (C) Uppsala University * * This file is distributed under the terms of the GNU general Public * License (GPL), see the file LICENSE * * Author: Erik Nordström, <erikn@it.uu.se> */#ifdef NS2#include "ns-agent.h"#else#include "dsr-dev.h"#endif#include "dsr.h"#include "dsr-pkt.h"#include "dsr-rreq.h"#include "dsr-rrep.h"#include "dsr-srt.h"#include "dsr-ack.h"#include "dsr-rtc.h"#include "dsr-ack.h"#include "maint-buf.h"#include "neigh.h"#include "dsr-opt.h"#include "link-cache.h"#include "debug.h"#include "send-buf.h"int NSCLASS dsr_recv(struct dsr_pkt *dp){	int i = 0, action;	int mask = DSR_PKT_NONE;	/* Process DSR Options */	action = dsr_opt_recv(dp);	/* Add mac address of previous hop to the neighbor table */	if (dp->flags & PKT_PROMISC_RECV) {		dsr_pkt_free(dp);		return 0;	}	for (i = 0; i < DSR_PKT_ACTION_LAST; i++) {			switch (action & mask) {		case DSR_PKT_NONE:			break;		case DSR_PKT_DROP:		case DSR_PKT_ERROR:			DEBUG("DSR_PKT_DROP or DSR_PKT_ERROR\n");			dsr_pkt_free(dp);			return 0;		case DSR_PKT_SEND_ACK:			/* Moved to dsr-ack.c */			break;		case DSR_PKT_SRT_REMOVE:			//DEBUG("Remove source route\n");			// Hmm, we remove the DSR options when we deliver a			//packet			//dsr_opt_remove(dp);			break;		case DSR_PKT_FORWARD:#ifdef NS2			if (dp->nh.iph->ttl() < 1)#else			if (dp->nh.iph->ttl < 1)#endif			{				DEBUG("ttl=0, dropping!\n");				dsr_pkt_free(dp);				return 0;			} else {				DEBUG("Forwarding %s %s nh %s\n",				      print_ip(dp->src),				      print_ip(dp->dst), print_ip(dp->nxt_hop));				XMIT(dp);				return 0;			}			break;		case DSR_PKT_FORWARD_RREQ:			XMIT(dp);			return 0;		case DSR_PKT_SEND_RREP:			/* In dsr-rrep.c */			break;		case DSR_PKT_SEND_ICMP:			DEBUG("Send ICMP\n");			break;		case DSR_PKT_SEND_BUFFERED:			if (dp->rrep_opt) {				struct in_addr rrep_srt_dst;				int i;								for (i = 0; i < dp->num_rrep_opts; i++) {					rrep_srt_dst.s_addr = dp->rrep_opt[i]->addrs[DSR_RREP_ADDRS_LEN(dp->rrep_opt[i]) / sizeof(struct in_addr)];										send_buf_set_verdict(SEND_BUF_SEND, rrep_srt_dst);				}			}				break;		case DSR_PKT_DELIVER:			DEBUG("Deliver to DSR device\n");			DELIVER(dp);			return 0;		case 0:			break;		default:			DEBUG("Unknown pkt action\n");		}		mask = (mask << 1);	}	dsr_pkt_free(dp);	return 0;}void NSCLASS dsr_start_xmit(struct dsr_pkt *dp){	int res;	if (!dp) {		DEBUG("Could not allocate DSR packet\n");		return;	}	dp->srt = dsr_rtc_find(dp->src, dp->dst);	if (dp->srt) {		if (dsr_srt_add(dp) < 0) {			DEBUG("Could not add source route\n");			goto out;		}		/* Send packet */		XMIT(dp);		return;	} else {#ifdef NS2		res = send_buf_enqueue_packet(dp, &DSRUU::ns_xmit);#else		res = send_buf_enqueue_packet(dp, &dsr_dev_xmit);#endif		if (res < 0) {			DEBUG("Queueing failed!\n");			goto out;		}		res = dsr_rreq_route_discovery(dp->dst);		if (res < 0)			DEBUG("RREQ Transmission failed...");		return;	}      out:	dsr_pkt_free(dp);}

⌨️ 快捷键说明

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