return 0;
}
-int fw_nftables_init(FirewallContext *ctx) {
+int fw_nftables_init_full(FirewallContext *ctx, bool init_tables) {
_cleanup_(sd_netlink_unrefp) sd_netlink *nfnl = NULL;
int r;
if (r < 0)
return r;
- r = fw_nftables_init_family(nfnl, AF_INET);
- if (r < 0)
- return r;
-
- if (socket_ipv6_is_supported()) {
- r = fw_nftables_init_family(nfnl, AF_INET6);
+ if (init_tables) {
+ r = fw_nftables_init_family(nfnl, AF_INET);
if (r < 0)
- log_debug_errno(r, "Failed to init ipv6 NAT: %m");
+ return r;
+
+ if (socket_ipv6_is_supported()) {
+ r = fw_nftables_init_family(nfnl, AF_INET6);
+ if (r < 0)
+ log_debug_errno(r, "Failed to init ipv6 NAT: %m");
+ }
}
ctx->nfnl = TAKE_PTR(nfnl);
return 0;
}
+int fw_nftables_init(FirewallContext *ctx) {
+ return fw_nftables_init_full(ctx, /* init_tables= */ true);
+}
+
void fw_nftables_exit(FirewallContext *ctx) {
assert(ctx);
const char *firewall_backend_to_string(FirewallBackend b) _const_;
int fw_nftables_init(FirewallContext *ctx);
+int fw_nftables_init_full(FirewallContext *ctx, bool init_tables);
void fw_nftables_exit(FirewallContext *ctx);
int fw_nftables_add_masquerade(
DEFINE_STRING_TABLE_LOOKUP_TO_STRING(firewall_backend, FirewallBackend);
-static void firewall_backend_probe(FirewallContext *ctx) {
+static void firewall_backend_probe(FirewallContext *ctx, bool init_tables) {
assert(ctx);
if (ctx->backend != _FW_BACKEND_INVALID)
return;
- if (fw_nftables_init(ctx) >= 0)
+ if (fw_nftables_init_full(ctx, init_tables) >= 0)
ctx->backend = FW_BACKEND_NFTABLES;
else
#if HAVE_LIBIPTC
log_debug("No firewall backend found.");
}
-int fw_ctx_new(FirewallContext **ret) {
+int fw_ctx_new_full(FirewallContext **ret, bool init_tables) {
_cleanup_free_ FirewallContext *ctx = NULL;
ctx = new(FirewallContext, 1);
.backend = _FW_BACKEND_INVALID,
};
- firewall_backend_probe(ctx);
+ firewall_backend_probe(ctx, init_tables);
*ret = TAKE_PTR(ctx);
return 0;
}
+int fw_ctx_new(FirewallContext **ret) {
+ return fw_ctx_new_full(ret, /* init_tables= */ true);
+}
+
FirewallContext *fw_ctx_free(FirewallContext *ctx) {
if (!ctx)
return NULL;
typedef struct FirewallContext FirewallContext;
int fw_ctx_new(FirewallContext **ret);
+int fw_ctx_new_full(FirewallContext **ret, bool init_tables);
FirewallContext *fw_ctx_free(FirewallContext *ctx);
DEFINE_TRIVIAL_CLEANUP_FUNC(FirewallContext *, fw_ctx_free);