]> git.proxmox.com Git - mirror_frr.git/blobdiff - bfdd/bfd.c
*: manual SPDX License ID conversions
[mirror_frr.git] / bfdd / bfd.c
index d52eeeddba704b17812e9afc0efd2061ebba2f78..4367f253e11955f4e8a418c6681b12c2a278941a 100644 (file)
@@ -348,7 +348,7 @@ int bfd_session_enable(struct bfd_session *bs)
        /* Sanity check: don't leak open sockets. */
        if (bs->sock != -1) {
                if (bglobal.debug_peer_event)
-                       zlog_debug("session-enable: previous socket open");
+                       zlog_debug("%s: previous socket open", __func__);
 
                close(bs->sock);
                bs->sock = -1;
@@ -381,6 +381,9 @@ int bfd_session_enable(struct bfd_session *bs)
                ptm_bfd_start_xmt_timer(bs, false);
        }
 
+       /* initialize RTT */
+       bfd_rtt_init(bs);
+
        return 0;
 }
 
@@ -454,7 +457,17 @@ void ptm_bfd_start_xmt_timer(struct bfd_session *bfd, bool is_echo)
 static void ptm_bfd_echo_xmt_TO(struct bfd_session *bfd)
 {
        /* Send the scheduled echo  packet */
-       ptm_bfd_echo_snd(bfd);
+       /* if ipv4 use the new echo implementation that causes
+        * the packet to be looped in forwarding plane of peer
+        */
+       if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_IPV6) == 0)
+#ifdef BFD_LINUX
+               ptm_bfd_echo_fp_snd(bfd);
+#else
+               ptm_bfd_echo_snd(bfd);
+#endif
+       else
+               ptm_bfd_echo_snd(bfd);
 
        /* Restart the timer for next time */
        ptm_bfd_start_xmt_timer(bfd, true);
@@ -558,6 +571,15 @@ void ptm_bfd_sess_dn(struct bfd_session *bfd, uint8_t diag)
                                   state_list[bfd->ses_state].str,
                                   get_diag_str(bfd->local_diag));
        }
+
+       /* clear peer's mac address */
+       UNSET_FLAG(bfd->flags, BFD_SESS_FLAG_MAC_SET);
+       memset(bfd->peer_hw_addr, 0, sizeof(bfd->peer_hw_addr));
+       /* reset local address ,it might has been be changed after bfd is up*/
+       memset(&bfd->local_address, 0, sizeof(bfd->local_address));
+
+       /* reset RTT */
+       bfd_rtt_init(bfd);
 }
 
 static struct bfd_session *bfd_find_disc(struct sockaddr_any *sa,
@@ -930,7 +952,7 @@ int ptm_bfd_sess_del(struct bfd_peer_cfg *bpc)
        }
 
        if (bglobal.debug_peer_event)
-               zlog_debug("session-delete: %s", bs_to_string(bs));
+               zlog_debug("%s: %s", __func__, bs_to_string(bs));
 
        control_notify_config(BCM_NOTIFY_CONFIG_DELETE, bs);
 
@@ -1934,40 +1956,38 @@ static int bfd_vrf_enable(struct vrf *vrf)
        if (bglobal.debug_zebra)
                zlog_debug("VRF enable add %s id %u", vrf->name, vrf->vrf_id);
 
-       if (vrf->vrf_id == VRF_DEFAULT ||
-           vrf_get_backend() == VRF_BACKEND_NETNS) {
-               if (!bvrf->bg_shop)
-                       bvrf->bg_shop = bp_udp_shop(vrf);
-               if (!bvrf->bg_mhop)
-                       bvrf->bg_mhop = bp_udp_mhop(vrf);
-               if (!bvrf->bg_shop6)
-                       bvrf->bg_shop6 = bp_udp6_shop(vrf);
-               if (!bvrf->bg_mhop6)
-                       bvrf->bg_mhop6 = bp_udp6_mhop(vrf);
-               if (!bvrf->bg_echo)
-                       bvrf->bg_echo = bp_echo_socket(vrf);
-               if (!bvrf->bg_echov6)
-                       bvrf->bg_echov6 = bp_echov6_socket(vrf);
-
-               if (!bvrf->bg_ev[0] && bvrf->bg_shop != -1)
-                       thread_add_read(master, bfd_recv_cb, bvrf,
-                                       bvrf->bg_shop, &bvrf->bg_ev[0]);
-               if (!bvrf->bg_ev[1] && bvrf->bg_mhop != -1)
-                       thread_add_read(master, bfd_recv_cb, bvrf,
-                                       bvrf->bg_mhop, &bvrf->bg_ev[1]);
-               if (!bvrf->bg_ev[2] && bvrf->bg_shop6 != -1)
-                       thread_add_read(master, bfd_recv_cb, bvrf,
-                                       bvrf->bg_shop6, &bvrf->bg_ev[2]);
-               if (!bvrf->bg_ev[3] && bvrf->bg_mhop6 != -1)
-                       thread_add_read(master, bfd_recv_cb, bvrf,
-                                       bvrf->bg_mhop6, &bvrf->bg_ev[3]);
-               if (!bvrf->bg_ev[4] && bvrf->bg_echo != -1)
-                       thread_add_read(master, bfd_recv_cb, bvrf,
-                                       bvrf->bg_echo, &bvrf->bg_ev[4]);
-               if (!bvrf->bg_ev[5] && bvrf->bg_echov6 != -1)
-                       thread_add_read(master, bfd_recv_cb, bvrf,
-                                       bvrf->bg_echov6, &bvrf->bg_ev[5]);
-       }
+       if (!bvrf->bg_shop)
+               bvrf->bg_shop = bp_udp_shop(vrf);
+       if (!bvrf->bg_mhop)
+               bvrf->bg_mhop = bp_udp_mhop(vrf);
+       if (!bvrf->bg_shop6)
+               bvrf->bg_shop6 = bp_udp6_shop(vrf);
+       if (!bvrf->bg_mhop6)
+               bvrf->bg_mhop6 = bp_udp6_mhop(vrf);
+       if (!bvrf->bg_echo)
+               bvrf->bg_echo = bp_echo_socket(vrf);
+       if (!bvrf->bg_echov6)
+               bvrf->bg_echov6 = bp_echov6_socket(vrf);
+
+       if (!bvrf->bg_ev[0] && bvrf->bg_shop != -1)
+               thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_shop,
+                               &bvrf->bg_ev[0]);
+       if (!bvrf->bg_ev[1] && bvrf->bg_mhop != -1)
+               thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop,
+                               &bvrf->bg_ev[1]);
+       if (!bvrf->bg_ev[2] && bvrf->bg_shop6 != -1)
+               thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_shop6,
+                               &bvrf->bg_ev[2]);
+       if (!bvrf->bg_ev[3] && bvrf->bg_mhop6 != -1)
+               thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop6,
+                               &bvrf->bg_ev[3]);
+       if (!bvrf->bg_ev[4] && bvrf->bg_echo != -1)
+               thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echo,
+                               &bvrf->bg_ev[4]);
+       if (!bvrf->bg_ev[5] && bvrf->bg_echov6 != -1)
+               thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echov6,
+                               &bvrf->bg_ev[5]);
+
        if (vrf->vrf_id != VRF_DEFAULT) {
                bfdd_zclient_register(vrf->vrf_id);
                bfdd_sessions_enable_vrf(vrf);
@@ -2049,3 +2069,14 @@ unsigned long bfd_get_session_count(void)
 {
        return bfd_key_hash->count;
 }
+
+void bfd_rtt_init(struct bfd_session *bfd)
+{
+       uint8_t i;
+
+       /* initialize RTT */
+       bfd->rtt_valid = 0;
+       bfd->rtt_index = 0;
+       for (i = 0; i < BFD_RTT_SAMPLE; i++)
+               bfd->rtt[i] = 0;
+}