摘要
本文介绍了contiki netstack中在framer,rdc,mac层中b欧诺个uffer数据的packetbuf的构造和原理。
正文
packetbuf作用
contilki netstack发送和接收数据先通过packetbuf缓冲,再进行处理。
packetbuf构成
packetbuf由header部分和data部分组成
data的长度为PACKETBUF_SIZE,可在contiki-conf.h中由PACKETBUF_CONF_SIZE定义
header的长度为PACKETBUF_HDR_SIZE,可在contiki-conf.h中由PACKETBUF_CONF_HDR_SIZE定义
因此packetbuf定义为
static uint16_t packetbuf_aligned[(PACKETBUF_SIZE + PACKETBUF_HDR_SIZE) / 2 + 1];
static uint8_t *packetbuf = (uint8_t *)packetbuf_aligned;
以上的做法是针对某些芯片特殊的对齐要求。
通过packetbuf_reference, packetbuf的数据区可以指向其它内存地址。
Header的操作
发送数据时,才会使用到header部分的内存
data从低地址向高地址分配.
- 将发送数据装载到packetbuf使用packetbuf_copyfrom. 会自动设置buflen.
- 取走发送数据使用packetbuf_copyto, 取走发送数据后,如果不再使用数据,使用packetbuf_set_datalen将buflen复位。
- header的分配从高地址向低地址分配。hdrptr在初始化时赋值为PACKETBUF_HDR_SIZE
- 使用packetbuf_hdralloc分配一个header,hdrptr就减去对应的长度.
- 使用packetbuf_hdr_remove释放一个heade, hdrptr就加上对应的长度。
- 使用packetbuf_copyto_hdr将header写入到packetbuf中
- 使用packetbuf_hdrptr得到header的起始地址
- 使用packetbuf_hdrlen得到header的长度
- 使用packetbuf_clear_hdr清除所有的header空间内的header
接收数据不会使用header部分的内存,接收数据的Header放在data的内存区内
将含有header接收数据装载到packetbuf使用packetbuf_copyfrom. 会自动设置buflen
使用packetbuf_hdrreduce移除接收到数据的header
数据的操作
取走发送数据使用packetbuf_copyto, 取走发送数据后,如果不再使用数据,使用packetbuf_set_datalen将buflen复位。
结束语
综上可见contiki的backbuf管理并不给出固定的格式,按照数据header+payload的模式来处理,提供的函数只是完成对header和payload的move, copy, get length操作。 packetbuf模块提供packet缓存,也提供修改payload缓存地址的机制,这样数据发送的实现方式可以更加灵活,同时也可发送大于packetbuf缓存的数据包。