打印

Linux系统内核接收以太帧的处理程序 (2)

Linux系统内核接收以太帧的处理程序 (2)

由于IP协议部分不能作为内核模块,所以是没有卸载函数的,没必要调用
知识在于积累,积分在于灌水

TOP

dev_remove_pack()函数。

4.2 8021q vlan


/* net/8021q/vlan.c */
static struct packet_type vlan_packet_type = {
.type = __constant_htons(ETH_P_8021Q),
.func = vlan_skb_recv, /* VLAN receive method */
};
......
static int __init vlan_proto_init(void)
{
......
dev_add_pack(&vlan_packet_type);
......

static void __exit vlan_cleanup_module(void)
{
......
dev_remove_pack(&vlan_packet_type);
......


由于VLAN可为模块方式存在,所以在模块清除函数中要调用dev_remove_pack()。

5. 网络接收

网卡驱动收到数据包构造出skb后,通过接口函数netif_receive_skb()传递到上层进行协议处理分配。


/* net/core/dev.c */
int netif_receive_skb(struct sk_buff *skb)
{
......
// 先查处理所有以太类型的链表各节点
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (!ptype->dev || ptype->dev == skb->dev) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
......
// 再查指定协议的HASH链表
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
if (ptype->type == type &&
(!ptype->dev || ptype->dev == skb->dev)) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
}
......

// 该函数就是调用个协议的接收函数处理该skb包,进入第三层网络层处理
static __inline__ int deliver_skb(struct sk_buff *skb,
struct packet_type *pt_prev,
struct net_device *orig_dev)
{
atomic_inc(&skb->users);
return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
}
知识在于积累,积分在于灌水

TOP

难道是执行完毕,默认调用卸载?
每一天都在努力

TOP

是不卸载的?

TOP

不卸的话,会造成内存垃圾的哦~
每一天都在努力

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-9-7 14:56 京ICP证060528 号

Designed By 17DST