diff --git a/src/internet-stack/nsc-tcp-l4-protocol.cc b/src/internet-stack/nsc-tcp-l4-protocol.cc index 63d08190e..77fdc1597 100644 --- a/src/internet-stack/nsc-tcp-l4-protocol.cc +++ b/src/internet-stack/nsc-tcp-l4-protocol.cc @@ -39,8 +39,8 @@ #include #include -#include -#include +#include +#include NS_LOG_COMPONENT_DEFINE ("NscTcpL4Protocol"); @@ -313,27 +313,31 @@ void NscTcpL4Protocol::SoftInterrupt (void) void NscTcpL4Protocol::send_callback(const void* data, int datalen) { Ptr p; + uint32_t ipv4Saddr, ipv4Daddr; - NS_ASSERT(datalen > (int)sizeof(struct iphdr)); + NS_ASSERT(datalen > 20); - const uint8_t *rawdata = reinterpret_cast(data); - rawdata += sizeof(struct iphdr); - - const struct iphdr *ipHdr = reinterpret_cast(data); // create packet, without IP header. The TCP header is not touched. // Not using the IP header makes integration easier, but it destroys // eg. ECN. - p = Create (rawdata, datalen - sizeof(struct iphdr)); + const uint8_t *rawdata = reinterpret_cast(data); + rawdata += 20; // skip IP header. IP options aren't supported at this time. + datalen -= 20; + p = Create (rawdata, datalen); - Ipv4Address saddr(ntohl(ipHdr->saddr)); - Ipv4Address daddr(ntohl(ipHdr->daddr)); + // we need the real source/destination ipv4 addresses for Send (). + const uint32_t *ipheader = reinterpret_cast(data); + ipv4Saddr = *(ipheader+3); + ipv4Daddr = *(ipheader+4); + + Ipv4Address saddr(ntohl(ipv4Saddr)); + Ipv4Address daddr(ntohl(ipv4Daddr)); Ptr ipv4 = m_node->GetObject (); - if (ipv4 != 0) - { - ipv4->Send (p, saddr, daddr, PROT_NUMBER); - } + NS_ASSERT_MSG (ipv4, "nsc callback invoked, but node has no ipv4 object"); + + ipv4->Send (p, saddr, daddr, PROT_NUMBER); m_nscStack->if_send_finish(0); } diff --git a/src/internet-stack/nsc-tcp-socket-impl.cc b/src/internet-stack/nsc-tcp-socket-impl.cc index 79ac08b1d..3023f49d2 100644 --- a/src/internet-stack/nsc-tcp-socket-impl.cc +++ b/src/internet-stack/nsc-tcp-socket-impl.cc @@ -33,11 +33,9 @@ #include -#include -#include +// for ntohs(). #include -#include -#include +#include #include "sim_interface.h" #include "sim_errno.h" @@ -307,13 +305,11 @@ NscTcpSocketImpl::Connect (const Address & address) m_remoteAddress = transport.GetIpv4 (); m_remotePort = transport.GetPort (); - struct in_addr remoteAddr; - uint32_t addr32; + std::ostringstream ss; + m_remoteAddress.Print(ss); + std::string ipstring = ss.str (); - m_remoteAddress.Serialize((uint8_t*)&addr32); - remoteAddr.s_addr = addr32; - - m_nscTcpSocket->connect(inet_ntoa(remoteAddr), m_remotePort); + m_nscTcpSocket->connect(ipstring.c_str (), m_remotePort); m_state = SYN_SENT; return 0; }