Chinaunix

标题: Linux内核::网络层ip_options.c::void ip_options_build内一处实现不解 [打印本页]

作者: 风情123    时间: 2012-12-23 16:13
标题: Linux内核::网络层ip_options.c::void ip_options_build内一处实现不解
请教下:Linux内核中网络层ip_options.c中
void ip_options_build(struct sk_buff * skb, struct ip_options * opt,
     __be32 daddr, struct rtable *rt, int is_frag)
{
unsigned char * iph = skb->nh.raw;

memcpy(&(IPCB(skb)->opt), opt, sizeof(struct ip_options));
memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen);
。。。。。。

关于
memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen);
不是很理解的;

我认为应该是:
memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen - sizeof(struct ip_options));的
请各位好心人多多指点,在此不胜感激,多谢了~


PS:
struct ip_options {
__be32  faddr;
unsigned char optlen;
unsigned char srr;
unsigned char rr;
unsigned char ts;
unsigned char is_data:1,
is_strictroute:1,
srr_is_hit:1,
is_changed:1,
rr_needaddr:1,
ts_needtime:1,
ts_needaddr:1;
unsigned char router_alert;
unsigned char cipso;
unsigned char __pad2;
unsigned char __data[0];
};
其中opt->optlen是代表ip选项在ip首部中占的总字节数的;
而意图是将ip可选项数据(选项信息块)拷出来的;
memcpy(iph+sizeof(struct iphdr), opt->__data, opt->optlen);

ip可选项数据(选项信息块)的首地址是 opt->__data没错的;但是长度opt->optlen我认为有问题的;opt->optlen是指:可选项数据+选项信息块




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2