Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a85a970a authored by WANG Cong's avatar WANG Cong Committed by David S. Miller
Browse files

net_sched: move tc_action into tcf_common



struct tc_action is confusing, currently we use it for two purposes:
1) Pass in arguments and carry out results from helper functions
2) A generic representation for tc actions

The first one is error-prone, since we need to make sure we don't
miss anything. This patch aims to get rid of this use, by moving
tc_action into tcf_common, so that they are allocated together
in hashtable and can be cast'ed easily.

And together with the following patch, we could really make
tc_action a generic representation for all tc actions and each
type of action can inherit from it.

Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b93dd49c
Loading
Loading
Loading
Loading
+29 −23
Original line number Diff line number Diff line
@@ -10,7 +10,26 @@
#include <net/net_namespace.h>
#include <net/netns/generic.h>


struct tcf_hashinfo {
	struct hlist_head	*htab;
	unsigned int		hmask;
	spinlock_t		lock;
	u32			index;
};

struct tc_action_ops;

struct tc_action {
	const struct tc_action_ops	*ops;
	__u32			type; /* for backward compat(TCA_OLD_COMPAT) */
	__u32			order;
	struct list_head	list;
	struct tcf_hashinfo	*hinfo;
};

struct tcf_common {
	struct tc_action		tcfc_act;
	struct hlist_node		tcfc_head;
	u32				tcfc_index;
	int				tcfc_refcnt;
@@ -26,6 +45,7 @@ struct tcf_common {
	struct gnet_stats_basic_cpu __percpu *cpu_bstats;
	struct gnet_stats_queue __percpu *cpu_qstats;
};
#define tcf_act		common.tcfc_act
#define tcf_head	common.tcfc_head
#define tcf_index	common.tcfc_index
#define tcf_refcnt	common.tcfc_refcnt
@@ -39,13 +59,6 @@ struct tcf_common {
#define tcf_lock	common.tcfc_lock
#define tcf_rcu		common.tcfc_rcu

struct tcf_hashinfo {
	struct hlist_head	*htab;
	unsigned int		hmask;
	spinlock_t		lock;
	u32			index;
};

static inline unsigned int tcf_hash(u32 index, unsigned int hmask)
{
	return index & hmask;
@@ -88,15 +101,6 @@ static inline void tcf_tm_dump(struct tcf_t *dtm, const struct tcf_t *stm)
	dtm->expires = jiffies_to_clock_t(stm->expires);
}

struct tc_action {
	void			*priv;
	const struct tc_action_ops	*ops;
	__u32			type; /* for backward compat(TCA_OLD_COMPAT) */
	__u32			order;
	struct list_head	list;
	struct tcf_hashinfo	*hinfo;
};

#ifdef CONFIG_NET_CLS_ACT

#define ACT_P_CREATED 1
@@ -106,17 +110,18 @@ struct tc_action_ops {
	struct list_head head;
	char    kind[IFNAMSIZ];
	__u32   type; /* TBD to match kind */
	size_t	size;
	struct module		*owner;
	int     (*act)(struct sk_buff *, const struct tc_action *,
		       struct tcf_result *);
	int     (*dump)(struct sk_buff *, struct tc_action *, int, int);
	void	(*cleanup)(struct tc_action *, int bind);
	int     (*lookup)(struct net *, struct tc_action *, u32);
	int     (*lookup)(struct net *, struct tc_action **, u32);
	int     (*init)(struct net *net, struct nlattr *nla,
			struct nlattr *est, struct tc_action *act, int ovr,
			struct nlattr *est, struct tc_action **act, int ovr,
			int bind);
	int     (*walk)(struct net *, struct sk_buff *,
			struct netlink_callback *, int, struct tc_action *);
			struct netlink_callback *, int, const struct tc_action_ops *);
	void	(*stats_update)(struct tc_action *, u64, u32, u64);
};

@@ -152,13 +157,14 @@ static inline void tc_action_net_exit(struct tc_action_net *tn)

int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
		       struct netlink_callback *cb, int type,
		       struct tc_action *a);
int tcf_hash_search(struct tc_action_net *tn, struct tc_action *a, u32 index);
		       const struct tc_action_ops *ops);
int tcf_hash_search(struct tc_action_net *tn, struct tc_action **a, u32 index);
u32 tcf_hash_new_index(struct tc_action_net *tn);
bool tcf_hash_check(struct tc_action_net *tn, u32 index, struct tc_action *a,
bool tcf_hash_check(struct tc_action_net *tn, u32 index, struct tc_action **a,
		    int bind);
int tcf_hash_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
		    struct tc_action *a, int size, int bind, bool cpustats);
		    struct tc_action **a, const struct tc_action_ops *ops, int bind,
		    bool cpustats);
void tcf_hash_cleanup(struct tc_action *a, struct nlattr *est);
void tcf_hash_insert(struct tc_action_net *tn, struct tc_action *a);

+1 −2
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ struct tcf_bpf {
	struct sock_filter	*bpf_ops;
	const char		*bpf_name;
};
#define to_bpf(a) \
	container_of(a->priv, struct tcf_bpf, common)
#define to_bpf(a) ((struct tcf_bpf *)a)

#endif /* __NET_TC_BPF_H */
+1 −2
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@ struct tcf_connmark_info {
	u16 zone;
};

#define to_connmark(a) \
	container_of(a->priv, struct tcf_connmark_info, common)
#define to_connmark(a) ((struct tcf_connmark_info *)a)

#endif /* __NET_TC_CONNMARK_H */
+1 −2
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@ struct tcf_csum {

	u32 update_flags;
};
#define to_tcf_csum(a) \
	container_of(a->priv,struct tcf_csum,common)
#define to_tcf_csum(a) ((struct tcf_csum *)a)

#endif /* __NET_TC_CSUM_H */
+1 −2
Original line number Diff line number Diff line
@@ -8,7 +8,6 @@ struct tcf_defact {
	u32		tcfd_datalen;
	void		*tcfd_defdata;
};
#define to_defact(a) \
	container_of(a->priv, struct tcf_defact, common)
#define to_defact(a) ((struct tcf_defact *)a)

#endif /* __NET_TC_DEF_H */
Loading