summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Popek <Jiri.Popek@bmw.de>2015-03-17 13:17:25 +0100
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2015-03-23 14:41:26 +0100
commit9a70eef3ee739543b87c867fd5b643b703899c89 (patch)
treef0eb67ae73b6acc643881851c5f0625281cb6ede
parentdb5b62a1c054667dc82929d90e195cd4a7060f4c (diff)
downloadDLT-daemon-9a70eef3ee739543b87c867fd5b643b703899c89.tar.gz
Add the IPv6 support
Enables communication between DLT server and clients over IPv6. Signed-off-by: Jiri Popek <jiri.popek@bmw.de> Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
-rwxr-xr-xsrc/adaptor/dlt-adaptor-udp.c4
-rw-r--r--src/daemon/dlt_daemon_socket.c85
-rwxr-xr-xsrc/lib/dlt_client.c45
-rw-r--r--src/system/dlt-system-syslog.c4
4 files changed, 82 insertions, 56 deletions
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);