tcp_iface.hh revision 10923
1/* 2 * Copyright (c) 2015 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions are 16 * met: redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer; 18 * redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution; 21 * neither the name of the copyright holders nor the names of its 22 * contributors may be used to endorse or promote products derived from 23 * this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * Authors: Gabor Dozsa 38 */ 39 40/* @file 41 * TCP stream socket based interface class for multi gem5 runs. 42 * 43 * For a high level description about multi gem5 see comments in 44 * header file multi_iface.hh. 45 * 46 * The TCP subclass of MultiIface uses a separate server process 47 * (see tcp_server.[hh,cc] under directory gem5/util/multi). Each gem5 48 * process connects to the server via a stream socket. The server process 49 * transfers messages and co-ordinates the synchronisation among the gem5 50 * peers. 51 */ 52#ifndef __DEV_TCP_IFACE_HH__ 53#define __DEV_TCP_IFACE_HH__ 54 55 56#include <string> 57 58#include "dev/multi_iface.hh" 59 60class EventManager; 61 62class TCPIface : public MultiIface 63{ 64 private: 65 /** 66 * The stream socket to connect to the server. 67 */ 68 int sock; 69 70 /** 71 * Registry for all sockets to the server opened by this gem5 process. 72 */ 73 static std::vector<int> sockRegistry; 74 75 private: 76 77 /** 78 * Send out a message through a TCP stream socket. 79 * 80 * @param sock TCP stream socket. 81 * @param buf Start address of the message. 82 * @param length Size of the message in bytes. 83 */ 84 void 85 sendTCP(int sock, void *buf, unsigned length); 86 87 /** 88 * Receive the next incoming message through a TCP stream socket. 89 * 90 * @param sock TCP stream socket. 91 * @param buf Start address of buffer to store the message. 92 * @param length Exact size of the expected message in bytes. 93 */ 94 bool recvTCP(int sock, void *buf, unsigned length); 95 96 97 protected: 98 99 virtual void 100 sendRaw(void *buf, unsigned length, 101 const MultiHeaderPkt::AddressType dest_addr=nullptr) 102 M5_ATTR_OVERRIDE 103 { 104 sendTCP(sock, buf, length); 105 } 106 107 virtual bool recvRaw(void *buf, unsigned length) M5_ATTR_OVERRIDE 108 { 109 return recvTCP(sock, buf, length); 110 } 111 112 virtual void syncRaw(MultiHeaderPkt::MsgType sync_req, 113 Tick sync_tick) M5_ATTR_OVERRIDE; 114 115 public: 116 /** 117 * The ctor creates and connects the stream socket to the server. 118 * @param server_name The name (or IP address) of the host running the 119 * server process. 120 * @param server_port The port number the server listening for new 121 * connections. 122 * @param sync_start The tick for the first multi synchronisation. 123 * @param sync_repeat The frequency of multi synchronisation. 124 * @param em The EventManager object associated with the simulated 125 * Ethernet link. 126 */ 127 TCPIface(std::string server_name, unsigned server_port, 128 unsigned multi_rank, Tick sync_start, Tick sync_repeat, 129 EventManager *em); 130 131 ~TCPIface() M5_ATTR_OVERRIDE; 132}; 133 134#endif 135