Instead of manual array registration.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
.snprintf = nft_rule_expr_bitwise_snprintf,
.xml_parse = nft_rule_expr_bitwise_xml_parse,
};
+
+static void __init expr_bitwise(void)
+{
+ nft_expr_ops_register(&expr_ops_bitwise);
+}
.snprintf = nft_rule_expr_byteorder_snprintf,
.xml_parse = nft_rule_expr_byteorder_xml_parse,
};
+
+static void __init expr_byteorder_init(void)
+{
+ nft_expr_ops_register(&expr_ops_byteorder);
+}
.snprintf = nft_rule_expr_cmp_snprintf,
.xml_parse = nft_rule_expr_cmp_xml_parse,
};
+static void __init expr_cmp_init(void)
+{
+ nft_expr_ops_register(&expr_ops_cmp);
+}
.snprintf = nft_rule_expr_counter_snprintf,
.xml_parse = nft_rule_expr_counter_xml_parse,
};
+
+static void __init expr_counter_init(void)
+{
+ nft_expr_ops_register(&expr_ops_counter);
+}
.snprintf = nft_rule_expr_ct_snprintf,
.xml_parse = nft_rule_expr_ct_xml_parse,
};
+
+static void __init expr_ct_init(void)
+{
+ nft_expr_ops_register(&expr_ops_ct);
+}
.snprintf = nft_rule_expr_exthdr_snprintf,
.xml_parse = nft_rule_expr_exthdr_xml_parse,
};
+
+static void __init expr_exthdr_init(void)
+{
+ nft_expr_ops_register(&expr_ops_exthdr);
+}
.snprintf = nft_rule_expr_immediate_snprintf,
.xml_parse = nft_rule_expr_immediate_xml_parse,
};
+
+static void __init expr_immediate_init(void)
+{
+ nft_expr_ops_register(&expr_ops_immediate);
+}
.snprintf = nft_rule_expr_limit_snprintf,
.xml_parse = nft_rule_expr_limit_xml_parse,
};
+
+static void __init expr_limit_init(void)
+{
+ nft_expr_ops_register(&expr_ops_limit);
+}
.snprintf = nft_rule_expr_log_snprintf,
.xml_parse = nft_rule_expr_log_xml_parse,
};
+
+static void __init expr_log_init(void)
+{
+ nft_expr_ops_register(&expr_ops_log);
+}
.snprintf = nft_rule_expr_lookup_snprintf,
.xml_parse = nft_rule_expr_lookup_xml_parse,
};
+
+static void __init expr_lookup_init(void)
+{
+ nft_expr_ops_register(&expr_ops_lookup);
+}
.snprintf = nft_rule_expr_match_snprintf,
.xml_parse = nft_rule_expr_match_xml_parse,
};
+
+static void __init expr_match_init(void)
+{
+ nft_expr_ops_register(&expr_ops_match);
+}
.snprintf = nft_rule_expr_meta_snprintf,
.xml_parse = nft_rule_expr_meta_xml_parse,
};
+
+static void __init expr_meta_init(void)
+{
+ nft_expr_ops_register(&expr_ops_meta);
+}
.snprintf = nft_rule_expr_nat_snprintf,
.xml_parse = nft_rule_expr_nat_xml_parse,
};
+
+static void __init expr_nat_init(void)
+{
+ nft_expr_ops_register(&expr_ops_nat);
+}
.snprintf = nft_rule_expr_payload_snprintf,
.xml_parse = nft_rule_expr_payload_xml_parse,
};
+
+static void __init expr_payload_init(void)
+{
+ nft_expr_ops_register(&expr_ops_payload);
+}
.snprintf = nft_rule_expr_target_snprintf,
.xml_parse = nft_rule_expr_target_xml_parse,
};
+
+static void __init expr_target_init(void)
+{
+ nft_expr_ops_register(&expr_ops_target);
+}
#include <string.h>
+#include <linux_list.h>
#include "expr_ops.h"
-extern struct expr_ops expr_ops_bitwise;
-extern struct expr_ops expr_ops_byteorder;
-extern struct expr_ops expr_ops_cmp;
-extern struct expr_ops expr_ops_counter;
-extern struct expr_ops expr_ops_ct;
-extern struct expr_ops expr_ops_exthdr;
-extern struct expr_ops expr_ops_immediate;
-extern struct expr_ops expr_ops_limit;
-extern struct expr_ops expr_ops_log;
-extern struct expr_ops expr_ops_lookup;
-extern struct expr_ops expr_ops_match;
-extern struct expr_ops expr_ops_meta;
-extern struct expr_ops expr_ops_nat;
-extern struct expr_ops expr_ops_payload;
-extern struct expr_ops expr_ops_target;
+static LIST_HEAD(expr_ops_list);
-struct expr_ops *expr_ops[] = {
- &expr_ops_bitwise,
- &expr_ops_byteorder,
- &expr_ops_cmp,
- &expr_ops_counter,
- &expr_ops_ct,
- &expr_ops_exthdr,
- &expr_ops_immediate,
- &expr_ops_match,
- &expr_ops_meta,
- &expr_ops_nat,
- &expr_ops_payload,
- &expr_ops_target,
- &expr_ops_limit,
- &expr_ops_log,
- &expr_ops_lookup,
- NULL,
-};
+void nft_expr_ops_register(struct expr_ops *ops)
+{
+ list_add_tail(&ops->head, &expr_ops_list);
+}
struct expr_ops *nft_expr_ops_lookup(const char *name)
{
- int i = 0;
-
- while (expr_ops[i] != NULL) {
- if (strcmp(expr_ops[i]->name, name) == 0)
- return expr_ops[i];
+ struct expr_ops *ops;
- i++;
+ list_for_each_entry(ops, &expr_ops_list, head) {
+ if (strcmp(ops->name, name) == 0)
+ return ops;
}
return NULL;
#endif
struct expr_ops {
+ struct list_head head;
+
char *name;
size_t alloc_len;
int max_attr;
int (*xml_parse)(struct nft_rule_expr *e, mxml_node_t *tree);
};
+void nft_expr_ops_register(struct expr_ops *ops);
struct expr_ops *nft_expr_ops_lookup(const char *name);
#endif
#define div_round_up(n, d) (((n) + (d) - 1) / (d))
+#define __init __attribute__((constructor))
+
#endif