openflow引擎源码分析(数据结构)

本文深入分析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设计是关键,优化了匹配性能。
摘要由CSDN通过智能技术生成

前言

本文以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 */
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值