Let me try to explain again.
At the moment how does handle_tx_copy exit?
It's for(;;) so you know you need to look for a break.
When reading code you also notice there's a goto done
which could exit the loop. if you scan forward
you notice that it does not.
This is confusing, but oh well. Worth fixing maybe ...
Now you add the next round check.
And there is also special code that
detects whether you exited with break
and whenever you did it acts specially.
Yea it works. But I think it's clearer if we
just make things obvious.
If we want something to happen on error then
if (error)
handle
break
is imho clearer than
flag = true
if (error)
break
flag = false
if (flag)
handle
in partucular - less branches on data path.
you point out code duplication correctly,
but we can solve it just by adding functions.
like i suggested.