Use weak function pointers to call extension init functions, this makes firewall3...
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 23 May 2013 11:32:42 +0000 (13:32 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 23 May 2013 12:38:27 +0000 (14:38 +0200)
iptables.c
iptables.h

index 56f68c3..f39ed1e 100644 (file)
@@ -54,32 +54,17 @@ get_kernel_version(void)
        kernel_version = LINUX_VERSION(x, y, z);
 }
 
+#undef __ipt_module
+#define __ipt_module(x) libxt_##x##_init, libipt_##x##_init, libip6t_##x##_init,
+
 static void fw3_init_extensions(void)
 {
-       libip6t_icmp6_init();
-       libip6t_LOG_init();
-       libip6t_REJECT_init();
-       libipt_DNAT_init();
-       libipt_icmp_init();
-       libipt_LOG_init();
-       libipt_MASQUERADE_init();
-       libipt_REDIRECT_init();
-       libipt_REJECT_init();
-       libipt_SNAT_init();
-       libxt_comment_init();
-       libxt_conntrack_init();
-       libxt_CT_init();
-       libxt_limit_init();
-       libxt_mac_init();
-       libxt_mark_init();
-       libxt_MARK_init();
-       libxt_set_init();
-       libxt_SET_init();
-       libxt_standard_init();
-       libxt_TCPMSS_init();
-       libxt_tcp_init();
-       libxt_time_init();
-       libxt_udp_init();
+       int i;
+       void (*initfuncs[])(void) = { FW3_IPT_MODULES };
+
+       for (i = 0; i < sizeof(initfuncs)/sizeof(initfuncs[0]); i++)
+               if (initfuncs[i])
+                       initfuncs[i]();
 }
 
 struct fw3_ipt_handle *
index cee9cc4..c8c86ec 100644 (file)
@@ -34,30 +34,38 @@ extern struct xtables_match *xtables_pending_matches;
 extern struct xtables_target *xtables_pending_targets;
 
 /* libext.a interface */
-void libip6t_icmp6_init(void);
-void libip6t_LOG_init(void);
-void libip6t_REJECT_init(void);
-void libipt_DNAT_init(void);
-void libipt_icmp_init(void);
-void libipt_LOG_init(void);
-void libipt_MASQUERADE_init(void);
-void libipt_REDIRECT_init(void);
-void libipt_REJECT_init(void);
-void libipt_SNAT_init(void);
-void libxt_comment_init(void);
-void libxt_conntrack_init(void);
-void libxt_CT_init(void);
-void libxt_limit_init(void);
-void libxt_mac_init(void);
-void libxt_mark_init(void);
-void libxt_MARK_init(void);
-void libxt_set_init(void);
-void libxt_SET_init(void);
-void libxt_standard_init(void);
-void libxt_TCPMSS_init(void);
-void libxt_tcp_init(void);
-void libxt_time_init(void);
-void libxt_udp_init(void);
+#define FW3_IPT_MODULES                        \
+       __ipt_module(comment)           \
+       __ipt_module(conntrack)         \
+       __ipt_module(icmp)                      \
+       __ipt_module(icmp6)                     \
+       __ipt_module(limit)                     \
+       __ipt_module(mac)                       \
+       __ipt_module(mark)                      \
+       __ipt_module(set)                       \
+       __ipt_module(standard)          \
+       __ipt_module(tcp)                       \
+       __ipt_module(time)                      \
+       __ipt_module(udp)                       \
+       __ipt_module(CT)                        \
+       __ipt_module(DNAT)                      \
+       __ipt_module(LOG)                       \
+       __ipt_module(MARK)                      \
+       __ipt_module(MASQUERADE)        \
+       __ipt_module(REDIRECT)          \
+       __ipt_module(REJECT)            \
+       __ipt_module(SET)                       \
+       __ipt_module(SNAT)                      \
+       __ipt_module(TCPMSS)
+
+#undef __ipt_module
+#define __ipt_module(x) \
+       extern void libxt_##x##_init(void) __attribute__((weak)); \
+       extern void libipt_##x##_init(void) __attribute__((weak)); \
+       extern void libip6t_##x##_init(void) __attribute__((weak));
+
+FW3_IPT_MODULES
+
 
 /* Required by certain extensions like SNAT and DNAT */
 extern int kernel_version;