I am creating a kernel module that implements the Homa transport protocol (see paper in SIGCOMM 2018) and as a Linux kernel newbie I'm struggling a bit to figure out how all of Linux's network plumbing works.
I'm currently having problems retransmitting an sk_buff after packet loss and hoping that perhaps someone here can help me understand the rules and/or constraints around retransmission. Pointers to any existing documentation would also be great. I'm currently using the naive approach: Homa saves a reference to the sk_buff after it is first transmitted, and if retransmission is necessary it calls ip_queue_xmit again with the same sk_buff (it also reuses the same flowi and dst as in the first call). The behavior I'm seeing is very strange: the second call to ip_queue_xmit is modifying the flowi so that its daddr is 127.0.0.1. This then results in an ICMP_DEST_UNREACH error. Am I doing something fundamentally wrong here? E.g., do I need to clone the sk_buff before retransmitting it? If so, are there any restrictions on *when* I clone it (I'd prefer not to do this unless retransmission is necessary, just to save work). Thanks in advance for any advice/pointers. -John-