]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
parse peer port, and actually send packets
authorAlan T. DeKok <aland@freeradius.org>
Tue, 7 Mar 2023 20:05:22 +0000 (15:05 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 8 Mar 2023 20:28:05 +0000 (15:28 -0500)
src/listen/bfd/proto_bfd.c
src/listen/bfd/proto_bfd.h
src/listen/bfd/proto_bfd_udp.c
src/listen/bfd/session.c

index 834499d194d06afe245261c9733af957c953eb28..19b75704fbe4f69eef3b471068a8e8dbd928fd7f 100644 (file)
@@ -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
 };
 
index 6baa7909e0081359de1f129e8f237c5a827580a3..c4ac4ec9f0084ca22af2d3e48ae0015e7fbbdcde 100644 (file)
@@ -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
index 3c86e66abdd62bff591a3f6c6871d63777bcb089..c8744122230ee95475aa29bd4119c22b390d1cef 100644 (file)
@@ -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;
                }
index 3a18d91d9e565b46af11cfe023ec3acdb4a934c6..ec5b61d28a093961b9c2f5b87fc9dc6a4a5bc998 100644 (file)
@@ -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
 }
 
 /*