1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 3 #ifndef _NET_SHAPER_H_ 4 #define _NET_SHAPER_H_ 5 6 #include <linux/types.h> 7 8 #include <uapi/linux/net_shaper.h> 9 10 struct net_device; 11 struct devlink; 12 struct netlink_ext_ack; 13 14 enum net_shaper_binding_type { 15 NET_SHAPER_BINDING_TYPE_NETDEV, 16 /* NET_SHAPER_BINDING_TYPE_DEVLINK_PORT */ 17 }; 18 19 struct net_shaper_binding { 20 enum net_shaper_binding_type type; 21 union { 22 struct net_device *netdev; 23 struct devlink *devlink; 24 }; 25 }; 26 27 struct net_shaper_handle { 28 enum net_shaper_scope scope; 29 u32 id; 30 }; 31 32 /** 33 * struct net_shaper - represents a shaping node on the NIC H/W 34 * zeroed field are considered not set. 35 * @parent: Unique identifier for the shaper parent, usually implied 36 * @handle: Unique identifier for this shaper 37 * @metric: Specify if the rate limits refers to PPS or BPS 38 * @bw_min: Minimum guaranteed rate for this shaper 39 * @bw_max: Maximum peak rate allowed for this shaper 40 * @burst: Maximum burst for the peek rate of this shaper 41 * @priority: Scheduling priority for this shaper 42 * @weight: Scheduling weight for this shaper 43 */ 44 struct net_shaper { 45 struct net_shaper_handle parent; 46 struct net_shaper_handle handle; 47 enum net_shaper_metric metric; 48 u64 bw_min; 49 u64 bw_max; 50 u64 burst; 51 u32 priority; 52 u32 weight; 53 54 /* private: */ 55 u32 leaves; /* accounted only for NODE scope */ 56 bool valid; 57 struct rcu_head rcu; 58 }; 59 60 /** 61 * struct net_shaper_ops - Operations on device H/W shapers 62 * 63 * The operations applies to either net_device and devlink objects. 64 * The initial shaping configuration at device initialization is empty: 65 * does not constraint the rate in any way. 66 * The network core keeps track of the applied user-configuration in 67 * the net_device or devlink structure. 68 * The operations are serialized via a per device lock. 69 * 70 * Device not supporting any kind of nesting should not provide the 71 * group operation. 72 * 73 * Each shaper is uniquely identified within the device with a 'handle' 74 * comprising the shaper scope and a scope-specific id. 75 */ 76 struct net_shaper_ops { 77 /** 78 * @group: create the specified shapers scheduling group 79 * 80 * Nest the @leaves shapers identified under the * @node shaper. 81 * All the shapers belong to the device specified by @binding. 82 * The @leaves arrays size is specified by @leaves_count. 83 * Create either the @leaves and the @node shaper; or if they already 84 * exists, links them together in the desired way. 85 * @leaves scope must be NET_SHAPER_SCOPE_QUEUE. 86 */ 87 int (*group)(struct net_shaper_binding *binding, int leaves_count, 88 const struct net_shaper *leaves, 89 const struct net_shaper *node, 90 struct netlink_ext_ack *extack); 91 92 /** 93 * @set: Updates the specified shaper 94 * 95 * Updates or creates the @shaper on the device specified by @binding. 96 */ 97 int (*set)(struct net_shaper_binding *binding, 98 const struct net_shaper *shaper, 99 struct netlink_ext_ack *extack); 100 101 /** 102 * @delete: Removes the specified shaper 103 * 104 * Removes the shaper configuration as identified by the given @handle 105 * on the device specified by @binding, restoring the default behavior. 106 */ 107 int (*delete)(struct net_shaper_binding *binding, 108 const struct net_shaper_handle *handle, 109 struct netlink_ext_ack *extack); 110 111 /** 112 * @capabilities: get the shaper features supported by the device 113 * 114 * Fills the bitmask @cap with the supported capabilities for the 115 * specified @scope and device specified by @binding. 116 */ 117 void (*capabilities)(struct net_shaper_binding *binding, 118 enum net_shaper_scope scope, unsigned long *cap); 119 }; 120 121 #endif 122