mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-12 17:26:47 -04:00
net/sched: act_police: more accurate MTU policing
in current Linux, MTU policing does not take into account that packets at the TC ingress have the L2 header pulled. Thus, the same TC police action (with the same value of tcfp_mtu) behaves differently for ingress/egress. In addition, the full GSO size is compared to tcfp_mtu: as a consequence, the policer drops GSO packets even when individual segments have the L2 + L3 + L4 + payload length below the configured valued of tcfp_mtu. Improve the accuracy of MTU policing as follows: - account for mac_len for non-GSO packets at TC ingress. - compare MTU threshold with the segmented size for GSO packets. Also, add a kselftest that verifies the correct behavior. Signed-off-by: Davide Caratti <dcaratti@redhat.com> Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
2618a0dae0
commit
4ddc844eb8
@@ -239,6 +239,20 @@ static int tcf_police_init(struct net *net, struct nlattr *nla,
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool tcf_police_mtu_check(struct sk_buff *skb, u32 limit)
|
||||
{
|
||||
u32 len;
|
||||
|
||||
if (skb_is_gso(skb))
|
||||
return skb_gso_validate_mac_len(skb, limit);
|
||||
|
||||
len = qdisc_pkt_len(skb);
|
||||
if (skb_at_tc_ingress(skb))
|
||||
len += skb->mac_len;
|
||||
|
||||
return len <= limit;
|
||||
}
|
||||
|
||||
static int tcf_police_act(struct sk_buff *skb, const struct tc_action *a,
|
||||
struct tcf_result *res)
|
||||
{
|
||||
@@ -261,7 +275,7 @@ static int tcf_police_act(struct sk_buff *skb, const struct tc_action *a,
|
||||
goto inc_overlimits;
|
||||
}
|
||||
|
||||
if (qdisc_pkt_len(skb) <= p->tcfp_mtu) {
|
||||
if (tcf_police_mtu_check(skb, p->tcfp_mtu)) {
|
||||
if (!p->rate_present && !p->pps_present) {
|
||||
ret = p->tcfp_result;
|
||||
goto end;
|
||||
|
||||
Reference in New Issue
Block a user