Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8917
  • 博文数量: 6
  • 博客积分: 172
  • 博客等级: 入伍新兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-27 14:02
文章分类

全部博文(6)

文章存档

2012年(6)

我的朋友
最近访客

分类: BSD

2012-03-19 19:09:10

IP6_EXTHDR_CHECK(m, off, hlen, ret)

因为一个数据包可以放在多个mbuf里,(mbuf link),而KAME的普遍实现,是要保证后面所操作的header或者option必须在一段连续的内存里,IP6_EXTHDR_CHECK是一个宏,用来检查从ipv6 header起始开始,到距离ipv6 header的偏移off,以及后面hlen长度都在同一个mbuf里面。

实现如下:

#define IP6_EXTHDR_CHECK(m, off, hlen, ret)                                 \

do {                                                                             \

    if ((m)->m_next != NULL) {                                                    \

         if ((m)->m_len < (off) + (hlen)) {                               \

                   ip6stat.ip6s_exthdrtoolong++;                                 \

                   m_freem(m);                                                      \

                   return ret;                                                 \

         }                                                                         \

    } else {                                                                           \

         if ((m)->m_len < (off) + (hlen)) {                               \

                   ip6stat.ip6s_tooshort++;                                 \

                   in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);     \

                   m_freem(m);                                                      \

                   return ret;                                                 \

         }                                                                         \

    }                                                                            \

} while (/*CONSTCOND*/ 0)

 

正常应用是,m是mbuf,当前mbuf的data距离ipv6 header的偏移的off,检查接下来的hlen是否和ipv6 header在连续内存中。

这个宏并不改变mbuf的内容,如果不满足条件,会直接return。所以KAME里某些地方在调用IP6_EXTHDR_CHECK后,重置ipv6 header或其他option指针,是没有必要的。

阅读(541) | 评论(0) | 转发(0) |
0

上一篇:KAME IPv6的地址结构

下一篇:没有了

给主人留下些什么吧!~~