Merge branch 'android-state-updates'
authorTobias Brunner <tobias@strongswan.org>
Tue, 22 Jul 2014 08:57:57 +0000 (10:57 +0200)
committerTobias Brunner <tobias@strongswan.org>
Tue, 22 Jul 2014 09:06:31 +0000 (11:06 +0200)
The GUI reflects the state of the IKE daemon more closely by switching
back to the "connecting" state when the IKE_SA or CHILD_SA is down and
is getting reestablished.

Fixes #616.

src/frontends/android/jni/libandroidbridge/backend/android_service.c
src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java
src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java

index db9bebc..d73dc45 100644 (file)
@@ -381,14 +381,8 @@ METHOD(listener_t, child_updown, bool,
                }
                else
                {
-                       if (ike_sa->has_condition(ike_sa, COND_REAUTHENTICATING))
-                       {       /* we ignore this during reauthentication */
-                               return TRUE;
-                       }
-                       close_tun_device(this);
                        charonservice->update_status(charonservice,
                                                                                 CHARONSERVICE_CHILD_STATE_DOWN);
-                       return FALSE;
                }
        }
        return TRUE;
@@ -398,7 +392,8 @@ METHOD(listener_t, ike_updown, bool,
        private_android_service_t *this, ike_sa_t *ike_sa, bool up)
 {
        /* this callback is only registered during initiation, so if the IKE_SA
-        * goes down we assume an authentication error */
+        * goes down we assume some kind of authentication error, more specific
+        * errors are catched in the alert() handler */
        if (this->ike_sa == ike_sa && !up)
        {
                charonservice->update_status(charonservice,
@@ -458,6 +453,11 @@ METHOD(listener_t, ike_reestablish, bool,
                this->ike_sa = new;
                /* re-register hook to detect initiation failures */
                this->public.listener.ike_updown = _ike_updown;
+               /* if the IKE_SA got deleted by the responder we get the child_down()
+                * event on the old IKE_SA after this hook has been called, so they
+                * get ignored and thus we trigger the event here */
+               charonservice->update_status(charonservice,
+                                                                        CHARONSERVICE_CHILD_STATE_DOWN);
                /* the TUN device will be closed when the new CHILD_SA is established */
        }
        return TRUE;
index 31172ab..d53d478 100644 (file)
@@ -322,9 +322,8 @@ public class CharonVpnService extends VpnService implements Runnable
        }
 
        /**
-        * Set an error on the state service and disconnect the current connection.
-        * This is not done by calling stopCurrentConnection() above, but instead
-        * is done asynchronously via state service.
+        * Set an error on the state service. Called by the handler thread and any
+        * of charon's threads.
         *
         * @param error error state
         */
@@ -337,7 +336,6 @@ public class CharonVpnService extends VpnService implements Runnable
                                if (!mIsDisconnecting)
                                {
                                        mService.setError(error);
-                                       mService.disconnect();
                                }
                        }
                }
@@ -354,7 +352,10 @@ public class CharonVpnService extends VpnService implements Runnable
                switch (status)
                {
                        case STATE_CHILD_SA_DOWN:
-                               /* we ignore this as we use closeaction=restart */
+                               if (!mIsDisconnecting)
+                               {
+                                       setState(State.CONNECTING);
+                               }
                                break;
                        case STATE_CHILD_SA_UP:
                                setState(State.CONNECTED);
index f0a03a5..160ba95 100644 (file)
@@ -313,6 +313,10 @@ public class VpnStateFragment extends Fragment implements VpnStateListener
 
        private void clearError()
        {
+               if (mService != null)
+               {
+                       mService.disconnect();
+               }
                mDismissedConnectionID = mErrorConnectionID;
                updateView();
        }