]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
BFD packets don't get replies
authorAlan T. DeKok <aland@freeradius.org>
Thu, 2 Mar 2023 02:25:49 +0000 (21:25 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 2 Mar 2023 21:27:39 +0000 (16:27 -0500)
they just cause us to change our state machine.

Any packets we originate get written.  Somehow...

src/listen/bfd/proto_bfd.c
src/process/bfd/base.c

index 9dd27b9f2d48c1bbd888150806bc91bd2dad387c..06932e844ec440574db1bba3049a15c6d35af37f 100644 (file)
@@ -259,8 +259,7 @@ static ssize_t mod_encode(UNUSED void const *instance, request_t *request, uint8
 //     proto_bfd_t const       *inst = talloc_get_type_abort_const(instance, proto_bfd_t);
        fr_io_track_t           *track = talloc_get_type_abort(request->async->packet_ctx, fr_io_track_t);
        fr_io_address_t const   *address = track->address;
-       ssize_t                 data_len;
-       fr_client_t const               *client;
+       fr_client_t const       *client;
 
        /*
         *      Process layer NAK, or "Do not respond".
@@ -302,38 +301,10 @@ static ssize_t mod_encode(UNUSED void const *instance, request_t *request, uint8
        }
 
        /*
-        *      Overwrite the src ip address on the outbound packet
-        *      with the one specified by the client.  This is useful
-        *      to work around broken DSR implementations and other
-        *      routing issues.
+        *      @todo - change our state based on the reply packet.
         */
-       if (client->src_ipaddr.af != AF_UNSPEC) {
-               request->reply->socket.inet.src_ipaddr = client->src_ipaddr;
-       }
-
-       data_len = fr_bfd_encode(buffer, buffer_len, request->packet->data,
-                                client->secret, talloc_array_length(client->secret) - 1,
-                                &request->reply_pairs);
-       if (data_len < 0) {
-               RPEDEBUG("Failed encoding BFD reply");
-               return -1;
-       }
-
-       if (RDEBUG_ENABLED) {
-               RDEBUG("Sending %s ID %i from %pV:%i to %pV:%i length %zu via socket %s",
-                      fr_bfd_packet_names[request->reply->code],
-                      request->reply->id,
-                      fr_box_ipaddr(request->reply->socket.inet.src_ipaddr),
-                      request->reply->socket.inet.src_port,
-                      fr_box_ipaddr(request->reply->socket.inet.dst_ipaddr),
-                      request->reply->socket.inet.dst_port,
-                      data_len,
-                      request->async->listen->name);
-
-               log_request_pair_list(L_DBG_LVL_1, request, NULL, &request->reply_pairs, NULL);
-       }
-
-       return data_len;
+       *buffer = 0x00;
+       return 1;
 }
 
 /** Open listen sockets/connect to external event source
index 5fd24ba11bd6730084438a3bcff774514c33124e..82ed4c8533f4d6416dc9348a1797df2ef542eedb 100644 (file)
@@ -34,10 +34,16 @@ fr_dict_autoload_t process_bfd_dict[] = {
 };
 
 static fr_dict_attr_t const *attr_packet_type;
+static fr_dict_attr_t const *attr_bfd_packet;
+static fr_dict_attr_t const *attr_bfd_state;
 
 extern fr_dict_attr_autoload_t process_bfd_dict_attr[];
 fr_dict_attr_autoload_t process_bfd_dict_attr[] = {
        { .out = &attr_packet_type, .name = "Packet-Type", .type = FR_TYPE_UINT32, .dict = &dict_bfd},
+
+       { .out = &attr_bfd_packet, .name = "Packet", .type = FR_TYPE_STRUCT, .dict = &dict_bfd},
+       { .out = &attr_bfd_state, .name = "Packet.state", .type = FR_TYPE_UINT8, .dict = &dict_bfd},
+
        { NULL }
 };
 
@@ -111,6 +117,38 @@ static void bfd_packet_debug(request_t *request, fr_radius_packet_t *packet, fr_
        }
 }
 
+RESUME_NO_MCTX(recv_bfd)
+{
+       rlm_rcode_t                     rcode = *p_result;
+       fr_pair_t                       *vp;
+       uint32_t                        state = 0;
+
+       PROCESS_TRACE;
+
+       fr_assert(rcode < RLM_MODULE_NUMCODES);
+
+       /*
+        *      Check for a state / reply code.
+        */
+       vp = fr_pair_find_by_da(&request->reply_pairs, NULL, attr_packet_type);
+       if (vp) {
+               state = vp->vp_uint32;
+       } else {
+               vp = fr_pair_find_by_da(&request->reply_pairs, NULL, attr_bfd_packet);
+               if (vp) vp = fr_pair_find_by_da(&vp->vp_group, NULL, attr_bfd_state);
+               if (vp) state = vp->vp_uint8;
+       }
+
+       fr_assert(PROCESS_PACKET_CODE_VALID(state));
+
+       request->reply->code = state;
+
+       request->reply->timestamp = fr_time();
+
+       return UNLANG_ACTION_CALCULATE_RESULT;
+}
+
+
 /*
  *     recv FOO
  */
@@ -119,7 +157,7 @@ static fr_process_state_t const process_state_packet[] = {
                .default_reply = FR_BFD_DOWN,
                .rcode = RLM_MODULE_NOOP,
                .recv = recv_generic,
-               .resume = resume_recv_generic,
+               .resume = resume_recv_bfd,
                .section_offset = offsetof(process_bfd_sections_t, recv_admin_down),
        },
 
@@ -127,7 +165,7 @@ static fr_process_state_t const process_state_packet[] = {
                .default_reply = FR_BFD_DOWN,
                .rcode = RLM_MODULE_NOOP,
                .recv = recv_generic,
-               .resume = resume_recv_generic,
+               .resume = resume_recv_bfd,
                .section_offset = offsetof(process_bfd_sections_t, recv_down),
        },
 
@@ -135,7 +173,7 @@ static fr_process_state_t const process_state_packet[] = {
                .default_reply = FR_BFD_UP,
                .rcode = RLM_MODULE_NOOP,
                .recv = recv_generic,
-               .resume = resume_recv_generic,
+               .resume = resume_recv_bfd,
                .section_offset = offsetof(process_bfd_sections_t, recv_init),
        },
 
@@ -143,7 +181,7 @@ static fr_process_state_t const process_state_packet[] = {
                .default_reply = FR_BFD_UP,
                .rcode = RLM_MODULE_NOOP,
                .recv = recv_generic,
-               .resume = resume_recv_generic,
+               .resume = resume_recv_bfd,
                .section_offset = offsetof(process_bfd_sections_t, recv_up),
        },
 };