Contiki packetbuf原理

摘要

本文介绍了contiki netstack中在framer,rdc,mac层中b欧诺个uffer数据的packetbuf的构造和原理。

正文

packetbuf作用

contilki netstack发送和接收数据先通过packetbuf缓冲,再进行处理。

packetbuf构成

packetbuf由header部分和data部分组成

 

Contiki packetbuf原理_第1张图片

 

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部分的内存

 

Contiki packetbuf原理_第2张图片

 

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的内存区内

 

Contiki packetbuf原理_第3张图片

将含有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缓存的数据包。

你可能感兴趣的:(Contiki packetbuf原理)