I have a program that needs to measure total loss after routing through a machine.
Essentially, I generate UDP traffic with iperf
on machine A that is destined for machine C. However, I first route this traffic through machine B**, then send it to machine C via a raw socket to port 5001 (the default port that iperf
listens to) with sendto()
. While running a tcpdump
shows that the packets are being received on machine C, the iperf
server doesn't see these connections or the packet.
I've hunted around the iperf
source code a bit to see how it works, and I see that packets are accepted with the function
rc = recvfrom( mSettings->mSock, mBuf, mSettings->mBufLen, 0,
(struct sockaddr*) &server->peer, &server->size_peer );.
Basically, because its simply a recvfrom
, I don't see why there's a problem if I'm very sure I'm not modifying the packets at any time, and am sending them with the function sendto(s, buf, len, 0, (struct sockaddr*) &si_other, slen)
and a socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
.
Anyone have any ideas? Why isn't iperf
noticing this connection?
**I actually route the packets to a TUN device on machine A, then read them from a userspace program on A, send them to B with a UDP socket, read them on a userspace program on B, then send them via a raw socket with IP_HDRINCL
disabled. I print out the headers when received on machine A and B, and I don't see anything weird.
Interesting. Turned out the problem was fixed by assigning the TUN device on machine A to
eth0
's IP address. Before, I assigned the TUN device to it's own IP address (I did attempt to remove an IP address from the TUN device, but then it defaulted toeth1
. That didn't work either.).I guess some modifications were occurring because of this, or that some sort of tunneling/connection wasn't established by
iperf
because the packets weren't being sent out ofeth0
before.If anyone has any further insights into how/why this works, I'd be very interested.