]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Prevent "duplicate UDP discovery" if IP addr given is local
authorc vw <dl1ycf@darc.de>
Fri, 7 Jan 2022 08:55:40 +0000 (09:55 +0100)
committerc vw <dl1ycf@darc.de>
Fri, 7 Jan 2022 08:55:40 +0000 (09:55 +0100)
discovery.c
old_discovery.c

index f5d839b5bb8c17d3cc80ba58134c714107f4a084..85732837388f7623713f298ef814aeb0020e6f18 100644 (file)
@@ -149,7 +149,6 @@ static gboolean radio_ip_cb (GtkWidget *widget, GdkEventButton *event, gpointer
 
     cp = gtk_entry_get_text(GTK_ENTRY(tcpaddr));
     len=strnlen(cp,IPADDR_LEN);
-    fprintf(stderr,">>>>%s<<<<\n", cp);
     if (len == 0) return TRUE;
     if (inet_pton(AF_INET, cp, &(sa.sin_addr)) != 1) return TRUE;
 
index 711a949f8adf2015645e093a8839cc834f936989..6d48f367fed0a9a52a1d6fb6610c5d041e399b15 100644 (file)
@@ -117,6 +117,12 @@ static void discover(struct ifaddrs* iface, int discflag) {
        //
        // Send METIS detection packet via UDP to ipaddr_radio
        //
+       memset(&to_addr, 0, sizeof(to_addr));
+        to_addr.sin_family=AF_INET;
+        to_addr.sin_port=htons(DISCOVERY_PORT);
+        if (inet_aton(ipaddr_radio, &to_addr.sin_addr) == 0) {
+          return;
+        }
        fprintf(stderr,"discover: looking for HPSDR device with IP %s\n", ipaddr_radio);
 
         discovery_socket=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
@@ -124,12 +130,6 @@ static void discover(struct ifaddrs* iface, int discflag) {
             perror("discover: create socket failed for discovery_socket:");
             return;
         }
-        to_addr.sin_family=AF_INET;
-        to_addr.sin_port=htons(DISCOVERY_PORT);
-        if (inet_aton(ipaddr_radio, &to_addr.sin_addr) == 0) {
-          fprintf(stderr, "discover: Radio UDP addr %s is invalid!\n", ipaddr_radio);
-          return;
-        }
        break;
       case 3:
        //
@@ -137,14 +137,13 @@ static void discover(struct ifaddrs* iface, int discflag) {
        // This is rather tricky, one must avoid "hanging" when the
        // connection does not succeed.
        //
-        fprintf(stderr,"Trying to detect via TCP with IP %s\n", ipaddr_radio);
        memset(&to_addr, 0, sizeof(to_addr));
        to_addr.sin_family = AF_INET;
+       to_addr.sin_port=htons(DISCOVERY_PORT);
        if (inet_aton(ipaddr_radio, &to_addr.sin_addr) == 0) {
-           fprintf(stderr,"discover: TCP addr %s is invalid!\n",ipaddr_radio);
            return;
        }
-       to_addr.sin_port=htons(DISCOVERY_PORT);
+        fprintf(stderr,"Trying to detect via TCP with IP %s\n", ipaddr_radio);
 
         discovery_socket=socket(AF_INET, SOCK_STREAM, 0);
         if(discovery_socket<0) {
@@ -425,6 +424,7 @@ g_print("old_discovery: name=%s min=%f max=%f\n",discovered[devices].name, disco
 
 void old_discovery() {
     struct ifaddrs *addrs,*ifa;
+    int i, is_local;
 
 fprintf(stderr,"old_discovery\n");
     //
@@ -450,17 +450,22 @@ fprintf(stderr,"old_discovery\n");
     }
 
     //
-    // If a radio ip addr is given, try sending a UDP packet to that address
-    // and try connecting via TCP
+    // If an IP address has already been "discovered" via a
+    // METIS broadcast package, it makes no sense to re-discover
+    // it via a routed UDP packet.
     //
-    if (strlen(ipaddr_radio) > 1) {
-      discover(NULL, 2);
-      discover(NULL, 3);
+    is_local=0;
+    for (i=0; i<devices; i++) {
+      fprintf(stderr,"DISCOVERED IP: %s\n",inet_ntoa(discovered[i].info.network.address.sin_addr));
+      if (!strncmp(inet_ntoa(discovered[i].info.network.address.sin_addr),ipaddr_radio,20)) {
+       is_local=1;
+      }
     }
+    if (!is_local) discover(NULL, 2);
+    discover(NULL, 3);
 
     fprintf(stderr, "discovery found %d devices\n",devices);
 
-    int i;
     for(i=0;i<devices;i++) {
                     fprintf(stderr,"discovery: found device=%d software_version=%d status=%d address=%s (%02X:%02X:%02X:%02X:%02X:%02X) on %s\n",
                             discovered[i].device,