From f1446f9885573c33bc3805b998dc723b6768da17 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 5 Aug 2020 13:10:27 -0400 Subject: [PATCH] bfdd: Allow it to work when V6 is completely turned off Experimental patch to allow us to discuss if we should allow bfdd to work when v6 is turned off in the kernel. Signed-off-by: Donald Sharp --- bfdd/bfd.c | 15 +++++++++------ bfdd/bfd_packet.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/bfdd/bfd.c b/bfdd/bfd.c index 2b3caa6fef..c16912060c 100644 --- a/bfdd/bfd.c +++ b/bfdd/bfd.c @@ -2052,16 +2052,16 @@ static int bfd_vrf_enable(struct vrf *vrf) if (!bvrf->bg_ev[1]) thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_mhop, &bvrf->bg_ev[1]); - if (!bvrf->bg_ev[2]) + 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]) + 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]) thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echo, &bvrf->bg_ev[4]); - if (!bvrf->bg_ev[5]) + if (!bvrf->bg_ev[5] && bvrf->bg_echov6 != -1) thread_add_read(master, bfd_recv_cb, bvrf, bvrf->bg_echov6, &bvrf->bg_ev[5]); } @@ -2100,10 +2100,13 @@ static int bfd_vrf_disable(struct vrf *vrf) socket_close(&bvrf->bg_echo); socket_close(&bvrf->bg_shop); socket_close(&bvrf->bg_mhop); - socket_close(&bvrf->bg_shop6); - socket_close(&bvrf->bg_mhop6); + if (bvrf->bg_shop6 != -1) + socket_close(&bvrf->bg_shop6); + if (bvrf->bg_mhop6 != -1) + socket_close(&bvrf->bg_mhop6); socket_close(&bvrf->bg_echo); - socket_close(&bvrf->bg_echov6); + if (bvrf->bg_echov6 != -1) + socket_close(&bvrf->bg_echov6); /* free context */ XFREE(MTYPE_BFDD_VRF, bvrf); diff --git a/bfdd/bfd_packet.c b/bfdd/bfd_packet.c index 38855acffc..5cc47d5a44 100644 --- a/bfdd/bfd_packet.c +++ b/bfdd/bfd_packet.c @@ -147,6 +147,8 @@ void ptm_bfd_echo_snd(struct bfd_session *bfd) bep.my_discr = htonl(bfd->discrs.my_discr); if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_IPV6)) { + if (bvrf->bg_echov6 == -1) + return; sd = bvrf->bg_echov6; memset(&sin6, 0, sizeof(sin6)); sin6.sin6_family = AF_INET6; @@ -1145,8 +1147,14 @@ int bp_udp6_shop(const struct vrf *vrf) sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf->vrf_id, vrf->name); } - if (sd == -1) - zlog_fatal("udp6-shop: socket: %s", strerror(errno)); + if (sd == -1) { + if (errno != EAFNOSUPPORT) + zlog_fatal("udp6-shop: socket: %s", strerror(errno)); + else + zlog_warn("udp6-shop: V6 is not supported, continuing"); + + return -1; + } bp_set_ipv6opts(sd); bp_bind_ipv6(sd, BFD_DEFDESTPORT); @@ -1162,8 +1170,14 @@ int bp_udp6_mhop(const struct vrf *vrf) sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf->vrf_id, vrf->name); } - if (sd == -1) - zlog_fatal("udp6-mhop: socket: %s", strerror(errno)); + if (sd == -1) { + if (errno != EAFNOSUPPORT) + zlog_fatal("udp6-mhop: socket: %s", strerror(errno)); + else + zlog_warn("udp6-mhop: V6 is not supported, continuing"); + + return -1; + } bp_set_ipv6opts(sd); bp_bind_ipv6(sd, BFD_DEF_MHOP_DEST_PORT); @@ -1194,8 +1208,15 @@ int bp_echov6_socket(const struct vrf *vrf) frr_with_privs(&bglobal.bfdd_privs) { s = vrf_socket(AF_INET6, SOCK_DGRAM, 0, vrf->vrf_id, vrf->name); } - if (s == -1) - zlog_fatal("echov6-socket: socket: %s", strerror(errno)); + if (s == -1) { + if (errno != EAFNOSUPPORT) + zlog_fatal("echov6-socket: socket: %s", + strerror(errno)); + else + zlog_warn("echov6-socket: V6 is not supported, continuing"); + + return -1; + } bp_set_ipv6opts(s); bp_bind_ipv6(s, BFD_DEF_ECHO_PORT); -- 2.39.5