From 1a2592601e29b027872580cbfc364194f8b01ba6 Mon Sep 17 00:00:00 2001 From: mquinson Date: Fri, 12 Nov 2010 20:22:54 +0000 Subject: [PATCH 1/1] Partial fix of GRAS: gras-ping-sg now works again * Make the following function specific to the plugins: - gras_socket_my_port(sock) - gras_socket_peer_port(sock) - gras_socket_peer_name(sock) - gras_socket_peer_proc(sock) - gras_socket_peer_proc_set(sock,peer_proc) * In SG plugin, implement them properly knowing that the same socket object gets shared between peers * In TCP plugin, use the previous behavior * In file plugin, use THROW_UNIMPLEMENTED git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8545 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- include/gras/transport.h | 4 +- src/gras/Transport/transport.c | 32 +++--- src/gras/Transport/transport_interface.h | 11 +- src/gras/Transport/transport_plugin_file.c | 25 ++++- src/gras/Transport/transport_plugin_sg.c | 94 +++++++++++----- src/gras/Transport/transport_plugin_tcp.c | 119 ++++++++++++++++----- src/gras/Transport/transport_private.h | 4 - src/gras/Virtu/virtu_sg.h | 3 + 8 files changed, 213 insertions(+), 79 deletions(-) diff --git a/include/gras/transport.h b/include/gras/transport.h index 8479a8ba9e..0f8f86864d 100644 --- a/include/gras/transport.h +++ b/include/gras/transport.h @@ -82,9 +82,9 @@ XBT_PUBLIC(int) gras_socket_my_port(gras_socket_t sock); XBT_PUBLIC(int) gras_socket_peer_port(gras_socket_t sock); /** Get the host name of the remote side */ -XBT_PUBLIC(char *) gras_socket_peer_name(gras_socket_t sock); +XBT_PUBLIC(const char *) gras_socket_peer_name(gras_socket_t sock); /** Get the process name of the remote side */ -XBT_PUBLIC(char *) gras_socket_peer_proc(gras_socket_t sock); +XBT_PUBLIC(const char *) gras_socket_peer_proc(gras_socket_t sock); /* @}*/ /** \defgroup GRAS_sock_meas Using measurement sockets diff --git a/src/gras/Transport/transport.c b/src/gras/Transport/transport.c index ed3f43eb46..cefc3e9453 100644 --- a/src/gras/Transport/transport.c +++ b/src/gras/Transport/transport.c @@ -163,10 +163,6 @@ void gras_trp_socket_new(int incoming, gras_socket_t * dst) sock->moredata = 0; sock->sd = -1; - sock->port = -1; - sock->peer_port = -1; - sock->peer_name = NULL; - sock->peer_proc = NULL; sock->data = NULL; sock->bufdata = NULL; @@ -200,14 +196,13 @@ gras_socket_server_ext(unsigned short port, /* defaults settings */ gras_trp_socket_new(1, &sock); sock->plugin = trp; - sock->port = port; sock->buf_size = buf_size > 0 ? buf_size : 32 * 1024; sock->meas = measurement; /* Call plugin socket creation function */ DEBUG1("Prepare socket with plugin (fct=%p)", trp->socket_server); TRY { - trp->socket_server(trp, sock); + trp->socket_server(trp, port, sock); DEBUG3("in=%c out=%c accept=%c", sock->incoming ? 'y' : 'n', sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n'); @@ -288,14 +283,12 @@ gras_socket_client_ext(const char *host, /* defaults settings */ gras_trp_socket_new(0, &sock); sock->plugin = trp; - sock->peer_port = port; - sock->peer_name = (char *) strdup(host ? host : "localhost"); sock->buf_size = buf_size > 0 ? buf_size : 32 * 1024; sock->meas = measurement; /* plugin-specific */ TRY { - (*trp->socket_client) (trp, sock); + (*trp->socket_client) (trp,host,port,sock); DEBUG3("in=%c out=%c accept=%c", sock->incoming ? 'y' : 'n', sock->outgoing ? 'y' : 'n', sock->accepting ? 'y' : 'n'); @@ -376,8 +369,6 @@ void gras_socket_close(gras_socket_t sock) (*sock->plugin->socket_close) (sock); /* free the memory */ - if (sock->peer_name) - free(sock->peer_name); free(sock); XBT_OUT; return; @@ -432,27 +423,32 @@ gras_trp_plugin_t gras_trp_plugin_get_by_name(const char *name) int gras_socket_my_port(gras_socket_t sock) { - return sock->port; + if (!sock->plugin->my_port) + THROW1(unknown_error,0,"Function my_port unimplemented in plugin %s",sock->plugin->name); + return (*sock->plugin->my_port)(sock); + } int gras_socket_peer_port(gras_socket_t sock) { - return sock->peer_port; + if (!sock->plugin->peer_port) + THROW1(unknown_error,0,"Function peer_port unimplemented in plugin %s",sock->plugin->name); + return (*sock->plugin->peer_port)(sock); } -char *gras_socket_peer_name(gras_socket_t sock) +const char *gras_socket_peer_name(gras_socket_t sock) { - return sock->peer_name; + return (*sock->plugin->peer_name)(sock); } -char *gras_socket_peer_proc(gras_socket_t sock) +const char *gras_socket_peer_proc(gras_socket_t sock) { - return sock->peer_proc; + return (*sock->plugin->peer_proc)(sock); } void gras_socket_peer_proc_set(gras_socket_t sock, char *peer_proc) { - sock->peer_proc = peer_proc; + return (*sock->plugin->peer_proc_set)(sock,peer_proc); } /** \brief Check if the provided socket is a measurement one (or a regular one) */ diff --git a/src/gras/Transport/transport_interface.h b/src/gras/Transport/transport_interface.h index 49223a49bb..d59cef130a 100644 --- a/src/gras/Transport/transport_interface.h +++ b/src/gras/Transport/transport_interface.h @@ -51,11 +51,18 @@ struct gras_trp_plugin_ { /* dst pointers are created and initialized with default values before call to socket_client/server. Retrive the info you need from there. */ - void (*socket_client) (gras_trp_plugin_t self, gras_socket_t dst); - void (*socket_server) (gras_trp_plugin_t self, gras_socket_t dst); + void (*socket_client) (gras_trp_plugin_t self,const char *host,int port, gras_socket_t dst); + void (*socket_server) (gras_trp_plugin_t self, int port,gras_socket_t dst); gras_socket_t(*socket_accept) (gras_socket_t from); + /* Getting info about who's speaking */ + int (*my_port)(gras_socket_t sd); + int (*peer_port)(gras_socket_t sd); + const char* (*peer_name)(gras_socket_t sd); + const char* (*peer_proc)(gras_socket_t sd); + void (*peer_proc_set)(gras_socket_t sd,char*peer_proc); + /* socket_close() is responsible of telling the OS that the socket is over, but should not free the socket itself (beside the specific part) */ diff --git a/src/gras/Transport/transport_plugin_file.c b/src/gras/Transport/transport_plugin_file.c index 64859a574b..4139999450 100644 --- a/src/gras/Transport/transport_plugin_file.c +++ b/src/gras/Transport/transport_plugin_file.c @@ -40,7 +40,24 @@ typedef struct { *** Specific socket part ***/ - +/*** + *** Info about who's speaking + ***/ +static int gras_trp_file_my_port(gras_socket_t s) { + THROW_UNIMPLEMENTED; +} +static int gras_trp_file_peer_port(gras_socket_t s) { + THROW_UNIMPLEMENTED; +} +static char* gras_trp_file_peer_name(gras_socket_t s) { + THROW_UNIMPLEMENTED; +} +static char* gras_trp_file_peer_proc(gras_socket_t s) { + THROW_UNIMPLEMENTED; +} +static void gras_trp_file_peer_proc_set(gras_socket_t s,char *name) { + THROW_UNIMPLEMENTED; +} /*** *** Code @@ -52,6 +69,12 @@ void gras_trp_file_setup(gras_trp_plugin_t plug) FD_ZERO(&(file->incoming_socks)); + plug->my_port = gras_trp_file_my_port; + plug->peer_port = gras_trp_file_peer_port; + plug->peer_name = gras_trp_file_peer_name; + plug->peer_proc = gras_trp_file_peer_proc; + plug->peer_proc_set = gras_trp_file_peer_proc_set; + plug->socket_close = gras_trp_file_close; plug->raw_send = gras_trp_file_chunk_send_raw; diff --git a/src/gras/Transport/transport_plugin_sg.c b/src/gras/Transport/transport_plugin_sg.c index 739a2a3c08..57c12c3a72 100644 --- a/src/gras/Transport/transport_plugin_sg.c +++ b/src/gras/Transport/transport_plugin_sg.c @@ -12,6 +12,7 @@ #include "xbt/ex.h" +#include "simix/simix.h" #include "gras/Msg/msg_private.h" #include "gras/Transport/transport_private.h" #include "gras/Virtu/virtu_sg.h" @@ -27,8 +28,11 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_sg, gras_trp, static gras_sg_portrec_t find_port(gras_hostdata_t * hd, int port); void gras_trp_sg_socket_client(gras_trp_plugin_t self, + const char*host, + int port, /* OUT */ gras_socket_t sock); void gras_trp_sg_socket_server(gras_trp_plugin_t self, + int port, /* OUT */ gras_socket_t sock); void gras_trp_sg_socket_close(gras_socket_t sd); @@ -66,10 +70,46 @@ static gras_sg_portrec_t find_port(gras_hostdata_t * hd, int port) return NULL; } +/*** + *** Info about who's speaking + ***/ +static int gras_trp_sg_my_port(gras_socket_t s) { + gras_trp_sg_sock_data_t sockdata = s->data; + if (sockdata->rdv_client == NULL) /* Master socket, I'm server */ + return sockdata->server_port; + else + return sockdata->client_port; +} +static int gras_trp_sg_peer_port(gras_socket_t s) { + gras_trp_sg_sock_data_t sockdata = s->data; + if (sockdata->server == SIMIX_process_self()) + return sockdata->client_port; + else + return sockdata->server_port; +} +static const char* gras_trp_sg_peer_name(gras_socket_t s) { + gras_trp_sg_sock_data_t sockdata = s->data; + if (sockdata->server == SIMIX_process_self()) + return SIMIX_host_get_name(SIMIX_process_get_host(sockdata->client)); + else + return SIMIX_host_get_name(SIMIX_process_get_host(sockdata->server)); +} +static const char* gras_trp_sg_peer_proc(gras_socket_t s) { + THROW_UNIMPLEMENTED; +} +static void gras_trp_sg_peer_proc_set(gras_socket_t s,char *name) { + THROW_UNIMPLEMENTED; +} void gras_trp_sg_setup(gras_trp_plugin_t plug) { + plug->my_port = gras_trp_sg_my_port; + plug->peer_port = gras_trp_sg_peer_port; + plug->peer_name = gras_trp_sg_peer_name; + plug->peer_proc = gras_trp_sg_peer_proc; + plug->peer_proc_set = gras_trp_sg_peer_proc_set; + gras_trp_sg_plug_data_t *data = xbt_new(gras_trp_sg_plug_data_t, 1); plug->data = data; @@ -86,6 +126,8 @@ void gras_trp_sg_setup(gras_trp_plugin_t plug) } void gras_trp_sg_socket_client(gras_trp_plugin_t self, + const char*host, + int port, /* OUT */ gras_socket_t sock) { @@ -95,41 +137,42 @@ void gras_trp_sg_socket_client(gras_trp_plugin_t self, gras_sg_portrec_t pr; /* make sure this socket will reach someone */ - if (!(peer = SIMIX_host_get_by_name(sock->peer_name))) + if (!(peer = SIMIX_host_get_by_name(host))) THROW1(mismatch_error, 0, - "Can't connect to %s: no such host.\n", sock->peer_name); + "Can't connect to %s: no such host.\n", host); if (!(hd = (gras_hostdata_t *) SIMIX_host_get_data(peer))) THROW1(mismatch_error, 0, "can't connect to %s: no process on this host", - sock->peer_name); + host); - pr = find_port(hd, sock->peer_port); + pr = find_port(hd, port); if (pr == NULL) { THROW2(mismatch_error, 0, "can't connect to %s:%d, no process listen on this port", - sock->peer_name, sock->peer_port); + host, port); } /* Ensure that the listener is expecting the kind of stuff we want to send */ if (pr->meas && !sock->meas) { THROW2(mismatch_error, 0, "can't connect to %s:%d in regular mode, the process listen " - "in measurement mode on this port", sock->peer_name, - sock->peer_port); + "in measurement mode on this port", host, + port); } if (!pr->meas && sock->meas) { THROW2(mismatch_error, 0, "can't connect to %s:%d in measurement mode, the process listen " - "in regular mode on this port", sock->peer_name, - sock->peer_port); + "in regular mode on this port", host, + port); } /* create simulation data of the socket */ data = xbt_new(s_gras_trp_sg_sock_data_t, 1); data->client = SIMIX_process_self(); data->server = pr->server; + data->server_port = port; /* initialize synchronization stuff on the socket */ data->rdv_server = pr->rdv; @@ -142,11 +185,11 @@ void gras_trp_sg_socket_client(gras_trp_plugin_t self, DEBUG5("%s (PID %d) connects in %s mode to %s:%d", SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid(), - sock->meas ? "meas" : "regular", sock->peer_name, - sock->peer_port); + sock->meas ? "meas" : "regular", host, + port); } -void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) +void gras_trp_sg_socket_server(gras_trp_plugin_t self, int port, gras_socket_t sock) { gras_hostdata_t *hd = @@ -159,16 +202,16 @@ void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) sock->accepting = 1; /* Check whether a server is already listening on that port or not */ - pr = find_port(hd, sock->port); + pr = find_port(hd, port); if (pr) THROW2(mismatch_error, 0, "can't listen on address %s:%d: port already in use.", - SIMIX_host_get_name(SIMIX_host_self()), sock->port); + SIMIX_host_get_name(SIMIX_host_self()), port); /* This port is free, let's take it */ pr = xbt_new(s_gras_sg_portrec_t, 1); - pr->port = sock->port; + pr->port = port; pr->meas = sock->meas; pr->server = SIMIX_process_self(); pr->rdv = SIMIX_rdv_create(NULL); @@ -177,6 +220,7 @@ void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) /* Create the socket */ data = xbt_new(s_gras_trp_sg_sock_data_t, 1); data->server = SIMIX_process_self(); + data->server_port = port; data->client = NULL; data->rdv_server = pr->rdv; data->rdv_client = NULL; @@ -187,7 +231,7 @@ void gras_trp_sg_socket_server(gras_trp_plugin_t self, gras_socket_t sock) VERB10 ("'%s' (%d) ears on %s:%d%s (%p; data:%p); Here rdv: %p; Remote rdv: %p; Comm %p", SIMIX_process_get_name(SIMIX_process_self()), gras_os_getpid(), - SIMIX_host_get_name(SIMIX_host_self()), sock->port, + SIMIX_host_get_name(SIMIX_host_self()), port, sock->meas ? " (mode meas)" : "", sock, data, (data->server == SIMIX_process_self())? data->rdv_server : data->rdv_client, @@ -211,16 +255,13 @@ void gras_trp_sg_socket_close(gras_socket_t sock) xbt_assert0(hd, "Please run gras_process_init on each process"); - if (sock->data) { - /* FIXME: kill the rdv point if receiver side */ - free(sock->data); - } + gras_trp_sg_sock_data_t sockdata = sock->data; - if (sock->incoming && !sock->outgoing && sock->port >= 0) { + if (sock->incoming && !sock->outgoing && sockdata->server_port >= 0) { /* server mode socket. Unregister it from 'OS' tables */ xbt_dynar_foreach(hd->ports, cpt, pr) { DEBUG2("Check pr %d of %lu", cpt, xbt_dynar_length(hd->ports)); - if (pr->port == sock->port) { + if (pr->port == sockdata->server_port) { xbt_dynar_cursor_rm(hd->ports, &cpt); XBT_OUT; return; @@ -228,7 +269,11 @@ void gras_trp_sg_socket_close(gras_socket_t sock) } WARN2 ("socket_close called on the unknown incoming socket %p (port=%d)", - sock, sock->port); + sock, sockdata->server_port); + } + if (sock->data) { + /* FIXME: kill the rdv point if receiver side */ + free(sock->data); } XBT_OUT; } @@ -270,9 +315,6 @@ void gras_trp_sg_chunk_send_raw(gras_socket_t sock, (sock_data->server == SIMIX_process_self())? (sock_data->client) : (sock_data->server); smx_host_t remote_host = SIMIX_process_get_host(remote_dude); - DEBUG4("send chunk from %s to %s:%d (size=%ld)", - SIMIX_host_get_name(SIMIX_host_self()), - SIMIX_host_get_name(remote_host), sock->peer_port, size); } //SIMIX_network_send(sock_data->rdv,size,1,-1,NULL,0,NULL,NULL); THROW_UNIMPLEMENTED; diff --git a/src/gras/Transport/transport_plugin_tcp.c b/src/gras/Transport/transport_plugin_tcp.c index ce5923d26e..6c22cb7ace 100644 --- a/src/gras/Transport/transport_plugin_tcp.c +++ b/src/gras/Transport/transport_plugin_tcp.c @@ -34,6 +34,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_tcp, gras_trp, *** Specific socket part ***/ +typedef struct { + int port; /* port on this side */ + int peer_port; /* port on the other side */ + char *peer_name; /* hostname of the other side */ + char *peer_proc; /* process on the other side */ +} s_gras_trp_tcp_sock_data_t, *gras_trp_tcp_sock_data_t; + typedef enum { buffering_buf, buffering_iov } buffering_kind; typedef struct { @@ -72,10 +79,18 @@ static int gras_trp_tcp_recv(gras_socket_t sock, char *data, static int _gras_tcp_proto_number(void); -static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t - ignored, - gras_socket_t sock) +static XBT_INLINE +void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, + const char *host, + int port, + /*OUT*/gras_socket_t sock) { + gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1); + sockdata->port = port; + sockdata->peer_proc = NULL; + sockdata->peer_port = port; + sockdata->peer_name = (char *) strdup(host ? host : "localhost"); + sock->data = sockdata; struct sockaddr_in addr; struct hostent *he; @@ -102,10 +117,10 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t sock_errstr(sock_errno)); } - he = gethostbyname(sock->peer_name); + he = gethostbyname(sockdata->peer_name); if (he == NULL) { THROW2(system_error, 0, "Failed to lookup hostname %s: %s", - sock->peer_name, sock_errstr(sock_errno)); + sockdata->peer_name, sock_errstr(sock_errno)); } haddr = ((struct in_addr *) (he->h_addr_list)[0]); @@ -113,20 +128,20 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t memset(&addr, 0, sizeof(struct sockaddr_in)); memcpy(&addr.sin_addr, haddr, sizeof(struct in_addr)); addr.sin_family = AF_INET; - addr.sin_port = htons(sock->peer_port); + addr.sin_port = htons(sockdata->peer_port); if (connect(sock->sd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { tcp_close(sock->sd); THROW3(system_error, 0, "Failed to connect socket to %s:%d (%s)", - sock->peer_name, sock->peer_port, sock_errstr(sock_errno)); + sockdata->peer_name, sockdata->peer_port, sock_errstr(sock_errno)); } gras_trp_tcp_send(sock, (char *) &myport, sizeof(uint32_t)); - DEBUG1("peerport sent to %d", sock->peer_port); + DEBUG1("peerport sent to %d", sockdata->peer_port); VERB4("Connect to %s:%d (sd=%d, port %d here)", - sock->peer_name, sock->peer_port, sock->sd, sock->port); + sockdata->peer_name, sockdata->peer_port, sock->sd, sockdata->port); } /** @@ -134,17 +149,25 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t * * Open a socket used to receive messages. */ -static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t - ignored, - gras_socket_t sock) +static XBT_INLINE +void gras_trp_sock_socket_server(gras_trp_plugin_t ignored, + int port, + gras_socket_t sock) { int size = sock->buf_size; int on = 1; struct sockaddr_in server; + gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1); + sockdata->port = port; + sockdata->peer_port = -1; + sockdata->peer_name = NULL; + sockdata->peer_proc = NULL; + sock->data=sockdata; + sock->outgoing = 1; /* TCP => duplex mode */ - server.sin_port = htons((u_short) sock->port); + server.sin_port = htons((u_short) sockdata->port); server.sin_addr.s_addr = INADDR_ANY; server.sin_family = AF_INET; if ((sock->sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) @@ -168,19 +191,19 @@ static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t if (bind(sock->sd, (struct sockaddr *) &server, sizeof(server)) == -1) { tcp_close(sock->sd); THROW2(system_error, 0, - "Cannot bind to port %d: %s", sock->port, + "Cannot bind to port %d: %s", sockdata->port, sock_errstr(sock_errno)); } - DEBUG2("Listen on port %d (sd=%d)", sock->port, sock->sd); + DEBUG2("Listen on port %d (sd=%d)", sockdata->port, sock->sd); if (listen(sock->sd, 5) < 0) { tcp_close(sock->sd); THROW2(system_error, 0, "Cannot listen on port %d: %s", - sock->port, sock_errstr(sock_errno)); + sockdata->port, sock_errstr(sock_errno)); } - VERB2("Openned a server socket on port %d (sd=%d)", sock->port, + VERB2("Openned a server socket on port %d (sd=%d)", sockdata->port, sock->sd); } @@ -233,15 +256,18 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) res->outgoing = sock->outgoing; res->accepting = 0; res->sd = sd; - res->port = -1; + gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1); + sockdata->port = -1; + res->data=sockdata; + gras_trp_tcp_recv(res, (char *) &hisport, sizeof(hisport)); - res->peer_port = ntohl(hisport); - DEBUG1("peerport %d received", res->peer_port); + sockdata->peer_port = ntohl(hisport); + DEBUG1("peerport %d received", sockdata->peer_port); /* FIXME: Lock to protect inet_ntoa */ if (((struct sockaddr *) &peer_in)->sa_family != AF_INET) { - res->peer_name = (char *) strdup("unknown"); + sockdata->peer_name = (char *) strdup("unknown"); } else { struct in_addr addrAsInAddr; char *tmp; @@ -250,13 +276,13 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) tmp = inet_ntoa(addrAsInAddr); if (tmp != NULL) { - res->peer_name = (char *) strdup(tmp); + sockdata->peer_name = (char *) strdup(tmp); } else { - res->peer_name = (char *) strdup("unknown"); + sockdata->peer_name = (char *) strdup("unknown"); } } - VERB3("Accepted from %s:%d (sd=%d)", res->peer_name, res->peer_port, sd); + VERB3("Accepted from %s:%d (sd=%d)", sockdata->peer_name, sockdata->peer_port, sd); xbt_dynar_push(((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res); @@ -270,6 +296,10 @@ static void gras_trp_sock_socket_close(gras_socket_t sock) if (!sock) return; /* close only once */ + if (((gras_trp_tcp_sock_data_t)sock->data)->peer_name) + free(((gras_trp_tcp_sock_data_t)sock->data)->peer_name); + free(sock->data); + VERB1("close tcp connection %d", sock->sd); /* ask the listener to close the socket */ @@ -584,8 +614,11 @@ gras_trp_iov_recv(gras_socket_t sock, char *chunk, unsigned long int size) ***/ void gras_trp_buf_socket_client(gras_trp_plugin_t self, + const char *host, + int port, gras_socket_t sock); void gras_trp_buf_socket_server(gras_trp_plugin_t self, + int port, gras_socket_t sock); gras_socket_t gras_trp_buf_socket_accept(gras_socket_t sock); @@ -621,12 +654,43 @@ gras_socket_t gras_trp_buf_init_sock(gras_socket_t sock) return sock; } +/*** + *** Info about who's speaking + ***/ +static int gras_trp_tcp_my_port(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->port; +} +static int gras_trp_tcp_peer_port(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->peer_port; +} +static const char* gras_trp_tcp_peer_name(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->peer_name; +} +static const char* gras_trp_tcp_peer_proc(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->peer_proc; +} +static void gras_trp_tcp_peer_proc_set(gras_socket_t s,char *name) { + gras_trp_tcp_sock_data_t sockdata = s->data; + sockdata->peer_proc = xbt_strdup(name); +} + /*** *** Code ***/ void gras_trp_tcp_setup(gras_trp_plugin_t plug) { + plug->my_port = gras_trp_tcp_my_port; + plug->peer_port = gras_trp_tcp_peer_port; + plug->peer_name = gras_trp_tcp_peer_name; + plug->peer_proc = gras_trp_tcp_peer_proc; + plug->peer_proc_set = gras_trp_tcp_peer_proc_set; + + plug->socket_client = gras_trp_buf_socket_client; plug->socket_server = gras_trp_buf_socket_server; plug->socket_accept = gras_trp_buf_socket_accept; @@ -649,10 +713,12 @@ void gras_trp_tcp_setup(gras_trp_plugin_t plug) } void gras_trp_buf_socket_client(gras_trp_plugin_t self, + const char *host, + int port, /* OUT */ gras_socket_t sock) { - gras_trp_sock_socket_client(NULL, sock); + gras_trp_sock_socket_client(NULL, host,port,sock); gras_trp_buf_init_sock(sock); } @@ -662,10 +728,11 @@ void gras_trp_buf_socket_client(gras_trp_plugin_t self, * Open a socket used to receive messages. */ void gras_trp_buf_socket_server(gras_trp_plugin_t self, + int port, /* OUT */ gras_socket_t sock) { - gras_trp_sock_socket_server(NULL, sock); + gras_trp_sock_socket_server(NULL, port, sock); gras_trp_buf_init_sock(sock); } diff --git a/src/gras/Transport/transport_private.h b/src/gras/Transport/transport_private.h index d886c045ea..ad0f55d2f7 100644 --- a/src/gras/Transport/transport_private.h +++ b/src/gras/Transport/transport_private.h @@ -74,10 +74,6 @@ typedef struct s_gras_socket { Field here to remember it when accepting */ int sd; - int port; /* port on this side */ - int peer_port; /* port on the other side */ - char *peer_name; /* hostname of the other side */ - char *peer_proc; /* process on the other side */ void *data; /* plugin specific data */ diff --git a/src/gras/Virtu/virtu_sg.h b/src/gras/Virtu/virtu_sg.h index 16e4f00a30..0180b9abbe 100644 --- a/src/gras/Virtu/virtu_sg.h +++ b/src/gras/Virtu/virtu_sg.h @@ -37,6 +37,9 @@ typedef struct { smx_rdv_t rdv_server; /* The rendez-vous point to use */ smx_rdv_t rdv_client; /* The rendez-vous point to use */ smx_comm_t comm_recv; /* The comm of irecv on receiver side */ + + int server_port; + int client_port; } s_gras_trp_sg_sock_data_t, *gras_trp_sg_sock_data_t; -- 2.20.1