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