- 论坛徽章:
- 0
|
原帖由 sunorr 于 2008-8-7 17:24 发表 ![]()
那NF在内核中是在TCP/IP协议栈之前呢?还是之后呢?
net/core/dev.c
int netif_receive_skb(struct sk_buff *skb)
{
struct packet_type *ptype, *pt_prev;
struct net_device *orig_dev;
int ret = NET_RX_DROP;
unsigned short type;
...
...
/* 类似于tcpdump这样的程序(或者其它使用libpcap的程序)
就在这个地方抓到这个包 */
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;
}
}
...
/* 根据是否是桥上的接口,包可能会通过这里到达桥处理包的代码 */
if (handle_bridge(&skb, &pt_prev, &ret, orig_dev))
goto out;
/* 如过桥(2层)不处理该包,那么该包就要走向3层也就是tcp/ip协议栈的网络层了
根据是IP协议还是arp协议等,最后把包传递给相应的函数,该函数由协议初始化的时候注册的
比如ip_rcv, ipv6_rcv, arp_rcv等 */
type = skb->protocol;
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;
}
}
if (pt_prev) {)
ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);//ip_rcv~~~~~~~
} else {
/* 没有函数处理这种协议,比如自定义的非arp/ip 的协议 */
kfree_skb(skb);
/* Jamal, now you will not able to escape explaining
* me how you were going to use this. 
*/
ret = NET_RX_DROP;
}
out:
rcu_read_unlock();
return ret;
}
net/ipv4/ip_input.c
/*
* Main IP Receive routine.
*/
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
struct iphdr *iph;
u32 len;
...
...
/* 通向netfilter之路 */}}}
return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,
ip_rcv_finish);
inhdr_error:
IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
drop:
kfree_skb(skb);
out:
return NET_RX_DROP;
}
在netfilter处理之后再往4层走,发包也是类似的 |
|