netRIver实验(三,ipv4转发)

遇到的问题

  • map函数的insert插入方法不是替换式插入,在题目中需要直接使用索引的方式插入routeTable[ipAddr] = route;
  • 需要注意给出的路由信息的字节顺序
  • 需要为自己保存的路由信息单独新申请内存并复制否则给出的内存地址可能会被回收导致数据出错

代码

/*
* THIS FILE IS FOR IP FORWARD TEST
*/
#include "sysInclude.h"
#include <map>
using namespace std;

// system support
extern void fwd_LocalRcv(char *pBuffer, int length);

extern void fwd_SendtoLower(char *pBuffer, int length, unsigned int nexthop);

extern void fwd_DiscardPkt(char *pBuffer, int type);

extern unsigned int getIpv4Address();

// implemented by students

map<unsigned, stud_route_msg*> routeTable;

void stud_Route_Init()
{
	printf("-----init a routeTable!\n");
	return;
}

void stud_route_add(stud_route_msg *proute)
{
	unsigned ipAddr = proute->dest;
	ipAddr = ntohl(ipAddr);
	stud_route_msg* route = (stud_route_msg*)malloc(sizeof(stud_route_msg));
	memcpy(route, proute, sizeof(stud_route_msg));
	routeTable[ipAddr] = route;
	printf("-----add a route of ip %x,nextIp is %x\n", ipAddr, proute->nexthop);
	return;
}
unsigned getCheckSum(unsigned short* pBuffer, unsigned headLen) {
	unsigned sum = 0;
	int i = 0;
	headLen = headLen / 2;
	while (headLen > i) {
		sum += (unsigned)(pBuffer[i]);
		i++;
	}
	if (sum & 0xffff != sum) {
		sum = (sum & 0xffff) + (sum >> 16);
	}
	return sum;
}
int stud_fwd_deal(char *pBuffer, int length)
{
	unsigned localAddr = getIpv4Address();
	unsigned recvAddr = ((unsigned*)pBuffer)[4];
	recvAddr = ntohl(recvAddr);
	printf("-----the local addr is %x ,the recv addr is %x\n", localAddr, recvAddr);

	/*本地接受*/
	if (localAddr == recvAddr) {
		fwd_LocalRcv(pBuffer, length);
		return 0;
	}

	/*查找路由表*/
	stud_route_msg* route = routeTable[recvAddr];
	/*错误分组*/
	if (route == NULL) {
		fwd_DiscardPkt(pBuffer, STUD_FORWARD_TEST_NOROUTE);
		printf("-----wrong ip!\n");
		return 1;
	}

	//检查生存时间
	unsigned ttl = (unsigned)(pBuffer[8]);
	printf("-----the ttl is %d\n", ttl);
	if (ttl == 0) {
		fwd_DiscardPkt(pBuffer, STUD_FORWARD_TEST_TTLERROR);
		return 1;
	}

	/*发送至下一个路由*/
	unsigned int nextIp = route->nexthop;
	printf("-----next ip is %x\n", nextIp);
	//init header checksum
	((unsigned short*)pBuffer)[5] = 0;
	//更改ttl
	pBuffer[8] -= 1;
	//计算校验和
	unsigned headLen = (unsigned)(pBuffer[0]) & 0xf;
	headLen *= 4;
	unsigned short checkSum = ~getCheckSum((unsigned short*)pBuffer, headLen);
	((unsigned short*)pBuffer)[5] = checkSum;
	printf("-----checksum is %x\n", checkSum);
	fwd_SendtoLower(pBuffer, length, nextIp);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值