您的位置:首页 > 理论基础 > 计算机网络

网络子系统18_arp对代理的处理

2013-09-30 13:48 190 查看
//	代理使用的特性:
//		medium-id  当ARP请求的目的地址非本机地址时,处理ip子网横跨不同的lan,且该子网中提供arp请求的主机有多快nic,设置这些nic是否在同一lan

//	arp代理处理的特点:
//		1.本机arp请求的优先级高于对代理主机的arp请求

//	延迟处理的实现:
//		1.通过tbl->proxy_queue入队对代理地址的arp,通过param->proxy_delay指定封包在代理队列中应该待的时间

//	arp代理处理
//	函数主要功能:
//		1. 设备需要开启转发功能
//		2. 目的ip地址应该为单播类型
//		3. 发送arp请求的主机与被代理的主机使用不同的接口设备连接
//		4. 已经开启全局代理或设备代理,并且入口lan与出口lan不同
//		5. 如果arp没有被延迟处理,则延迟处理,否则应答
1.1 static int arp_process(struct sk_buff *skb)
{
...

//请求地址非本机ip,存在到目的地的路由
} else if (IN_DEV_FORWARD(in_dev)) {//输入接口具有转发功能
if ((rt->rt_flags&RTCF_DNAT) ||//此路由项执行目的地网络地址转换
(addr_type == RTN_UNICAST  && rt->u.dst.dev != dev &&//或目的ip地址为单播类型,并且出口设备不是入口设备
(arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &tip, dev, 0)))) {//设备可以处理代理,或者代理过的地址数据库中有目的地址
n = neigh_event_ns(&arp_tbl, sha, &sip, dev);//创建发送ip对应的neighbour结构,被动学习
if (n)
neigh_release(n);

if (skb->stamp.tv_sec == LOCALLY_ENQUEUED || //检测此skb是从延时队列中出队的
skb->pkt_type == PACKET_HOST ||//或者配置了延时处理,目标主机为本机
in_dev->arp_parms->proxy_delay == 0) {//入口设备配置不适用延时
arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);//应答arp
} else {
pneigh_enqueue(&arp_tbl, in_dev->arp_parms, skb);//否则将此arp入队,延时处理
in_dev_put(in_dev);
return 0;
}
goto out;
}
}
}

...
//此skb为邻居可达的证据,更新邻居状态
...

out:
if (in_dev)
in_dev_put(in_dev);
kfree_skb(skb);
return 0;
}

//	判断是否可以对此主机进行代理
//		1.开启全局代理或设备代理
//		2.被代理主机与请求主机应该在不同的lan
2.1 static inline int arp_fwd_proxy(struct in_device *in_dev, struct rtable *rt)
{
struct in_device *out_dev;
int imi, omi = -1;
//是否开启设备代理,或者全局代理
if (!IN_DEV_PROXY_ARP(in_dev))
return 0;
//一台主机,给连接在同一个lan的多个nic设置相同的medium-id,告诉协议这些nic是否在同一的lan上
if ((imi = IN_DEV_MEDIUM_ID(in_dev)) == 0)//medium-id特性被关闭
return 1;
if (imi == -1)//arp代理已关闭
return 0;

if ((out_dev = in_dev_get(rt->u.dst.dev)) != NULL) {
omi = IN_DEV_MEDIUM_ID(out_dev);
in_dev_put(out_dev);
}
return (omi != imi && omi != -1);//出口设备的medium-id不等于出口设备的medium-id时,才可以代理此请求,表示两块nic在不用的lan
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息