Merge branch 'nfp-MPLS-and-shared-blocks-TC-offload-fixes'
Jakub Kicinski says: ==================== nfp: MPLS and shared blocks TC offload fixes This series brings two fixes to TC filter/action offload code. Pieter fixes matching MPLS packets when the match is purely on the MPLS ethertype and none of the MPLS fields are used. John provides a fix for offload of shared blocks. Unfortunately, with shared blocks there is currently no guarantee that filters which were added by the core will be removed before block unbind. Our simple fix is to not support offload of rules on shared blocks at all, a revert of this fix will be send for -next once the reoffload infrastructure lands. The shared blocks became important as we are trying to use them for bonding offload (managed from user space) and lack of remove calls leads to resource leaks. v2: - fix build error reported by kbuild bot due to missing tcf_block_shared() helper. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
f3c2c5ebd4
|
@ -202,6 +202,9 @@ static int nfp_bpf_setup_tc_block(struct net_device *netdev,
|
|||
if (f->binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (tcf_block_shared(f->block))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (f->command) {
|
||||
case TC_BLOCK_BIND:
|
||||
return tcf_block_cb_register(f->block,
|
||||
|
|
|
@ -123,6 +123,20 @@ nfp_flower_compile_mac(struct nfp_flower_mac_mpls *frame,
|
|||
NFP_FLOWER_MASK_MPLS_Q;
|
||||
|
||||
frame->mpls_lse = cpu_to_be32(t_mpls);
|
||||
} else if (dissector_uses_key(flow->dissector,
|
||||
FLOW_DISSECTOR_KEY_BASIC)) {
|
||||
/* Check for mpls ether type and set NFP_FLOWER_MASK_MPLS_Q
|
||||
* bit, which indicates an mpls ether type but without any
|
||||
* mpls fields.
|
||||
*/
|
||||
struct flow_dissector_key_basic *key_basic;
|
||||
|
||||
key_basic = skb_flow_dissector_target(flow->dissector,
|
||||
FLOW_DISSECTOR_KEY_BASIC,
|
||||
flow->key);
|
||||
if (key_basic->n_proto == cpu_to_be16(ETH_P_MPLS_UC) ||
|
||||
key_basic->n_proto == cpu_to_be16(ETH_P_MPLS_MC))
|
||||
frame->mpls_lse = cpu_to_be32(NFP_FLOWER_MASK_MPLS_Q);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -264,6 +264,14 @@ nfp_flower_calculate_key_layers(struct nfp_app *app,
|
|||
case cpu_to_be16(ETH_P_ARP):
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
case cpu_to_be16(ETH_P_MPLS_UC):
|
||||
case cpu_to_be16(ETH_P_MPLS_MC):
|
||||
if (!(key_layer & NFP_FLOWER_LAYER_MAC)) {
|
||||
key_layer |= NFP_FLOWER_LAYER_MAC;
|
||||
key_size += sizeof(struct nfp_flower_mac_mpls);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Will be included in layer 2. */
|
||||
case cpu_to_be16(ETH_P_8021Q):
|
||||
break;
|
||||
|
@ -623,6 +631,9 @@ static int nfp_flower_setup_tc_block(struct net_device *netdev,
|
|||
if (f->binder_type != TCF_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (tcf_block_shared(f->block))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (f->command) {
|
||||
case TC_BLOCK_BIND:
|
||||
return tcf_block_cb_register(f->block,
|
||||
|
|
|
@ -111,6 +111,11 @@ void tcf_block_put_ext(struct tcf_block *block, struct Qdisc *q,
|
|||
{
|
||||
}
|
||||
|
||||
static inline bool tcf_block_shared(struct tcf_block *block)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct Qdisc *tcf_block_q(struct tcf_block *block)
|
||||
{
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue