summaryrefslogtreecommitdiff
path: root/src/lib/dlt_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dlt_client.c')
-rw-r--r--src/lib/dlt_client.c82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/lib/dlt_client.c b/src/lib/dlt_client.c
index 5c18c0e..0b44d6e 100644
--- a/src/lib/dlt_client.c
+++ b/src/lib/dlt_client.c
@@ -121,6 +121,7 @@ DltReturnValue dlt_client_init_port(DltClient *client, int port, int verbose)
client->receiver.buffer = NULL;
client->receiver.buf = NULL;
client->receiver.backup_buf = NULL;
+ client->hostip = NULL;
return DLT_RETURN_OK;
}
@@ -153,16 +154,17 @@ DltReturnValue dlt_client_init(DltClient *client, int verbose)
dlt_vlog(LOG_INFO,
"Init dlt client struct with default port: %hu.\n",
servPort);
-
return dlt_client_init_port(client, servPort, verbose);
}
DltReturnValue dlt_client_connect(DltClient *client, int verbose)
{
+ const int yes = 1;
char portnumbuffer[33];
struct addrinfo hints, *servinfo, *p;
struct sockaddr_un addr;
int rv;
+ struct ip_mreq mreq;
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
@@ -266,6 +268,58 @@ DltReturnValue dlt_client_connect(DltClient *client, int verbose)
}
break;
+ case DLT_CLIENT_MODE_UDP_MULTICAST:
+
+ if ((client->sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ {
+ fprintf(stderr, "ERROR: socket error: %s\n", strerror(errno));
+ return DLT_RETURN_ERROR;
+ }
+
+ /* allow multiple sockets to use the same PORT number */
+ if (setsockopt(client->sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0)
+ {
+ fprintf(stderr, "ERROR: Reusing address failed: %s\n", strerror(errno));
+ return DLT_RETURN_ERROR;
+ }
+
+ memset(&client->receiver.addr, 0, sizeof(client->receiver.addr));
+ client->receiver.addr.sin_family = AF_INET;
+ client->receiver.addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ client->receiver.addr.sin_port = htons(client->port);
+
+ /* bind to receive address */
+ if (bind(client->sock, (struct sockaddr*) &client->receiver.addr, sizeof(client->receiver.addr)) < 0)
+ {
+ fprintf(stderr, "ERROR: bind failed: %s\n", strerror(errno));
+ return DLT_RETURN_ERROR;
+ }
+
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+ if (client->hostip)
+ {
+ mreq.imr_interface.s_addr = inet_addr(client->hostip);
+ }
+ if (client->servIP == NULL)
+ {
+ fprintf(stderr, "ERROR: server address not set\n");
+ return DLT_RETURN_ERROR;
+ }
+
+ mreq.imr_multiaddr.s_addr = inet_addr(client->servIP);
+ if (mreq.imr_multiaddr.s_addr == (in_addr_t)-1)
+ {
+ fprintf(stderr, "ERROR: server address not not valid %s\n", client->servIP);
+ return DLT_RETURN_ERROR;
+ }
+
+ if (setsockopt(client->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
+ {
+ fprintf(stderr, "ERROR: setsockopt add membership failed: %s\n", strerror(errno));
+ return DLT_RETURN_ERROR;
+ }
+
+ break;
default:
if (verbose)
@@ -315,6 +369,10 @@ DltReturnValue dlt_client_cleanup(DltClient *client, int verbose)
client->socketPath = NULL;
}
+ if (client->hostip) {
+ free(client->hostip);
+ client->hostip = NULL;
+ }
return ret;
}
@@ -875,6 +933,16 @@ DltReturnValue dlt_client_setbaudrate(DltClient *client, int baudrate)
return DLT_RETURN_OK;
}
+DltReturnValue dlt_client_set_mode(DltClient *client, DltClientMode mode)
+{
+ if (client == 0)
+ return DLT_RETURN_ERROR;
+
+ client->mode = mode;
+ return DLT_RETURN_OK;
+
+}
+
int dlt_client_set_server_ip(DltClient *client, char *ipaddr)
{
client->servIP = strdup(ipaddr);
@@ -887,6 +955,18 @@ int dlt_client_set_server_ip(DltClient *client, char *ipaddr)
return DLT_RETURN_OK;
}
+int dlt_client_set_host_if_address(DltClient *client, char *hostip)
+{
+ client->hostip = strdup(hostip);
+
+ if (client->hostip == NULL) {
+ dlt_log(LOG_ERR, "ERROR: failed to duplicate UDP interface address\n");
+ return DLT_RETURN_ERROR;
+ }
+
+ return DLT_RETURN_OK;
+}
+
int dlt_client_set_serial_device(DltClient *client, char *serial_device)
{
client->serialDevice = strdup(serial_device);