From 71b131daf2c13477470289cc8faef319e2ff5f2f Mon Sep 17 00:00:00 2001 From: Bui Nguyen Quoc Thanh <49302843+thanhbnq@users.noreply.github.com> Date: Wed, 26 Oct 2022 15:14:49 +0700 Subject: dlt-receive: set host interface and allow multiple udp multicast addresses (#420) * dlt-receive: Allow listening to multiple udp multicast addresses Multiple udp multicast addresses can now be specified, e.g: dlt-receive -u 224.255.1.1 225.255.1.1 Signed-off-by: Alexander Irion * dlt-receive: Add option to set host interface address Signed-off-by: Alexander Irion Signed-off-by: Alexander Irion Co-authored-by: Alexander Irion --- src/console/dlt-receive.c | 57 +++++++++++++++++++++++++++++++---------------- src/lib/dlt_client.c | 39 ++++++++++++++++++-------------- 2 files changed, 60 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/console/dlt-receive.c b/src/console/dlt-receive.c index c985447..dec4713 100644 --- a/src/console/dlt-receive.c +++ b/src/console/dlt-receive.c @@ -135,6 +135,7 @@ typedef struct { DltFile file; DltFilter filter; int port; + char *ifaddr; } DltReceiveData; /** @@ -161,6 +162,7 @@ void usage() printf(" -R Enable resync serial header\n"); printf(" -y Serial device mode\n"); printf(" -u UDP multicast mode\n"); + printf(" -i addr Host interface address\n"); printf(" -b baudrate Serial device baudrate (Default: 115200)\n"); printf(" -e ecuid Set ECU ID (Default: RECV)\n"); printf(" -o filename Output messages in new DLT file\n"); @@ -314,28 +316,13 @@ void dlt_receive_close_output_file(DltReceiveData *dltdata) int main(int argc, char *argv[]) { DltReceiveData dltdata; + memset(&dltdata, 0, sizeof(dltdata)); int c; int index; /* Initialize dltdata */ - dltdata.aflag = 0; - dltdata.sflag = 0; - dltdata.xflag = 0; - dltdata.mflag = 0; - dltdata.vflag = 0; - dltdata.yflag = 0; - dltdata.uflag = 0; - dltdata.ovalue = 0; - dltdata.ovaluebase = 0; - dltdata.fvalue = 0; - dltdata.jvalue = 0; - dltdata.evalue = 0; - dltdata.bvalue = 0; - dltdata.sendSerialHeaderFlag = 0; - dltdata.resyncSerialHeaderFlag = 0; dltdata.climit = -1; /* default: -1 = unlimited */ dltdata.ohandle = -1; - dltdata.totalbytes = 0; dltdata.part_num = -1; dltdata.port = 3490; @@ -354,7 +341,7 @@ int main(int argc, char *argv[]) /* Fetch command line arguments */ opterr = 0; - while ((c = getopt (argc, argv, "vashSRyuxmf:j:o:e:b:c:p:")) != -1) + while ((c = getopt (argc, argv, "vashSRyuxmf:j:o:e:b:c:p:i:")) != -1) switch (c) { case 'v': { @@ -406,6 +393,11 @@ int main(int argc, char *argv[]) dltdata.uflag = 1; break; } + case 'i': + { + dltdata.ifaddr = optarg; + break; + } case 'f': { dltdata.fvalue = optarg; @@ -506,11 +498,31 @@ int main(int argc, char *argv[]) if (dltclient.mode == DLT_CLIENT_MODE_TCP || dltclient.mode == DLT_CLIENT_MODE_UDP_MULTICAST) { dltclient.port = dltdata.port; - for (index = optind; index < argc; index++) - if (dlt_client_set_server_ip(&dltclient, argv[index]) == -1) { + + unsigned int servIPLength = 1; // Counting the terminating 0 byte + for (index = optind; index < argc; index++) { + servIPLength += strlen(argv[index]); + if (index > optind) { + servIPLength++; // For the comma delimiter + } + } + if (servIPLength > 1) { + char* servIPString = malloc(servIPLength); + strcpy(servIPString, argv[optind]); + + for (index = optind + 1; index < argc; index++) { + strcat(servIPString, ","); + strcat(servIPString, argv[index]); + } + + int retval = dlt_client_set_server_ip(&dltclient, servIPString); + free(servIPString); + + if (retval == -1) { fprintf(stderr, "set server ip didn't succeed\n"); return -1; } + } if (dltclient.servIP == 0) { /* no hostname selected, show usage and terminate */ @@ -519,6 +531,13 @@ int main(int argc, char *argv[]) dlt_client_cleanup(&dltclient, dltdata.vflag); return -1; } + + if (dltdata.ifaddr != 0) { + if (dlt_client_set_host_if_address(&dltclient, dltdata.ifaddr) != DLT_RETURN_OK) { + fprintf(stderr, "set host interface address didn't succeed\n"); + return -1; + } + } } else { for (index = optind; index < argc; index++) diff --git a/src/lib/dlt_client.c b/src/lib/dlt_client.c index c032fd4..af380e4 100644 --- a/src/lib/dlt_client.c +++ b/src/lib/dlt_client.c @@ -428,27 +428,32 @@ DltReturnValue dlt_client_connect(DltClient *client, int verbose) return DLT_RETURN_ERROR; } - mreq.imr_multiaddr.s_addr = inet_addr(client->servIP); - if (mreq.imr_multiaddr.s_addr == (in_addr_t)-1) - { - dlt_vlog(LOG_ERR, - "%s: ERROR: server address not not valid %s\n", - __func__, - client->servIP); + char delimiter[] = ","; + char* servIP = strtok(client->servIP, delimiter); - return DLT_RETURN_ERROR; - } + while(servIP != NULL) { + mreq.imr_multiaddr.s_addr = inet_addr(servIP); + if (mreq.imr_multiaddr.s_addr == (in_addr_t)-1) + { + dlt_vlog(LOG_ERR, + "%s: ERROR: server address not not valid %s\n", + __func__, + servIP); - if (setsockopt(client->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) - { - dlt_vlog(LOG_ERR, - "%s: ERROR: setsockopt add membership failed: %s\n", - __func__, - strerror(errno)); + return DLT_RETURN_ERROR; + } - return DLT_RETURN_ERROR; - } + if (setsockopt(client->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) + { + dlt_vlog(LOG_ERR, + "%s: ERROR: setsockopt add membership failed: %s\n", + __func__, + strerror(errno)); + return DLT_RETURN_ERROR; + } + servIP = strtok(NULL, delimiter); + } receiver_type = DLT_RECEIVE_UDP_SOCKET; break; -- cgit v1.2.1