OVS处理upcall过程分析

本文深入分析了OpenvSwitch处理内核到用户空间的upcall过程,特别是针对流表未命中(MISS_UPCALL)的情况。首先,handle_upcalls函数批量处理dpif_upcalls,获取flow_miss。接着,handle_miss_upcalls遍历flow_misses,构建flow_miss_op。处理过程中涉及流信息解析、哈希、存储和待处理列表。然后,handle_flow_miss构造flow_miss_op,包括检查facet、创建流规则和构建用户空间处理动作。最终,dpif_operate执行这些操作,将流规则下达到内核层面。
摘要由CSDN通过智能技术生成

处理upcall的整体框架是:



1.由函数 handle_upcalls()批量处理(in batches)的是由内核传上来的dpif_upcalls,会解析出upcall的类型。这里主要看在内核中匹配流表失败的MISS_UPCALL。处理完成后会得到多个flow_miss。

结构体dpif_upcall代表的是由内核传到用户空间的一个包,包括上传原因,packet data,以及以netlink attr形式存在的键值。
struct  dpif_upcall {
    /* All types. */
    enum dpif_upcall_type type;
    struct ofpbuf *packet;      /* Packet data. */
    struct nlattr *key;         /* Flow key. */
    size_t key_len;             /* Length of 'key' in bytes. */

    /* DPIF_UC_ACTION only. */
    uint64_t userdata;          /* Argument to OVS_ACTION_ATTR_USERSPACE. */
};


结构体flow_miss是将具有相同流特征的packets统一起来( batching),性能可能会更优,所以这个结构体要将datapath interface相关的数据队列起来,每个flow_miss对应的是发送的一个或多个数据包,另外可能会在dpif中安装流项。
struct  flow_miss  {
    struct hmap_node hmap_node;
    struct  flow  flow;  //流特征;
    enum  odp_key_fitness  key_fitness;
    const struct nlattr *key;
    size_t key_len;
    ovs_be16 initial_tci;
     struct list packets;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值