Merge pull request #6863 from donaldsharp/bfd_v6_shenanigans

bfdd: Allow it to work when V6 is completely turned off
This commit is contained in:
Rafael Zalamena 2020-08-14 16:12:47 +00:00 committed by GitHub
commit fbbb4629ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 12 deletions

View File

@ -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);

View File

@ -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);