diff --git a/src/frontends/android/jni/libandroidbridge/backend/android_service.c b/src/frontends/android/jni/libandroidbridge/backend/android_service.c index db9bebcc5..d73dc4582 100644 --- a/src/frontends/android/jni/libandroidbridge/backend/android_service.c +++ b/src/frontends/android/jni/libandroidbridge/backend/android_service.c @@ -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; diff --git a/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java b/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java index 31172ab44..d53d478b2 100644 --- a/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java +++ b/src/frontends/android/src/org/strongswan/android/logic/CharonVpnService.java @@ -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); diff --git a/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java b/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java index f0a03a513..160ba951b 100644 --- a/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java +++ b/src/frontends/android/src/org/strongswan/android/ui/VpnStateFragment.java @@ -313,6 +313,10 @@ public class VpnStateFragment extends Fragment implements VpnStateListener private void clearError() { + if (mService != null) + { + mService.disconnect(); + } mDismissedConnectionID = mErrorConnectionID; updateView(); }