在 2020/7/18 20:30, Florian Westphal 写道: > we...@ucloud.cn <we...@ucloud.cn> wrote: >> From: wenxu <we...@ucloud.cn> >> >> The fragment packets do defrag in tcf_ct_handle_fragments >> will clear the skb->cb which make the qdisc_skb_cb clear >> too. So the qdsic_skb_cb should be store before defrag and >> restore after that. >> It also update the pkt_len after all the >> fragments finish the defrag to one packet and make the >> following actions counter correct. >> >> Fixes: b57dc7c13ea9 ("net/sched: Introduce action ct") >> Signed-off-by: wenxu <we...@ucloud.cn> > Looks ok to me. One question: > >> @@ -1014,6 +1017,7 @@ static int tcf_ct_act(struct sk_buff *skb, const >> struct tc_action *a, >> >> out: >> tcf_action_update_bstats(&c->common, skb); >> + qdisc_skb_cb(skb)->pkt_len = skb->len; >> return retval; > This appears to be unconditional, I would have expected that > this only done for reassembled skbs? Yes. > > Otherwise we will lose the value calculated by core via > qdisc_calculate_pkt_len().
qdisc_calculate_pkt_len only be cablled in dev_xmit_skb and qdisc_enqueue. If all the fragment will pass those before defrag, it will caculate correctly. If the reassembled packets pass those, it also caculate correctly after we recaculate the pkt_len of qdisc_skb_cb