diff options
author | João Sousa <48479050+joaodasousa@users.noreply.github.com> | 2020-08-31 00:56:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-31 08:56:03 +0900 |
commit | 33fbad18c814e13bd7ba2053525d8959fee437d1 (patch) | |
tree | 87d30704e5e78c603aace4cb2c0dacdf3554eba6 /src/lib | |
parent | 9af27899553dcfe9cd5ffede7f37be57d1a577a6 (diff) | |
download | DLT-daemon-33fbad18c814e13bd7ba2053525d8959fee437d1.tar.gz |
Implement DLTClient for UDP multicast (#240)
* Add UDP multicast support on client side
UDP multicast support is already present on server side. This
patch add seemless support for UDP multicast on client side
in dlt-receive.
Signed-off-by: Joao Sousa <joao.sa.sousa@ctw.bmwgroup.com>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/dlt_client.c | 82 |
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); |