Resolution
It would seem I was doing everything correctly with a single exception. I wasn't recalculating the IP header's checksum (since I was changing the protocol id itself, this is mandatory).
Code
iph->check = 0;
iph->check = ip_fast_csum(iph, iph->ihl);
And presto it worked.