Commit b1f3e43d authored by Dmitry Yakunin's avatar Dmitry Yakunin Committed by David S. Miller

inet_diag: add support for cgroup filter

This patch adds ability to filter sockets based on cgroup v2 ID.
Such filter is helpful in ss utility for filtering sockets by
cgroup pathname.
Signed-off-by: default avatarDmitry Yakunin <zeil@yandex-team.ru>
Reviewed-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6e3a401f
...@@ -96,6 +96,7 @@ enum { ...@@ -96,6 +96,7 @@ enum {
INET_DIAG_BC_MARK_COND, INET_DIAG_BC_MARK_COND,
INET_DIAG_BC_S_EQ, INET_DIAG_BC_S_EQ,
INET_DIAG_BC_D_EQ, INET_DIAG_BC_D_EQ,
INET_DIAG_BC_CGROUP_COND, /* u64 cgroup v2 ID */
}; };
struct inet_diag_hostcond { struct inet_diag_hostcond {
......
...@@ -43,6 +43,9 @@ struct inet_diag_entry { ...@@ -43,6 +43,9 @@ struct inet_diag_entry {
u16 userlocks; u16 userlocks;
u32 ifindex; u32 ifindex;
u32 mark; u32 mark;
#ifdef CONFIG_SOCK_CGROUP_DATA
u64 cgroup_id;
#endif
}; };
static DEFINE_MUTEX(inet_diag_table_mutex); static DEFINE_MUTEX(inet_diag_table_mutex);
...@@ -682,6 +685,16 @@ static int inet_diag_bc_run(const struct nlattr *_bc, ...@@ -682,6 +685,16 @@ static int inet_diag_bc_run(const struct nlattr *_bc,
yes = 0; yes = 0;
break; break;
} }
#ifdef CONFIG_SOCK_CGROUP_DATA
case INET_DIAG_BC_CGROUP_COND: {
u64 cgroup_id;
cgroup_id = get_unaligned((const u64 *)(op + 1));
if (cgroup_id != entry->cgroup_id)
yes = 0;
break;
}
#endif
} }
if (yes) { if (yes) {
...@@ -732,6 +745,9 @@ int inet_diag_bc_sk(const struct nlattr *bc, struct sock *sk) ...@@ -732,6 +745,9 @@ int inet_diag_bc_sk(const struct nlattr *bc, struct sock *sk)
entry.mark = inet_rsk(inet_reqsk(sk))->ir_mark; entry.mark = inet_rsk(inet_reqsk(sk))->ir_mark;
else else
entry.mark = 0; entry.mark = 0;
#ifdef CONFIG_SOCK_CGROUP_DATA
entry.cgroup_id = cgroup_id(sock_cgroup_ptr(&sk->sk_cgrp_data));
#endif
return inet_diag_bc_run(bc, &entry); return inet_diag_bc_run(bc, &entry);
} }
...@@ -821,6 +837,15 @@ static bool valid_markcond(const struct inet_diag_bc_op *op, int len, ...@@ -821,6 +837,15 @@ static bool valid_markcond(const struct inet_diag_bc_op *op, int len,
return len >= *min_len; return len >= *min_len;
} }
#ifdef CONFIG_SOCK_CGROUP_DATA
static bool valid_cgroupcond(const struct inet_diag_bc_op *op, int len,
int *min_len)
{
*min_len += sizeof(u64);
return len >= *min_len;
}
#endif
static int inet_diag_bc_audit(const struct nlattr *attr, static int inet_diag_bc_audit(const struct nlattr *attr,
const struct sk_buff *skb) const struct sk_buff *skb)
{ {
...@@ -863,6 +888,12 @@ static int inet_diag_bc_audit(const struct nlattr *attr, ...@@ -863,6 +888,12 @@ static int inet_diag_bc_audit(const struct nlattr *attr,
if (!valid_markcond(bc, len, &min_len)) if (!valid_markcond(bc, len, &min_len))
return -EINVAL; return -EINVAL;
break; break;
#ifdef CONFIG_SOCK_CGROUP_DATA
case INET_DIAG_BC_CGROUP_COND:
if (!valid_cgroupcond(bc, len, &min_len))
return -EINVAL;
break;
#endif
case INET_DIAG_BC_AUTO: case INET_DIAG_BC_AUTO:
case INET_DIAG_BC_JMP: case INET_DIAG_BC_JMP:
case INET_DIAG_BC_NOP: case INET_DIAG_BC_NOP:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment