免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1506 | 回复: 0
打印 上一主题 下一主题

[实践] Linux内核::网络层ip_options.c::void ip_options_build内一处实现不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-23 16:13 |只看该作者 |倒序浏览
请教下: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是指:可选项数据+选项信息块
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP