gpt4 book ai didi

OVS-DPDK流表查询详解

转载 作者:我是一只小鸟 更新时间:2023-03-15 22:31:36 28 4
gpt4 key购买 nike

  。


一图胜千言:

  。

  。

  。

  。

flow和miniflow

在介绍之前先说一些概念:里面有两个结构很重要,一个是flow一个是miniflow这里介绍一下他们的数据结构和构造函数.

回到顶部

flow:

flow的特点是8字节对齐的,存储报文相关字段和其他原数据,用于匹配流表,数据包含四个层次:
  1. metadata: 入端口号,寄存器等信息
  2. l2: 源目的mac,vlan和mpls等信息
  3. l3: ipv4/ipv6源目的ip,ttl等信息
  4. l4: 源目的端口号,icmp code和type等信息。
flow的坏处就是占用了很大的字节,并且有很多字段都是0,在2.8版本中flow的大小是672字节。
 
回到顶部

miniflow

miniflow是flow的压缩版,因为flow占用字节很大,比如可以支持ARP,IP等报文,填充了arp字段,icmp报文就是空的了,浪费了很多信息。过程中用到hash作为key,也是根据miniflow计算hash值,不是用的flow。
                              
                                struct
                              
                              
                                 miniflow {
    
                              
                              
                                struct
                              
                              
                                 flowmap map;
};

                              
                              
                                struct
                              
                              
                                 flowmap {
    map_t bits[FLOWMAP_UNITS];
};
                              
                            
miniflow其包含两部分内容:
  1. struct flowmap map;是bit数组,使用其中的bit表示flow中哪个8字节存在有效数据,flow中占多少个8字节,那么就需要map中多个个bit,并且按照64bit向上取整。
  2. 第二部分是有效数据,有效数据动态分配,根据struct flowmap map;中1bit数个数进行分配,大小为bit数*8字节,该部分直接跟在map后面。该部分存储在netdev_flow_key结构中的buf数组。
miniflow数据结构:
                                  
                                    //
                                  
                                  
                                    flow是8字节对齐的,除8得到flow中包含8字节的个数
                                  
                                  
                                    #define
                                  
                                   FLOW_U64S (sizeof(struct flow) / sizeof(uint64_t))


                                  
                                    //
                                  
                                  
                                    map大小为8字节,MAP_T_BITS 为64位
                                  
                                  
typedef unsigned 
                                  
                                    long
                                  
                                  
                                    long
                                  
                                  
                                     map_t;

                                  
                                  
                                    #define
                                  
                                   MAP_T_BITS (sizeof(map_t) * CHAR_BIT)


                                  
                                    //
                                  
                                  
                                    每位表示一个u64,FLOWMAP_UNITS 表示最少需要几个64位
                                  
                                  
                                    #define
                                  
                                   FLOWMAP_UNITS DIV_ROUND_UP(FLOW_U64S, MAP_T_BITS)


                                  
                                    struct
                                  
                                  
                                     flowmap {
    map_t bits[FLOWMAP_UNITS];
};


                                  
                                  
                                    struct
                                  
                                  
                                     miniflow {
    
                                  
                                  
                                    struct
                                  
                                  
                                     flowmap map;
    
                                  
                                  
                                    /*
                                  
                                  
                                     Followed by:
     *     uint64_t values[n];
     * where 'n' is miniflow_n_values(miniflow). 
                                  
                                  
                                    */
                                  
                                  
                                    
};


                                  
                                  
                                    struct
                                  
                                  
                                     netdev_flow_key {
    uint32_t hash;     
    uint32_t len;     
    
                                  
                                  
                                    struct
                                  
                                   miniflow mf;  
                                  
                                    //
                                  
                                  
                                     bits
                                  
                                  
    uint64_t buf[FLOW_MAX_PACKET_U64S];  
                                  
                                    //
                                  
                                  
                                     就是上边所说的value
                                  
                                  
                                    };


                                  
                                  
                                    //
                                  
                                  
                                     有些字段是互斥的
                                  
                                  
                                    #define
                                  
                                   FLOW_MAX_PACKET_U64S (FLOW_U64S                                   \
    
                                  
                                    /*
                                  
                                  
                                     Unused in datapath 
                                  
                                  
                                    */
                                  
                                    -
                                  
                                     FLOW_U64_SIZE(regs)                       \
                              
                                  
                                  -
                                  
                                     FLOW_U64_SIZE(metadata)                   \
    
                                  
                                  
                                    /*
                                  
                                  
                                     L2.5/3 
                                  
                                  
                                    */
                                  
                                                - FLOW_U64_SIZE(nw_src)  
                                  
                                    /*
                                  
                                  
                                     incl. nw_dst 
                                  
                                  
                                    */
                                  
                                  
                                     \
                              
                                  
                                  -
                                  
                                     FLOW_U64_SIZE(mpls_lse)                   \
    
                                  
                                  
                                    /*
                                  
                                  
                                     L4 
                                  
                                  
                                    */
                                  
                                                    -
                                  
                                     FLOW_U64_SIZE(tp_src)                     \
                             )
                                  
                                

最后此篇关于OVS-DPDK流表查询详解的文章就讲到这里了,如果你想了解更多关于OVS-DPDK流表查询详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com