gdouble internetwork_sampleLatency(Internetwork* internet, GQuark sourceNodeID, GQuark destinationNodeID) { MAGIC_ASSERT(internet); Node* sourceNode = internetwork_getNode(internet, sourceNodeID); in_addr_t sourceIP = node_getDefaultIP(sourceNode); Node* destinationNode = internetwork_getNode(internet, destinationNodeID); in_addr_t destinationIP = node_getDefaultIP(destinationNode); return network_sampleLinkLatency(sourceIP, destinationIP); }
static Packet* _tcp_createPacket(TCP* tcp, enum ProtocolTCPFlags flags, gconstpointer payload, gsize payloadLength) { MAGIC_ASSERT(tcp); /* * packets from children of a server must appear to be coming from the server */ in_addr_t sourceIP = tcp_getIP(tcp); in_port_t sourcePort = (tcp->child) ? tcp->child->parent->super.boundPort : tcp->super.boundPort; in_addr_t destinationIP = tcp_getPeerIP(tcp); in_port_t destinationPort = (tcp->server) ? tcp->server->lastPeerPort : tcp->super.peerPort; if(sourceIP == htonl(INADDR_ANY)) { sourceIP = node_getDefaultIP(worker_getPrivate()->cached_node); } g_assert(sourceIP && sourcePort && destinationIP && destinationPort); /* make sure our receive window is up to date before putting it in the packet */ _tcp_updateReceiveWindow(tcp); /* control packets have no sequence number * (except FIN, so we close after sending everything) */ guint sequence = ((payloadLength > 0) || (flags & PTCP_FIN)) ? tcp->send.next : 0; /* create the TCP packet */ Packet* packet = packet_new(payload, payloadLength); packet_setTCP(packet, flags, sourceIP, sourcePort, destinationIP, destinationPort, sequence, tcp->receive.next, tcp->receive.window); /* update sequence number */ if(sequence > 0) { tcp->send.next++; } return packet; }