parece que o bug está na forma como o processador XML está obtendo os datagramas UDP. Não deveria estar olhando para os pacotes. Esse é o trabalho da pilha UDP.
O processador XML deve estar pedindo à UDP para datagramas UDP remontados. A divisão de datagramas em pacotes e a remontagem desses pacotes em datagramas é o trabalho da pilha IP e UDP.
Obviamente, se você usar soquetes brutos, o UDP quebrará se você não replicar esse comportamento. Mas não use soquetes brutos, use o UDP dessa forma, ele foi planejado para ser usado.
Quando você intercepta pacotes através da interface bruta, se você obtê-los antes ou depois da remontagem de IP, isso depende de vários parâmetros do sistema, como quais firewalls estão habilitados e quais regras eles possuem. O seu código "funciona" se receber os pacotes brutos após a remontagem do IP. Mas confiando nisso está quebrado. se a remontagem não for necessária, isso não acontecerá e nem sempre será necessário.