mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
net_sched: act: use standard struct list_head
Currently actions are chained by a singly linked list, therefore it is a bit hard to add and remove a specific entry. Convert it to struct list_head so that in the latter patch we can remove an action without finding its head. Cc: Jamal Hadi Salim <[email protected]> Cc: David S. Miller <[email protected]> Signed-off-by: Cong Wang <[email protected]> Signed-off-by: Jamal Hadi Salim <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
d84231d3a2
commit
33be627159
13 changed files with 101 additions and 99 deletions
|
|
@ -60,7 +60,7 @@ struct tc_action {
|
|||
const struct tc_action_ops *ops;
|
||||
__u32 type; /* for backward compat(TCA_OLD_COMPAT) */
|
||||
__u32 order;
|
||||
struct tc_action *next;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
#define TCA_CAP_NONE 0
|
||||
|
|
@ -99,16 +99,16 @@ void tcf_hash_insert(struct tcf_common *p, struct tcf_hashinfo *hinfo);
|
|||
|
||||
int tcf_register_action(struct tc_action_ops *a);
|
||||
int tcf_unregister_action(struct tc_action_ops *a);
|
||||
void tcf_action_destroy(struct tc_action *a, int bind);
|
||||
int tcf_action_exec(struct sk_buff *skb, const struct tc_action *a,
|
||||
void tcf_action_destroy(struct list_head *actions, int bind);
|
||||
int tcf_action_exec(struct sk_buff *skb, const struct list_head *actions,
|
||||
struct tcf_result *res);
|
||||
struct tc_action *tcf_action_init(struct net *net, struct nlattr *nla,
|
||||
int tcf_action_init(struct net *net, struct nlattr *nla,
|
||||
struct nlattr *est, char *n, int ovr,
|
||||
int bind);
|
||||
int bind, struct list_head *);
|
||||
struct tc_action *tcf_action_init_1(struct net *net, struct nlattr *nla,
|
||||
struct nlattr *est, char *n, int ovr,
|
||||
int bind);
|
||||
int tcf_action_dump(struct sk_buff *skb, struct tc_action *a, int, int);
|
||||
int tcf_action_dump(struct sk_buff *skb, struct list_head *, int, int);
|
||||
int tcf_action_dump_old(struct sk_buff *skb, struct tc_action *a, int, int);
|
||||
int tcf_action_dump_1(struct sk_buff *skb, struct tc_action *a, int, int);
|
||||
int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,8 @@ tcf_unbind_filter(struct tcf_proto *tp, struct tcf_result *r)
|
|||
|
||||
struct tcf_exts {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
struct tc_action *action;
|
||||
__u32 type; /* for backward compat(TCA_OLD_COMPAT) */
|
||||
struct list_head actions;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -74,6 +75,13 @@ struct tcf_ext_map {
|
|||
int police;
|
||||
};
|
||||
|
||||
static inline void tcf_exts_init(struct tcf_exts *exts)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
INIT_LIST_HEAD(&exts->actions);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* tcf_exts_is_predicative - check if a predicative extension is present
|
||||
* @exts: tc filter extensions handle
|
||||
|
|
@ -85,7 +93,7 @@ static inline int
|
|||
tcf_exts_is_predicative(struct tcf_exts *exts)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
return !!exts->action;
|
||||
return !list_empty(&exts->actions);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
|
@ -120,8 +128,8 @@ tcf_exts_exec(struct sk_buff *skb, struct tcf_exts *exts,
|
|||
struct tcf_result *res)
|
||||
{
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (exts->action)
|
||||
return tcf_action_exec(skb, exts->action, res);
|
||||
if (!list_empty(&exts->actions))
|
||||
return tcf_action_exec(skb, &exts->actions, res);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue