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:
committed by
David S. Miller
parent
c63fbb0b41
commit
87d83093bf
@@ -19,10 +19,19 @@ int unregister_tcf_proto_ops(struct tcf_proto_ops *ops);
|
|||||||
|
|
||||||
#ifdef CONFIG_NET_CLS
|
#ifdef CONFIG_NET_CLS
|
||||||
void tcf_destroy_chain(struct tcf_proto __rcu **fl);
|
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
|
#else
|
||||||
static inline void tcf_destroy_chain(struct tcf_proto __rcu **fl)
|
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
|
#endif
|
||||||
|
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
|
|||||||
@@ -113,9 +113,6 @@ static inline void qdisc_run(struct Qdisc *q)
|
|||||||
__qdisc_run(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)
|
static inline __be16 tc_skb_protocol(const struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
/* We need to take extra care in case the skb came via
|
/* We need to take extra care in case the skb came via
|
||||||
|
|||||||
@@ -105,6 +105,7 @@
|
|||||||
#include <net/dst.h>
|
#include <net/dst.h>
|
||||||
#include <net/dst_metadata.h>
|
#include <net/dst_metadata.h>
|
||||||
#include <net/pkt_sched.h>
|
#include <net/pkt_sched.h>
|
||||||
|
#include <net/pkt_cls.h>
|
||||||
#include <net/checksum.h>
|
#include <net/checksum.h>
|
||||||
#include <net/xfrm.h>
|
#include <net/xfrm.h>
|
||||||
#include <linux/highmem.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_skb_cb(skb)->pkt_len was already set by the caller. */
|
||||||
qdisc_bstats_cpu_update(cl->q, skb);
|
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_OK:
|
||||||
case TC_ACT_RECLASSIFY:
|
case TC_ACT_RECLASSIFY:
|
||||||
skb->tc_index = TC_H_MIN(cl_res.classid);
|
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;
|
skb->tc_at_ingress = 1;
|
||||||
qdisc_bstats_cpu_update(cl->q, skb);
|
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_OK:
|
||||||
case TC_ACT_RECLASSIFY:
|
case TC_ACT_RECLASSIFY:
|
||||||
skb->tc_index = TC_H_MIN(cl_res.classid);
|
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);
|
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 */
|
/* Add/change/delete/get a filter node */
|
||||||
|
|
||||||
static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
|
static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n,
|
||||||
|
|||||||
@@ -1878,54 +1878,6 @@ done:
|
|||||||
return skb->len;
|
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
|
#ifdef CONFIG_PROC_FS
|
||||||
static int psched_show(struct seq_file *seq, void *v)
|
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) {
|
list_for_each_entry(flow, &p->flows, list) {
|
||||||
fl = rcu_dereference_bh(flow->filter_list);
|
fl = rcu_dereference_bh(flow->filter_list);
|
||||||
if (fl) {
|
if (fl) {
|
||||||
result = tc_classify(skb, fl, &res, true);
|
result = tcf_classify(skb, fl, &res, true);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
continue;
|
continue;
|
||||||
flow = (struct atm_flow_data *)res.class;
|
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.
|
* Step 2+n. Apply classifier.
|
||||||
*/
|
*/
|
||||||
result = tc_classify(skb, fl, &res, true);
|
result = tcf_classify(skb, fl, &res, true);
|
||||||
if (!fl || result < 0)
|
if (!fl || result < 0)
|
||||||
goto fallback;
|
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;
|
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||||
fl = rcu_dereference_bh(q->filter_list);
|
fl = rcu_dereference_bh(q->filter_list);
|
||||||
result = tc_classify(skb, fl, &res, false);
|
result = tcf_classify(skb, fl, &res, false);
|
||||||
if (result >= 0) {
|
if (result >= 0) {
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
|||||||
else {
|
else {
|
||||||
struct tcf_result res;
|
struct tcf_result res;
|
||||||
struct tcf_proto *fl = rcu_dereference_bh(p->filter_list);
|
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);
|
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;
|
return fq_codel_hash(q, skb) + 1;
|
||||||
|
|
||||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||||
result = tc_classify(skb, filter, &res, false);
|
result = tcf_classify(skb, filter, &res, false);
|
||||||
if (result >= 0) {
|
if (result >= 0) {
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|||||||
@@ -1142,7 +1142,7 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
|
|||||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||||
head = &q->root;
|
head = &q->root;
|
||||||
tcf = rcu_dereference_bh(q->root.filter_list);
|
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
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case TC_ACT_QUEUED:
|
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;
|
*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
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case TC_ACT_QUEUED:
|
case TC_ACT_QUEUED:
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ multiq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
*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
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case TC_ACT_STOLEN:
|
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;
|
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||||
if (TC_H_MAJ(skb->priority) != sch->handle) {
|
if (TC_H_MAJ(skb->priority) != sch->handle) {
|
||||||
fl = rcu_dereference_bh(q->filter_list);
|
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
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case TC_ACT_STOLEN:
|
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;
|
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||||
fl = rcu_dereference_bh(q->filter_list);
|
fl = rcu_dereference_bh(q->filter_list);
|
||||||
result = tc_classify(skb, fl, &res, false);
|
result = tcf_classify(skb, fl, &res, false);
|
||||||
if (result >= 0) {
|
if (result >= 0) {
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ static bool sfb_classify(struct sk_buff *skb, struct tcf_proto *fl,
|
|||||||
struct tcf_result res;
|
struct tcf_result res;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
result = tc_classify(skb, fl, &res, false);
|
result = tcf_classify(skb, fl, &res, false);
|
||||||
if (result >= 0) {
|
if (result >= 0) {
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ static unsigned int sfq_classify(struct sk_buff *skb, struct Qdisc *sch,
|
|||||||
return sfq_hash(q, skb) + 1;
|
return sfq_hash(q, skb) + 1;
|
||||||
|
|
||||||
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
|
||||||
result = tc_classify(skb, fl, &res, false);
|
result = tcf_classify(skb, fl, &res, false);
|
||||||
if (result >= 0) {
|
if (result >= 0) {
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|||||||
Reference in New Issue
Block a user