From 38d9152f80f72eaf6b8304b77e53ad616c088a1d Mon Sep 17 00:00:00 2001 From: Ramakrishnan Muthukrishnan Date: Thu, 5 Dec 2024 21:05:03 +0530 Subject: [PATCH] protocol1 discovery named to p1_discovery and likewise for p2 Simplified the DISCOVERED struct a bit. --- Makefile | 4 +- about_menu.c | 18 +- discovered.h | 8 +- discovery.c | 111 ++++---- new_protocol.c | 44 +-- new_protocol_programmer.c | 4 +- old_protocol.c | 10 +- p1_discovery.c | 574 ++++++++++++++++++++------------------ p1_discovery.h | 2 +- p2_discovery.c | 90 +++--- p2_discovery.h | 2 +- radio.c | 44 +-- 12 files changed, 477 insertions(+), 434 deletions(-) diff --git a/Makefile b/Makefile index a031d3d..adb079a 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ GIT_VERSION := $(shell git describe --abbrev=0 --tags --always) # CONTROLLER2_V1 single encoders with MCP23017 switches # CONTROLLER2_V2 dual encoders with MCP23017 switches # -GPIO_INCLUDE=GPIO +# GPIO_INCLUDE=GPIO # uncomment if level control (power output) is software based # LEVEL_CTRL=SW_LEVEL_CTRL @@ -183,7 +183,7 @@ COMPILE=$(CC) $(CFLAGS) $(OPTIONS) $(INCLUDES) PROGRAM=pihpsdr -SRC = $(filter-out hpsdrsim.c mac_midi.c midi2.c midi_menu.c ps_menu.c server_menu.c soundio.c ozyio.c newhpsdrsim.c beep.c alsa_midi.c iambic.c pulseaudio.c frequency.c audio.c client_server.c freqent_menu.c general_menu.c gpio_mraa.c, $(wildcard *.c)) +SRC = $(filter-out hpsdrsim.c mac_midi.c midi2.c midi_menu.c ps_menu.c server_menu.c soundio.c ozyio.c newhpsdrsim.c beep.c alsa_midi.c iambic.c pulseaudio.c frequency.c audio.c client_server.c freqent_menu.c general_menu.c gpio_mraa.c hpsdr_discovery.c, $(wildcard *.c)) HEADERS = $(wildcard *.h) OBJS = $(SRC:.c=.o) diff --git a/about_menu.c b/about_menu.c index 984b742..5958c36 100644 --- a/about_menu.c +++ b/about_menu.c @@ -117,17 +117,17 @@ void about_menu(GtkWidget *parent) { } else { #endif - strcpy(addr,inet_ntoa(radio->info.network.address.sin_addr)); - strcpy(interface_addr,inet_ntoa(radio->info.network.interface_address.sin_addr)); + strcpy(addr,inet_ntoa(radio->network.address.sin_addr)); + strcpy(interface_addr,inet_ntoa(radio->network.interface_address.sin_addr)); sprintf(line,"\nDevice Mac Address: %02X:%02X:%02X:%02X:%02X:%02X", - radio->info.network.mac_address[0], - radio->info.network.mac_address[1], - radio->info.network.mac_address[2], - radio->info.network.mac_address[3], - radio->info.network.mac_address[4], - radio->info.network.mac_address[5]); + radio->network.mac_address[0], + radio->network.mac_address[1], + radio->network.mac_address[2], + radio->network.mac_address[3], + radio->network.mac_address[4], + radio->network.mac_address[5]); strcat(text,line); - sprintf(line,"\nDevice IP Address: %s on %s (%s)",addr,radio->info.network.interface_name,interface_addr); + sprintf(line,"\nDevice IP Address: %s on %s (%s)",addr,radio->network.interface_name,interface_addr); strcat(text,line); #ifdef USBOZY diff --git a/discovered.h b/discovered.h index 347a29b..47623a7 100644 --- a/discovered.h +++ b/discovered.h @@ -69,17 +69,15 @@ struct _DISCOVERED { int dacs; double frequency_min; double frequency_max; - union { - struct network { + struct network { unsigned char mac_address[6]; - int address_length; + // int address_length; struct sockaddr_in address; int interface_length; struct sockaddr_in interface_address; struct sockaddr_in interface_netmask; char interface_name[64]; - } network; - } info; + } network; }; typedef struct _DISCOVERED DISCOVERED; diff --git a/discovery.c b/discovery.c index aa43249..c3875de 100644 --- a/discovery.c +++ b/discovery.c @@ -19,7 +19,7 @@ #include #include -#include + #include #include #include @@ -37,8 +37,7 @@ #endif #include "discovered.h" -#include "old_discovery.h" -#include "new_discovery.h" +#include "p1_discovery.h" #include "main.h" #include "radio.h" #ifdef USBOZY @@ -54,12 +53,12 @@ #ifdef CLIENT_SERVER #include "client_server.h" #endif -#include "property.h" #include "log.h" static GtkWidget *discovery_dialog; static DISCOVERED *d; + GtkWidget *tcpaddr; #define IPADDR_LEN 20 static char ipaddr_tcp_buf[IPADDR_LEN] = "10.10.10.10"; @@ -260,58 +259,58 @@ static gboolean connect_cb (GtkWidget *widget, GdkEventButton *event, gpointer d } #endif -void discovery() { -//fprintf(stderr,"discovery\n"); - - protocols_restore_state(); - - selected_device=0; - devices=0; - - // Try to locate IP addr - FILE *fp=fopen("ip.addr","r"); - if (fp) { - fgets(ipaddr_tcp, IPADDR_LEN,fp); - fclose(fp); - ipaddr_tcp[IPADDR_LEN-1]=0; - // remove possible trailing newline char in ipaddr_tcp - int len=strnlen(ipaddr_tcp,IPADDR_LEN); - while (--len >= 0) { - if (ipaddr_tcp[len] != '\n') - break; - ipaddr_tcp[len]=0; +void discovery(void) { + //fprintf(stderr,"discovery\n"); + protocols_restore_state(); + + selected_device=0; + devices=0; + + // Try to locate IP addr + FILE *fp = fopen("ip.addr","r"); + if (fp) { + fgets(ipaddr_tcp, IPADDR_LEN,fp); + fclose(fp); + ipaddr_tcp[IPADDR_LEN-1]=0; + // remove possible trailing newline char in ipaddr_tcp + int len = strnlen(ipaddr_tcp,IPADDR_LEN); + while (--len >= 0) { + if (ipaddr_tcp[len] != '\n') + break; + ipaddr_tcp[len]=0; + } } - } + #ifdef USBOZY // // first: look on USB for an Ozy // - log_trace("looking for USB based OZY devices"); - - if (ozy_discover() != 0) - { - discovered[devices].protocol = ORIGINAL_PROTOCOL; - discovered[devices].device = DEVICE_OZY; - discovered[devices].software_version = 10; // we can't know yet so this isn't a real response - discovered[devices].status = STATE_AVAILABLE; - strcpy(discovered[devices].name,"Ozy on USB"); - - strcpy(discovered[devices].info.network.interface_name,"USB"); - devices++; - } + log_trace("looking for USB based OZY devices"); + + if (ozy_discover() != 0) + { + discovered[devices].protocol = ORIGINAL_PROTOCOL; + discovered[devices].device = DEVICE_OZY; + discovered[devices].software_version = 10; // we can't know yet so this isn't a real response + discovered[devices].status = STATE_AVAILABLE; + strcpy(discovered[devices].name,"Ozy on USB"); + + strcpy(discovered[devices].info.network.interface_name,"USB"); + devices++; + } #endif - if(enable_protocol_1) { - status_text("Protocol 1 ... Discovering Devices"); - old_discovery(); - } + if(enable_protocol_1) { + status_text("Protocol 1 ... Discovering Devices"); + p1_discovery(); + } - /* if(enable_protocol_2) { */ - /* status_text("Protocol 2 ... Discovering Devices"); */ - /* new_discovery(); */ - /* } */ + /* if(enable_protocol_2) { */ + /* status_text("Protocol 2 ... Discovering Devices"); */ + /* new_discovery(); */ + /* } */ - status_text("Discovery"); + status_text("Discovery"); log_info("discovery: found %d devices", devices); gdk_window_set_cursor(gtk_widget_get_window(top_window),gdk_cursor_new(GDK_ARROW)); @@ -366,14 +365,14 @@ void discovery() { d->name, d->protocol==ORIGINAL_PROTOCOL?"Protocol 1":"Protocol 2", version, - inet_ntoa(d->info.network.address.sin_addr), - d->info.network.mac_address[0], - d->info.network.mac_address[1], - d->info.network.mac_address[2], - d->info.network.mac_address[3], - d->info.network.mac_address[4], - d->info.network.mac_address[5], - d->info.network.interface_name); + inet_ntoa(d->network.address.sin_addr), + d->network.mac_address[0], + d->network.mac_address[1], + d->network.mac_address[2], + d->network.mac_address[3], + d->network.mac_address[4], + d->network.mac_address[5], + d->network.interface_name); #ifdef USBOZY } #endif @@ -399,7 +398,7 @@ void discovery() { } // if not on the same subnet then cannot start it - if((d->info.network.interface_address.sin_addr.s_addr&d->info.network.interface_netmask.sin_addr.s_addr) != (d->info.network.address.sin_addr.s_addr&d->info.network.interface_netmask.sin_addr.s_addr)) { + if((d->network.interface_address.sin_addr.s_addr&d->network.interface_netmask.sin_addr.s_addr) != (d->network.address.sin_addr.s_addr&d->network.interface_netmask.sin_addr.s_addr)) { gtk_button_set_label(GTK_BUTTON(start_button),"Subnet!"); gtk_widget_set_sensitive(start_button, FALSE); } diff --git a/new_protocol.c b/new_protocol.c index 755874f..d3018a2 100644 --- a/new_protocol.c +++ b/new_protocol.c @@ -503,50 +503,50 @@ void new_protocol_init(int pixels) { setsockopt(data_socket, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); // bind to the interface - if(bind(data_socket,(struct sockaddr*)&radio->info.network.interface_address,radio->info.network.interface_length)<0) { + if(bind(data_socket,(struct sockaddr*)&radio->network.interface_address,radio->network.interface_length)<0) { g_print("metis: bind socket failed for data_socket\n"); exit(-1); } -g_print("new_protocol_init: data_socket %d bound to interface %s:%d\n",data_socket,inet_ntoa(radio->info.network.interface_address.sin_addr),ntohs(radio->info.network.interface_address.sin_port)); +g_print("new_protocol_init: data_socket %d bound to interface %s:%d\n",data_socket,inet_ntoa(radio->network.interface_address.sin_addr),ntohs(radio->network.interface_address.sin_port)); - memcpy(&base_addr,&radio->info.network.address,radio->info.network.address_length); - base_addr_length=radio->info.network.address_length; + memcpy(&base_addr,&radio->network.address,radio->network.address_length); + base_addr_length=radio->network.address_length; base_addr.sin_port=htons(GENERAL_REGISTERS_FROM_HOST_PORT); -//g_print("base_addr=%s\n",inet_ntoa(radio->info.network.address.sin_addr)); +//g_print("base_addr=%s\n",inet_ntoa(radio->network.address.sin_addr)); - memcpy(&receiver_addr,&radio->info.network.address,radio->info.network.address_length); - receiver_addr_length=radio->info.network.address_length; + memcpy(&receiver_addr,&radio->network.address,radio->network.address_length); + receiver_addr_length=radio->network.address_length; receiver_addr.sin_port=htons(RECEIVER_SPECIFIC_REGISTERS_FROM_HOST_PORT); -//g_print("receive_addr=%s\n",inet_ntoa(radio->info.network.address.sin_addr)); +//g_print("receive_addr=%s\n",inet_ntoa(radio->network.address.sin_addr)); - memcpy(&transmitter_addr,&radio->info.network.address,radio->info.network.address_length); - transmitter_addr_length=radio->info.network.address_length; + memcpy(&transmitter_addr,&radio->network.address,radio->network.address_length); + transmitter_addr_length=radio->network.address_length; transmitter_addr.sin_port=htons(TRANSMITTER_SPECIFIC_REGISTERS_FROM_HOST_PORT); -//g_print("transmit_addr=%s\n",inet_ntoa(radio->info.network.address.sin_addr)); +//g_print("transmit_addr=%s\n",inet_ntoa(radio->network.address.sin_addr)); - memcpy(&high_priority_addr,&radio->info.network.address,radio->info.network.address_length); - high_priority_addr_length=radio->info.network.address_length; + memcpy(&high_priority_addr,&radio->network.address,radio->network.address_length); + high_priority_addr_length=radio->network.address_length; high_priority_addr.sin_port=htons(HIGH_PRIORITY_FROM_HOST_PORT); -//g_print("high_priority_addr=%s\n",inet_ntoa(radio->info.network.address.sin_addr)); +//g_print("high_priority_addr=%s\n",inet_ntoa(radio->network.address.sin_addr)); //g_print("new_protocol_thread: high_priority_addr setup for port %d\n",HIGH_PRIORITY_FROM_HOST_PORT); - memcpy(&audio_addr,&radio->info.network.address,radio->info.network.address_length); - audio_addr_length=radio->info.network.address_length; + memcpy(&audio_addr,&radio->network.address,radio->network.address_length); + audio_addr_length=radio->network.address_length; audio_addr.sin_port=htons(AUDIO_FROM_HOST_PORT); -//g_print("audio_addr=%s\n",inet_ntoa(radio->info.network.address.sin_addr)); +//g_print("audio_addr=%s\n",inet_ntoa(radio->network.address.sin_addr)); - memcpy(&iq_addr,&radio->info.network.address,radio->info.network.address_length); - iq_addr_length=radio->info.network.address_length; + memcpy(&iq_addr,&radio->network.address,radio->network.address_length); + iq_addr_length=radio->network.address_length; iq_addr.sin_port=htons(TX_IQ_FROM_HOST_PORT); -//g_print("iq_addr=%s\n",inet_ntoa(radio->info.network.address.sin_addr)); +//g_print("iq_addr=%s\n",inet_ntoa(radio->network.address.sin_addr)); for(i=0;iinfo.network.address,radio->info.network.address_length); - data_addr_length[i]=radio->info.network.address_length; + memcpy(&data_addr[i],&radio->network.address,radio->network.address_length); + data_addr_length[i]=radio->network.address_length; data_addr[i].sin_port=htons(RX_IQ_TO_HOST_PORT_0+i); } diff --git a/new_protocol_programmer.c b/new_protocol_programmer.c index 1b26519..c898b85 100644 --- a/new_protocol_programmer.c +++ b/new_protocol_programmer.c @@ -66,8 +66,8 @@ void new_protocol_programmer(char *filename ) { DISCOVERED* d=&discovered[selected_device]; - memcpy(&program_addr,&d->info.network.address,d->info.network.address_length); - program_addr_length=d->info.network.address_length; + memcpy(&program_addr,&d->network.address,d->network.address_length); + program_addr_length=d->network.address_length; program_addr.sin_port=htons(PROGRAMMING_FROM_HOST_PORT); FILE *fp; diff --git a/old_protocol.c b/old_protocol.c index f8f29f7..5de8d96 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -404,13 +404,13 @@ static void open_udp_socket() { } // bind to the interface - log_trace("binding UDP socket to %s:%d\n",inet_ntoa(radio->info.network.interface_address.sin_addr),ntohs(radio->info.network.interface_address.sin_port)); - if(bind(tmp,(struct sockaddr*)&radio->info.network.interface_address,radio->info.network.interface_length)<0) { + log_trace("binding UDP socket to %s:%d\n",inet_ntoa(radio->network.interface_address.sin_addr),ntohs(radio->network.interface_address.sin_port)); + if(bind(tmp,(struct sockaddr*)&radio->network.interface_address,radio->network.interface_length)<0) { log_error("old_protocol: bind socket failed for data_socket: %s", strerror(errno)); exit(-1); } - memcpy(&data_addr,&radio->info.network.address,radio->info.network.address_length); + memcpy(&data_addr,&radio->network.address,radio->network.address_length); data_addr.sin_port=htons(DATA_PORT); data_socket=tmp; log_trace("%s: UDP socket established: %d for %s:%d",__FUNCTION__,data_socket,inet_ntoa(data_addr.sin_addr),ntohs(data_addr.sin_port)); @@ -425,10 +425,10 @@ static void open_tcp_socket() { usleep(100000); close(tmp); } - memcpy(&data_addr,&radio->info.network.address,radio->info.network.address_length); + memcpy(&data_addr,&radio->network.address,radio->network.address_length); data_addr.sin_port=htons(DATA_PORT); data_addr.sin_family = AF_INET; - log_trace("Trying to open TCP connection to %s", inet_ntoa(radio->info.network.address.sin_addr)); + log_trace("Trying to open TCP connection to %s", inet_ntoa(radio->network.address.sin_addr)); tmp=socket(AF_INET, SOCK_STREAM, 0); if (tmp < 0) { diff --git a/p1_discovery.c b/p1_discovery.c index 8c8cfc0..933ad73 100644 --- a/p1_discovery.c +++ b/p1_discovery.c @@ -1,47 +1,47 @@ /* Copyright (C) -* 2015 - John Melton, G0ORX/N6LYT -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -* -*/ + * 2015 - John Melton, G0ORX/N6LYT + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ -#include -#include -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include "discovered.h" #include "discovery.h" -#include "old_discovery.h" #include "log.h" +#include "p1_discovery.h" static char interface_name[64]; -static struct sockaddr_in interface_addr={0}; -static struct sockaddr_in interface_netmask={0}; +static struct sockaddr_in interface_addr = {0}; +static struct sockaddr_in interface_netmask = {0}; #define DISCOVERY_PORT 1024 static int discovery_socket; @@ -49,11 +49,11 @@ static int discovery_socket; static GThread *discover_thread_id; static gpointer discover_receive_thread(gpointer data); -static void discover(struct ifaddrs* iface) { +static void discover(struct ifaddrs *iface) { int rc; struct sockaddr_in *sa; struct sockaddr_in *mask; - struct sockaddr_in to_addr={0}; + struct sockaddr_in to_addr = {0}; int flags; struct timeval tv; int optval; @@ -63,149 +63,172 @@ static void discover(struct ifaddrs* iface) { int i, len; if (iface == NULL) { - // - // This indicates that we want to connect to an SDR which - // cannot be reached by (UDP) broadcast packets, but that - // we know its fixed IP address - // Therefore we try to send a METIS detection packet via TCP - // to a "fixed" ip address. - // + // + // This indicates that we want to connect to an SDR which + // cannot be reached by (UDP) broadcast packets, but that + // we know its fixed IP address + // Therefore we try to send a METIS detection packet via TCP + // to a "fixed" ip address. + // log_trace("Trying to detect at TCP addr %s", ipaddr_tcp); - memset(&to_addr, 0, sizeof(to_addr)); - to_addr.sin_family = AF_INET; - if (inet_aton(ipaddr_tcp, &to_addr.sin_addr) == 0) { - log_error("discover: TCP addr %s is invalid!",ipaddr_tcp); - return; - } - to_addr.sin_port=htons(DISCOVERY_PORT); + memset(&to_addr, 0, sizeof(to_addr)); + to_addr.sin_family = AF_INET; + if (inet_aton(ipaddr_tcp, &to_addr.sin_addr) == 0) { + log_error("discover: TCP addr %s is invalid!", ipaddr_tcp); + return; + } + to_addr.sin_port = htons(DISCOVERY_PORT); - discovery_socket=socket(AF_INET, SOCK_STREAM, 0); - if(discovery_socket<0) { + discovery_socket = socket(AF_INET, SOCK_STREAM, 0); + if (discovery_socket < 0) { perror("discover: create socket failed for TCP discovery_socket\n"); return; - } - // - // Here I tried a bullet-proof approach to connect() such that the program - // does not "hang" under any circumstances. - // - First, one makes the socket non-blocking. Then, the connect() will + } + // + // Here I tried a bullet-proof approach to connect() such that the + // program does not "hang" under any circumstances. + // - First, one makes the socket non-blocking. Then, the connect() will // immediately return with error EINPROGRESS. - // - Then, one uses select() to look for *writeability* and check - // the socket error if everything went right. Since one calls select() + // - Then, one uses select() to look for *writeability* and check + // the socket error if everything went right. Since one calls select() // with a time-out, one either succeed within this time or gives up. // - Do not forget to make the socket blocking again. - // + // // Step 1. Make socket non-blocking and connect() - flags=fcntl(discovery_socket, F_GETFL, 0); - fcntl(discovery_socket, F_SETFL, flags | O_NONBLOCK); - rc=connect(discovery_socket, (const struct sockaddr *)&to_addr, sizeof(to_addr)); + flags = fcntl(discovery_socket, F_GETFL, 0); + fcntl(discovery_socket, F_SETFL, flags | O_NONBLOCK); + rc = connect(discovery_socket, (const struct sockaddr *)&to_addr, + sizeof(to_addr)); if ((errno != EINPROGRESS) && (rc < 0)) { perror("discover: connect() failed for TCP discovery_socket:"); - close(discovery_socket); - return; - } - // Step 2. Use select to wait for the connection - tv.tv_sec=3; - tv.tv_usec=0; - FD_ZERO(&fds); - FD_SET(discovery_socket, &fds); - rc=select(discovery_socket+1, NULL, &fds, NULL, &tv); + close(discovery_socket); + return; + } + // Step 2. Use select to wait for the connection + tv.tv_sec = 3; + tv.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(discovery_socket, &fds); + rc = select(discovery_socket + 1, NULL, &fds, NULL, &tv); if (rc < 0) { perror("discover: select() failed on TCP discovery_socket:"); - close(discovery_socket); - return; + close(discovery_socket); + return; } - // If no connection occured, return - if (rc == 0) { - // select timed out - log_error("discover: select() timed out on TCP discovery socket"); - close(discovery_socket); - return; - } - // Step 3. select() succeeded. Check success of connect() - optlen=sizeof(int); - rc=getsockopt(discovery_socket, SOL_SOCKET, SO_ERROR, &optval, &optlen); - if (rc < 0) { - // this should very rarely happen + // If no connection occured, return + if (rc == 0) { + // select timed out + log_error("discover: select() timed out on TCP discovery socket"); + close(discovery_socket); + return; + } + // Step 3. select() succeeded. Check success of connect() + optlen = sizeof(int); + rc = getsockopt(discovery_socket, SOL_SOCKET, SO_ERROR, &optval, + &optlen); + if (rc < 0) { + // this should very rarely happen perror("discover: getsockopt() failed on TCP discovery_socket:"); - close(discovery_socket); - return; - } - if (optval != 0) { - // connect did not succeed - log_error("discover: connect() on TCP socket did not succeed"); - close(discovery_socket); - return; - } - // Step 4. reset the socket to normal (blocking) mode - fcntl(discovery_socket, F_SETFL, flags & ~O_NONBLOCK); + close(discovery_socket); + return; + } + if (optval != 0) { + // connect did not succeed + log_error("discover: connect() on TCP socket did not succeed"); + close(discovery_socket); + return; + } + // Step 4. reset the socket to normal (blocking) mode + fcntl(discovery_socket, F_SETFL, flags & ~O_NONBLOCK); } else { - - strcpy(interface_name,iface->ifa_name); + /* struct ifaddrs { */ + /* struct ifaddrs *ifa_next; /\* Next item in list *\/ */ + /* char *ifa_name; /\* Name of interface *\/ */ + /* unsigned int ifa_flags; /\* Flags from SIOCGIFFLAGS *\/ */ + /* struct sockaddr *ifa_addr; /\* Address of interface *\/ */ + /* struct sockaddr *ifa_netmask; /\* Netmask of interface *\/ */ + /* union { */ + /* struct sockaddr *ifu_broadaddr; */ + /* /\* Broadcast address of interface *\/ */ + /* struct sockaddr *ifu_dstaddr; */ + /* /\* Point-to-point destination address *\/ */ + /* } ifa_ifu; */ + /* #define ifa_broadaddr ifa_ifu.ifu_broadaddr */ + /* #define ifa_dstaddr ifa_ifu.ifu_dstaddr */ + /* void *ifa_data; /\* Address-specific data *\/ */ + /* }; */ + + strcpy(interface_name, iface->ifa_name); log_trace("discover: looking for HPSDR devices on %s", interface_name); // send a broadcast to locate hpsdr boards on the network - discovery_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); - if(discovery_socket<0) { + discovery_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (discovery_socket < 0) { perror("discover: create socket failed for discovery_socket:"); exit(-1); } - sa = (struct sockaddr_in *) iface->ifa_addr; - mask = (struct sockaddr_in *) iface->ifa_netmask; + sa = (struct sockaddr_in *)iface->ifa_addr; + mask = (struct sockaddr_in *)iface->ifa_netmask; interface_netmask.sin_addr.s_addr = mask->sin_addr.s_addr; // bind to this interface and the discovery port + // static struct sockaddr_in interface_addr = {0}; interface_addr.sin_family = AF_INET; interface_addr.sin_addr.s_addr = sa->sin_addr.s_addr; - //interface_addr.sin_port = htons(DISCOVERY_PORT*2); + // interface_addr.sin_port = htons(DISCOVERY_PORT*2); interface_addr.sin_port = htons(0); // system assigned port - if(bind(discovery_socket,(struct sockaddr*)&interface_addr,sizeof(interface_addr))<0) { + if (bind(discovery_socket, (struct sockaddr *)&interface_addr, + sizeof(interface_addr)) < 0) { perror("discover: bind socket failed for discovery_socket:"); return; } - log_trace("discover: bound to %s",interface_name); + log_trace("discover: bound to %s", interface_name); // allow broadcast on the socket - int on=1; - rc=setsockopt(discovery_socket, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); - if(rc != 0) { + int on = 1; + rc = setsockopt(discovery_socket, SOL_SOCKET, SO_BROADCAST, &on, + sizeof(on)); + if (rc != 0) { log_error("discover: cannot set SO_BROADCAST: rc=%d", rc); exit(-1); } // setup to address - to_addr.sin_family=AF_INET; - to_addr.sin_port=htons(DISCOVERY_PORT); - to_addr.sin_addr.s_addr=htonl(INADDR_BROADCAST); + to_addr.sin_family = AF_INET; + to_addr.sin_port = htons(DISCOVERY_PORT); + to_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); } optval = 1; - setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); - setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); + setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEADDR, &optval, + sizeof(optval)); + setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEPORT, &optval, + sizeof(optval)); - rc=devices; + rc = devices; // start a receive thread to collect discovery response packets - discover_thread_id = g_thread_new( "old discover receive", discover_receive_thread, NULL); - if( ! discover_thread_id ) - { + discover_thread_id = + g_thread_new("old discover receive", discover_receive_thread, NULL); + if (!discover_thread_id) { log_error("g_thread_new failed on discover_receive_thread"); exit(-1); } - - // send discovery packet // If this is a TCP connection, send a "long" packet - len=63; - if (iface == NULL) len=1032; - buffer[0]=0xEF; - buffer[1]=0xFE; - buffer[2]=0x02; - for(i=3;iifa_name); + log_trace("discover: exiting discover for %s", iface->ifa_name); } - } - -//static void *discover_receive_thread(void* arg) { +// static void *discover_receive_thread(void* arg) { static gpointer discover_receive_thread(gpointer data) { struct sockaddr_in addr; socklen_t len; @@ -249,133 +273,156 @@ static gpointer discover_receive_thread(gpointer data) { tv.tv_sec = 2; tv.tv_usec = 0; - setsockopt(discovery_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); - - len=sizeof(addr); - while(1) { - bytes_read=recvfrom(discovery_socket,buffer,sizeof(buffer),1032,(struct sockaddr*)&addr,&len); - if(bytes_read<0) { + setsockopt(discovery_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, + sizeof(struct timeval)); + + len = sizeof(addr); + while (1) { + bytes_read = recvfrom(discovery_socket, buffer, sizeof(buffer), 1032, + (struct sockaddr *)&addr, &len); + if (bytes_read < 0) { log_debug("discovery: bytes read %d", bytes_read); - log_error("old_discovery: recvfrom socket failed for discover_receive_thread: %s", strerror(errno)); + log_error("p1_discovery: recvfrom socket failed for " + "discover_receive_thread: %s", + strerror(errno)); break; } - if (bytes_read == 0) break; - log_trace("old_discovery: received %d bytes",bytes_read); + if (bytes_read == 0) + break; + log_trace("p1_discovery: received %d bytes", bytes_read); if ((buffer[0] & 0xFF) == 0xEF && (buffer[1] & 0xFF) == 0xFE) { int status = buffer[2] & 0xFF; if (status == 2 || status == 3) { - if(devicesifa_addr && ifa->ifa_addr->sa_family == AF_INET) { - if((ifa->ifa_flags&IFF_UP)==IFF_UP - && (ifa->ifa_flags&IFF_RUNNING)==IFF_RUNNING) { - // && (ifa->ifa_flags&IFF_LOOPBACK)==IFF_LOOPBACK) { + if ((ifa->ifa_flags & IFF_UP) == IFF_UP && + (ifa->ifa_flags & IFF_RUNNING) == IFF_RUNNING) { + // && (ifa->ifa_flags&IFF_LOOPBACK)==IFF_LOOPBACK) { discover(ifa); } } @@ -386,21 +433,20 @@ void old_discovery() { // Do one additional "discover" for a fixed TCP address discover(NULL); - log_trace("discovery found %d devices",devices); - - for(size_t i = 0; i < devices; i++) { - log_trace("discovery: found device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s", - discovered[i].device, - discovered[i].software_version, - discovered[i].status, - inet_ntoa(discovered[i].info.network.address.sin_addr), - discovered[i].info.network.mac_address[0], - discovered[i].info.network.mac_address[1], - discovered[i].info.network.mac_address[2], - discovered[i].info.network.mac_address[3], - discovered[i].info.network.mac_address[4], - discovered[i].info.network.mac_address[5], - discovered[i].info.network.interface_name); + log_trace("discovery found %d devices", devices); + + for (size_t i = 0; i < devices; i++) { + log_trace("discovery: found device=%d software_version=%d status=%d " + "address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s", + discovered[i].device, discovered[i].software_version, + discovered[i].status, + inet_ntoa(discovered[i].network.address.sin_addr), + discovered[i].network.mac_address[0], + discovered[i].network.mac_address[1], + discovered[i].network.mac_address[2], + discovered[i].network.mac_address[3], + discovered[i].network.mac_address[4], + discovered[i].network.mac_address[5], + discovered[i].network.interface_name); } } - diff --git a/p1_discovery.h b/p1_discovery.h index fb3a2f5..51ab9ca 100644 --- a/p1_discovery.h +++ b/p1_discovery.h @@ -20,6 +20,6 @@ #ifndef _OLD_DISCOVERY_H #define _OLD_DISCOVERY_H -void old_discovery(void); +void p1_discovery(void); #endif diff --git a/p2_discovery.c b/p2_discovery.c index 1d860c9..8289be1 100644 --- a/p2_discovery.c +++ b/p2_discovery.c @@ -44,10 +44,10 @@ static struct sockaddr_in interface_netmask={0}; #define DISCOVERY_PORT 1024 static int discovery_socket; -void new_discover(struct ifaddrs* iface); +void p2_discover(struct ifaddrs* iface); static GThread *discover_thread_id; -gpointer new_discover_receive_thread(gpointer data); +gpointer p2_discover_receive_thread(gpointer data); void print_device(int i) { fprintf(stderr,"discovery: found protocol=%d device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s\n", @@ -55,17 +55,17 @@ void print_device(int i) { discovered[i].device, discovered[i].software_version, discovered[i].status, - inet_ntoa(discovered[i].info.network.address.sin_addr), - discovered[i].info.network.mac_address[0], - discovered[i].info.network.mac_address[1], - discovered[i].info.network.mac_address[2], - discovered[i].info.network.mac_address[3], - discovered[i].info.network.mac_address[4], - discovered[i].info.network.mac_address[5], - discovered[i].info.network.interface_name); + inet_ntoa(discovered[i].network.address.sin_addr), + discovered[i].network.mac_address[0], + discovered[i].network.mac_address[1], + discovered[i].network.mac_address[2], + discovered[i].network.mac_address[3], + discovered[i].network.mac_address[4], + discovered[i].network.mac_address[5], + discovered[i].network.interface_name); } -void new_discovery() { +void p2_discovery() { struct ifaddrs *addrs,*ifa; getifaddrs(&addrs); ifa = addrs; @@ -75,7 +75,7 @@ void new_discovery() { if(ifa->ifa_addr->sa_family == AF_INET && (ifa->ifa_flags&IFF_UP)==IFF_UP && (ifa->ifa_flags&IFF_RUNNING)==IFF_RUNNING) { - new_discover(ifa); + p2_discover(ifa); } } ifa = ifa->ifa_next; @@ -83,7 +83,7 @@ void new_discovery() { freeifaddrs(addrs); - fprintf(stderr, "new_discovery found %d devices\n",devices); + fprintf(stderr, "p2_discovery found %d devices\n",devices); int i; for(i=0;iifa_name); - fprintf(stderr,"new_discover: looking for HPSDR devices on %s\n",interface_name); + fprintf(stderr,"p2_discover: looking for HPSDR devices on %s\n",interface_name); // send a broadcast to locate metis boards on the network discovery_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); if(discovery_socket<0) { - perror("new_discover: create socket failed for discovery_socket\n"); + perror("p2_discover: create socket failed for discovery_socket\n"); exit(-1); } @@ -122,20 +122,20 @@ void new_discover(struct ifaddrs* iface) { interface_addr.sin_addr.s_addr = sa->sin_addr.s_addr; interface_addr.sin_port = htons(0); if(bind(discovery_socket,(struct sockaddr*)&interface_addr,sizeof(interface_addr))<0) { - perror("new_discover: bind socket failed for discovery_socket\n"); + perror("p2_discover: bind socket failed for discovery_socket\n"); exit(-1); } strcpy(addr,inet_ntoa(sa->sin_addr)); strcpy(net_mask,inet_ntoa(mask->sin_addr)); - fprintf(stderr,"new_discover: bound to %s %s %s\n",interface_name,addr,net_mask); + fprintf(stderr,"p2_discover: bound to %s %s %s\n",interface_name,addr,net_mask); // allow broadcast on the socket int on=1; rc=setsockopt(discovery_socket, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)); if(rc != 0) { - fprintf(stderr,"new_discover: cannot set SO_BROADCAST: rc=%d\n", rc); + fprintf(stderr,"p2_discover: cannot set SO_BROADCAST: rc=%d\n", rc); exit(-1); } @@ -146,10 +146,10 @@ void new_discover(struct ifaddrs* iface) { to_addr.sin_addr.s_addr=htonl(INADDR_BROADCAST); // start a receive thread to collect discovery response packets - discover_thread_id = g_thread_new( "new discover receive", new_discover_receive_thread, NULL); + discover_thread_id = g_thread_new( "new discover receive", p2_discover_receive_thread, NULL); if( ! discover_thread_id ) { - fprintf(stderr,"g_thread_new failed on new_discover_receive_thread\n"); + fprintf(stderr,"g_thread_new failed on p2_discover_receive_thread\n"); exit( -1 ); } fprintf(stderr,"new_disovery: thread_id=%p\n",discover_thread_id); @@ -168,7 +168,7 @@ void new_discover(struct ifaddrs* iface) { } if(sendto(discovery_socket,buffer,60,0,(struct sockaddr*)&to_addr,sizeof(to_addr))<0) { - perror("new_discover: sendto socket failed for discovery_socket\n"); + perror("p2_discover: sendto socket failed for discovery_socket\n"); return; } @@ -177,11 +177,11 @@ void new_discover(struct ifaddrs* iface) { close(discovery_socket); - fprintf(stderr,"new_discover: exiting discover for %s\n",iface->ifa_name); + fprintf(stderr,"p2_discover: exiting discover for %s\n",iface->ifa_name); } -//void* new_discover_receive_thread(void* arg) { -gpointer new_discover_receive_thread(gpointer data) { +//void* p2_discover_receive_thread(void* arg) { +gpointer p2_discover_receive_thread(gpointer data) { struct sockaddr_in addr; socklen_t len; unsigned char buffer[2048]; @@ -199,11 +199,11 @@ gpointer new_discover_receive_thread(gpointer data) { while(1) { bytes_read=recvfrom(discovery_socket,buffer,sizeof(buffer),0,(struct sockaddr*)&addr,&len); if(bytes_read<0) { - fprintf(stderr,"new_discover: bytes read %d\n", bytes_read); - perror("new_discover: recvfrom socket failed for discover_receive_thread"); + fprintf(stderr,"p2_discover: bytes read %d\n", bytes_read); + perror("p2_discover: recvfrom socket failed for discover_receive_thread"); break; } - fprintf(stderr,"new_discover: received %d bytes\n",bytes_read); + fprintf(stderr,"p2_discover: received %d bytes\n",bytes_read); if(bytes_read==1444) { if(devices>0) { break; @@ -265,29 +265,29 @@ gpointer new_discover_receive_thread(gpointer data) { break; } for(i=0;i<6;i++) { - discovered[devices].info.network.mac_address[i]=buffer[i+5]; + discovered[devices].network.mac_address[i]=buffer[i+5]; } - memcpy((void*)&discovered[devices].info.network.address,(void*)&addr,sizeof(addr)); - discovered[devices].info.network.address_length=sizeof(addr); - memcpy((void*)&discovered[devices].info.network.interface_address,(void*)&interface_addr,sizeof(interface_addr)); - memcpy((void*)&discovered[devices].info.network.interface_netmask,(void*)&interface_netmask,sizeof(interface_netmask)); - discovered[devices].info.network.interface_length=sizeof(interface_addr); - strcpy(discovered[devices].info.network.interface_name,interface_name); + memcpy((void*)&discovered[devices].network.address,(void*)&addr,sizeof(addr)); + discovered[devices].network.address_length=sizeof(addr); + memcpy((void*)&discovered[devices].network.interface_address,(void*)&interface_addr,sizeof(interface_addr)); + memcpy((void*)&discovered[devices].network.interface_netmask,(void*)&interface_netmask,sizeof(interface_netmask)); + discovered[devices].network.interface_length=sizeof(interface_addr); + strcpy(discovered[devices].network.interface_name,interface_name); discovered[devices].supported_receivers=2; - fprintf(stderr,"new_discover: found %d protocol=%d device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s\n", + fprintf(stderr,"p2_discover: found %d protocol=%d device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s\n", devices, discovered[devices].protocol, discovered[devices].device, discovered[devices].software_version, discovered[devices].status, - inet_ntoa(discovered[devices].info.network.address.sin_addr), - discovered[devices].info.network.mac_address[0], - discovered[devices].info.network.mac_address[1], - discovered[devices].info.network.mac_address[2], - discovered[devices].info.network.mac_address[3], - discovered[devices].info.network.mac_address[4], - discovered[devices].info.network.mac_address[5], - discovered[devices].info.network.interface_name); + inet_ntoa(discovered[devices].network.address.sin_addr), + discovered[devices].network.mac_address[0], + discovered[devices].network.mac_address[1], + discovered[devices].network.mac_address[2], + discovered[devices].network.mac_address[3], + discovered[devices].network.mac_address[4], + discovered[devices].network.mac_address[5], + discovered[devices].network.interface_name); discovered[devices].frequency_min=frequency_min; discovered[devices].frequency_max=frequency_max; devices++; @@ -296,7 +296,7 @@ gpointer new_discover_receive_thread(gpointer data) { } } } - fprintf(stderr,"new_discover: exiting new_discover_receive_thread\n"); + fprintf(stderr,"p2_discover: exiting p2_discover_receive_thread\n"); g_thread_exit(NULL); return NULL; } diff --git a/p2_discovery.h b/p2_discovery.h index 9851f22..af45689 100644 --- a/p2_discovery.h +++ b/p2_discovery.h @@ -20,6 +20,6 @@ #ifndef _NEW_DISCOVERY_H #define _NEW_DISCOVERY_H -void new_discovery(void); +void p2_discovery(void); #endif diff --git a/radio.c b/radio.c index 29c61a5..9bbb98a 100644 --- a/radio.c +++ b/radio.c @@ -900,28 +900,28 @@ void start_radio() { sprintf(version, "v%d.%d)", radio->software_version / 10, radio->software_version % 10); sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", - radio->info.network.mac_address[0], - radio->info.network.mac_address[1], - radio->info.network.mac_address[2], - radio->info.network.mac_address[3], - radio->info.network.mac_address[4], - radio->info.network.mac_address[5]); - sprintf(ip, "%s", inet_ntoa(radio->info.network.address.sin_addr)); - sprintf(iface, "%s", radio->info.network.interface_name); + radio->network.mac_address[0], + radio->network.mac_address[1], + radio->network.mac_address[2], + radio->network.mac_address[3], + radio->network.mac_address[4], + radio->network.mac_address[5]); + sprintf(ip, "%s", inet_ntoa(radio->network.address.sin_addr)); + sprintf(iface, "%s", radio->network.interface_name); break; case NEW_PROTOCOL: strcpy(p, "Protocol 2"); sprintf(version, "v%d.%d)", radio->software_version / 10, radio->software_version % 10); sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X", - radio->info.network.mac_address[0], - radio->info.network.mac_address[1], - radio->info.network.mac_address[2], - radio->info.network.mac_address[3], - radio->info.network.mac_address[4], - radio->info.network.mac_address[5]); - sprintf(ip, "%s", inet_ntoa(radio->info.network.address.sin_addr)); - sprintf(iface, "%s", radio->info.network.interface_name); + radio->network.mac_address[0], + radio->network.mac_address[1], + radio->network.mac_address[2], + radio->network.mac_address[3], + radio->network.mac_address[4], + radio->network.mac_address[5]); + sprintf(ip, "%s", inet_ntoa(radio->network.address.sin_addr)); + sprintf(iface, "%s", radio->network.interface_name); break; } @@ -961,12 +961,12 @@ void start_radio() { #endif default: sprintf(property_path, "%02X-%02X-%02X-%02X-%02X-%02X.props", - radio->info.network.mac_address[0], - radio->info.network.mac_address[1], - radio->info.network.mac_address[2], - radio->info.network.mac_address[3], - radio->info.network.mac_address[4], - radio->info.network.mac_address[5]); + radio->network.mac_address[0], + radio->network.mac_address[1], + radio->network.mac_address[2], + radio->network.mac_address[3], + radio->network.mac_address[4], + radio->network.mac_address[5]); break; } break; -- 2.45.2