MT#55283 support table creation through nft

Change-Id: I44c95d40e1c209505955f46a3208d0035027e4ef
pull/2141/head
Richard Fuchs 1 month ago
parent 32874b687f
commit eebbece214

@ -1094,6 +1094,7 @@ static void options(int *argc, char ***argv, charp_ht templates) {
.append = rtpe_config.nftables_append,
.family = rtpe_config.nftables_family,
.xtables = rtpe_config.xtables,
.may_exist = true,
});
}
else // nftables_stop
@ -1762,12 +1763,14 @@ static void kernel_setup(void) {
}
#endif
if (!kernel_create_table(rtpe_config.kernel_table)) {
ilog(LOG_ERR, "FAILED TO CREATE KERNEL TABLE %i (%s), KERNEL FORWARDING DISABLED",
rtpe_config.kernel_table, strerror(errno));
if (rtpe_config.no_fallback)
die("Userspace fallback disallowed - exiting");
goto fallback;
if (rtpe_config.xtables) {
if (!kernel_create_table(rtpe_config.kernel_table)) {
ilog(LOG_ERR, "FAILED TO CREATE KERNEL TABLE %i (%s), KERNEL FORWARDING DISABLED",
rtpe_config.kernel_table, strerror(errno));
if (rtpe_config.no_fallback)
die("Userspace fallback disallowed - exiting");
goto fallback;
}
}
if (!kernel_setup_table(rtpe_config.kernel_table)) {

@ -62,6 +62,8 @@ struct add_rule_callbacks {
int table;
bool append;
bool xtables;
bool may_exist;
bool *created;
};
@ -501,6 +503,15 @@ static const char *target_base_nft_expr(nfapi_buf *b, struct add_rule_callbacks
nfapi_add_u32_attr(b, RTPEA_RTPENGINE_TABLE, callbacks->table,
"table %u", callbacks->table);
if (!*callbacks->created) {
nfapi_add_attr(b, RTPEA_RTPENGINE_CREAT, NULL, 0, "creat");
if (!callbacks->may_exist)
nfapi_add_attr(b, RTPEA_RTPENGINE_EXCL, NULL, 0, "excl");
*callbacks->created = true;
}
nfapi_nested_end(b);
nfapi_nested_end(b);
@ -772,6 +783,8 @@ static char *nftables_setup_family(nfapi_socket *nl, int family,
.table = args->table,
.append = args->append,
.xtables = args->xtables,
.created = &args->created,
.may_exist = args->may_exist,
});
if (err)
return err;
@ -797,6 +810,8 @@ static char *nftables_setup_family(nfapi_socket *nl, int family,
.table = args->table,
.append = args->append,
.xtables = args->xtables,
.created = &args->created,
.may_exist = args->may_exist,
});
if (err)
return err;

@ -8,6 +8,8 @@ typedef struct {
int family;
bool append;
bool xtables;
bool may_exist;
bool created;
} nftables_args;
char *nftables_setup(const char *chain, const char *base_chain, nftables_args);

@ -7465,9 +7465,24 @@ static int rtpengine_expr_init(const struct nft_ctx *ctx, const struct nft_expr
if (table >= MAX_ID)
return -ERANGE;
bool crt = !!tb[RTPEA_RTPENGINE_CREAT];
bool excl = !!tb[RTPEA_RTPENGINE_EXCL];
info->table = get_table(table);
if (!info->table)
return -ENOENT;
if (!info->table) {
if (!crt)
return -ENOENT;
info->table = new_table_link(table);
if (!info->table)
return -EBUSY;
}
else {
if (excl) {
table_put(info->table);
info->table = NULL;
return -EEXIST;
}
}
return 0;
}
@ -7547,6 +7562,8 @@ static const struct nft_expr_ops rtpengine_ipv6_ops = {
static const struct nla_policy rtpengine_policy[RTPEA_RTPENGINE_MAX + 1] = {
[RTPEA_RTPENGINE_TABLE] = { .type = NLA_U32 },
[RTPEA_RTPENGINE_CREAT] = { .type = NLA_FLAG },
[RTPEA_RTPENGINE_EXCL] = { .type = NLA_FLAG },
};
static struct nft_expr_type rtpengine_inet_expr __read_mostly = {

@ -22,6 +22,8 @@ struct xt_rtpengine_info {
enum rtpengine_nft_attributes {
RTPEA_RTPENGINE_UNSPEC,
RTPEA_RTPENGINE_TABLE,
RTPEA_RTPENGINE_CREAT,
RTPEA_RTPENGINE_EXCL,
__RTPEA_RTPENGINE_MAX
};
#define RTPEA_RTPENGINE_MAX (__RTPEA_RTPENGINE_MAX - 1)

Loading…
Cancel
Save