forked from Minki/linux
flow_dissector: dissect tunnel info outside __skb_flow_dissect()
Move dissection of tunnel info to outside of the main flow dissection function, __skb_flow_dissect(). The sole user of this feature, the flower classifier, is updated to call tunnel info dissection directly, using skb_flow_dissect_tunnel_info(). This results in a slightly less complex implementation of __skb_flow_dissect(), in particular removing logic from that call path which is not used by the majority of users. The expense of this is borne by the flower classifier which now has to make an extra call for tunnel info dissection. This patch should not result in any behavioural change. Signed-off-by: Simon Horman <simon.horman@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
96f8406162
commit
62b32379fd
@ -1211,6 +1211,11 @@ static inline bool skb_flow_dissect_flow_keys_buf(struct flow_keys *flow,
|
|||||||
data, proto, nhoff, hlen, flags);
|
data, proto, nhoff, hlen, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
|
||||||
|
struct flow_dissector *flow_dissector,
|
||||||
|
void *target_container);
|
||||||
|
|
||||||
static inline __u32 skb_get_hash(struct sk_buff *skb)
|
static inline __u32 skb_get_hash(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
if (!skb->l4_hash && !skb->sw_hash)
|
if (!skb->l4_hash && !skb->sw_hash)
|
||||||
|
@ -133,10 +133,10 @@ skb_flow_dissect_set_enc_addr_type(enum flow_dissector_key_id type,
|
|||||||
ctrl->addr_type = type;
|
ctrl->addr_type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
__skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
|
skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
|
||||||
struct flow_dissector *flow_dissector,
|
struct flow_dissector *flow_dissector,
|
||||||
void *target_container)
|
void *target_container)
|
||||||
{
|
{
|
||||||
struct ip_tunnel_info *info;
|
struct ip_tunnel_info *info;
|
||||||
struct ip_tunnel_key *key;
|
struct ip_tunnel_key *key;
|
||||||
@ -212,6 +212,7 @@ __skb_flow_dissect_tunnel_info(const struct sk_buff *skb,
|
|||||||
tp->dst = key->tp_dst;
|
tp->dst = key->tp_dst;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(skb_flow_dissect_tunnel_info);
|
||||||
|
|
||||||
static enum flow_dissect_ret
|
static enum flow_dissect_ret
|
||||||
__skb_flow_dissect_mpls(const struct sk_buff *skb,
|
__skb_flow_dissect_mpls(const struct sk_buff *skb,
|
||||||
@ -576,9 +577,6 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
|
|||||||
FLOW_DISSECTOR_KEY_BASIC,
|
FLOW_DISSECTOR_KEY_BASIC,
|
||||||
target_container);
|
target_container);
|
||||||
|
|
||||||
__skb_flow_dissect_tunnel_info(skb, flow_dissector,
|
|
||||||
target_container);
|
|
||||||
|
|
||||||
if (dissector_uses_key(flow_dissector,
|
if (dissector_uses_key(flow_dissector,
|
||||||
FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
|
FLOW_DISSECTOR_KEY_ETH_ADDRS)) {
|
||||||
struct ethhdr *eth = eth_hdr(skb);
|
struct ethhdr *eth = eth_hdr(skb);
|
||||||
|
@ -166,6 +166,7 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
|||||||
* so do it rather here.
|
* so do it rather here.
|
||||||
*/
|
*/
|
||||||
skb_key.basic.n_proto = skb->protocol;
|
skb_key.basic.n_proto = skb->protocol;
|
||||||
|
skb_flow_dissect_tunnel_info(skb, &head->dissector, &skb_key);
|
||||||
skb_flow_dissect(skb, &head->dissector, &skb_key, 0);
|
skb_flow_dissect(skb, &head->dissector, &skb_key, 0);
|
||||||
|
|
||||||
fl_set_masked_key(&skb_mkey, &skb_key, &head->mask);
|
fl_set_masked_key(&skb_mkey, &skb_key, &head->mask);
|
||||||
|
Loading…
Reference in New Issue
Block a user