<pre style='margin:0'>
ra1nb0w (ra1nb0w) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/eeb3c6dc7db5949457af81ed8075f8de753a9bf4">https://github.com/macports/macports-ports/commit/eeb3c6dc7db5949457af81ed8075f8de753a9bf4</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new eeb3c6dc7db pihpsdr: update commit to 9112c90781
</span>eeb3c6dc7db is described below

<span style='display:block; white-space:pre;color:#808000;'>commit eeb3c6dc7db5949457af81ed8075f8de753a9bf4
</span>Author: Davide Gerhard <ra1nb0w@macports.org>
AuthorDate: Wed Jan 5 14:03:44 2022 +0100

<span style='display:block; white-space:pre;color:#404040;'>    pihpsdr: update commit to 9112c90781
</span>---
 science/pihpsdr/Portfile                           |  13 +-
 ...an-OpenHPSDR-radio-using-the-IPv4-address.patch | 551 +++++++++++++++++++++
 2 files changed, 558 insertions(+), 6 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/science/pihpsdr/Portfile b/science/pihpsdr/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 60c87d5fa84..f90dd5667f2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/science/pihpsdr/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/science/pihpsdr/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -16,15 +16,16 @@ maintainers         {ra1nb0w @ra1nb0w} openmaintainer
</span> description         piHPSDR is an HPSDR application designed for low power boards, like Raspberry.
 long_description    ${description}
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup        dl1ycf pihpsdr 6dc3787447d3fa1db0385fadb072b48e47aaa377
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-version             20211226-[string range ${github.version} 0 7]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  b74ce4384794a9dad6cb8952fab56055d2c8570f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  4cd76e21d458f9cdea50cdb4b4d7ddf273305ce3b3b30432a818124d1ebc4ff3 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    118540104
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup        dl1ycf pihpsdr 9112c907813df664a710b82114f5cae23a106cdd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             20220105-[string range ${github.version} 0 7]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  ed8b88ae6e0e543bcd7d333bb8ef8ffc62ca11cf \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  af23f1f83bb69c726ab8f801a657cc0e21a98d133ad108574f17aa3acfafddbc \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    118542987
</span> revision            0
 
 patchfiles-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    0001-add-remote-audio-output-option-for-each-RX.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    0001-add-remote-audio-output-option-for-each-RX.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    0001-discover-an-OpenHPSDR-radio-using-the-IPv4-address.patch
</span> 
 compiler.c_standard 1999
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/science/pihpsdr/files/0001-discover-an-OpenHPSDR-radio-using-the-IPv4-address.patch b/science/pihpsdr/files/0001-discover-an-OpenHPSDR-radio-using-the-IPv4-address.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..4a5b05ab2e5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/science/pihpsdr/files/0001-discover-an-OpenHPSDR-radio-using-the-IPv4-address.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,551 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From a1f1eae33b5948784c38946f0604107dcc348c8b Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Davide Gerhard <rainbow@irh.it>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Mon, 27 Dec 2021 12:57:18 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] discover an OpenHPSDR radio using the IPv4 address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Use a pre-declared IPv4 address to find the radio and connect to it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+without broadcast discovery. The user can input the IPv4 in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+discovery window. If the user declared IPv4 address is empty the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+discovery is disabled. Moreover, if the IP is already discovered by the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+broadcast procedure the static IP is not used.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This is very useful when you use a VPN or you computer is connected to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+another network (therefore is leveraging the routing mechanism).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+On both cases, you need to pay attention to the firewall rules.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+To maintain the interface easy to use, the TCP (aka red pitaya)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+and UDP static IP input boxes are merged in a single input.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ discovered.h        |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ discovery.c         |  92 ++++++++++++++++-----------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ discovery.h         |   4 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ new_discovery.c     | 123 +++++++++++++++++++++++++++++++-------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ old_discovery.c     |  57 ++++++++++++++++----
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ stemlab_discovery.c |  12 ++---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 6 files changed, 187 insertions(+), 102 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git discovered.h discovered.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 91e7b0b..26ec95a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- discovered.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ discovered.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -92,6 +92,7 @@ struct _DISCOVERED {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int protocol;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int device;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int use_tcp;    // use TCP rather than UDP to connect to radio
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint8_t use_routing;  // use routing to connect to radio (no local IP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     char name[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int software_version;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git discovery.c discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e2edd70..6d43813 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -61,10 +61,10 @@ static DISCOVERED *d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static GtkWidget *apps_combobox[MAX_DEVICES];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-GtkWidget *tcpaddr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define IPADDR_LEN 20
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static char ipaddr_tcp_buf[IPADDR_LEN] = "10.10.10.10";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-char *ipaddr_tcp = &ipaddr_tcp_buf[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++GtkWidget *radioaddr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static char ipaddr_radio_buf[IPADDR_LEN] = "";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++char *ipaddr_radio = &ipaddr_radio_buf[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef CLIENT_SERVER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ GtkWidget *host_addr_entry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -148,26 +148,33 @@ static gboolean exit_cb (GtkWidget *widget, GdkEventButton *event, gpointer data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static gboolean tcp_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    strncpy(ipaddr_tcp, gtk_entry_get_text(GTK_ENTRY(tcpaddr)), IPADDR_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ipaddr_tcp[IPADDR_LEN-1]=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // remove possible trailing newline chars in ipaddr_tcp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      int len=strnlen(ipaddr_tcp,IPADDR_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      while (--len >= 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (ipaddr_tcp[len] != '\n') break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        ipaddr_tcp[len]=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      //fprintf(stderr,"New TCP addr = %s.\n", ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      // save this value to config file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      FILE *fp = fopen("ip.addr", "w");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (fp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          fprintf(fp,"%s\n",ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          fclose(fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      gtk_widget_destroy(discovery_dialog);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      g_idle_add(ext_discovery,NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static gboolean is_valid_IPv4_address(char *ipAddress)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct sockaddr_in sa;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int result = inet_pton(AF_INET, ipAddress, &(sa.sin_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return result != 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static gboolean radio_addr_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  strncpy(ipaddr_radio, gtk_entry_get_text(GTK_ENTRY(radioaddr)), IPADDR_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // at the moment we check only IPv4 notation and avoid IPv6 and hostname strings
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (strlen(ipaddr_radio) && !is_valid_IPv4_address(ipaddr_radio)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gtk_entry_set_text(GTK_ENTRY(radioaddr), "wrong IPv4");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    fprintf(stderr,"discover: Radio address %s is invalid!\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  char value[80];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  clearProperties();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  snprintf(value, IPADDR_LEN, "%s", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  setProperty("ipaddr_radio",value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  saveProperties("protocols.props");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  gtk_widget_destroy(discovery_dialog);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  g_idle_add(ext_discovery,NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef CLIENT_SERVER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static gboolean connect_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -199,25 +206,17 @@ g_print("connect_cb: %s:%d\n",host_addr,host_port);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //fprintf(stderr,"discovery\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  char *value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   protocols_restore_state();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   selected_device=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   devices=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // Try to locate IP addr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  FILE *fp=fopen("ip.addr","r");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (fp) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    char *c=fgets(ipaddr_tcp, IPADDR_LEN,fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fclose(fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ipaddr_tcp[IPADDR_LEN-1]=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // remove possible trailing newline char in ipaddr_tcp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int len=strnlen(ipaddr_tcp,IPADDR_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    while (--len >= 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (ipaddr_tcp[len] != '\n') break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      ipaddr_tcp[len]=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  loadProperties("protocols.props");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  value=getProperty("ipaddr_radio");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if(value!=NULL) strncpy(ipaddr_radio,value, IPADDR_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef USBOZY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // first: look on USB for an Ozy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -390,7 +389,8 @@ fprintf(stderr,"%p Protocol=%d name=%s\n",d,d->protocol,d->name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // leads to a radio address outside the netmask and can be ignored. So if either the radio
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // or the interface address starts with 169.254., suppress "Subnet!" complaint.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          if (strncmp(inet_ntoa(d->info.network.address.sin_addr),"169.254.",8) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          // NOTE: probably at this point we can disable this or check if we are connecting remotelly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if (!d->use_routing && strncmp(inet_ntoa(d->info.network.address.sin_addr),"169.254.",8) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               strncmp(inet_ntoa(d->info.network.interface_address.sin_addr),"169.254.",8)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             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)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               gtk_button_set_label(GTK_BUTTON(start_button),"Subnet!");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -450,7 +450,6 @@ fprintf(stderr,"%p Protocol=%d name=%s\n",d,d->protocol,d->name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef CLIENT_SERVER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     loadProperties("remote.props");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    char *value;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     value=getProperty("host");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if(value!=NULL) strcpy(host_addr_buffer,value);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     value=getProperty("port");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -511,14 +510,15 @@ fprintf(stderr,"%p Protocol=%d name=%s\n",d,d->protocol,d->name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gtk_grid_attach(GTK_GRID(grid),gpio_b,0,row,1,1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    GtkWidget *tcp_b=gtk_button_new_with_label("Use new TCP Addr:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    g_signal_connect (tcp_b, "button-press-event", G_CALLBACK(tcp_cb), NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    gtk_grid_attach(GTK_GRID(grid),tcp_b,1,row,1,1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    GtkWidget *radio_addr_b=gtk_button_new_with_label("Use Radio addr:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    g_signal_connect (radio_addr_b, "button-press-event", G_CALLBACK(radio_addr_cb), NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gtk_grid_attach(GTK_GRID(grid),radio_addr_b,1,row,1,1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    tcpaddr=gtk_entry_new();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    gtk_entry_set_max_length(GTK_ENTRY(tcpaddr), 20);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    gtk_grid_attach(GTK_GRID(grid),tcpaddr,2,row,1,1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    gtk_entry_set_text(GTK_ENTRY(tcpaddr), ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    radioaddr=gtk_entry_new();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gtk_entry_set_max_length(GTK_ENTRY(radioaddr), 20);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gtk_grid_attach(GTK_GRID(grid),radioaddr,2,row,1,1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gtk_entry_set_max_length(GTK_ENTRY(radioaddr), IPADDR_LEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    gtk_entry_set_text(GTK_ENTRY(radioaddr), ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     GtkWidget *exit_b=gtk_button_new_with_label("Exit");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     g_signal_connect (exit_b, "button-press-event", G_CALLBACK(exit_cb), NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -526,7 +526,7 @@ fprintf(stderr,"%p Protocol=%d name=%s\n",d,d->protocol,d->name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gtk_container_add (GTK_CONTAINER (content), grid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     gtk_widget_show_all(discovery_dialog);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-fprintf(stderr,"showing device dialog\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    fprintf(stderr,"showing device dialog\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // autostart if one device and autostart enabled
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     g_print("%s: devices=%d autostart=%d\n",__FUNCTION__,devices,autostart);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git discovery.h discovery.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fb540e1..20ab464 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- discovery.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ discovery.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,5 +17,5 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-extern void discovery(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-extern char *ipaddr_tcp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern void discovery();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern char *ipaddr_radio;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git new_discovery.c new_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6039d34..c530558 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- new_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ new_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -34,7 +34,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <errno.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "discovered.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-//#include "discovery.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "discovery.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static char interface_name[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -69,6 +69,8 @@ void print_device(int i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void new_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     struct ifaddrs *addrs,*ifa;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     getifaddrs(&addrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ifa = addrs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     while (ifa) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -84,10 +86,20 @@ void new_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     freeifaddrs(addrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Do one additional "discover" for fixed address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (strlen(ipaddr_radio)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // check if the IP address is already discovered
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      for (i = 0; i < devices; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (strcmp(inet_ntoa(discovered[i].info.network.address.sin_addr),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   ipaddr_radio) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (i == devices)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        new_discover((void *)-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     fprintf(stderr, "new_discovery found %d devices\n",devices);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for(i=0;i<devices;i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         print_device(i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -99,53 +111,79 @@ void new_discover(struct ifaddrs* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     struct sockaddr_in *mask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     char addr[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     char net_mask[16];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct sockaddr_in to_addr = {0};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (iface == (void *)-1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr, "discover: looking for HPSDR device with IP %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    strcpy(interface_name,iface->ifa_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fprintf(stderr,"new_discover: looking for HPSDR devices on %s\n",interface_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // send a broadcast to locate hpsdr boards on the network
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      discovery_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (discovery_socket < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        perror("discover: create socket failed for discovery_socket:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        exit(-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // send a broadcast to locate metis boards on the network
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    discovery_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if(discovery_socket<0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // setup to address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      to_addr.sin_family = AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      to_addr.sin_port = htons(DISCOVERY_PORT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (inet_aton(ipaddr_radio, &to_addr.sin_addr) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf(stderr, "discover: Radio UDP addr %s is invalid!\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      strcpy(interface_name, iface->ifa_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr, "new_discover: looking for HPSDR devices on %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              interface_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // send a broadcast to locate metis boards on the network
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      discovery_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (discovery_socket < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("new_discover: create socket failed for discovery_socket\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         exit(-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int optval = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      int optval = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEADDR, &optval,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                 sizeof(optval));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      setsockopt(discovery_socket, SOL_SOCKET, SO_REUSEPORT, &optval,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                 sizeof(optval));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    sa = (struct sockaddr_in *) iface->ifa_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    mask = (struct sockaddr_in *) iface->ifa_netmask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      sa = (struct sockaddr_in *)iface->ifa_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      mask = (struct sockaddr_in *)iface->ifa_netmask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    interface_netmask.sin_addr.s_addr = mask->sin_addr.s_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      interface_netmask.sin_addr.s_addr = mask->sin_addr.s_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // bind to this interface and the discovery port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    interface_addr.sin_family = AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    interface_addr.sin_addr.s_addr = sa->sin_addr.s_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    interface_addr.sin_port = htons(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if(bind(discovery_socket,(struct sockaddr*)&interface_addr,sizeof(interface_addr))<0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // bind to this interface and the discovery port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      interface_addr.sin_family = AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      interface_addr.sin_addr.s_addr = sa->sin_addr.s_addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      interface_addr.sin_port = htons(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (bind(discovery_socket, (struct sockaddr *)&interface_addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               sizeof(interface_addr)) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         perror("new_discover: bind socket failed for discovery_socket\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         exit(-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    strcpy(addr,inet_ntoa(sa->sin_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    strcpy(net_mask,inet_ntoa(mask->sin_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      strcpy(addr, inet_ntoa(sa->sin_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      strcpy(net_mask, inet_ntoa(mask->sin_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fprintf(stderr,"new_discover: bound to %s %s %s\n",interface_name,addr,net_mask);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr, "new_discover: bound to %s %s %s\n", interface_name, addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              net_mask);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // allow broadcast on the socket
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int on=1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    rc=setsockopt(discovery_socket, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if(rc != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        fprintf(stderr,"new_discover: cannot set SO_BROADCAST: rc=%d\n", rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // allow broadcast on the socket
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      int on = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      rc = setsockopt(discovery_socket, SOL_SOCKET, SO_BROADCAST, &on,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      sizeof(on));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (rc != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf(stderr, "new_discover: cannot set SO_BROADCAST: rc=%d\n", rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         exit(-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // setup to address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    struct sockaddr_in to_addr={0};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    to_addr.sin_family=AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    to_addr.sin_port=htons(DISCOVERY_PORT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    to_addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // setup to address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      to_addr.sin_family = AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      to_addr.sin_port = htons(DISCOVERY_PORT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      to_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // start a receive thread to collect discovery response packets
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     discover_thread_id = g_thread_new( "new discover receive", new_discover_receive_thread, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -179,7 +217,17 @@ void new_discover(struct ifaddrs* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(discovery_socket);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fprintf(stderr,"new_discover: exiting discover for %s\n",iface->ifa_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (iface == (void *)-1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr, "discover: exiting Radio UDP discover for %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      memcpy((void *)&discovered[rc].info.network.address, (void *)&to_addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             sizeof(to_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      discovered[rc].info.network.address_length = sizeof(to_addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      discovered[rc].use_routing = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr, "new_discover: exiting discover for %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              iface->ifa_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //void* new_discover_receive_thread(void* arg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -276,6 +324,7 @@ gpointer new_discover_receive_thread(gpointer data) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     discovered[devices].info.network.interface_length=sizeof(interface_addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     strcpy(discovered[devices].info.network.interface_name,interface_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     discovered[devices].supported_receivers=2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    discovered[devices].use_routing=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     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", 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             devices,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             discovered[devices].protocol,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git old_discovery.c old_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9b48c6c..438ef40 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- old_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ old_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -63,7 +63,24 @@ static void discover(struct ifaddrs* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     unsigned char buffer[1032];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int i, len;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (iface == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (iface == (void *) -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf(stderr,"discover: looking for HPSDR device with IP %s\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // send a broadcast to locate hpsdr boards on the network
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        discovery_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if(discovery_socket<0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            perror("discover: create socket failed for discovery_socket:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            exit(-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // setup to address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        to_addr.sin_family=AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        to_addr.sin_port=htons(DISCOVERY_PORT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (inet_aton(ipaddr_radio, &to_addr.sin_addr) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          fprintf(stderr, "discover: Radio UDP addr %s is invalid!\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else if (iface == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // This indicates that we want to connect to an SDR which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // cannot be reached by (UDP) broadcast packets, but that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -71,11 +88,11 @@ static void discover(struct ifaddrs* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Therefore we try to send a METIS detection packet via TCP 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // to a "fixed" ip address.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        fprintf(stderr,"Trying to detect at TCP addr %s\n", ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf(stderr,"Trying to detect at TCP addr %s\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   memset(&to_addr, 0, sizeof(to_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   to_addr.sin_family = AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (inet_aton(ipaddr_tcp, &to_addr.sin_addr) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      fprintf(stderr,"discover: TCP addr %s is invalid!\n",ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (inet_aton(ipaddr_radio, &to_addr.sin_addr) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr,"discover: TCP addr %s is invalid!\n",ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   to_addr.sin_port=htons(DISCOVERY_PORT);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -216,8 +233,14 @@ static void discover(struct ifaddrs* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(discovery_socket);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (iface == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      fprintf(stderr,"discover: exiting TCP discover for %s\n",ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (iface == (void *)-1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr,"discover: exiting Radio UDP discover for %s\n",ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      memcpy((void *)&discovered[rc].info.network.address, (void *)&to_addr,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             sizeof(to_addr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      discovered[rc].info.network.address_length = sizeof(to_addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      discovered[rc].use_routing = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else if (iface == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      fprintf(stderr,"discover: exiting TCP discover for %s\n",ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (devices == rc+1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // We have exactly found one TCP device
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -235,7 +258,6 @@ static void discover(struct ifaddrs* iface) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       fprintf(stderr,"discover: exiting discover for %s\n",iface->ifa_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //static void *discover_receive_thread(void* arg) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -349,7 +371,8 @@ g_print("old_discovery: name=%s min=%f max=%f\n",discovered[devices].name, disco
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     memcpy((void*)&discovered[devices].info.network.interface_netmask,(void*)&interface_netmask,sizeof(interface_netmask));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     discovered[devices].info.network.interface_length=sizeof(interface_addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     strcpy(discovered[devices].info.network.interface_name,interface_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              discovered[devices].use_tcp=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    discovered[devices].use_tcp=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    discovered[devices].use_routing=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     discovered[devices].supported_receivers=2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               fprintf(stderr,"old_discovery: found device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s min=%f max=%f\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             discovered[devices].device,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -378,6 +401,7 @@ g_print("old_discovery: name=%s min=%f max=%f\n",discovered[devices].name, disco
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void old_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     struct ifaddrs *addrs,*ifa;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fprintf(stderr,"old_discovery\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     getifaddrs(&addrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -395,12 +419,23 @@ fprintf(stderr,"old_discovery\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     freeifaddrs(addrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // Do one additional "discover" for a fixed TCP address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    discover(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Do one additional "discover" for fixed address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (strlen(ipaddr_radio)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // call the TCP version
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        discover(NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        // check if the IP address is already discovered
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        for (i = 0; i < devices; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          if (strcmp(inet_ntoa(discovered[i].info.network.address.sin_addr),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                     ipaddr_radio) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (i == devices)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          discover((void *)-1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     fprintf(stderr, "discovery found %d devices\n",devices);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for(i=0;i<devices;i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     fprintf(stderr,"discovery: found device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             discovered[i].device,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git stemlab_discovery.c stemlab_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index df9c45c..865eb8e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- stemlab_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ stemlab_discovery.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -522,10 +522,10 @@ void stemlab_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   struct sockaddr_in netmask;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fprintf(stderr,"Stripped-down STEMLAB/HAMLAB discovery...\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-   fprintf(stderr,"STEMLAB: using inet addr %s\n", ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   fprintf(stderr,"STEMLAB: using inet addr %s\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ip_address.sin_family = AF_INET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-   if (inet_aton(ipaddr_tcp, &ip_address.sin_addr) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  fprintf(stderr,"StemlabDiscovery: TCP %s is invalid!\n", ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   if (inet_aton(ipaddr_radio, &ip_address.sin_addr) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  fprintf(stderr,"StemlabDiscovery: TCP %s is invalid!\n", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -543,7 +543,7 @@ void stemlab_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   app_list=0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  sprintf(txt,"http://%s",ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  sprintf(txt,"http://%s",ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   curl_easy_setopt(curl_handle, CURLOPT_URL, txt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, (long) 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, get_list_cb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -551,7 +551,7 @@ void stemlab_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   curl_error = curl_easy_perform(curl_handle);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   curl_easy_cleanup(curl_handle);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (curl_error ==  CURLE_OPERATION_TIMEDOUT) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    sprintf(txt,"No response from web server at %s", ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sprintf(txt,"No response from web server at %s", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     status_text(txt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     fprintf(stderr,"%s\n",txt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -569,7 +569,7 @@ void stemlab_discovery() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       fprintf(stderr, "stemlab_start: Failed to create cURL handle\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    sprintf(txt,"http://%s/bazaar?apps=", ipaddr_tcp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sprintf(txt,"http://%s/bazaar?apps=", ipaddr_radio);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     curl_easy_setopt(curl_handle, CURLOPT_URL, txt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, (long) 20);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, app_list_cb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.34.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>