}
writeEthernetHeader(iface.getMac(), &dest_addr[0], buf);
+ // It is likely that the local address in pkt object is set to
+ // broadcast address. This is the case if server received the
+ // client's packet on broadcast address. Therefore, we need to
+ // correct it here and assign the actual source address.
+ if (pkt->getLocalAddr().toText() == "255.255.255.255") {
+ const Iface::SocketCollection& sockets = iface.getSockets();
+ for (Iface::SocketCollection::const_iterator it = sockets.begin();
+ it != sockets.end(); ++it) {
+ if (sockfd == it->sockfd_) {
+ pkt->setLocalAddr(it->addr_);
+ }
+ }
+ }
+
// IP and UDP header
writeIpUdpHeader(pkt, buf);
ASSERT_TRUE(pkt);
// Set required fields.
- pkt->setLocalAddr(IOAddress("127.0.0.1"));
+ // By setting the local address to broadcast we simulate the
+ // typical scenario when client's request was send to broadcast
+ // address and server by default used it as a source address
+ // in its response. The send() function should be able to detect
+ // it and correct the source address.
+ pkt->setLocalAddr(IOAddress("255.255.255.255"));
pkt->setRemotePort(PORT);
pkt->setLocalPort(PORT + 1);
pkt->setIndex(ifindex_);