From 9a70eef3ee739543b87c867fd5b643b703899c89 Mon Sep 17 00:00:00 2001 From: Jiri Popek Date: Tue, 17 Mar 2015 13:17:25 +0100 Subject: Add the IPv6 support Enables communication between DLT server and clients over IPv6. Signed-off-by: Jiri Popek Signed-off-by: Alexander Wenzel --- src/adaptor/dlt-adaptor-udp.c | 4 +- src/daemon/dlt_daemon_socket.c | 85 +++++++++++++++++++++++++----------------- src/lib/dlt_client.c | 45 +++++++++++++--------- src/system/dlt-system-syslog.c | 4 +- 4 files changed, 82 insertions(+), 56 deletions(-) (limited to 'src') diff --git a/src/adaptor/dlt-adaptor-udp.c b/src/adaptor/dlt-adaptor-udp.c index d817269..ce204c1 100755 --- a/src/adaptor/dlt-adaptor-udp.c +++ b/src/adaptor/dlt-adaptor-udp.c @@ -148,13 +148,13 @@ int main(int argc, char* argv[]) } } - if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) { perror("Socket"); exit(1); } - server_addr.sin_family = AF_INET; + server_addr.sin_family = AF_INET6; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(server_addr.sin_zero), 8); diff --git a/src/daemon/dlt_daemon_socket.c b/src/daemon/dlt_daemon_socket.c index 4888807..88c360a 100644 --- a/src/daemon/dlt_daemon_socket.c +++ b/src/daemon/dlt_daemon_socket.c @@ -59,52 +59,69 @@ static char str[DLT_DAEMON_TEXTBUFSIZE]; int dlt_daemon_socket_open(int *sock) { int yes = 1; - int socket_family = PF_INET; - int socket_type = SOCK_STREAM; - int protocol = IPPROTO_TCP; - struct sockaddr_in servAddr; - unsigned int servPort = DLT_DAEMON_TCP_PORT; - - if ((*sock = socket(socket_family, socket_type, protocol)) < 0) - { - dlt_log(LOG_ERR, "dlt_daemon_socket_open: socket() failed!\n"); + char portnumbuffer[33]; + struct addrinfo hints, *servinfo, *p; + int rv; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_INET6; // force IPv6 - will still work with IPv4 + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; // use my IP address + + sprintf(portnumbuffer, "%d", DLT_DAEMON_TCP_PORT); + if ((rv = getaddrinfo(NULL, portnumbuffer, &hints, &servinfo)) != 0) { + snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "getaddrinfo: %s\n", gai_strerror(rv)); + dlt_log(LOG_ERR, str); return -1; - } /* if */ + } - snprintf(str,DLT_DAEMON_TEXTBUFSIZE,"%s: Socket created - socket_family:%i, socket_type:%i, protocol:%i\n", __FUNCTION__, socket_family, socket_type, protocol); - dlt_log(LOG_INFO, str); + for(p = servinfo; p != NULL; p = p->ai_next) { + if ((*sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { + dlt_log(LOG_ERR, "socket() error\n"); + continue; + } + + snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "%s: Socket created - socket_family:%i, socket_type:%i, protocol:%i\n", + __FUNCTION__, p->ai_family, p->ai_socktype, p->ai_protocol); + dlt_log(LOG_INFO, str); + + if (setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) + { + snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "dlt_daemon_socket_open: Setsockopt error in dlt_daemon_local_connection_init: %s\n", strerror(errno)); + dlt_log(LOG_ERR, str); + continue; + } + + if (bind(*sock, p->ai_addr, p->ai_addrlen) == -1) { + close(*sock); + dlt_log(LOG_ERR, "bind() error\n"); + continue; + } + + break; + } - if ( -1 == setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))) - { - snprintf(str,DLT_DAEMON_TEXTBUFSIZE,"dlt_daemon_socket_open: Setsockopt error in dlt_daemon_local_connection_init: %s\n",strerror(errno)); - dlt_log(LOG_ERR, str); + if (p == NULL) { + dlt_log(LOG_ERR, "failed to bind socket\n"); return -1; } - memset(&servAddr, 0, sizeof(servAddr)); - servAddr.sin_family = AF_INET; - servAddr.sin_addr.s_addr = INADDR_ANY; - servAddr.sin_port = htons(servPort); - if (bind(*sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) - { - dlt_log(LOG_ERR, "dlt_daemon_socket_open: bind() failed!\n"); - return -1; - } /* if */ + freeaddrinfo(servinfo); + + snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "%s: Listening on port: %u\n", __FUNCTION__, DLT_DAEMON_TCP_PORT); + dlt_log(LOG_INFO, str); + + // get socket buffer size + snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "dlt_daemon_socket_open: Socket send queue size: %d\n", dlt_daemon_socket_get_send_qeue_max_size(*sock)); + dlt_log(LOG_INFO, str); if (listen(*sock, 3) < 0) { dlt_log(LOG_ERR, "dlt_daemon_socket_open: listen() failed!\n"); return -1; - } /* if */ - - snprintf(str,DLT_DAEMON_TEXTBUFSIZE,"%s: Listening on port: %u\n",__FUNCTION__,servPort); - dlt_log(LOG_INFO, str); - - /* get socket buffer size */ - snprintf(str,DLT_DAEMON_TEXTBUFSIZE,"dlt_daemon_socket_open: Socket send queue size: %d\n",dlt_daemon_socket_get_send_qeue_max_size(*sock)); - dlt_log(LOG_INFO, str); + } - return 0; /* OK */ + return 0; // OK } int dlt_daemon_socket_close(int sock) diff --git a/src/lib/dlt_client.c b/src/lib/dlt_client.c index b8872ad..d5f81e9 100755 --- a/src/lib/dlt_client.c +++ b/src/lib/dlt_client.c @@ -94,6 +94,8 @@ static int (*message_callback_function) (DltMessage *message, void *data) = NULL; +static char str[DLT_CLIENT_TEXTBUFSIZE]; + void dlt_client_register_message_callback(int (*registerd_callback) (DltMessage *message, void *data)){ message_callback_function = registerd_callback; } @@ -122,9 +124,12 @@ int dlt_client_init(DltClient *client, int verbose) int dlt_client_connect(DltClient *client, int verbose) { - struct sockaddr_in servAddr; - unsigned short servPort = DLT_DAEMON_TCP_PORT; - struct hostent *host; /* Structure containing host information */ + char portnumbuffer[33]; + struct addrinfo hints, *servinfo, *p; + int rv; + + memset(&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; if (client==0) { @@ -133,27 +138,30 @@ int dlt_client_connect(DltClient *client, int verbose) if (client->serial_mode==0) { - /* open socket */ - if ((client->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) - { - fprintf(stderr,"ERROR: socket() failed!\n"); + sprintf(portnumbuffer, "%d", DLT_DAEMON_TCP_PORT); + if ((rv = getaddrinfo(client->servIP, portnumbuffer, &hints, &servinfo)) != 0) { + fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return -1; } - if ((host = (struct hostent*) gethostbyname(client->servIP)) == 0) - { - fprintf(stderr, "ERROR: gethostbyname() failed\n"); - return -1; + for(p = servinfo; p != NULL; p = p->ai_next) { + if ((client->sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) { + snprintf(str, DLT_CLIENT_TEXTBUFSIZE, "socket() failed!\n"); + continue; + } + if (connect(client->sock, p->ai_addr, p->ai_addrlen) < 0) { + close(client->sock); + snprintf(str, DLT_CLIENT_TEXTBUFSIZE, "connect() failed!\n"); + continue; + } + + break; } - memset(&servAddr, 0, sizeof(servAddr)); - servAddr.sin_family = AF_INET; - servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*( struct in_addr*)( host -> h_addr_list[0]))); - servAddr.sin_port = htons(servPort); + freeaddrinfo(servinfo); - if (connect(client->sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) - { - fprintf(stderr,"ERROR: connect() failed!\n"); + if (p == NULL) { + fprintf(stderr, "ERROR: failed to connect - %s\n", str); return -1; } @@ -201,6 +209,7 @@ int dlt_client_connect(DltClient *client, int verbose) if (dlt_receiver_init(&(client->receiver),client->sock,DLT_CLIENT_RCVBUFSIZE)!=0) { + fprintf(stderr, "ERROR initializing receiver\n"); return -1; } diff --git a/src/system/dlt-system-syslog.c b/src/system/dlt-system-syslog.c index c788d94..d7e7e1d 100644 --- a/src/system/dlt-system-syslog.c +++ b/src/system/dlt-system-syslog.c @@ -66,7 +66,7 @@ int init_socket(SyslogOptions opts) int sock = -1; struct sockaddr_in syslog_addr; - sock = socket(AF_INET, SOCK_DGRAM, 0); + sock = socket(AF_INET6, SOCK_DGRAM, 0); if(sock < 0) { DLT_LOG(syslogContext, DLT_LOG_FATAL, @@ -74,7 +74,7 @@ int init_socket(SyslogOptions opts) return -1; } - syslog_addr.sin_family = AF_INET; + syslog_addr.sin_family = AF_INET6; syslog_addr.sin_port = htons(opts.Port); syslog_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(syslog_addr.sin_zero), 8); -- cgit v1.2.1