mirror of
https://github.com/torvalds/linux.git
synced 2026-05-21 05:18:45 +02:00
netfilter pull request 25-04-29
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEjF9xRqF1emXiQiqU1w0aZmrPKyEFAmgP++oACgkQ1w0aZmrP KyHxVw/5ASwm5WPt7qRgSLKlbIzUbTQ5a2CEC7WS6ova5M0nvxFL6f/JACeK3tTt nC+2+Vx89PFYB1fcGE9MfrZBFf/Ccm9/leluKtYJ0l7VnhLAxAByn5EbExhTFPeP YA3neewU62x8Cm3JQ6pZrFQYjz7pEGfSgjJ6E2dncIDMcjQzFAnDxEAB8VDqzFde yAosgA3yJtvan2otuqAqg33i0Q32FM0rhFplIB0pvJpbq24YVs1vTupSp9xEAeDu Ms5dcm2fN1L2HEgt2xhDrhVLEIp3CDZpC0k9hf7eJkonm03nCBlfqUd6gPFwdz0j YoHziIDO4zdtefw4Z1Bd31L5BgRyEZkbf6E8qWqCb5hpauKMKNwrtaa2qAMYqWmF UQuGXCXkIJVTfwxrCk1zyYKRhc0ECXpah65lB7RwxlAayDWTvEGKdcWKs9Hk5jx3 hHgxfqO+nRfUjzGap5bWpOt18mfwZn287XSWFK6Ko6m/6UgzORfEEby/YoDUELKL xZBWy50+fauSkhFpQXt+IRT5rirmfMYv9hBBweKBwK05txMR4JdTNcI+zZxLMwnK sDbRjUsE1Req2ZnJPF33PcbkbvHj/B8m3awPxt2C3/kDK5WpKL3986Bj0hIJ25iM 12BD5iSfOTGIZJCdRMW7SAoI1h3Z7+cePF4UjxiWS7jCbKE6u2E= =tp12 -----END PGP SIGNATURE----- Merge tag 'nf-next-25-04-29' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next Pablo Neira Ayuso says: ==================== Netfilter updates for net-next The following batch contains Netfilter updates for net-next: 1) Replace msecs_to_jiffies() by secs_to_jiffies(), from Easwar Hariharan. 2) Allow to compile xt_cgroup with cgroupsv2 support only, from Michal Koutny. 3) Prepare for sock_cgroup_classid() removal by wrapping it around ifdef, also from Michal Koutny. 4) Remove redundant pointer fetch on conntrack template, from Xuanqiang Luo. 5) Re-format one block in the tproxy documentation for consistency, from Chen Linxuan. 6) Expose set element count and type via netlink attributes, from Florian Westphal. * tag 'nf-next-25-04-29' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf-next: netfilter: nf_tables: export set count and backend name to userspace docs: tproxy: fix formatting for nft code block netfilter: conntrack: Remove redundant NFCT_ALIGN call net: cgroup: Guard users of sock_cgroup_classid() netfilter: xt_cgroup: Make it independent from net_cls netfilter: xt_IDLETIMER: convert timeouts to secs_to_jiffies() ==================== Link: https://patch.msgid.link/20250428221254.3853-1-pablo@netfilter.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
1f773970a7
|
|
@ -69,9 +69,9 @@ add rules like this to the iptables ruleset above::
|
|||
# iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY \
|
||||
--tproxy-mark 0x1/0x1 --on-port 50080
|
||||
|
||||
Or the following rule to nft:
|
||||
Or the following rule to nft::
|
||||
|
||||
# nft add rule filter divert tcp dport 80 tproxy to :50080 meta mark set 1 accept
|
||||
# nft add rule filter divert tcp dport 80 tproxy to :50080 meta mark set 1 accept
|
||||
|
||||
Note that for this to work you'll have to modify the proxy to enable (SOL_IP,
|
||||
IP_TRANSPARENT) for the listening socket.
|
||||
|
|
|
|||
|
|
@ -394,6 +394,8 @@ enum nft_set_field_attributes {
|
|||
* @NFTA_SET_HANDLE: set handle (NLA_U64)
|
||||
* @NFTA_SET_EXPR: set expression (NLA_NESTED: nft_expr_attributes)
|
||||
* @NFTA_SET_EXPRESSIONS: list of expressions (NLA_NESTED: nft_list_attributes)
|
||||
* @NFTA_SET_TYPE: set backend type (NLA_STRING)
|
||||
* @NFTA_SET_COUNT: number of set elements (NLA_U32)
|
||||
*/
|
||||
enum nft_set_attributes {
|
||||
NFTA_SET_UNSPEC,
|
||||
|
|
@ -415,6 +417,8 @@ enum nft_set_attributes {
|
|||
NFTA_SET_HANDLE,
|
||||
NFTA_SET_EXPR,
|
||||
NFTA_SET_EXPRESSIONS,
|
||||
NFTA_SET_TYPE,
|
||||
NFTA_SET_COUNT,
|
||||
__NFTA_SET_MAX
|
||||
};
|
||||
#define NFTA_SET_MAX (__NFTA_SET_MAX - 1)
|
||||
|
|
|
|||
|
|
@ -160,7 +160,7 @@ int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
|
|||
ext & (1 << (INET_DIAG_TCLASS - 1))) {
|
||||
u32 classid = 0;
|
||||
|
||||
#ifdef CONFIG_SOCK_CGROUP_DATA
|
||||
#ifdef CONFIG_CGROUP_NET_CLASSID
|
||||
classid = sock_cgroup_classid(&sk->sk_cgrp_data);
|
||||
#endif
|
||||
/* Fallback to socket priority if class id isn't set.
|
||||
|
|
|
|||
|
|
@ -1180,7 +1180,7 @@ config NETFILTER_XT_MATCH_CGROUP
|
|||
tristate '"control group" match support'
|
||||
depends on NETFILTER_ADVANCED
|
||||
depends on CGROUPS
|
||||
select CGROUP_NET_CLASSID
|
||||
select SOCK_CGROUP_DATA
|
||||
help
|
||||
Socket/process control group matching allows you to match locally
|
||||
generated packets based on which net_cls control group processes
|
||||
|
|
|
|||
|
|
@ -531,10 +531,8 @@ struct nf_conn *nf_ct_tmpl_alloc(struct net *net,
|
|||
|
||||
p = tmpl;
|
||||
tmpl = (struct nf_conn *)NFCT_ALIGN((unsigned long)p);
|
||||
if (tmpl != p) {
|
||||
tmpl = (struct nf_conn *)NFCT_ALIGN((unsigned long)p);
|
||||
if (tmpl != p)
|
||||
tmpl->proto.tmpl_padto = (char *)tmpl - (char *)p;
|
||||
}
|
||||
} else {
|
||||
tmpl = kzalloc(sizeof(*tmpl), flags);
|
||||
if (!tmpl)
|
||||
|
|
|
|||
|
|
@ -4569,6 +4569,8 @@ static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
|
|||
[NFTA_SET_HANDLE] = { .type = NLA_U64 },
|
||||
[NFTA_SET_EXPR] = { .type = NLA_NESTED },
|
||||
[NFTA_SET_EXPRESSIONS] = NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
|
||||
[NFTA_SET_TYPE] = { .type = NLA_REJECT },
|
||||
[NFTA_SET_COUNT] = { .type = NLA_REJECT },
|
||||
};
|
||||
|
||||
static const struct nla_policy nft_concat_policy[NFTA_SET_FIELD_MAX + 1] = {
|
||||
|
|
@ -4763,6 +4765,27 @@ static u32 nft_set_userspace_size(const struct nft_set_ops *ops, u32 size)
|
|||
return size;
|
||||
}
|
||||
|
||||
static noinline_for_stack int
|
||||
nf_tables_fill_set_info(struct sk_buff *skb, const struct nft_set *set)
|
||||
{
|
||||
unsigned int nelems;
|
||||
char str[40];
|
||||
int ret;
|
||||
|
||||
ret = snprintf(str, sizeof(str), "%ps", set->ops);
|
||||
|
||||
/* Not expected to happen and harmless: NFTA_SET_TYPE is dumped
|
||||
* to userspace purely for informational/debug purposes.
|
||||
*/
|
||||
DEBUG_NET_WARN_ON_ONCE(ret >= sizeof(str));
|
||||
|
||||
if (nla_put_string(skb, NFTA_SET_TYPE, str))
|
||||
return -EMSGSIZE;
|
||||
|
||||
nelems = nft_set_userspace_size(set->ops, atomic_read(&set->nelems));
|
||||
return nla_put_be32(skb, NFTA_SET_COUNT, htonl(nelems));
|
||||
}
|
||||
|
||||
static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
|
||||
const struct nft_set *set, u16 event, u16 flags)
|
||||
{
|
||||
|
|
@ -4843,6 +4866,9 @@ static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
|
|||
|
||||
nla_nest_end(skb, nest);
|
||||
|
||||
if (nf_tables_fill_set_info(skb, set))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (set->num_exprs == 1) {
|
||||
nest = nla_nest_start_noflag(skb, NFTA_SET_EXPR);
|
||||
if (nf_tables_fill_expr_info(skb, set->exprs[0], false) < 0)
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ static int idletimer_tg_create(struct idletimer_tg_info *info)
|
|||
INIT_WORK(&info->timer->work, idletimer_tg_work);
|
||||
|
||||
mod_timer(&info->timer->timer,
|
||||
msecs_to_jiffies(info->timeout * 1000) + jiffies);
|
||||
secs_to_jiffies(info->timeout) + jiffies);
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
@ -229,7 +229,7 @@ static int idletimer_tg_create_v1(struct idletimer_tg_info_v1 *info)
|
|||
} else {
|
||||
timer_setup(&info->timer->timer, idletimer_tg_expired, 0);
|
||||
mod_timer(&info->timer->timer,
|
||||
msecs_to_jiffies(info->timeout * 1000) + jiffies);
|
||||
secs_to_jiffies(info->timeout) + jiffies);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -254,7 +254,7 @@ static unsigned int idletimer_tg_target(struct sk_buff *skb,
|
|||
info->label, info->timeout);
|
||||
|
||||
mod_timer(&info->timer->timer,
|
||||
msecs_to_jiffies(info->timeout * 1000) + jiffies);
|
||||
secs_to_jiffies(info->timeout) + jiffies);
|
||||
|
||||
return XT_CONTINUE;
|
||||
}
|
||||
|
|
@ -275,7 +275,7 @@ static unsigned int idletimer_tg_target_v1(struct sk_buff *skb,
|
|||
alarm_start_relative(&info->timer->alarm, tout);
|
||||
} else {
|
||||
mod_timer(&info->timer->timer,
|
||||
msecs_to_jiffies(info->timeout * 1000) + jiffies);
|
||||
secs_to_jiffies(info->timeout) + jiffies);
|
||||
}
|
||||
|
||||
return XT_CONTINUE;
|
||||
|
|
@ -320,7 +320,7 @@ static int idletimer_tg_checkentry(const struct xt_tgchk_param *par)
|
|||
if (info->timer) {
|
||||
info->timer->refcnt++;
|
||||
mod_timer(&info->timer->timer,
|
||||
msecs_to_jiffies(info->timeout * 1000) + jiffies);
|
||||
secs_to_jiffies(info->timeout) + jiffies);
|
||||
|
||||
pr_debug("increased refcnt of timer %s to %u\n",
|
||||
info->label, info->timer->refcnt);
|
||||
|
|
@ -382,7 +382,7 @@ static int idletimer_tg_checkentry_v1(const struct xt_tgchk_param *par)
|
|||
}
|
||||
} else {
|
||||
mod_timer(&info->timer->timer,
|
||||
msecs_to_jiffies(info->timeout * 1000) + jiffies);
|
||||
secs_to_jiffies(info->timeout) + jiffies);
|
||||
}
|
||||
pr_debug("increased refcnt of timer %s to %u\n",
|
||||
info->label, info->timer->refcnt);
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ MODULE_DESCRIPTION("Xtables: process control group matching");
|
|||
MODULE_ALIAS("ipt_cgroup");
|
||||
MODULE_ALIAS("ip6t_cgroup");
|
||||
|
||||
#define NET_CLS_CLASSID_INVALID_MSG "xt_cgroup: classid invalid without net_cls cgroups\n"
|
||||
|
||||
static int cgroup_mt_check_v0(const struct xt_mtchk_param *par)
|
||||
{
|
||||
struct xt_cgroup_info_v0 *info = par->matchinfo;
|
||||
|
|
@ -30,6 +32,11 @@ static int cgroup_mt_check_v0(const struct xt_mtchk_param *par)
|
|||
if (info->invert & ~1)
|
||||
return -EINVAL;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_CGROUP_NET_CLASSID)) {
|
||||
pr_info(NET_CLS_CLASSID_INVALID_MSG);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -51,6 +58,11 @@ static int cgroup_mt_check_v1(const struct xt_mtchk_param *par)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (info->has_classid && !IS_ENABLED(CONFIG_CGROUP_NET_CLASSID)) {
|
||||
pr_info(NET_CLS_CLASSID_INVALID_MSG);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
info->priv = NULL;
|
||||
if (info->has_path) {
|
||||
cgrp = cgroup_get_from_path(info->path);
|
||||
|
|
@ -83,6 +95,11 @@ static int cgroup_mt_check_v2(const struct xt_mtchk_param *par)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (info->has_classid && !IS_ENABLED(CONFIG_CGROUP_NET_CLASSID)) {
|
||||
pr_info(NET_CLS_CLASSID_INVALID_MSG);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
info->priv = NULL;
|
||||
if (info->has_path) {
|
||||
cgrp = cgroup_get_from_path(info->path);
|
||||
|
|
@ -100,6 +117,7 @@ static int cgroup_mt_check_v2(const struct xt_mtchk_param *par)
|
|||
static bool
|
||||
cgroup_mt_v0(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
{
|
||||
#ifdef CONFIG_CGROUP_NET_CLASSID
|
||||
const struct xt_cgroup_info_v0 *info = par->matchinfo;
|
||||
struct sock *sk = skb->sk;
|
||||
|
||||
|
|
@ -108,6 +126,8 @@ cgroup_mt_v0(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
|
||||
return (info->id == sock_cgroup_classid(&skb->sk->sk_cgrp_data)) ^
|
||||
info->invert;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool cgroup_mt_v1(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
|
|
@ -123,9 +143,12 @@ static bool cgroup_mt_v1(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
if (ancestor)
|
||||
return cgroup_is_descendant(sock_cgroup_ptr(skcd), ancestor) ^
|
||||
info->invert_path;
|
||||
#ifdef CONFIG_CGROUP_NET_CLASSID
|
||||
else
|
||||
return (info->classid == sock_cgroup_classid(skcd)) ^
|
||||
info->invert_classid;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool cgroup_mt_v2(const struct sk_buff *skb, struct xt_action_param *par)
|
||||
|
|
@ -141,9 +164,12 @@ static bool cgroup_mt_v2(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
if (ancestor)
|
||||
return cgroup_is_descendant(sock_cgroup_ptr(skcd), ancestor) ^
|
||||
info->invert_path;
|
||||
#ifdef CONFIG_CGROUP_NET_CLASSID
|
||||
else
|
||||
return (info->classid == sock_cgroup_classid(skcd)) ^
|
||||
info->invert_classid;
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
static void cgroup_mt_destroy_v1(const struct xt_mtdtor_param *par)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user