The function pf_setup_pdesc() handles ruleset evaluation for non-reassembled packets. Having it called before pf_mtag is checked for flags PF_MTAG_FLAG_ROUTE_TO and PF_MTAG_FLAG_DUMMYNET will cause loops for fragmented packets if reassembly is disabled.
Move pd zeroing and pf_mtag extraction from pf_setup_pdesc() to a separate function pf_init_pdesc() and change the order of function calls: first call pf_init_pdesc(), then check if the currently processed packet has been reinjected from dummynet, finally call pf_setup_pdesc().
Add functionality of sending UDP packets to pft_ping.py with fragmentation support and fix broken IPv6 reassembly.