]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
go to admin-down on routing errors
authorAlan T. DeKok <aland@freeradius.org>
Tue, 14 Mar 2023 21:28:28 +0000 (17:28 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 14 Mar 2023 21:28:28 +0000 (17:28 -0400)
src/listen/bfd/proto_bfd_udp.c
src/listen/bfd/session.c
src/listen/bfd/session.h

index 28936784ac648d519cd8f685956b124495512edf..9c0ca0836f714e4351756e2a1136eab706ab415e 100644 (file)
@@ -221,7 +221,8 @@ static ssize_t mod_write(fr_listen_t *li, void *packet_ctx, UNUSED fr_time_t req
                           (struct sockaddr *) &session->remote_sockaddr, session->remote_salen);
        if (rcode < 0) {
                ERROR("Failed sending packet: %s", fr_syserror(errno));
-               fr_assert(0);
+               bfd_session_admin_down(session);
+               return 0;
        }
 
        return rcode;
index a9860f9b349b290d8f84f8aead25e984ecd5d4a7..5fd047d9a14a5b2233abf3dde4751d9f05dddcd9 100644 (file)
@@ -47,7 +47,6 @@ static void bfd_start_control(bfd_session_t *session);
 static int bfd_stop_control(bfd_session_t *session);
 static void bfd_set_timeout(bfd_session_t *session, fr_time_t when);
 
-
 /*
  *     Wrapper to run a trigger.
  *
@@ -73,6 +72,15 @@ static void bfd_trigger(UNUSED bfd_session_t *session, UNUSED bfd_state_change_t
 #endif
 }
 
+void bfd_session_admin_down(bfd_session_t *session)
+{
+       bfd_stop_control(session);
+
+       session->session_state = BFD_STATE_ADMIN_DOWN;
+       bfd_trigger(session,  BFD_STATE_CHANGE_ADMIN_DOWN);
+}
+
+
 /*
  *     Stop polling for packets.
  */
@@ -132,7 +140,7 @@ static void bfd_poll_response(bfd_session_t *session)
                       (struct sockaddr *) &session->local_sockaddr, session->local_salen,
                       (struct sockaddr *) &session->remote_sockaddr, session->remote_salen) < 0) {
                ERROR("Failed sending packet: %s", fr_syserror(errno));
-               fr_assert(0);
+               bfd_session_admin_down(session);
        }
 }
 
@@ -755,7 +763,7 @@ static void bfd_send_packet(UNUSED fr_event_list_t *el, UNUSED fr_time_t now, vo
                       (struct sockaddr *) &session->local_sockaddr, session->local_salen,
                       (struct sockaddr *) &session->remote_sockaddr, session->remote_salen) < 0) {
                ERROR("Failed sending packet: %s", fr_syserror(errno));
-               fr_assert(0);
+               bfd_session_admin_down(session);
        }
 }
 
@@ -1031,7 +1039,7 @@ static void bfd_start_control(bfd_session_t *session)
        if ((session->remote_disc == 0) && session->passive) return;
 
        /*
-        *      We were asked to go "up" when we were alread "up" 
+        *      We were asked to go "up" when we were already "up"
         */
        if (session->remote_demand_mode &&
            (session->session_state == BFD_STATE_UP) &&
@@ -1039,8 +1047,7 @@ static void bfd_start_control(bfd_session_t *session)
            !session->doing_poll) {
                DEBUG("BFD %s peer %s warning: asked to start UP / UP ?",
                      session->server_name, session->client.shortname);
-               fr_assert(0 == 1);
-               bfd_stop_control(session);
+               bfd_session_admin_down(session);
                return;
        }
 
index b223d6bea23bf2a5402f03efb33261e82b71a8e1..80ddbffa1f8d582d3f9f4c3549a916560284cf89 100644 (file)
@@ -149,4 +149,6 @@ int bfd_session_init(bfd_session_t *session);
 
 void   bfd_session_start(bfd_session_t *session);
 
+void   bfd_session_admin_down(bfd_session_t *session);
+
 bfd_state_change_t bfd_session_process(bfd_session_t *session, bfd_packet_t *bfd);