• OVS-DPDK 流表查询详解


     


    一图胜千言:

     

     

     社区里是EMC开启,SMC默认关闭。

     

    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)                     \
                                 )
    复制代码
  • 相关阅读:
    阿里云难题学习笔记
    vue中反向代理pathRewite的理解
    2023-09-29 LeetCode每日一题(种花问题)
    Linux修改24小时制中国时区
    Python Day9 字符串进阶【零基础】
    手撸代码,Redis发布订阅机制实现
    C++设计模式---模版方法模式
    【.net core】yisha框架单页面双列表联动效果示例
    Docker Compose 启动容器例子
    (JavaEE) 多线程基础3——多线程的代码案例 (单例模式, 阻塞队列,定时器)详解!!!
  • 原文地址:https://www.cnblogs.com/philo-zhou/p/17219340.html