diff options
Diffstat (limited to 'net/sched/sch_hfsc.c')
-rw-r--r-- | net/sched/sch_hfsc.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index b38b39c60752..abd904be4287 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
@@ -617,7 +617,6 @@ rtsc_min(struct runtime_sc *rtsc, struct internal_sc *isc, u64 x, u64 y) | |||
617 | rtsc->y = y; | 617 | rtsc->y = y; |
618 | rtsc->dx = dx; | 618 | rtsc->dx = dx; |
619 | rtsc->dy = dy; | 619 | rtsc->dy = dy; |
620 | return; | ||
621 | } | 620 | } |
622 | 621 | ||
623 | static void | 622 | static void |
@@ -1155,7 +1154,7 @@ static struct hfsc_class * | |||
1155 | hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | 1154 | hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) |
1156 | { | 1155 | { |
1157 | struct hfsc_sched *q = qdisc_priv(sch); | 1156 | struct hfsc_sched *q = qdisc_priv(sch); |
1158 | struct hfsc_class *cl; | 1157 | struct hfsc_class *head, *cl; |
1159 | struct tcf_result res; | 1158 | struct tcf_result res; |
1160 | struct tcf_proto *tcf; | 1159 | struct tcf_proto *tcf; |
1161 | int result; | 1160 | int result; |
@@ -1166,6 +1165,7 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
1166 | return cl; | 1165 | return cl; |
1167 | 1166 | ||
1168 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; | 1167 | *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
1168 | head = &q->root; | ||
1169 | tcf = q->root.filter_list; | 1169 | tcf = q->root.filter_list; |
1170 | while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) { | 1170 | while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) { |
1171 | #ifdef CONFIG_NET_CLS_ACT | 1171 | #ifdef CONFIG_NET_CLS_ACT |
@@ -1180,6 +1180,8 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
1180 | if ((cl = (struct hfsc_class *)res.class) == NULL) { | 1180 | if ((cl = (struct hfsc_class *)res.class) == NULL) { |
1181 | if ((cl = hfsc_find_class(res.classid, sch)) == NULL) | 1181 | if ((cl = hfsc_find_class(res.classid, sch)) == NULL) |
1182 | break; /* filter selected invalid classid */ | 1182 | break; /* filter selected invalid classid */ |
1183 | if (cl->level >= head->level) | ||
1184 | break; /* filter may only point downwards */ | ||
1183 | } | 1185 | } |
1184 | 1186 | ||
1185 | if (cl->level == 0) | 1187 | if (cl->level == 0) |
@@ -1187,6 +1189,7 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
1187 | 1189 | ||
1188 | /* apply inner filter chain */ | 1190 | /* apply inner filter chain */ |
1189 | tcf = cl->filter_list; | 1191 | tcf = cl->filter_list; |
1192 | head = cl; | ||
1190 | } | 1193 | } |
1191 | 1194 | ||
1192 | /* classification failed, try default class */ | 1195 | /* classification failed, try default class */ |