From: Alan T. DeKok Date: Tue, 7 Mar 2023 20:05:22 +0000 (-0500) Subject: parse peer port, and actually send packets X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67b508fe21e9be0c761bfa26c5400aa3783f9a93;p=thirdparty%2Ffreeradius-server.git parse peer port, and actually send packets --- diff --git a/src/listen/bfd/proto_bfd.c b/src/listen/bfd/proto_bfd.c index 834499d194d..19b75704fbe 100644 --- a/src/listen/bfd/proto_bfd.c +++ b/src/listen/bfd/proto_bfd.c @@ -51,6 +51,8 @@ static const CONF_PARSER peer_config[] = { { FR_CONF_OFFSET("auth_type", FR_TYPE_VOID, proto_bfd_peer_t, auth_type ), .func = auth_type_parse }, + { FR_CONF_OFFSET("port", FR_TYPE_UINT16, proto_bfd_peer_t, port ) }, + CONF_PARSER_TERMINATOR }; diff --git a/src/listen/bfd/proto_bfd.h b/src/listen/bfd/proto_bfd.h index 6baa7909e00..c4ac4ec9f00 100644 --- a/src/listen/bfd/proto_bfd.h +++ b/src/listen/bfd/proto_bfd.h @@ -41,6 +41,8 @@ typedef struct { typedef struct { fr_client_t client; //!< might as well re-use this, others need it + uint16_t port; //!< peer port where packets are sent to + /* * Peers are defined globally to a virtual server. Each * peer can only have one session associated with it. @@ -52,7 +54,10 @@ typedef struct { fr_event_list_t *el; struct sockaddr_storage remote_sockaddr; //!< cached for laziness - socklen_t salen; + socklen_t remote_salen; + + struct sockaddr_storage local_sockaddr; //!< cached for laziness + socklen_t local_salen; /* * Internal state management diff --git a/src/listen/bfd/proto_bfd_udp.c b/src/listen/bfd/proto_bfd_udp.c index 3c86e66abdd..c8744122230 100644 --- a/src/listen/bfd/proto_bfd_udp.c +++ b/src/listen/bfd/proto_bfd_udp.c @@ -275,6 +275,9 @@ static int mod_open(fr_listen_t *li) } #endif + /* + * @todo - cache ifindex for use with udpfromto. + */ if (fr_socket_bind(sockfd, &inst->ipaddr, &port, inst->interface) < 0) { close(sockfd); PERROR("Failed binding socket"); @@ -422,6 +425,12 @@ static int mod_bootstrap(module_inst_ctx_t const *mctx) peer->inst = inst; peer->client.src_ipaddr = inst->ipaddr; /* override inaddr_any */ + /* + * Cache these so that they don't get recalculated on every packet. + */ + fr_ipaddr_to_sockaddr(&peer->remote_sockaddr, &peer->remote_salen, &peer->client.ipaddr, peer->port); + fr_ipaddr_to_sockaddr(&peer->local_sockaddr, &peer->local_salen, &inst->ipaddr, inst->port); + if (bfd_session_init(peer) < 0) { return -1; } diff --git a/src/listen/bfd/session.c b/src/listen/bfd/session.c index 3a18d91d9e5..ec5b61d28a0 100644 --- a/src/listen/bfd/session.c +++ b/src/listen/bfd/session.c @@ -737,13 +737,12 @@ static void bfd_send_packet(UNUSED fr_event_list_t *el, UNUSED fr_time_t now, vo DEBUG("BFD %s sending packet state %s", session->client.shortname, fr_bfd_packet_names[session->session_state]); -#if 0 - if (sendto(session->socket.fd, &bfd, bfd.length, 0, - (struct sockaddr *) &session->remote_sockaddr, - session->salen) < 0) { + if (sendfromto(session->sockfd, &bfd, bfd.length, 0, 0, + (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); } -#endif } /*