标签:
杂谈 |
在多个proxy和软交换的情况下,对record-route和route一直都是蒙查查。只好先中断开发,请我们的协议高手看看,PS说他要仔细看看RFC
3261。有点空闲,将ETH_P_ALL的问题详细说清楚。
ETH_P_ALL含有各种类型,但是我们在具体处理不同类型是,需采用不同的方式,大致上分为2类。一类是设备需要解析的,需要送到上层分析或者需要进行转发的数据包,例如ETH_P_ALL,ETH_P_ARP等等,一类包属于在混杂模式下捕获,不需送到上层处理,需要终结的一类。
在我们采用ETH_P_ALL时,我们很难确定网络的情况(不采用混杂模式除外),我们不一定能对每个数据包采用正确的方式处理,导致系统死机。下面给出一个例子,假设机器不分析vlan,也就是ETH_P_8021Q属于和ETH_P_IP不同处理的方式,蓝色表示使用ETH_P_8021Q的情况,可以在例子中看到区别:
struct packet_type ourpt, *ippt = NULL;
init_module(){
……
struct packet_type *temp;
ourpt.type = htons(ETH_P_IP);
ourpt.type =
htons(ETH_P_8021Q);
ourpt.dev = NULL;
ourpt.func = rcv_ip_packet;
ourpt.data = NULL;
ourpt.next = NULL;
ourpt.dev = NULL;
ourpt.func = rcv_ip_packet;
ourpt.data = NULL;
ourpt.next = NULL;
dev_add_pack(&ourpt);
temp = &ourpt;
for (us = us->next; us; us =
us->next) {
if (temp->type == ourpt.type) {
if (temp->type == ourpt.type) {
//在ETH_P_IP,进入这里,说明系统对IP包进行处理,将系统的勾子去掉『在多次dev_add_pack中,自动在最前面加上新添的钩子』,并记下系统钩子的位置,以便在执行完我们的操作后,进行系统的缺省操作,例如送到IP层作进一步处理。
//在ETH_P_8021Q,不进入这里,说明系统对vlan的包不进行处理
//如果我们使用ETH_P_ALL,在这里就很难处理了,除非我们打算中断系统的正常处理,而不是在其中插入我们的钩子,否则不要轻易使用ETH_P_ALL
printk("Already has dev at %x\n",temp);
ippt = temp;
dev_remove_pack(us);
break;
}
}
……
ippt = temp;
dev_remove_pack(us);
break;
}
}
……
}
cleanup_module(){
……
dev_remove_pack(&ourpt);
if(ippt)
dev_add_pack(ippt);
dev_add_pack(ippt);
//不需要dev_add_pack加上原来的勾,因为原来没有勾,ippt ==
NULL
……
……
}
int rcv_ip_packet(struct sk_buff *skb, struct net_device *dev,
struct packet_type *ptype){
... ...
... ...
if(ippt){//对ip
if(skb->pkt_type ==
PACKET_OTHERHOST){
kfree_skb(skb);
return NET_RX_DROP;
}
kfree_skb(skb);
return NET_RX_DROP;
}
//调用系统的缺省处理
return ippt->func(skb, dev, ippt);}else{ //对vlan
kfree_skb(skb);
return NET_RX_DROP;
return NET_RX_DROP;
}
}
所以我们要在程序中加上相关的判断对两种方式进行不同的处理方可。
前一篇:ETH_P_ALL慎用
后一篇:慢速生活