mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
netlink: spec: add shaper YAML spec
Define the user-space visible interface to query, configure and delete network shapers via yaml definition. Add dummy implementations for the relevant NL callbacks. set() and delete() operations touch a single shaper creating/updating or deleting it. The group() operation creates a shaper's group, nesting multiple input shapers under the specified output shaper. Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com> Link: https://patch.msgid.link/7a33a1ff370bdbcd0cd3f909575c912cd56f41da.1728460186.git.pabeni@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
13d68a1643
commit
04e65df94b
274
Documentation/netlink/specs/net_shaper.yaml
Normal file
274
Documentation/netlink/specs/net_shaper.yaml
Normal file
@ -0,0 +1,274 @@
|
|||||||
|
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||||
|
name: net-shaper
|
||||||
|
|
||||||
|
doc: |
|
||||||
|
Networking HW rate limiting configuration.
|
||||||
|
|
||||||
|
This API allows configuring HW shapers available on the network
|
||||||
|
devices at different levels (queues, network device) and allows
|
||||||
|
arbitrary manipulation of the scheduling tree of the involved
|
||||||
|
shapers.
|
||||||
|
|
||||||
|
Each @shaper is identified within the given device, by a @handle,
|
||||||
|
comprising both a @scope and an @id.
|
||||||
|
|
||||||
|
Depending on the @scope value, the shapers are attached to specific
|
||||||
|
HW objects (queues, devices) or, for @node scope, represent a
|
||||||
|
scheduling group, that can be placed in an arbitrary location of
|
||||||
|
the scheduling tree.
|
||||||
|
|
||||||
|
Shapers can be created with two different operations: the @set
|
||||||
|
operation, to create and update a single "attached" shaper, and
|
||||||
|
the @group operation, to create and update a scheduling
|
||||||
|
group. Only the @group operation can create @node scope shapers.
|
||||||
|
|
||||||
|
Existing shapers can be deleted/reset via the @delete operation.
|
||||||
|
|
||||||
|
The user can query the running configuration via the @get operation.
|
||||||
|
|
||||||
|
definitions:
|
||||||
|
-
|
||||||
|
type: enum
|
||||||
|
name: scope
|
||||||
|
doc: Defines the shaper @id interpretation.
|
||||||
|
render-max: true
|
||||||
|
entries:
|
||||||
|
- name: unspec
|
||||||
|
doc: The scope is not specified.
|
||||||
|
-
|
||||||
|
name: netdev
|
||||||
|
doc: The main shaper for the given network device.
|
||||||
|
-
|
||||||
|
name: queue
|
||||||
|
doc: |
|
||||||
|
The shaper is attached to the given device queue,
|
||||||
|
the @id represents the queue number.
|
||||||
|
-
|
||||||
|
name: node
|
||||||
|
doc: |
|
||||||
|
The shaper allows grouping of queues or other
|
||||||
|
node shapers; can be nested in either @netdev
|
||||||
|
shapers or other @node shapers, allowing placement
|
||||||
|
in any location of the scheduling tree, except
|
||||||
|
leaves and root.
|
||||||
|
-
|
||||||
|
type: enum
|
||||||
|
name: metric
|
||||||
|
doc: Different metric supported by the shaper.
|
||||||
|
entries:
|
||||||
|
-
|
||||||
|
name: bps
|
||||||
|
doc: Shaper operates on a bits per second basis.
|
||||||
|
-
|
||||||
|
name: pps
|
||||||
|
doc: Shaper operates on a packets per second basis.
|
||||||
|
|
||||||
|
attribute-sets:
|
||||||
|
-
|
||||||
|
name: net-shaper
|
||||||
|
attributes:
|
||||||
|
-
|
||||||
|
name: handle
|
||||||
|
type: nest
|
||||||
|
nested-attributes: handle
|
||||||
|
doc: Unique identifier for the given shaper inside the owning device.
|
||||||
|
-
|
||||||
|
name: metric
|
||||||
|
type: u32
|
||||||
|
enum: metric
|
||||||
|
doc: Metric used by the given shaper for bw-min, bw-max and burst.
|
||||||
|
-
|
||||||
|
name: bw-min
|
||||||
|
type: uint
|
||||||
|
doc: Guaranteed bandwidth for the given shaper.
|
||||||
|
-
|
||||||
|
name: bw-max
|
||||||
|
type: uint
|
||||||
|
doc: Maximum bandwidth for the given shaper or 0 when unlimited.
|
||||||
|
-
|
||||||
|
name: burst
|
||||||
|
type: uint
|
||||||
|
doc: |
|
||||||
|
Maximum burst-size for shaping. Should not be interpreted
|
||||||
|
as a quantum.
|
||||||
|
-
|
||||||
|
name: priority
|
||||||
|
type: u32
|
||||||
|
doc: |
|
||||||
|
Scheduling priority for the given shaper. The priority
|
||||||
|
scheduling is applied to sibling shapers.
|
||||||
|
-
|
||||||
|
name: weight
|
||||||
|
type: u32
|
||||||
|
doc: |
|
||||||
|
Relative weight for round robin scheduling of the
|
||||||
|
given shaper.
|
||||||
|
The scheduling is applied to all sibling shapers
|
||||||
|
with the same priority.
|
||||||
|
-
|
||||||
|
name: ifindex
|
||||||
|
type: u32
|
||||||
|
doc: Interface index owning the specified shaper.
|
||||||
|
-
|
||||||
|
name: parent
|
||||||
|
type: nest
|
||||||
|
nested-attributes: handle
|
||||||
|
doc: |
|
||||||
|
Identifier for the parent of the affected shaper.
|
||||||
|
Only needed for @group operation.
|
||||||
|
-
|
||||||
|
name: leaves
|
||||||
|
type: nest
|
||||||
|
multi-attr: true
|
||||||
|
nested-attributes: leaf-info
|
||||||
|
doc: |
|
||||||
|
Describes a set of leaves shapers for a @group operation.
|
||||||
|
-
|
||||||
|
name: handle
|
||||||
|
attributes:
|
||||||
|
-
|
||||||
|
name: scope
|
||||||
|
type: u32
|
||||||
|
enum: scope
|
||||||
|
doc: Defines the shaper @id interpretation.
|
||||||
|
-
|
||||||
|
name: id
|
||||||
|
type: u32
|
||||||
|
doc: |
|
||||||
|
Numeric identifier of a shaper. The id semantic depends on
|
||||||
|
the scope. For @queue scope it's the queue id and for @node
|
||||||
|
scope it's the node identifier.
|
||||||
|
-
|
||||||
|
name: leaf-info
|
||||||
|
subset-of: net-shaper
|
||||||
|
attributes:
|
||||||
|
-
|
||||||
|
name: handle
|
||||||
|
-
|
||||||
|
name: priority
|
||||||
|
-
|
||||||
|
name: weight
|
||||||
|
|
||||||
|
operations:
|
||||||
|
list:
|
||||||
|
-
|
||||||
|
name: get
|
||||||
|
doc: |
|
||||||
|
Get information about a shaper for a given device.
|
||||||
|
attribute-set: net-shaper
|
||||||
|
|
||||||
|
do:
|
||||||
|
pre: net-shaper-nl-pre-doit
|
||||||
|
post: net-shaper-nl-post-doit
|
||||||
|
request:
|
||||||
|
attributes: &ns-binding
|
||||||
|
- ifindex
|
||||||
|
- handle
|
||||||
|
reply:
|
||||||
|
attributes: &ns-attrs
|
||||||
|
- ifindex
|
||||||
|
- parent
|
||||||
|
- handle
|
||||||
|
- metric
|
||||||
|
- bw-min
|
||||||
|
- bw-max
|
||||||
|
- burst
|
||||||
|
- priority
|
||||||
|
- weight
|
||||||
|
|
||||||
|
dump:
|
||||||
|
pre: net-shaper-nl-pre-dumpit
|
||||||
|
post: net-shaper-nl-post-dumpit
|
||||||
|
request:
|
||||||
|
attributes:
|
||||||
|
- ifindex
|
||||||
|
reply:
|
||||||
|
attributes: *ns-attrs
|
||||||
|
-
|
||||||
|
name: set
|
||||||
|
doc: |
|
||||||
|
Create or update the specified shaper.
|
||||||
|
The set operation can't be used to create a @node scope shaper,
|
||||||
|
use the @group operation instead.
|
||||||
|
attribute-set: net-shaper
|
||||||
|
flags: [ admin-perm ]
|
||||||
|
|
||||||
|
do:
|
||||||
|
pre: net-shaper-nl-pre-doit
|
||||||
|
post: net-shaper-nl-post-doit
|
||||||
|
request:
|
||||||
|
attributes:
|
||||||
|
- ifindex
|
||||||
|
- handle
|
||||||
|
- metric
|
||||||
|
- bw-min
|
||||||
|
- bw-max
|
||||||
|
- burst
|
||||||
|
- priority
|
||||||
|
- weight
|
||||||
|
|
||||||
|
-
|
||||||
|
name: delete
|
||||||
|
doc: |
|
||||||
|
Clear (remove) the specified shaper. When deleting
|
||||||
|
a @node shaper, reattach all the node's leaves to the
|
||||||
|
deleted node's parent.
|
||||||
|
If, after the removal, the parent shaper has no more
|
||||||
|
leaves and the parent shaper scope is @node, the parent
|
||||||
|
node is deleted, recursively.
|
||||||
|
When deleting a @queue shaper or a @netdev shaper,
|
||||||
|
the shaper disappears from the hierarchy, but the
|
||||||
|
queue/device can still send traffic: it has an implicit
|
||||||
|
node with infinite bandwidth. The queue's implicit node
|
||||||
|
feeds an implicit RR node at the root of the hierarchy.
|
||||||
|
attribute-set: net-shaper
|
||||||
|
flags: [ admin-perm ]
|
||||||
|
|
||||||
|
do:
|
||||||
|
pre: net-shaper-nl-pre-doit
|
||||||
|
post: net-shaper-nl-post-doit
|
||||||
|
request:
|
||||||
|
attributes: *ns-binding
|
||||||
|
|
||||||
|
-
|
||||||
|
name: group
|
||||||
|
doc: |
|
||||||
|
Create or update a scheduling group, attaching the specified
|
||||||
|
@leaves shapers under the specified node identified by @handle.
|
||||||
|
The @leaves shapers scope must be @queue and the node shaper
|
||||||
|
scope must be either @node or @netdev.
|
||||||
|
When the node shaper has @node scope, if the @handle @id is not
|
||||||
|
specified, a new shaper of such scope is created, otherwise the
|
||||||
|
specified node must already exist.
|
||||||
|
When updating an existing node shaper, the specified @leaves are
|
||||||
|
added to the existing node; such node will also retain any preexisting
|
||||||
|
leave.
|
||||||
|
The @parent handle for a new node shaper defaults to the parent
|
||||||
|
of all the leaves, provided all the leaves share the same parent.
|
||||||
|
Otherwise @parent handle must be specified.
|
||||||
|
The user can optionally provide shaping attributes for the node
|
||||||
|
shaper.
|
||||||
|
The operation is atomic, on failure no change is applied to
|
||||||
|
the device shaping configuration, otherwise the @node shaper
|
||||||
|
full identifier, comprising @binding and @handle, is provided
|
||||||
|
as the reply.
|
||||||
|
attribute-set: net-shaper
|
||||||
|
flags: [ admin-perm ]
|
||||||
|
|
||||||
|
do:
|
||||||
|
pre: net-shaper-nl-pre-doit
|
||||||
|
post: net-shaper-nl-post-doit
|
||||||
|
request:
|
||||||
|
attributes:
|
||||||
|
- ifindex
|
||||||
|
- parent
|
||||||
|
- handle
|
||||||
|
- metric
|
||||||
|
- bw-min
|
||||||
|
- bw-max
|
||||||
|
- burst
|
||||||
|
- priority
|
||||||
|
- weight
|
||||||
|
- leaves
|
||||||
|
reply:
|
||||||
|
attributes: *ns-binding
|
@ -16116,6 +16116,7 @@ F: include/linux/platform_data/wiznet.h
|
|||||||
F: include/uapi/linux/cn_proc.h
|
F: include/uapi/linux/cn_proc.h
|
||||||
F: include/uapi/linux/ethtool_netlink.h
|
F: include/uapi/linux/ethtool_netlink.h
|
||||||
F: include/uapi/linux/if_*
|
F: include/uapi/linux/if_*
|
||||||
|
F: include/uapi/linux/net_shaper.h
|
||||||
F: include/uapi/linux/netdev*
|
F: include/uapi/linux/netdev*
|
||||||
F: tools/testing/selftests/drivers/net/
|
F: tools/testing/selftests/drivers/net/
|
||||||
X: Documentation/devicetree/bindings/net/bluetooth/
|
X: Documentation/devicetree/bindings/net/bluetooth/
|
||||||
|
78
include/uapi/linux/net_shaper.h
Normal file
78
include/uapi/linux/net_shaper.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
|
||||||
|
/* Do not edit directly, auto-generated from: */
|
||||||
|
/* Documentation/netlink/specs/net_shaper.yaml */
|
||||||
|
/* YNL-GEN uapi header */
|
||||||
|
|
||||||
|
#ifndef _UAPI_LINUX_NET_SHAPER_H
|
||||||
|
#define _UAPI_LINUX_NET_SHAPER_H
|
||||||
|
|
||||||
|
#define NET_SHAPER_FAMILY_NAME "net-shaper"
|
||||||
|
#define NET_SHAPER_FAMILY_VERSION 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum net_shaper_scope - Defines the shaper @id interpretation.
|
||||||
|
* @NET_SHAPER_SCOPE_UNSPEC: The scope is not specified.
|
||||||
|
* @NET_SHAPER_SCOPE_NETDEV: The main shaper for the given network device.
|
||||||
|
* @NET_SHAPER_SCOPE_QUEUE: The shaper is attached to the given device queue,
|
||||||
|
* the @id represents the queue number.
|
||||||
|
* @NET_SHAPER_SCOPE_NODE: The shaper allows grouping of queues or other node
|
||||||
|
* shapers; can be nested in either @netdev shapers or other @node shapers,
|
||||||
|
* allowing placement in any location of the scheduling tree, except leaves
|
||||||
|
* and root.
|
||||||
|
*/
|
||||||
|
enum net_shaper_scope {
|
||||||
|
NET_SHAPER_SCOPE_UNSPEC,
|
||||||
|
NET_SHAPER_SCOPE_NETDEV,
|
||||||
|
NET_SHAPER_SCOPE_QUEUE,
|
||||||
|
NET_SHAPER_SCOPE_NODE,
|
||||||
|
|
||||||
|
/* private: */
|
||||||
|
__NET_SHAPER_SCOPE_MAX,
|
||||||
|
NET_SHAPER_SCOPE_MAX = (__NET_SHAPER_SCOPE_MAX - 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enum net_shaper_metric - Different metric supported by the shaper.
|
||||||
|
* @NET_SHAPER_METRIC_BPS: Shaper operates on a bits per second basis.
|
||||||
|
* @NET_SHAPER_METRIC_PPS: Shaper operates on a packets per second basis.
|
||||||
|
*/
|
||||||
|
enum net_shaper_metric {
|
||||||
|
NET_SHAPER_METRIC_BPS,
|
||||||
|
NET_SHAPER_METRIC_PPS,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NET_SHAPER_A_HANDLE = 1,
|
||||||
|
NET_SHAPER_A_METRIC,
|
||||||
|
NET_SHAPER_A_BW_MIN,
|
||||||
|
NET_SHAPER_A_BW_MAX,
|
||||||
|
NET_SHAPER_A_BURST,
|
||||||
|
NET_SHAPER_A_PRIORITY,
|
||||||
|
NET_SHAPER_A_WEIGHT,
|
||||||
|
NET_SHAPER_A_IFINDEX,
|
||||||
|
NET_SHAPER_A_PARENT,
|
||||||
|
NET_SHAPER_A_LEAVES,
|
||||||
|
|
||||||
|
__NET_SHAPER_A_MAX,
|
||||||
|
NET_SHAPER_A_MAX = (__NET_SHAPER_A_MAX - 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NET_SHAPER_A_HANDLE_SCOPE = 1,
|
||||||
|
NET_SHAPER_A_HANDLE_ID,
|
||||||
|
|
||||||
|
__NET_SHAPER_A_HANDLE_MAX,
|
||||||
|
NET_SHAPER_A_HANDLE_MAX = (__NET_SHAPER_A_HANDLE_MAX - 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NET_SHAPER_CMD_GET = 1,
|
||||||
|
NET_SHAPER_CMD_SET,
|
||||||
|
NET_SHAPER_CMD_DELETE,
|
||||||
|
NET_SHAPER_CMD_GROUP,
|
||||||
|
|
||||||
|
__NET_SHAPER_CMD_MAX,
|
||||||
|
NET_SHAPER_CMD_MAX = (__NET_SHAPER_CMD_MAX - 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _UAPI_LINUX_NET_SHAPER_H */
|
@ -72,6 +72,9 @@ config NET_DEVMEM
|
|||||||
depends on GENERIC_ALLOCATOR
|
depends on GENERIC_ALLOCATOR
|
||||||
depends on PAGE_POOL
|
depends on PAGE_POOL
|
||||||
|
|
||||||
|
config NET_SHAPER
|
||||||
|
bool
|
||||||
|
|
||||||
menu "Networking options"
|
menu "Networking options"
|
||||||
|
|
||||||
source "net/packet/Kconfig"
|
source "net/packet/Kconfig"
|
||||||
|
@ -79,3 +79,4 @@ obj-$(CONFIG_XDP_SOCKETS) += xdp/
|
|||||||
obj-$(CONFIG_MPTCP) += mptcp/
|
obj-$(CONFIG_MPTCP) += mptcp/
|
||||||
obj-$(CONFIG_MCTP) += mctp/
|
obj-$(CONFIG_MCTP) += mctp/
|
||||||
obj-$(CONFIG_NET_HANDSHAKE) += handshake/
|
obj-$(CONFIG_NET_HANDSHAKE) += handshake/
|
||||||
|
obj-$(CONFIG_NET_SHAPER) += shaper/
|
||||||
|
8
net/shaper/Makefile
Normal file
8
net/shaper/Makefile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
#
|
||||||
|
# Makefile for the net shaper infrastructure.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2024, Red Hat, Inc.
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-y += shaper.o shaper_nl_gen.o
|
55
net/shaper/shaper.c
Normal file
55
net/shaper/shaper.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/skbuff.h>
|
||||||
|
|
||||||
|
#include "shaper_nl_gen.h"
|
||||||
|
|
||||||
|
int net_shaper_nl_pre_doit(const struct genl_split_ops *ops,
|
||||||
|
struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
void net_shaper_nl_post_doit(const struct genl_split_ops *ops,
|
||||||
|
struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_shaper_nl_get_doit(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_shaper_nl_get_dumpit(struct sk_buff *skb,
|
||||||
|
struct netlink_callback *cb)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_shaper_nl_set_doit(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_shaper_nl_delete_doit(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_shaper_nl_pre_dumpit(struct netlink_callback *cb)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_shaper_nl_post_dumpit(struct netlink_callback *cb)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init shaper_init(void)
|
||||||
|
{
|
||||||
|
return genl_register_family(&net_shaper_nl_family);
|
||||||
|
}
|
||||||
|
|
||||||
|
subsys_initcall(shaper_init);
|
125
net/shaper/shaper_nl_gen.c
Normal file
125
net/shaper/shaper_nl_gen.c
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
// SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||||
|
/* Do not edit directly, auto-generated from: */
|
||||||
|
/* Documentation/netlink/specs/net_shaper.yaml */
|
||||||
|
/* YNL-GEN kernel source */
|
||||||
|
|
||||||
|
#include <net/netlink.h>
|
||||||
|
#include <net/genetlink.h>
|
||||||
|
|
||||||
|
#include "shaper_nl_gen.h"
|
||||||
|
|
||||||
|
#include <uapi/linux/net_shaper.h>
|
||||||
|
|
||||||
|
/* Common nested types */
|
||||||
|
const struct nla_policy net_shaper_handle_nl_policy[NET_SHAPER_A_HANDLE_ID + 1] = {
|
||||||
|
[NET_SHAPER_A_HANDLE_SCOPE] = NLA_POLICY_MAX(NLA_U32, 3),
|
||||||
|
[NET_SHAPER_A_HANDLE_ID] = { .type = NLA_U32, },
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct nla_policy net_shaper_leaf_info_nl_policy[NET_SHAPER_A_WEIGHT + 1] = {
|
||||||
|
[NET_SHAPER_A_HANDLE] = NLA_POLICY_NESTED(net_shaper_handle_nl_policy),
|
||||||
|
[NET_SHAPER_A_PRIORITY] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_WEIGHT] = { .type = NLA_U32, },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* NET_SHAPER_CMD_GET - do */
|
||||||
|
static const struct nla_policy net_shaper_get_do_nl_policy[NET_SHAPER_A_IFINDEX + 1] = {
|
||||||
|
[NET_SHAPER_A_IFINDEX] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_HANDLE] = NLA_POLICY_NESTED(net_shaper_handle_nl_policy),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* NET_SHAPER_CMD_GET - dump */
|
||||||
|
static const struct nla_policy net_shaper_get_dump_nl_policy[NET_SHAPER_A_IFINDEX + 1] = {
|
||||||
|
[NET_SHAPER_A_IFINDEX] = { .type = NLA_U32, },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* NET_SHAPER_CMD_SET - do */
|
||||||
|
static const struct nla_policy net_shaper_set_nl_policy[NET_SHAPER_A_IFINDEX + 1] = {
|
||||||
|
[NET_SHAPER_A_IFINDEX] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_HANDLE] = NLA_POLICY_NESTED(net_shaper_handle_nl_policy),
|
||||||
|
[NET_SHAPER_A_METRIC] = NLA_POLICY_MAX(NLA_U32, 1),
|
||||||
|
[NET_SHAPER_A_BW_MIN] = { .type = NLA_UINT, },
|
||||||
|
[NET_SHAPER_A_BW_MAX] = { .type = NLA_UINT, },
|
||||||
|
[NET_SHAPER_A_BURST] = { .type = NLA_UINT, },
|
||||||
|
[NET_SHAPER_A_PRIORITY] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_WEIGHT] = { .type = NLA_U32, },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* NET_SHAPER_CMD_DELETE - do */
|
||||||
|
static const struct nla_policy net_shaper_delete_nl_policy[NET_SHAPER_A_IFINDEX + 1] = {
|
||||||
|
[NET_SHAPER_A_IFINDEX] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_HANDLE] = NLA_POLICY_NESTED(net_shaper_handle_nl_policy),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* NET_SHAPER_CMD_GROUP - do */
|
||||||
|
static const struct nla_policy net_shaper_group_nl_policy[NET_SHAPER_A_LEAVES + 1] = {
|
||||||
|
[NET_SHAPER_A_IFINDEX] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_PARENT] = NLA_POLICY_NESTED(net_shaper_handle_nl_policy),
|
||||||
|
[NET_SHAPER_A_HANDLE] = NLA_POLICY_NESTED(net_shaper_handle_nl_policy),
|
||||||
|
[NET_SHAPER_A_METRIC] = NLA_POLICY_MAX(NLA_U32, 1),
|
||||||
|
[NET_SHAPER_A_BW_MIN] = { .type = NLA_UINT, },
|
||||||
|
[NET_SHAPER_A_BW_MAX] = { .type = NLA_UINT, },
|
||||||
|
[NET_SHAPER_A_BURST] = { .type = NLA_UINT, },
|
||||||
|
[NET_SHAPER_A_PRIORITY] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_WEIGHT] = { .type = NLA_U32, },
|
||||||
|
[NET_SHAPER_A_LEAVES] = NLA_POLICY_NESTED(net_shaper_leaf_info_nl_policy),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Ops table for net_shaper */
|
||||||
|
static const struct genl_split_ops net_shaper_nl_ops[] = {
|
||||||
|
{
|
||||||
|
.cmd = NET_SHAPER_CMD_GET,
|
||||||
|
.pre_doit = net_shaper_nl_pre_doit,
|
||||||
|
.doit = net_shaper_nl_get_doit,
|
||||||
|
.post_doit = net_shaper_nl_post_doit,
|
||||||
|
.policy = net_shaper_get_do_nl_policy,
|
||||||
|
.maxattr = NET_SHAPER_A_IFINDEX,
|
||||||
|
.flags = GENL_CMD_CAP_DO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cmd = NET_SHAPER_CMD_GET,
|
||||||
|
.start = net_shaper_nl_pre_dumpit,
|
||||||
|
.dumpit = net_shaper_nl_get_dumpit,
|
||||||
|
.done = net_shaper_nl_post_dumpit,
|
||||||
|
.policy = net_shaper_get_dump_nl_policy,
|
||||||
|
.maxattr = NET_SHAPER_A_IFINDEX,
|
||||||
|
.flags = GENL_CMD_CAP_DUMP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cmd = NET_SHAPER_CMD_SET,
|
||||||
|
.pre_doit = net_shaper_nl_pre_doit,
|
||||||
|
.doit = net_shaper_nl_set_doit,
|
||||||
|
.post_doit = net_shaper_nl_post_doit,
|
||||||
|
.policy = net_shaper_set_nl_policy,
|
||||||
|
.maxattr = NET_SHAPER_A_IFINDEX,
|
||||||
|
.flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cmd = NET_SHAPER_CMD_DELETE,
|
||||||
|
.pre_doit = net_shaper_nl_pre_doit,
|
||||||
|
.doit = net_shaper_nl_delete_doit,
|
||||||
|
.post_doit = net_shaper_nl_post_doit,
|
||||||
|
.policy = net_shaper_delete_nl_policy,
|
||||||
|
.maxattr = NET_SHAPER_A_IFINDEX,
|
||||||
|
.flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.cmd = NET_SHAPER_CMD_GROUP,
|
||||||
|
.pre_doit = net_shaper_nl_pre_doit,
|
||||||
|
.doit = net_shaper_nl_group_doit,
|
||||||
|
.post_doit = net_shaper_nl_post_doit,
|
||||||
|
.policy = net_shaper_group_nl_policy,
|
||||||
|
.maxattr = NET_SHAPER_A_LEAVES,
|
||||||
|
.flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
struct genl_family net_shaper_nl_family __ro_after_init = {
|
||||||
|
.name = NET_SHAPER_FAMILY_NAME,
|
||||||
|
.version = NET_SHAPER_FAMILY_VERSION,
|
||||||
|
.netnsok = true,
|
||||||
|
.parallel_ops = true,
|
||||||
|
.module = THIS_MODULE,
|
||||||
|
.split_ops = net_shaper_nl_ops,
|
||||||
|
.n_split_ops = ARRAY_SIZE(net_shaper_nl_ops),
|
||||||
|
};
|
34
net/shaper/shaper_nl_gen.h
Normal file
34
net/shaper/shaper_nl_gen.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
|
||||||
|
/* Do not edit directly, auto-generated from: */
|
||||||
|
/* Documentation/netlink/specs/net_shaper.yaml */
|
||||||
|
/* YNL-GEN kernel header */
|
||||||
|
|
||||||
|
#ifndef _LINUX_NET_SHAPER_GEN_H
|
||||||
|
#define _LINUX_NET_SHAPER_GEN_H
|
||||||
|
|
||||||
|
#include <net/netlink.h>
|
||||||
|
#include <net/genetlink.h>
|
||||||
|
|
||||||
|
#include <uapi/linux/net_shaper.h>
|
||||||
|
|
||||||
|
/* Common nested types */
|
||||||
|
extern const struct nla_policy net_shaper_handle_nl_policy[NET_SHAPER_A_HANDLE_ID + 1];
|
||||||
|
extern const struct nla_policy net_shaper_leaf_info_nl_policy[NET_SHAPER_A_WEIGHT + 1];
|
||||||
|
|
||||||
|
int net_shaper_nl_pre_doit(const struct genl_split_ops *ops,
|
||||||
|
struct sk_buff *skb, struct genl_info *info);
|
||||||
|
void
|
||||||
|
net_shaper_nl_post_doit(const struct genl_split_ops *ops, struct sk_buff *skb,
|
||||||
|
struct genl_info *info);
|
||||||
|
int net_shaper_nl_pre_dumpit(struct netlink_callback *cb);
|
||||||
|
int net_shaper_nl_post_dumpit(struct netlink_callback *cb);
|
||||||
|
|
||||||
|
int net_shaper_nl_get_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
int net_shaper_nl_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb);
|
||||||
|
int net_shaper_nl_set_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
int net_shaper_nl_delete_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
int net_shaper_nl_group_doit(struct sk_buff *skb, struct genl_info *info);
|
||||||
|
|
||||||
|
extern struct genl_family net_shaper_nl_family;
|
||||||
|
|
||||||
|
#endif /* _LINUX_NET_SHAPER_GEN_H */
|
Loading…
Reference in New Issue
Block a user