想了解ipset的hash:mac类型的实现,要阅读的源代码文件有两个ip_set_hash_mac.c和ip_set_hash_gen.h
一、定义hash元素结构体
/* Member elements */
struct hash_mac4_elem {
/* Zero valued IP addresses cannot be stored */
union {
unsigned char ether[ETH_ALEN];
__be32 foo[2];
};
};
如果想设置被哈希成key的元素,可以参考下ip_set_hash_netiface.c
/* IPv4 variant */
struct hash_netiface4_elem_hashed {
__be32 ip;
u8 physdev;
u8 cidr;
u8 nomatch;
u8 elem;
};
/* Member elements */
struct hash_netiface4_elem {
__be32 ip;
u8 physdev;
u8 cidr;
u8 nomatch;
u8 elem;
char iface[IFNAMSIZ];
};
由mtype_elem可知,不管是hash_mac4_elem结构体还是hash_netiface4_elem结构体,都是对mtype_elem的扩展
#define mtype_elem IPSET_TOKEN(MTYPE, _elem)
每种实现ip_set_hash_gen的子类型,可以定义HKEY_DATALEN宏来指定key的长度
如netiface类型的set定义的是
#define HKEY_DATALEN sizeof(struct hash_netiface4_elem_hashed)
还是实现了hash_netiface4_do_data_match函数
mtype_data_match 先调用了ip_set_match_extensions函数,然后再调用mtype_do_data_match函数。
ip_set_match_extensions函数逐一检查ip_set结构体是否设置了timeout,counter,skbinfo标志。
mtype_test函数检测某一元素是否已经加入集合set中
mtype_data_list何时被调用呢
#define mtype_data_list IPSET_TOKEN(MTYPE, _data_list)
在使用ipset list显示命令时调用mtype_list函数,mtype_list 函数调用mtype_data_list
ip_set_hash_mac.c源文件最下面代码是填充struct ip_set_type结构体变量hash_mac_type的各个成员,并使用ip_set_type_register函数注册这个结构体,划重点哈,想注册自定义类型的set集合,调用ip_set_type_register函数即可
type->dimension表示有几种维度,比如hash:ip只有一种维度ip,分别去解析不同维度的参数。
比如hash:net,iface就是两个维度,IPSET_DIM_TWO
create回调函数的赋值
#ifdef IP_SET_EMIT_CREATE
static int
IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set,
struct nlattr *tb[], u32 flags)
#endif
使用IPSET_TOKEN宏来构造函数名称,对于ip_set_hash_mac.c来说,
/* Type specific function prefix */
#define HTYPE hash_mac
所以其函数名为hash_mac_create
create_policy参数(待完成)
adt_policy参数(待完成)
备注:
深入理解rcu机制
undef关键字:取消宏定义的值,一般再宏重新定义之前使用undef关键字
取消