- 论坛徽章:
- 0
|
本帖最后由 风情123 于 2012-12-23 16:15 编辑
请教下: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是指:可选项数据+选项信息块 |
|