Commit 5591b021 authored by Paolo Abeni's avatar Paolo Abeni

Merge branch 'net-openvswitch-metering-and-conntrack-in-userns'

Michael Weiß says:

====================
net: openvswitch: metering and conntrack in userns

Currently using openvswitch in a non-initial user namespace, e.g., an
unprivileged container, is possible but without metering and conntrack
support. This is due to the restriction of the corresponding Netlink
interfaces to the global CAP_NET_ADMIN.

This simple patches switch from GENL_ADMIN_PERM to GENL_UNS_ADMIN_PERM
in several cases to allow this also for the unprivileged container
use case.

We tested this for unprivileged containers created by the container
manager of GyroidOS (gyroidos.github.io). However, for other container
managers such as LXC or systemd which provide unprivileged containers
this should be apply equally.
====================

Link: https://lore.kernel.org/r/20220923133820.993725-1-michael.weiss@aisec.fraunhofer.deSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 6627a207 59cd7377
...@@ -1982,7 +1982,8 @@ static int ovs_ct_limit_set_zone_limit(struct nlattr *nla_zone_limit, ...@@ -1982,7 +1982,8 @@ static int ovs_ct_limit_set_zone_limit(struct nlattr *nla_zone_limit,
} else { } else {
struct ovs_ct_limit *ct_limit; struct ovs_ct_limit *ct_limit;
ct_limit = kmalloc(sizeof(*ct_limit), GFP_KERNEL); ct_limit = kmalloc(sizeof(*ct_limit),
GFP_KERNEL_ACCOUNT);
if (!ct_limit) if (!ct_limit)
return -ENOMEM; return -ENOMEM;
...@@ -2252,14 +2253,16 @@ static int ovs_ct_limit_cmd_get(struct sk_buff *skb, struct genl_info *info) ...@@ -2252,14 +2253,16 @@ static int ovs_ct_limit_cmd_get(struct sk_buff *skb, struct genl_info *info)
static const struct genl_small_ops ct_limit_genl_ops[] = { static const struct genl_small_ops ct_limit_genl_ops[] = {
{ .cmd = OVS_CT_LIMIT_CMD_SET, { .cmd = OVS_CT_LIMIT_CMD_SET,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN
* privilege. */ * privilege.
*/
.doit = ovs_ct_limit_cmd_set, .doit = ovs_ct_limit_cmd_set,
}, },
{ .cmd = OVS_CT_LIMIT_CMD_DEL, { .cmd = OVS_CT_LIMIT_CMD_DEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN
* privilege. */ * privilege.
*/
.doit = ovs_ct_limit_cmd_del, .doit = ovs_ct_limit_cmd_del,
}, },
{ .cmd = OVS_CT_LIMIT_CMD_GET, { .cmd = OVS_CT_LIMIT_CMD_GET,
......
...@@ -343,7 +343,7 @@ static struct dp_meter *dp_meter_create(struct nlattr **a) ...@@ -343,7 +343,7 @@ static struct dp_meter *dp_meter_create(struct nlattr **a)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
/* Allocate and set up the meter before locking anything. */ /* Allocate and set up the meter before locking anything. */
meter = kzalloc(struct_size(meter, bands, n_bands), GFP_KERNEL); meter = kzalloc(struct_size(meter, bands, n_bands), GFP_KERNEL_ACCOUNT);
if (!meter) if (!meter)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
...@@ -687,7 +687,7 @@ static const struct genl_small_ops dp_meter_genl_ops[] = { ...@@ -687,7 +687,7 @@ static const struct genl_small_ops dp_meter_genl_ops[] = {
}, },
{ .cmd = OVS_METER_CMD_SET, { .cmd = OVS_METER_CMD_SET,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN
* privilege. * privilege.
*/ */
.doit = ovs_meter_cmd_set, .doit = ovs_meter_cmd_set,
...@@ -699,7 +699,7 @@ static const struct genl_small_ops dp_meter_genl_ops[] = { ...@@ -699,7 +699,7 @@ static const struct genl_small_ops dp_meter_genl_ops[] = {
}, },
{ .cmd = OVS_METER_CMD_DEL, { .cmd = OVS_METER_CMD_DEL,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
.flags = GENL_ADMIN_PERM, /* Requires CAP_NET_ADMIN .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN
* privilege. * privilege.
*/ */
.doit = ovs_meter_cmd_del .doit = ovs_meter_cmd_del
......
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