首先我们先来分析下ipset_hash_mac.c文件

dimension的含义

opt设置的IPSET_OPT_ETHER

.opt = IPSET_OPT_ETHER

因为我们要添加新的类型,所以可能需要创建IPSET_OPT_STRING

1.枚举定义

data.h文件中的

enum ipset_opt {
    IPSET_OPT_NONE = 0,
    /* Common ones */
    IPSET_SETNAME,
    IPSET_OPT_TYPENAME,
    IPSET_OPT_FAMILY,
    
    /* ADT-specific options */
    IPSET_OPT_ETHER,//mac对应的枚举在这里!!!
    IPSET_OPT_NAME,
    IPSET_OPT_NAMEREF,
    IPSET_OPT_IP2,
    IPSET_OPT_CIDR2,
    IPSET_OPT_IP2_TO,
    IPSET_OPT_PROTO,
    IPSET_OPT_IFACE,

};

2 注册时添充need和full的值

\"\"

3.IPSET_ADT_FLAGS宏定义,这个宏的调用位置?

#define IPSET_ADT_FLAGS            \\
    (IPSET_FLAG(IPSET_OPT_IP)    \\
    | IPSET_FLAG(IPSET_OPT_IP_TO)    \\
    | IPSET_FLAG(IPSET_OPT_CIDR)    \\
    | IPSET_FLAG(IPSET_OPT_MARK)    \\
    | IPSET_FLAG(IPSET_OPT_PORT)    \\
    | IPSET_FLAG(IPSET_OPT_PORT_TO)    \\
    | IPSET_FLAG(IPSET_OPT_TIMEOUT)    \\
    | IPSET_FLAG(IPSET_OPT_ETHER)    \\
    | IPSET_FLAG(IPSET_OPT_NAME)    \\
    | IPSET_FLAG(IPSET_OPT_NAMEREF)    \\
    | IPSET_FLAG(IPSET_OPT_IP2)    \\
    | IPSET_FLAG(IPSET_OPT_CIDR2)    \\
    | IPSET_FLAG(IPSET_OPT_PROTO)    \\
    | IPSET_FLAG(IPSET_OPT_IFACE) \\
    | IPSET_FLAG(IPSET_OPT_CADT_FLAGS)\\
    | IPSET_FLAG(IPSET_OPT_BEFORE) \\
    | IPSET_FLAG(IPSET_OPT_PHYSDEV) \\
    | IPSET_FLAG(IPSET_OPT_NOMATCH) \\
    | IPSET_FLAG(IPSET_OPT_PACKETS)    \\
    | IPSET_FLAG(IPSET_OPT_BYTES)    \\
    | IPSET_FLAG(IPSET_OPT_ADT_COMMENT)\\
    | IPSET_FLAG(IPSET_OPT_SKBMARK)    \\
    | IPSET_FLAG(IPSET_OPT_SKBPRIO)    \\
    | IPSET_FLAG(IPSET_OPT_SKBQUEUE))

另外还有一个IPSET_CREATE_FLAGS是做什么使用的?

4.ipset_data_sizeof  计算特定数据类型的长度

其中计算IPSET_OPT_ETHER类型的长度,

case IPSET_OPT_ETHER:
        return ETH_ALEN;

5.ipset_data_get函数

case IPSET_OPT_ETHER:
        return data->adt.ether;

亲自验证下何时调用ipset_data_get函数中的IPSET_OPT_ETHER分支?

6.ipset_data_set函数

/* ADT-specific options */
    case IPSET_OPT_ETHER:
        memcpy(data->adt.ether, value, ETH_ALEN);
        break;

收藏 打印