Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: cls_u32: be more strict about skip-sw flag for knodes

Return an error if user requested skip-sw and the underlaying
hardware cannot handle tc offloads (or offloads are disabled).
This patch fixes the knode handling.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jakub Kicinski and committed by
David S. Miller
201c44bd 6eef3801

+21 -20
+21 -20
net/sched/cls_u32.c
··· 508 508 offload.type = TC_SETUP_CLSU32; 509 509 offload.cls_u32 = &u32_offload; 510 510 511 - if (tc_should_offload(dev, tp, flags)) { 512 - offload.cls_u32->command = TC_CLSU32_REPLACE_KNODE; 513 - offload.cls_u32->knode.handle = n->handle; 514 - offload.cls_u32->knode.fshift = n->fshift; 515 - #ifdef CONFIG_CLS_U32_MARK 516 - offload.cls_u32->knode.val = n->val; 517 - offload.cls_u32->knode.mask = n->mask; 518 - #else 519 - offload.cls_u32->knode.val = 0; 520 - offload.cls_u32->knode.mask = 0; 521 - #endif 522 - offload.cls_u32->knode.sel = &n->sel; 523 - offload.cls_u32->knode.exts = &n->exts; 524 - if (n->ht_down) 525 - offload.cls_u32->knode.link_handle = n->ht_down->handle; 511 + if (!tc_should_offload(dev, tp, flags)) 512 + return tc_skip_sw(flags) ? -EINVAL : 0; 526 513 527 - err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, 528 - tp->protocol, &offload); 529 - if (tc_skip_sw(flags)) 530 - return err; 531 - } 514 + offload.cls_u32->command = TC_CLSU32_REPLACE_KNODE; 515 + offload.cls_u32->knode.handle = n->handle; 516 + offload.cls_u32->knode.fshift = n->fshift; 517 + #ifdef CONFIG_CLS_U32_MARK 518 + offload.cls_u32->knode.val = n->val; 519 + offload.cls_u32->knode.mask = n->mask; 520 + #else 521 + offload.cls_u32->knode.val = 0; 522 + offload.cls_u32->knode.mask = 0; 523 + #endif 524 + offload.cls_u32->knode.sel = &n->sel; 525 + offload.cls_u32->knode.exts = &n->exts; 526 + if (n->ht_down) 527 + offload.cls_u32->knode.link_handle = n->ht_down->handle; 528 + 529 + err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, 530 + tp->protocol, &offload); 531 + if (tc_skip_sw(flags)) 532 + return err; 532 533 533 534 return 0; 534 535 }