免费注册 查看新帖 |

Chinaunix

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

[网络子系统] [请教帖]内核中不太明白的结构体定义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-31 16:53 |只看该作者 |倒序浏览
各位好,goolge到一种网络协议的包头如下(http://en.wikipedia.org/wiki/IPsec#Encapsulating_Security_Payload


可以看到报头中包括的项有:

Security Parameters Index (SPI)
Sequence Number
Payload data
Padding (0-255 octets)          
Pad Length
Next Header

我不是很理解,如果把
payload data(加密的) + padding + pad len + next header等部分当作是整体的 Payload data ,如下图:


可是我在目录
  1. /usr/include/linux/ip.h
复制代码
发现系统自己定义的结构体,让我困惑,如下:
  1. struct ip_esp_hdr {
  2.         __be32 spi;
  3.         __be32 seq_no;          /* Sequence number */
  4.         __u8  enc_data[0];      /* Variable len but >=8. Mind the 64 bit alignment! */
  5. };
复制代码
不理解其中第三个元素  enc_data[0],一个长度为0的数组,怎么使用都是越界,为什么不定义成  __u8 * enc_data[0]?  请指点,谢谢大家帮忙。

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
2 [报告]
发表于 2014-03-31 17:06 |只看该作者
回复 1# hanzhiwei111

请搜索 0长数组。该数据结构体只是表示其头部,用 0长数组方便引用后面不固定长度的部分!

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
3 [报告]
发表于 2014-03-31 18:08 |只看该作者
这种常用于表分两部分,前半部分是固定的长度,后半部分是可变长度。

通常都是这样实现的:
   length=sizeof(ip_ctr_hdr) +可变长度
   p = kmalloc(length)
   p->enc_data = p+sizeof(ip_ctr_hdr)

论坛徽章:
0
4 [报告]
发表于 2014-03-31 19:16 |只看该作者
回复 2# asuka2001


    谢谢,受人以渔,0长数组好处不小阿,但是有一个问题,能够用 指针 代替吗?

论坛徽章:
0
5 [报告]
发表于 2014-03-31 19:18 |只看该作者
回复 3# kiongf


     谢谢,结构体中的 0长数组能够用指针代替吗?
     还有,不在结构体中,我也没见过直接用 0长数组的例子。(不过我度过的好代码不多。

论坛徽章:
0
6 [报告]
发表于 2014-03-31 19:23 |只看该作者
回复 3# kiongf

     结合具体问题,p->enc_data = p+ sizoeof(报头定长),那么 p->enc_data指向的应该是数据包的payload部分吧,我奇怪它为什么这么定义,换句话说,为什么普通的IP报头没有这个不定长的部分(payload).

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
7 [报告]
发表于 2014-03-31 19:37 |只看该作者
回复 4# hanzhiwei111

0长数组本身是不占结构体大小的。这样方便结构体和真实数据二进制上一一对应。如果是指针,就添加了真实数据不存在的4个或8个字节了。

论坛徽章:
0
8 [报告]
发表于 2014-03-31 19:46 |只看该作者
回复 7# asuka2001


    恩,谢谢,指针和数组名字的区别!

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
9 [报告]
发表于 2014-03-31 20:30 |只看该作者
回复 6# hanzhiwei111


    我认为是为了实现新IP表头和老IP表头的共存,通过0长度数组,同一个结构体可以服务于新IP和老IP的代码。这样通用域的处理不变,可变域根据.proto的实际设置来解读。 内核这种用法我见的也不多, 只在buffer I/O 和 pid中见过。

论坛徽章:
0
10 [报告]
发表于 2014-04-01 14:59 |只看该作者
学习,楼主真有心,发个贴子这么多对应截图,是很认真的人!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP