]> git.proxmox.com Git - mirror_frr.git/blobdiff - bfdd/bfd.c
Merge pull request #12397 from opensourcerouting/vscode-intro
[mirror_frr.git] / bfdd / bfd.c
index fbe0436b508133c03770f62983f6f43fae89982b..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,
@@ -609,27 +631,23 @@ struct bfd_session *ptm_bfd_sess_find(struct bfd_pkt *cp,
        return bfd_key_lookup(key);
 }
 
-int bfd_xmt_cb(struct thread *t)
+void bfd_xmt_cb(struct thread *t)
 {
        struct bfd_session *bs = THREAD_ARG(t);
 
        ptm_bfd_xmt_TO(bs, 0);
-
-       return 0;
 }
 
-int bfd_echo_xmt_cb(struct thread *t)
+void bfd_echo_xmt_cb(struct thread *t)
 {
        struct bfd_session *bs = THREAD_ARG(t);
 
        if (bs->echo_xmt_TO > 0)
                ptm_bfd_echo_xmt_TO(bs);
-
-       return 0;
 }
 
 /* Was ptm_bfd_detect_TO() */
-int bfd_recvtimer_cb(struct thread *t)
+void bfd_recvtimer_cb(struct thread *t)
 {
        struct bfd_session *bs = THREAD_ARG(t);
 
@@ -639,12 +657,10 @@ int bfd_recvtimer_cb(struct thread *t)
                ptm_bfd_sess_dn(bs, BD_CONTROL_EXPIRED);
                break;
        }
-
-       return 0;
 }
 
 /* Was ptm_bfd_echo_detect_TO() */
-int bfd_echo_recvtimer_cb(struct thread *t)
+void bfd_echo_recvtimer_cb(struct thread *t)
 {
        struct bfd_session *bs = THREAD_ARG(t);
 
@@ -654,8 +670,6 @@ int bfd_echo_recvtimer_cb(struct thread *t)
                ptm_bfd_sess_dn(bs, BD_ECHO_FAILED);
                break;
        }
-
-       return 0;
 }
 
 struct bfd_session *bfd_session_new(void)
@@ -777,7 +791,7 @@ static void _bfd_session_update(struct bfd_session *bs,
         * Apply profile last: it also calls `bfd_set_shutdown`.
         *
         * There is no problem calling `shutdown` twice if the value doesn't
-        * change or if it is overriden by peer specific configuration.
+        * change or if it is overridden by peer specific configuration.
         */
        if (bpc->bpc_has_profile)
                bfd_profile_apply(bpc->bpc_profile, bs);
@@ -938,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);
 
@@ -1424,7 +1438,7 @@ int strtosa(const char *addr, struct sockaddr_any *sa)
 
 void integer2timestr(uint64_t time, char *buf, size_t buflen)
 {
-       unsigned int year, month, day, hour, minute, second;
+       uint64_t year, month, day, hour, minute, second;
        int rv;
 
 #define MINUTES (60)
@@ -1436,7 +1450,7 @@ void integer2timestr(uint64_t time, char *buf, size_t buflen)
                year = time / YEARS;
                time -= year * YEARS;
 
-               rv = snprintf(buf, buflen, "%u year(s), ", year);
+               rv = snprintfrr(buf, buflen, "%" PRIu64 " year(s), ", year);
                buf += rv;
                buflen -= rv;
        }
@@ -1444,7 +1458,7 @@ void integer2timestr(uint64_t time, char *buf, size_t buflen)
                month = time / MONTHS;
                time -= month * MONTHS;
 
-               rv = snprintf(buf, buflen, "%u month(s), ", month);
+               rv = snprintfrr(buf, buflen, "%" PRIu64 " month(s), ", month);
                buf += rv;
                buflen -= rv;
        }
@@ -1452,7 +1466,7 @@ void integer2timestr(uint64_t time, char *buf, size_t buflen)
                day = time / DAYS;
                time -= day * DAYS;
 
-               rv = snprintf(buf, buflen, "%u day(s), ", day);
+               rv = snprintfrr(buf, buflen, "%" PRIu64 " day(s), ", day);
                buf += rv;
                buflen -= rv;
        }
@@ -1460,7 +1474,7 @@ void integer2timestr(uint64_t time, char *buf, size_t buflen)
                hour = time / HOURS;
                time -= hour * HOURS;
 
-               rv = snprintf(buf, buflen, "%u hour(s), ", hour);
+               rv = snprintfrr(buf, buflen, "%" PRIu64 " hour(s), ", hour);
                buf += rv;
                buflen -= rv;
        }
@@ -1468,12 +1482,12 @@ void integer2timestr(uint64_t time, char *buf, size_t buflen)
                minute = time / MINUTES;
                time -= minute * MINUTES;
 
-               rv = snprintf(buf, buflen, "%u minute(s), ", minute);
+               rv = snprintfrr(buf, buflen, "%" PRIu64 " minute(s), ", minute);
                buf += rv;
                buflen -= rv;
        }
        second = time % MINUTES;
-       snprintf(buf, buflen, "%u second(s)", second);
+       snprintfrr(buf, buflen, "%" PRIu64 " second(s)", second);
 }
 
 const char *bs_to_string(const struct bfd_session *bs)
@@ -1942,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);
@@ -2057,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;
+}