IPv6实现--转发包的处理流程(2)

进入第一个钩子NF_HOOK(PF_INET6, NF_INET_PRE_ROUTING, skb, dev, NULL,ip6_rcv_finish)后,ip6_rcv_finish()将调用下列3个函数之一:ip6_input()、ip6_mc_input()、ip6_forward()。

当IPv6包必须要转发的时候,ip6_rcv_finish()函数调用ipv6_forward(),这里ipv6_forward()函数是通过struct inet6_protocol钩子结构钩到的,在(1)中提到在内核代码中查到的为input函数指针赋值的地方在~net/ipv6/route.c中:
struct rt6_info *addrconf_dst_alloc()函数       rt->u.dst.input = ip6_input;
int ip6_route_add()函数                       if (addr_type & IPV6_ADDR_MULTICAST)
                                        rt->u.dst.input = ip6_mc_input;
                                            else
                                        rt->u.dst.input = ip6_forward;
那么ip6_route_add()函数又是何时被执行的呢?
说明一下到本机的路由表项的初始化过程。到本机的路由表的初始化是在给网卡分配ipv6地址的时候初始化的,代码在addrconf.c中。比如当用户在给网卡手动赋ipv6地址的时候,会通过netlink接口,传递到内核以后,就由rtnetlink_rcv_msg()来处理。Rtnetlink_recv_msg()会根据family的值,在rtnetlink_links[family]表中进行查找,找到对应协议簇的处理表。对于ipv6而言是PF_INET6协议簇,调用的是inet6_rtnetlink_table[]。在inet6_rtnetlink_table[]表中,对应添加网卡ipv6地址的处理函数是inet6_rtm_newaddr()函数,因此整个处理过程是inet6_rtm_newaddr()-->ipv6_add_addr() --> addrconf_dst_alloc()-->rt->u.dst.input = ip6_input(),从而转入ip6_input()函数的处理。

转发路由表项的初始化和到本机的路由表的初始化过程类似。不同的是从netlink到ip6_route_add(),由于是转发故rt->u.dst.input = ip6_forward。需要注意的是,在ip6_forward中,将会进行最后一次的安全检查,对需要经过隧道处理的包,要在包头再次添加IPv6头之后才会交到数据链路层。

ip6_forward()函数通过钩子NF_HOOK(PF_INET6, NF_INET_FORWARD, skb, skb->dev, dst->dev,ip6_forward_finish),调用到ip6_forward_finish()函数,其定义:
static inline int ip6_forward_finish(struct sk_buff *skb)
{
    return dst_output(skb);
}
static inline int dst_output(struct sk_buff *skb)
{
    return skb->dst->output(skb);
}

这里的output()函数又由~net/ipv6/route.c中的函数钩到ip6_output()函数,然后ipv6包传出本机

参考:
http://blog.csdn.net/uestc_huan/archive/2009/01/08/3735884.aspx
《linux网络体系结构》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值