openVswitch(OVS)源代码的分析技巧(哈希桶结构体为例)

前言: 

        个人认为学习openVswitch源代码是比较困难的,因为该项目开发出来不久(当然了这是相对于其他开源项目),一些资料不完全,网上也比较少资料(一般都是说怎么使用,比如:怎么安装,怎么配置,以及一些命令等。对源码分析的资料比较少),如果遇到问题只有自己看源代码,分析源代码,然后各种假设,再带着假设去阅读分析源代码。而源代码中注释的也比较少(只有几部分函数和结构体有注释)。所以对源代码的分析是比较困难的。不像linux(UNIX)方面的分析,因为linux项目已经开放出来好久了,资料漫天都是,各种内核源代码分析,只要你有耐心什么内核源代码分析,内核源代码全注释,都有各种详细版本供你参考。而我在学习openVswitch源代码的时候也遇到个比较大的问题,困扰了我比较久的时间,我也查看了几个模块的源代码发现都解决不了(因为各个模块中意思不能统一),今天拿出来和大家一起来探讨下,也顺便分享下我分析源代码和处理问题的方法。

        顺便说下,我原本是要顺着ovs_dp_process_received_packet()函数处理流程来分析所有的流程源代码,但分析完流表查询,觉得那个问题还是得处理下,所以在这里插入一篇blog来处理下那个问题。在之后会继续分析upcall和流表使用,action动作等模块。


问题:

        话不多说,还是看问题吧。其实在系列blog中的第二篇openVswitch(OVS)源代码分析之数据结构已经说过。就是下面的结构体成员字段有歧义:

// 哈希桶结构
struct flex_array {
	// 共用体,第二个成员为占位符,为共用体大小
	union {
        // 对于这个结构体的成员数据含义,真是花了我不少时间来研究,发现有歧义,(到后期流表匹配时会详细分析)。现在就我认为最正确的理解来分析
		struct {
			int element_size; // 无疑这是数组元素的大小
			int total_nr_elements; // 这是数组元素的总个数
			int elems_per_part; // 这是每个part指针指向的空间能存储多少元素
			u32 reciprocal_elems; 
			struct flex_array_part *parts[]; // 结构体指针数组,里面存放的是struct flex_array_part结构的指针
		};
		char padding[FLEX_ARRAY_BASE_SIZE];
	};
};

// 其实struct flex_array_part *parts[];中的结构体只是一个数组而已
struct flex_array_part {
	char elements[FLEX_ARRAY_PART_SIZE]; // 里面是一个页大小的字符数组 
};
        上面这个结构的分析还是引用下第二篇blog的原文吧:

        “顺序分析下去,应该是分析哈希桶结构体了,因为这个结构体设计的实在是太巧妙了。所以应该仔细的分析下。

        这是一个共用体,是个设计非常巧妙的共用体。因为共用体的特点是:整个共用体的大小是其中最大成员变量的大小。也就是说 共用体成员中某个最大的成员的大小就

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值