分类: 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指针,是没有必要的。