• openvswitch group hash实现代码分析


    代码分析

    ovs版本是2.11.0,linux版本是linux-3.10.0-693.21.1.el7。

    只拿ovs实现的group hash和dp_hash举例分析代码,通过一个点一个功能切入代码,漫无目的看代码是很难看懂的,必须带着一个疑问看代码,点多了全面开花,从点到面,慢慢就搞定代码了。

    代码分析的场景就是一个虚拟机中curl一个vip。

    ovs都说首包从datapath上送到vswitchd那就找找vswitchd从哪开始处理首包的。

    1. main
    2. └─bridge_run
    3. └─bridge_reconfigure
    4. └─ofproto_create
    5. └─construct
    6. └─open_dpif_backer
    7. ├─udpif_create
    8. | └─dpif_register_upcall_cb//kernel为NULL,用于DPDK
    9. ├─udpif_set_threads
    10. | └─dpif_handlers_set
    11. └─udpif_start_threads
    12. └─udpif_upcall_handler
    13. ├─dpif_recv
    14. | └─dpif_netlink_recv
    15. | └─dpif_netlink_recv__
    16. | └─parse_odp_packet
    17. └─recv_upcalls

    vswitchd启动时创建了udpif_start_threads几个thread,这几个thread循环调用recv_upcalls处理上送的首包。

    再找datapath首包是在什么地方上送的。

    1. #linux kernel datapath
    2. ovs_vport_receive
    3. ├─ovs_flow_key_extract
    4. | └─key_extract
    5. └─ovs_dp_process_packet
    6. ├─if ovs_flow_tbl_lookup_stats
    7. | └─ovs_dp_upcall
    8. | └─queue_userspace_packet
    9. | └─ovs_nla_put_key
    10. | └─__ovs_nla_put_key
    11. └─else ovs_execute_actions
    12. ├─case OVS_ACTION_ATTR_OUTPUT
    13. └─do_output
    14. └─ovs_vport_send

    首包来了先从skb上ovs_flow_key_extract生成flow key,再根据key查找 表ovs_flow_tbl_lookup_stats,查找不到ÿ

  • 相关阅读:
    PostgreSQL11.17离线安装过程(X86+Ubuntu)
    [数据结构] 树、森林及二叉树的应用
    20231018 自然常数的存在性
    iOS 登录分享推送支付问题
    【毕业设计】基于ZigBee的智能灯控系统 -物联网 单片机 stm32
    GCC详解的-Wl选项说明与测试
    spring boot中shiro使用自定义注解屏蔽接口鉴权
    picoctf_2018_can_you_gets_me
    MySQL查询
    初级算法题(上)
  • 原文地址:https://blog.csdn.net/lingshengxiyou/article/details/128104080