#include <linux/hash.h>
#include <linux/hashtable.h>
#include <linux/jhash.h>
#include <linux/math64.h>
#include <linux/vmalloc.h>
#include <net/pkt_cls.h>
#include <net/pkt_sched.h>
#include "cmsg.h"
#include "main.h"
#include "../nfp_port.h"
#define NFP_FL_QOS_UPDATE …
#define NFP_FL_QOS_PPS …
#define NFP_FL_QOS_METER …
struct nfp_police_cfg_head { … };
enum NFP_FL_QOS_TYPES { … };
struct nfp_police_config { … };
struct nfp_police_stats_reply { … };
int nfp_flower_offload_one_police(struct nfp_app *app, bool ingress,
bool pps, u32 id, u32 rate, u32 burst)
{ … }
static int nfp_policer_validate(const struct flow_action *action,
const struct flow_action_entry *act,
struct netlink_ext_ack *extack,
bool ingress)
{ … }
static int
nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *netdev,
struct tc_cls_matchall_offload *flow,
struct netlink_ext_ack *extack)
{ … }
static int
nfp_flower_remove_rate_limiter(struct nfp_app *app, struct net_device *netdev,
struct tc_cls_matchall_offload *flow,
struct netlink_ext_ack *extack)
{ … }
void nfp_flower_stats_rlim_reply(struct nfp_app *app, struct sk_buff *skb)
{ … }
static void
nfp_flower_stats_rlim_request(struct nfp_flower_priv *fl_priv,
u32 id, bool ingress)
{ … }
static void
nfp_flower_stats_rlim_request_all(struct nfp_flower_priv *fl_priv)
{ … }
static void update_stats_cache(struct work_struct *work)
{ … }
static int
nfp_flower_stats_rate_limiter(struct nfp_app *app, struct net_device *netdev,
struct tc_cls_matchall_offload *flow,
struct netlink_ext_ack *extack)
{ … }
void nfp_flower_qos_init(struct nfp_app *app)
{ … }
void nfp_flower_qos_cleanup(struct nfp_app *app)
{ … }
int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev,
struct tc_cls_matchall_offload *flow)
{ … }
static const struct rhashtable_params stats_meter_table_params = …;
struct nfp_meter_entry *
nfp_flower_search_meter_entry(struct nfp_app *app, u32 meter_id)
{ … }
static struct nfp_meter_entry *
nfp_flower_add_meter_entry(struct nfp_app *app, u32 meter_id)
{ … }
static void nfp_flower_del_meter_entry(struct nfp_app *app, u32 meter_id)
{ … }
int nfp_flower_setup_meter_entry(struct nfp_app *app,
const struct flow_action_entry *action,
enum nfp_meter_op op,
u32 meter_id)
{ … }
int nfp_init_meter_table(struct nfp_app *app)
{ … }
void
nfp_flower_stats_meter_request_all(struct nfp_flower_priv *fl_priv)
{ … }
static int
nfp_act_install_actions(struct nfp_app *app, struct flow_offload_action *fl_act,
struct netlink_ext_ack *extack)
{ … }
static int
nfp_act_remove_actions(struct nfp_app *app, struct flow_offload_action *fl_act,
struct netlink_ext_ack *extack)
{ … }
void
nfp_act_stats_reply(struct nfp_app *app, void *pmsg)
{ … }
static int
nfp_act_stats_actions(struct nfp_app *app, struct flow_offload_action *fl_act,
struct netlink_ext_ack *extack)
{ … }
int nfp_setup_tc_act_offload(struct nfp_app *app,
struct flow_offload_action *fl_act)
{ … }