前言
本文以openvswitch 2.5.0源码,主要介绍**应用层**openflow处理引擎相关的数据结构,分析其设计的原因和精彩之处。
报文结构
网络中最重要的就是报文,因此首先分析报文结构struct dp_packet:
/* Buffer for holding packet data. A dp_packet is automatically reallocated
* as necessary if it grows too large for the available memory.
*/
struct dp_packet {
#ifdef DPDK_NETDEV
struct rte_mbuf mbuf; /* DPDK mbuf */
#else
void *base_; /* First byte of allocated space. */
uint16_t allocated_; /* Number of bytes allocated. */
uint16_t data_ofs; /* First byte actually in use. */
uint32_t size_; /* Number of bytes in use. */
uint32_t rss_hash; /* Packet hash. */
bool rss_hash_valid; /* Is the 'rss_hash' valid? */
#endif
enum dp_packet_source source; /* Source of memory allocated as 'base'. */
uint8_t l2_pad_size; /* Detected l2 padding size.
* Padding is non-pullable. */
uint16_t l2_5_ofs; /* MPLS label stack offset, or UINT16_MAX */
uint16_t l3_ofs; /* Network-level header offset,
* or UINT16_MAX. */
uint16_t l4_ofs; /* Transport-level header offset,
or UINT16_MAX. */
struct pkt_metadata md;
};
可以看出,在采用dpdk时直接使用struct rte_mbuf结构,再加上部分辅助字段。
struct pkt_metadata结构如下:
/* Datapath packet metadata */

本文深入分析OpenvSwitch 2.5.0的源码,重点关注应用层OpenFlow处理引擎的数据结构,包括报文结构struct dp_packet、struct pkt_metadata,以及核心匹配结构struct flow和struct miniflow。报文结构中,dp_packet结合dpdk的struct rte_mbuf进行处理,pkt_metadata存储元数据和隧道信息。匹配结构中,struct flow包含了报文的完整特征,而struct netdev_flow_key和struct miniflow则用于高效的匹配和缓存操作,其中miniflow的bitmap设计是关键,优化了匹配性能。
最低0.47元/天 解锁文章
539

被折叠的 条评论
为什么被折叠?



