net: sched: move tc_classify function to cls_api.c
Move tc_classify function to cls_api.c where it belongs, rename it to fit the namespace. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Acked-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c63fbb0b41
commit
87d83093bf
|
@ -19,10 +19,19 @@ int unregister_tcf_proto_ops(struct tcf_proto_ops *ops);
|
|||
|
||||
#ifdef CONFIG_NET_CLS
|
||||
void tcf_destroy_chain(struct tcf_proto __rcu **fl);
|
||||
int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode);
|
||||
|
||||
#else
|
||||
static inline void tcf_destroy_chain(struct tcf_proto __rcu **fl)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode)
|
||||
{
|
||||
return TC_ACT_UNSPEC;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long
|
||||
|
|
|
@ -113,9 +113,6 @@ static inline void qdisc_run(struct Qdisc *q)
|
|||
__qdisc_run(q);
|
||||
}
|
||||
|
||||
int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode);
|
||||
|
||||
static inline __be16 tc_skb_protocol(const struct sk_buff *skb)
|
||||
{
|
||||
/* We need to take extra care in case the skb came via
|
||||
|
|
|
@ -105,6 +105,7 @@
|
|||
#include <net/dst.h>
|
||||
#include <net/dst_metadata.h>
|
||||
#include <net/pkt_sched.h>
|
||||
#include <net/pkt_cls.h>
|
||||
#include <net/checksum.h>
|
||||
#include <net/xfrm.h>
|
||||
#include <linux/highmem.h>
|
||||
|
@ -3178,7 +3179,7 @@ sch_handle_egress(struct sk_buff *skb, int *ret, struct net_device *dev)
|
|||
/* qdisc_skb_cb(skb)->pkt_len was already set by the caller. */
|
||||
qdisc_bstats_cpu_update(cl->q, skb);
|
||||
|
||||
switch (tc_classify(skb, cl, &cl_res, false)) {
|
||||
switch (tcf_classify(skb, cl, &cl_res, false)) {
|
||||
case TC_ACT_OK:
|
||||
case TC_ACT_RECLASSIFY:
|
||||
skb->tc_index = TC_H_MIN(cl_res.classid);
|
||||
|
@ -3948,7 +3949,7 @@ sch_handle_ingress(struct sk_buff *skb, struct packet_type **pt_prev, int *ret,
|
|||
skb->tc_at_ingress = 1;
|
||||
qdisc_bstats_cpu_update(cl->q, skb);
|
||||
|
||||
switch (tc_classify(skb, cl, &cl_res, false)) {
|
||||
switch (tcf_classify(skb, cl, &cl_res, false)) {
|
||||
case TC_ACT_OK:
|
||||
case TC_ACT_RECLASSIFY:
|
||||
skb->tc_index = TC_H_MIN(cl_res.classid);
|
||||
|
|
|
@ -196,6 +196,54 @@ void tcf_destroy_chain(struct tcf_proto __rcu **fl)
|
|||
}
|
||||
EXPORT_SYMBOL(tcf_destroy_chain);
|
||||
|
||||
/* Main classifier routine: scans classifier chain attached
|
||||
* to this qdisc, (optionally) tests for protocol and asks
|
||||
* specific classifiers.
|
||||
*/
|
||||
int tcf_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode)
|
||||
{
|
||||
__be16 protocol = tc_skb_protocol(skb);
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
const int max_reclassify_loop = 4;
|
||||
const struct tcf_proto *old_tp = tp;
|
||||
int limit = 0;
|
||||
|
||||
reclassify:
|
||||
#endif
|
||||
for (; tp; tp = rcu_dereference_bh(tp->next)) {
|
||||
int err;
|
||||
|
||||
if (tp->protocol != protocol &&
|
||||
tp->protocol != htons(ETH_P_ALL))
|
||||
continue;
|
||||
|
||||
err = tp->classify(skb, tp, res);
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (unlikely(err == TC_ACT_RECLASSIFY && !compat_mode))
|
||||
goto reset;
|
||||
#endif
|
||||
if (err >= 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return TC_ACT_UNSPEC; /* signal: continue lookup */
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
reset:
|
||||
if (unlikely(limit++ >= max_reclassify_loop)) {
|
||||
net_notice_ratelimited("%s: reclassify loop, rule prio %u, protocol %02x\n",
|
||||
tp->q->ops->id, tp->prio & 0xffff,
|
||||
ntohs(tp->protocol));
|
||||
return TC_ACT_SHOT;
|
||||
}
|
||||
|
||||
tp = old_tp;
|
||||
protocol = tc_skb_protocol(skb);
|
||||
goto reclassify;
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(tcf_classify);
|
||||
|
||||
/* Add/change/delete/get a filter node */
|
||||
|
||||
static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
|
||||
|
|
|
@ -1878,54 +1878,6 @@ done:
|
|||
return skb->len;
|
||||
}
|
||||
|
||||
/* Main classifier routine: scans classifier chain attached
|
||||
* to this qdisc, (optionally) tests for protocol and asks
|
||||
* specific classifiers.
|
||||
*/
|
||||
int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
||||
struct tcf_result *res, bool compat_mode)
|
||||
{
|
||||
__be16 protocol = tc_skb_protocol(skb);
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
const int max_reclassify_loop = 4;
|
||||
const struct tcf_proto *old_tp = tp;
|
||||
int limit = 0;
|
||||
|
||||
reclassify:
|
||||
#endif
|
||||
for (; tp; tp = rcu_dereference_bh(tp->next)) {
|
||||
int err;
|
||||
|
||||
if (tp->protocol != protocol &&
|
||||
tp->protocol != htons(ETH_P_ALL))
|
||||
continue;
|
||||
|
||||
err = tp->classify(skb, tp, res);
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
if (unlikely(err == TC_ACT_RECLASSIFY && !compat_mode))
|
||||
goto reset;
|
||||
#endif
|
||||
if (err >= 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
return TC_ACT_UNSPEC; /* signal: continue lookup */
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
reset:
|
||||
if (unlikely(limit++ >= max_reclassify_loop)) {
|
||||
net_notice_ratelimited("%s: reclassify loop, rule prio %u, protocol %02x\n",
|
||||
tp->q->ops->id, tp->prio & 0xffff,
|
||||
ntohs(tp->protocol));
|
||||
return TC_ACT_SHOT;
|
||||
}
|
||||
|
||||
tp = old_tp;
|
||||
protocol = tc_skb_protocol(skb);
|
||||
goto reclassify;
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(tc_classify);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int psched_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
|
|
|
@ -377,7 +377,7 @@ static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||
list_for_each_entry(flow, &p->flows, list) {
|
||||
fl = rcu_dereference_bh(flow->filter_list);
|
||||
if (fl) {
|
||||
result = tc_classify(skb, fl, &res, true);
|
||||
result = tcf_classify(skb, fl, &res, true);
|
||||
if (result < 0)
|
||||
continue;
|
||||
flow = (struct atm_flow_data *)res.class;
|
||||
|
|
|
@ -233,7 +233,7 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
|
|||
/*
|
||||
* Step 2+n. Apply classifier.
|
||||
*/
|
||||
result = tc_classify(skb, fl, &res, true);
|
||||
result = tcf_classify(skb, fl, &res, true);
|
||||
if (!fl || result < 0)
|
||||
goto fallback;
|
||||
|
||||
|
|
|
@ -333,7 +333,7 @@ static struct drr_class *drr_classify(struct sk_buff *skb, struct Qdisc *sch,
|
|||
|
||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
fl = rcu_dereference_bh(q->filter_list);
|
||||
result = tc_classify(skb, fl, &res, false);
|
||||
result = tcf_classify(skb, fl, &res, false);
|
||||
if (result >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
|
|
|
@ -234,7 +234,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||
else {
|
||||
struct tcf_result res;
|
||||
struct tcf_proto *fl = rcu_dereference_bh(p->filter_list);
|
||||
int result = tc_classify(skb, fl, &res, false);
|
||||
int result = tcf_classify(skb, fl, &res, false);
|
||||
|
||||
pr_debug("result %d class 0x%04x\n", result, res.classid);
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@ static unsigned int fq_codel_classify(struct sk_buff *skb, struct Qdisc *sch,
|
|||
return fq_codel_hash(q, skb) + 1;
|
||||
|
||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
result = tc_classify(skb, filter, &res, false);
|
||||
result = tcf_classify(skb, filter, &res, false);
|
||||
if (result >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
|
|
|
@ -1142,7 +1142,7 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
|
|||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
head = &q->root;
|
||||
tcf = rcu_dereference_bh(q->root.filter_list);
|
||||
while (tcf && (result = tc_classify(skb, tcf, &res, false)) >= 0) {
|
||||
while (tcf && (result = tcf_classify(skb, tcf, &res, false)) >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
case TC_ACT_QUEUED:
|
||||
|
|
|
@ -231,7 +231,7 @@ static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch,
|
|||
}
|
||||
|
||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
while (tcf && (result = tc_classify(skb, tcf, &res, false)) >= 0) {
|
||||
while (tcf && (result = tcf_classify(skb, tcf, &res, false)) >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
case TC_ACT_QUEUED:
|
||||
|
|
|
@ -46,7 +46,7 @@ multiq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
|
|||
int err;
|
||||
|
||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
err = tc_classify(skb, fl, &res, false);
|
||||
err = tcf_classify(skb, fl, &res, false);
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (err) {
|
||||
case TC_ACT_STOLEN:
|
||||
|
|
|
@ -42,7 +42,7 @@ prio_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
|
|||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
if (TC_H_MAJ(skb->priority) != sch->handle) {
|
||||
fl = rcu_dereference_bh(q->filter_list);
|
||||
err = tc_classify(skb, fl, &res, false);
|
||||
err = tcf_classify(skb, fl, &res, false);
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (err) {
|
||||
case TC_ACT_STOLEN:
|
||||
|
|
|
@ -720,7 +720,7 @@ static struct qfq_class *qfq_classify(struct sk_buff *skb, struct Qdisc *sch,
|
|||
|
||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
fl = rcu_dereference_bh(q->filter_list);
|
||||
result = tc_classify(skb, fl, &res, false);
|
||||
result = tcf_classify(skb, fl, &res, false);
|
||||
if (result >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
|
|
|
@ -259,7 +259,7 @@ static bool sfb_classify(struct sk_buff *skb, struct tcf_proto *fl,
|
|||
struct tcf_result res;
|
||||
int result;
|
||||
|
||||
result = tc_classify(skb, fl, &res, false);
|
||||
result = tcf_classify(skb, fl, &res, false);
|
||||
if (result >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
|
|
|
@ -180,7 +180,7 @@ static unsigned int sfq_classify(struct sk_buff *skb, struct Qdisc *sch,
|
|||
return sfq_hash(q, skb) + 1;
|
||||
|
||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||
result = tc_classify(skb, fl, &res, false);
|
||||
result = tcf_classify(skb, fl, &res, false);
|
||||
if (result >= 0) {
|
||||
#ifdef CONFIG_NET_CLS_ACT
|
||||
switch (result) {
|
||||
|
|
Loading…
Reference in New Issue