From: Alan T. DeKok Date: Thu, 2 Mar 2023 02:25:49 +0000 (-0500) Subject: BFD packets don't get replies X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88128fe1c3f4ae7dc167c2f7726efbeaca2d7a1d;p=thirdparty%2Ffreeradius-server.git BFD packets don't get replies they just cause us to change our state machine. Any packets we originate get written. Somehow... --- diff --git a/src/listen/bfd/proto_bfd.c b/src/listen/bfd/proto_bfd.c index 9dd27b9f2d4..06932e844ec 100644 --- a/src/listen/bfd/proto_bfd.c +++ b/src/listen/bfd/proto_bfd.c @@ -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 diff --git a/src/process/bfd/base.c b/src/process/bfd/base.c index 5fd24ba11bd..82ed4c8533f 100644 --- a/src/process/bfd/base.c +++ b/src/process/bfd/base.c @@ -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), }, };