当前位置: 技术问答>linux和unix
Linux内核::网络层ip_options.c::void ip_options_build内一处实现不解
来源: 互联网 发布时间:2017-03-28
本文导语: 请教下: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_optio...
请教下: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是指:可选项数据+选项信息块
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是指:可选项数据+选项信息块
|
其中opt->optlen是代表ip选项在ip首部中占的总字节数的;这是只你自己的猜测,
实际的optlen就是用来指定数据块的大小,比如再看ip_options_get_finish,可以看出opt->optlen和__data大小是一致的,因为当作数组下标用
实际的optlen就是用来指定数据块的大小,比如再看ip_options_get_finish,可以看出opt->optlen和__data大小是一致的,因为当作数组下标用
static int ip_options_get_finish(struct net *net, struct ip_options **optp,
struct ip_options *opt, int optlen)
{
while (optlen & 3)
opt->__data[optlen++] = IPOPT_END;
opt->optlen = optlen;
.....
}
|
http://vote.blog.csdn.net/item/blogstar/yming0221
可以看看本人的博客,顺便支持下
可以看看本人的博客,顺便支持下