On Mon, Oct 21, 2019 at 10:09:46PM +0200, Matteo Croce wrote: > FLOW_DISSECTOR_KEY_ICMP is checked for every packet, not only ICMP ones. > Even if the test overhead is probably negligible, move the > ICMP dissector code under the big 'switch(ip_proto)' so it gets called > only for ICMP packets. > > Signed-off-by: Matteo Croce <mcr...@redhat.com>
Reviewed-by: Simon Horman <simon.hor...@netronome.com> > --- > net/core/flow_dissector.c | 34 +++++++++++++++++++++++++--------- > 1 file changed, 25 insertions(+), 9 deletions(-) > > diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c > index affde70dad47..6443fac65ce8 100644 > --- a/net/core/flow_dissector.c > +++ b/net/core/flow_dissector.c > @@ -203,6 +203,25 @@ __be32 __skb_flow_get_ports(const struct sk_buff *skb, > int thoff, u8 ip_proto, > } > EXPORT_SYMBOL(__skb_flow_get_ports); > > +/* If FLOW_DISSECTOR_KEY_ICMP is set, get the Type and Code from an ICMP > packet > + * using skb_flow_get_be16(). > + */ > +static void __skb_flow_dissect_icmp(const struct sk_buff *skb, > + struct flow_dissector *flow_dissector, > + void *target_container, > + void *data, int thoff, int hlen) > +{ > + struct flow_dissector_key_icmp *key_icmp; > + > + if (!dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_ICMP)) > + return; > + > + key_icmp = skb_flow_dissector_target(flow_dissector, > + FLOW_DISSECTOR_KEY_ICMP, > + target_container); > + key_icmp->icmp = skb_flow_get_be16(skb, thoff, data, hlen); > +} > + > void skb_flow_dissect_meta(const struct sk_buff *skb, > struct flow_dissector *flow_dissector, > void *target_container) > @@ -853,7 +872,6 @@ bool __skb_flow_dissect(const struct net *net, > struct flow_dissector_key_basic *key_basic; > struct flow_dissector_key_addrs *key_addrs; > struct flow_dissector_key_ports *key_ports; > - struct flow_dissector_key_icmp *key_icmp; > struct flow_dissector_key_tags *key_tags; > struct flow_dissector_key_vlan *key_vlan; > struct bpf_prog *attached = NULL; > @@ -1295,6 +1313,12 @@ bool __skb_flow_dissect(const struct net *net, > data, nhoff, hlen); > break; > > + case IPPROTO_ICMP: > + case IPPROTO_ICMPV6: > + __skb_flow_dissect_icmp(skb, flow_dissector, target_container, > + data, nhoff, hlen); > + break; > + > default: > break; > } > @@ -1308,14 +1332,6 @@ bool __skb_flow_dissect(const struct net *net, > data, hlen); > } > > - if (dissector_uses_key(flow_dissector, > - FLOW_DISSECTOR_KEY_ICMP)) { > - key_icmp = skb_flow_dissector_target(flow_dissector, > - FLOW_DISSECTOR_KEY_ICMP, > - target_container); > - key_icmp->icmp = skb_flow_get_be16(skb, nhoff, data, hlen); > - } > - > /* Process result of IP proto processing */ > switch (fdret) { > case FLOW_DISSECT_RET_PROTO_AGAIN: > -- > 2.21.0 >