https://bugs.kde.org/show_bug.cgi?id=470085

--- Comment #4 from Axel <thas5egh2chae...@pm.me> ---
The identity packet is broadcast on the wrong network interface because
onNetworkChange is called before the wifi interface becomes the default.

I logged the current default network in sendUdpIdentityPacket:

diff --git a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
index e7983928..651b9025 100644
--- a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
+++ b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
@@ -368,6 +375,11 @@ public class LanLinkProvider extends BaseLinkProvider {
             return;
         }

+        ConnectivityManager connectivityManager =
this.context.getSystemService(ConnectivityManager.class);
+        Network network = connectivityManager.getActiveNetwork();
+        LinkProperties linkProperties =
connectivityManager.getLinkProperties(network);
+        Log.i("LanLinkProvider", "default network interface: " +
linkProperties.getInterfaceName());
+
         NetworkPacket identity = NetworkPacket.createIdentityPacket(context);
         identity.set("tcpPort", tcpServer.getLocalPort());

and got the cellular interface instead of wifi:

2023-08-15 16:25:14.906 21199-21239 KDE/BackgroundService  
org.kde.kdeconnect_tp                D  onNetworkChange
2023-08-15 16:25:14.933 21199-21294 LanLinkProvider        
org.kde.kdeconnect_tp                I  default network interface: rmnet0

to validate this I put a 500ms sleep before the call to sendUdpIdentityPacket
in broadcastUdpIdentityPacket and got the correct interface and the phone
connected to the computer:

2023-08-15 16:27:23.245 21637-21683 KDE/BackgroundService  
org.kde.kdeconnect_tp                D  onNetworkChange
2023-08-15 16:27:23.751 21637-21687 LanLinkProvider        
org.kde.kdeconnect_tp                I  default network interface: wlan0
2023-08-15 16:27:23.786 21637-21687 KDE/LanLinkProvider    
org.kde.kdeconnect_tp                I  identity packet received from a TCP
connection from [...]

I removed the sleep and hacked onNetworkChange to pass the new network from the
callback on to sendUdpIdentityPacket and bind the socket to the right
interface:

diff --git a/src/org/kde/kdeconnect/BackgroundService.java
b/src/org/kde/kdeconnect/BackgroundService.java
index 10c73ab2..b37aa6c8 100644
--- a/src/org/kde/kdeconnect/BackgroundService.java
+++ b/src/org/kde/kdeconnect/BackgroundService.java
@@ -136,7 +136,7 @@ public class BackgroundService extends Service {
             @Override
             public void onAvailable(Network network) {
                 connectedToNonCellularNetwork.postValue(true);
-                onNetworkChange();
+                onNetworkChange(network);
             }
             @Override
             public void onLost(Network network) {
diff --git a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
index e7983928..dc6c391e 100644
--- a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
+++ b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java
         });
     }

     @WorkerThread
-    public void sendUdpIdentityPacket(List<InetAddress> ipList) {
+    public void sendUdpIdentityPacket(Network network, List<InetAddress>
ipList) {
         if (tcpServer == null || !tcpServer.isBound()) {
             Log.i("LanLinkProvider", "Won't broadcast UDP packet if TCP socket
is not ready yet");
             return;
         }

@@ -382,11 +397,17 @@ public class LanLinkProvider extends BaseLinkProvider {
         DatagramSocket socket;
         try {
             socket = new DatagramSocket();
+            if (network != null) {
+                network.bindSocket(socket);
+            }
             socket.setReuseAddress(true);
             socket.setBroadcast(true);
         } catch (SocketException e) {
             Log.e("KDE/LanLinkProvider", "Failed to create DatagramSocket",
e);
             return;
         }

Works fine but should probably be done a bit more careful for real:

2023-08-15 16:49:26.104 22943-22985 KDE/BackgroundService  
org.kde.kdeconnect_tp                D  onNetworkChange
2023-08-15 16:49:26.111 22943-22992 LanLinkProvider        
org.kde.kdeconnect_tp                I  default network interface: rmnet0
2023-08-15 16:49:26.115 22943-22992 LanLinkProvider        
org.kde.kdeconnect_tp                I  callback network interface: wlan0
2023-08-15 16:49:26.146 22943-22992 KDE/LanLinkProvider    
org.kde.kdeconnect_tp                I  identity packet received from a TCP
connection from [...]

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to