OVS中流表操作的理解关键在于这里哈希表的实现,引入的 flex_array方便了内存的管理,通过 hash&(桶数-1)可以随机的将一个元素定位到某一个桶中。
接下来是代码细节。
一. 核心数据结构
//流表
struct
flow_table{
struct
flex_array *
buckets
;
//具体的流表项
unsigned
int
count
,
n_buckets
;
//
struct
rcu_head
rcu
;
int
node_ver
;
//之前的理解有误,flow table rehash 需要。
u32
hash_seed
;
//哈希算法需要的种子
bool
keep_flows
;
//是否保留该流表项
};
//流表项
struct
sw_flow{
struct
rcu_head
rcu
;
struct
hlist_node
hash_node
[2]; //rehash需要
u32
hash
;
//存hash值
struct
sw_flow_key
key
;
//
struct
sw_flow_actions __rcu *sf_acts;
spinlock_t
lock
;
/* Lock for values below. */
unsigned
long
used
;
/* Last used time (in jiffies). */
u64
packet_count
;
/* Number of packets matched. */
u64
byte_count
;
/* Number of bytes matched. */
u8
tcp_flags
;
/* Union of seen TCP flags. */
};
//弹性数组??用于大量需要数组类型的时候
struct
flex_array{