`
shaojiashuai123456
  • 浏览: 262217 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

ipv6 处理扩展头

阅读更多
160 static int ip6_input_finish(struct sk_buff *skb)
161 {
162         struct inet6_protocol *ipprot;   //注册协议结构体
163         unsigned int nhoff;
164         int nexthdr, raw;
165         u8 hash;
166         struct inet6_dev *idev;
167         struct net *net = dev_net(skb_dst(skb)->dev);
168 
169         /*
170          *      Parse extension headers
171          */
172 
173         rcu_read_lock();
174 resubmit:
175         idev = ip6_dst_idev(skb_dst(skb));
176         if (!pskb_pull(skb, skb_transport_offset(skb)))
177                 goto discard;
178         nhoff = IP6CB(skb)->nhoff;
179         nexthdr = skb_network_header(skb)[nhoff];
180 
181         raw = raw6_local_deliver(skb, nexthdr);
182 
183         hash = nexthdr & (MAX_INET_PROTOS - 1);
184         if ((ipprot = rcu_dereference(inet6_protos[hash])) != NULL) {
185                 int ret;
186 
187                 if (ipprot->flags & INET6_PROTO_FINAL) {
188                         struct ipv6hdr *hdr;
189 
190                         /* Free reference early: we don't need it any more,
191                            and it may hold ip_conntrack module loaded
192                            indefinitely. */
193                         nf_reset(skb);
194 
195                         skb_postpull_rcsum(skb, skb_network_header(skb),
196                                            skb_network_header_len(skb));
197                         hdr = ipv6_hdr(skb);
198                         if (ipv6_addr_is_multicast(&hdr->daddr) &&
199                             !ipv6_chk_mcast_addr(skb->dev, &hdr->daddr,
200                             &hdr->saddr) &&
201                             !ipv6_is_mld(skb, nexthdr))
202                                 goto discard;
203                 }
204                 if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&
205                     !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
206                         goto discard;
207 
208                 ret = ipprot->handler(skb);       //此处调用当前扩展头部解析函数
209                 if (ret > 0)
210                         goto resubmit;                  //直到扩展头被解析完,否则提交到上面,继续解析
211                 else if (ret == 0)
212                         IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDELIVERS);
213         } else {
214                 if (!raw) {
215                         if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
216                                 IP6_INC_STATS_BH(net, idev,
217                                                  IPSTATS_MIB_INUNKNOWNPROTOS);
218                                 icmpv6_send(skb, ICMPV6_PARAMPROB,
219                                             ICMPV6_UNK_NEXTHDR, nhoff,
220                                             skb->dev);
221                         }
222                 } else
223                         IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDELIVERS);
224                 kfree_skb(skb);
225         }
226         rcu_read_unlock();
227         return 0;
228 
229 discard:
230         IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDISCARDS);
231         rcu_read_unlock();
232         kfree_skb(skb);
233         return 0;
234 }
协议注册结构体: 
50 struct inet6_protocol 
 51 {
 52         int     (*handler)(struct sk_buff *skb);
 53 
 54         void    (*err_handler)(struct sk_buff *skb,
 55                                struct inet6_skb_parm *opt,
 56                                u8 type, u8 code, int offset,
 57                                __be32 info);
 58 
 59         int     (*gso_send_check)(struct sk_buff *skb);
 60         struct sk_buff *(*gso_segment)(struct sk_buff *skb,
 61                                        int features);
 62         struct sk_buff **(*gro_receive)(struct sk_buff **head,
 63                                         struct sk_buff *skb);
 64         int     (*gro_complete)(struct sk_buff *skb);
 65 
 66         unsigned int    flags;  /* INET6_PROTO_xxx */
 67 };

 

 

 

  

常用解析函数:

 

 

      //ah协议头处理
 530 static struct inet6_protocol ah6_protocol = {
 531         .handler        =       xfrm6_rcv,
 532         .err_handler    =       ah6_err,
 533         .flags          =       INET6_PROTO_NOPOLICY,
 534 };
       //路由协议头处理
503 static struct inet6_protocol rthdr_protocol = {
504         .handler        =       ipv6_rthdr_rcv,
505         .flags          =       INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
506 };
       //目的协议头处理
508 static struct inet6_protocol destopt_protocol = {
509         .handler        =       ipv6_destopt_rcv,
510         .flags          =       INET6_PROTO_NOPOLICY | INET6_PROTO_GSO_EXTHDR,
511 };

        
513 static struct inet6_protocol nodata_protocol = {
514         .handler        =       dst_discard,
515         .flags          =       INET6_PROTO_NOPOLICY,
516 };
        //tcp协议头处理
2095 static struct inet6_protocol tcpv6_protocol = {
2096         .handler        =       tcp_v6_rcv,
2097         .err_handler    =       tcp_v6_err,
2098         .gso_send_check =       tcp_v6_gso_send_check,
2099         .gso_segment    =       tcp_tso_segment,
2100         .gro_receive    =       tcp6_gro_receive,
2101         .gro_complete   =       tcp6_gro_complete,
2102         .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
2103 };

1033 static struct inet6_protocol udpv6_protocol = {
1034         .handler        =       udpv6_rcv,
1035         .err_handler    =       udpv6_err,
1036         .flags          =       INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
1037 };
         //esp协议头处理
561 static struct inet6_protocol esp6_protocol = {
562         .handler        =       xfrm6_rcv,
563         .err_handler    =       esp6_err,
564         .flags          =       INET6_PROTO_NOPOLICY,
565 };
           //管道协议头处理
136 static struct inet6_protocol tunnel6_protocol = {
137         .handler        = tunnel6_rcv,
138         .err_handler    = tunnel6_err,
139         .flags          = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
140 };
141 
           
142 static struct inet6_protocol tunnel46_protocol = {
143         .handler        = tunnel46_rcv,
144         .err_handler    = tunnel6_err,
145         .flags          = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
146 };


 

分享到:
评论

相关推荐

    IPv6寻址-IPv6扩展头简介.pdf

    IPv6扩展头是IPv6协议族中的一个重要组成部分,它的设计目的是为了提高网络处理能力和灵活性,同时简化IPv4中复杂选项的处理方式。IPv6扩展头主要用于携带那些在基本的IPv6头部中无法容纳的额外信息,例如特定路由、...

    IPV6详解(第五章)

    在扩展和选项支持方面,IPv6使用扩展头的概念,将选项从主包头中分离出来,只有在需要时才进行处理。这允许IPv6更加灵活地支持新的功能,如流量标签,用于标识和优先处理特定的数据流,这对于实时通信和服务质量控制...

    IPV6详解(第七章)

    IPv6扩展头的设计简化了选项的处理,避免了IPv4中复杂的选项处理带来的性能影响。所有IPv6头的长度固定,通过`下一个头`字段指示是否存在扩展头及扩展头的类型。这允许扩展头形成一个链,从基本的IPv6头开始,按顺序...

    IPv6的概念-IPv6与IPv4的比较.pdf

    IPv6与IPv4的比较还体现在扩展头的使用上,IPv6允许通过扩展头携带额外的信息,如路由选项、分片信息、认证和加密等,而IPv4则没有这样的机制。这增强了IPv6的灵活性和安全性。 总的来说,IPv6是对IPv4的一次重大...

    IPv6 详解 中文版

    IPv6使用扩展头部来处理之前在IPv4中作为选项包含的信息,如路由选择、分片和认证等。扩展头部可以灵活地插入到IP包的头部与负载之间,允许在网络层实现更复杂的操作,同时避免了IPv4中选项字段导致的解析复杂性和...

    IPv4网络向IPv6网络的演进.pdf

    1. **扩展的编址能力**:IPv6将地址长度从32位扩展到了128位,极大地增加了地址空间。此外,IPv6还支持更灵活的地址自动配置机制,并引入了“范围”域以提高组播路由的可量测性,以及一种新的地址类型——“任意播...

    Cisco IPv6

    - **简化头部格式**:IPv6对头部进行了简化处理,去除了IPv4中的某些字段,减少了不必要的复杂性,提高了数据传输效率。 - **流标签**:IPv6引入了流标签机制,使得特定的数据流可以得到特殊的处理,这对于实时应用...

    IPv6个人学习笔记.pdf

    扩展包头允许在基本包头之后加入可选的扩展信息,增加了IP包处理的灵活性。 IPv6地址类型: IPv6定义了多种地址类型,包括单播、组播和任意播。单播地址用于唯一标识网络中的一个接口,组播地址则用于标识一组接口...

    IPv6技术课件:IPv6数据报格式.pdf

    IPv6数据报格式 IPv6数据报格式是指IPv6协议中数据报的格式,它是IPv6协议的核心之一。IPv6数据报格式主要由三...路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头,并不是所需的扩展头都需要处理。

    IPV6子网划分工具

    传统的IPv4子网掩码计算通常是基于32位的,而在IPv6中,地址长度扩展到了128位。这就引入了更复杂的子网计算规则,需要处理的位数是IPv4的四倍。此工具的功能强大,能帮助用户轻松处理这些复杂的计算,确保网络规划...

    ipv6内容复习资料

    IPv4采用32位地址长度,而IPv6则将其扩展到了128位,极大地增加了可分配的地址数量。这一变化不仅能够满足当前及未来互联网的爆炸式增长需求,还为网络设计提供了更加灵活的选择,支持更多层次的寻址结构。 #### 二...

    IPv6资源包.zip

    IPv6报头比IPv4更简洁,去除了许多IPv4报头中的可选字段,提高了处理速度。 **九、移动性和安全性增强** IPv6设计时考虑了移动性,允许设备在保持通信的同时改变其网络连接。此外,IPv6还内置了IPsec安全协议,...

    IPv6 cisco 讲课 课件

    在IPv6中,地址空间得到了极大的扩展,从IPv4的32位地址扩展到了128位,理论上可以提供约3.4x10^38个地址,足以满足未来数百年内的设备连接需求。这使得全球每粒沙子理论上都可以分配到一个唯一的IPv6地址,极大地...

Global site tag (gtag.js) - Google Analytics