summaryrefslogtreecommitdiff
path: root/bfdd/bfd_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'bfdd/bfd_packet.c')
-rw-r--r--bfdd/bfd_packet.c160
1 files changed, 89 insertions, 71 deletions
diff --git a/bfdd/bfd_packet.c b/bfdd/bfd_packet.c
index 1ec761e3b8..68bdd89bb7 100644
--- a/bfdd/bfd_packet.c
+++ b/bfdd/bfd_packet.c
@@ -76,7 +76,7 @@ int _ptm_bfd_send(struct bfd_session *bs, uint16_t *port, const void *data,
ssize_t rv;
int sd = -1;
- if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_IPV6)) {
+ if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_IPV6)) {
memset(&sin6, 0, sizeof(sin6));
sin6.sin6_family = AF_INET6;
memcpy(&sin6.sin6_addr, &bs->key.peer, sizeof(sin6.sin6_addr));
@@ -85,7 +85,7 @@ int _ptm_bfd_send(struct bfd_session *bs, uint16_t *port, const void *data,
sin6.sin6_port =
(port) ? *port
- : (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH))
+ : (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH))
? htons(BFD_DEF_MHOP_DEST_PORT)
: htons(BFD_DEFDESTPORT);
@@ -98,7 +98,7 @@ int _ptm_bfd_send(struct bfd_session *bs, uint16_t *port, const void *data,
memcpy(&sin.sin_addr, &bs->key.peer, sizeof(sin.sin_addr));
sin.sin_port =
(port) ? *port
- : (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH))
+ : (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH))
? htons(BFD_DEF_MHOP_DEST_PORT)
: htons(BFD_DEFDESTPORT);
@@ -112,11 +112,16 @@ int _ptm_bfd_send(struct bfd_session *bs, uint16_t *port, const void *data,
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
rv = sendto(sd, data, datalen, 0, sa, slen);
if (rv <= 0) {
- log_debug("packet-send: send failure: %s", strerror(errno));
+ if (bglobal.debug_network)
+ zlog_debug("packet-send: send failure: %s",
+ strerror(errno));
return -1;
}
- if (rv < (ssize_t)datalen)
- log_debug("packet-send: send partial: %s", strerror(errno));
+ if (rv < (ssize_t)datalen) {
+ if (bglobal.debug_network)
+ zlog_debug("packet-send: send partial: %s",
+ strerror(errno));
+ }
return 0;
}
@@ -133,15 +138,15 @@ void ptm_bfd_echo_snd(struct bfd_session *bfd)
if (!bvrf)
return;
- if (!BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE))
- BFD_SET_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE);
+ if (!CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE))
+ SET_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE);
memset(&bep, 0, sizeof(bep));
bep.ver = BFD_ECHO_VERSION;
bep.len = BFD_ECHO_PKT_LEN;
bep.my_discr = htonl(bfd->discrs.my_discr);
- if (BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_IPV6)) {
+ if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_IPV6)) {
sd = bvrf->bg_echov6;
memset(&sin6, 0, sizeof(sin6));
sin6.sin6_family = AF_INET6;
@@ -190,13 +195,16 @@ static int ptm_bfd_process_echo_pkt(struct bfd_vrf_global *bvrf, int s)
/* Your discriminator not zero - use it to find session */
bfd = bfd_id_lookup(my_discr);
if (bfd == NULL) {
- log_debug("echo-packet: no matching session (id:%u)", my_discr);
+ if (bglobal.debug_network)
+ zlog_debug("echo-packet: no matching session (id:%u)",
+ my_discr);
return -1;
}
- if (!BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE)) {
- log_debug("echo-packet: echo disabled [%s] (id:%u)",
- bs_to_string(bfd), my_discr);
+ if (!CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_ECHO_ACTIVE)) {
+ if (bglobal.debug_network)
+ zlog_debug("echo-packet: echo disabled [%s] (id:%u)",
+ bs_to_string(bfd), my_discr);
return -1;
}
@@ -214,7 +222,7 @@ static int ptm_bfd_process_echo_pkt(struct bfd_vrf_global *bvrf, int s)
void ptm_bfd_snd(struct bfd_session *bfd, int fbit)
{
- struct bfd_pkt cp;
+ struct bfd_pkt cp = {};
/* Set fields according to section 6.5.7 */
cp.diag = bfd->local_diag;
@@ -222,7 +230,7 @@ void ptm_bfd_snd(struct bfd_session *bfd, int fbit)
cp.flags = 0;
BFD_SETSTATE(cp.flags, bfd->ses_state);
- if (BFD_CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_CBIT))
+ if (CHECK_FLAG(bfd->flags, BFD_SESS_FLAG_CBIT))
BFD_SETCBIT(cp.flags, BFD_CBIT);
BFD_SETDEMANDBIT(cp.flags, BFD_DEF_DEMAND);
@@ -291,8 +299,7 @@ ssize_t bfd_recv_ipv4(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
mlen = recvmsg(sd, &msghdr, MSG_DONTWAIT);
if (mlen == -1) {
if (errno != EAGAIN)
- log_error("ipv4-recv: recv failed: %s",
- strerror(errno));
+ zlog_err("ipv4-recv: recv failed: %s", strerror(errno));
return -1;
}
@@ -313,7 +320,9 @@ ssize_t bfd_recv_ipv4(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
memcpy(&ttlval, CMSG_DATA(cm), sizeof(ttlval));
if (ttlval > 255) {
- log_debug("ipv4-recv: invalid TTL: %u", ttlval);
+ if (bglobal.debug_network)
+ zlog_debug("ipv4-recv: invalid TTL: %u",
+ ttlval);
return -1;
}
*ttl = ttlval;
@@ -402,8 +411,7 @@ ssize_t bfd_recv_ipv6(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
mlen = recvmsg(sd, &msghdr6, MSG_DONTWAIT);
if (mlen == -1) {
if (errno != EAGAIN)
- log_error("ipv6-recv: recv failed: %s",
- strerror(errno));
+ zlog_err("ipv6-recv: recv failed: %s", strerror(errno));
return -1;
}
@@ -420,7 +428,9 @@ ssize_t bfd_recv_ipv6(int sd, uint8_t *msgbuf, size_t msgbuflen, uint8_t *ttl,
if (cm->cmsg_type == IPV6_HOPLIMIT) {
memcpy(&ttlval, CMSG_DATA(cm), sizeof(ttlval));
if (ttlval > 255) {
- log_debug("ipv6-recv: invalid TTL: %u", ttlval);
+ if (bglobal.debug_network)
+ zlog_debug("ipv6-recv: invalid TTL: %u",
+ ttlval);
return -1;
}
@@ -486,6 +496,10 @@ static void cp_debug(bool mhop, struct sockaddr_any *peer,
char buf[512], peerstr[128], localstr[128], portstr[64], vrfstr[64];
va_list vl;
+ /* Don't to any processing if debug is disabled. */
+ if (bglobal.debug_network == false)
+ return;
+
if (peer->sa_sin.sin_family)
snprintf(peerstr, sizeof(peerstr), " peer:%s", satostr(peer));
else
@@ -511,8 +525,8 @@ static void cp_debug(bool mhop, struct sockaddr_any *peer,
vsnprintf(buf, sizeof(buf), fmt, vl);
va_end(vl);
- log_debug("control-packet: %s [mhop:%s%s%s%s%s]", buf,
- mhop ? "yes" : "no", peerstr, localstr, portstr, vrfstr);
+ zlog_debug("control-packet: %s [mhop:%s%s%s%s%s]", buf,
+ mhop ? "yes" : "no", peerstr, localstr, portstr, vrfstr);
}
int bfd_recv_cb(struct thread *t)
@@ -779,7 +793,7 @@ int bp_udp_send(int sd, uint8_t ttl, uint8_t *data, size_t datalen,
cmsg->cmsg_level = IPPROTO_IPV6;
cmsg->cmsg_type = IPV6_HOPLIMIT;
} else {
-#if BFD_LINUX
+#ifdef BFD_LINUX
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_TTL;
#else
@@ -796,11 +810,14 @@ int bp_udp_send(int sd, uint8_t ttl, uint8_t *data, size_t datalen,
/* Send echo back. */
wlen = sendmsg(sd, &msg, 0);
if (wlen <= 0) {
- log_debug("udp-send: loopback failure: (%d) %s", errno, strerror(errno));
+ if (bglobal.debug_network)
+ zlog_debug("udp-send: loopback failure: (%d) %s", errno,
+ strerror(errno));
return -1;
} else if (wlen < (ssize_t)datalen) {
- log_debug("udp-send: partial send: %zd expected %zu", wlen,
- datalen);
+ if (bglobal.debug_network)
+ zlog_debug("udp-send: partial send: %zd expected %zu",
+ wlen, datalen);
return -1;
}
@@ -821,8 +838,8 @@ int bp_set_ttl(int sd, uint8_t value)
int ttl = value;
if (setsockopt(sd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) == -1) {
- log_warning("set-ttl: setsockopt(IP_TTL, %d): %s", value,
- strerror(errno));
+ zlog_warn("set-ttl: setsockopt(IP_TTL, %d): %s", value,
+ strerror(errno));
return -1;
}
@@ -834,8 +851,8 @@ int bp_set_tos(int sd, uint8_t value)
int tos = value;
if (setsockopt(sd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1) {
- log_warning("set-tos: setsockopt(IP_TOS, %d): %s", value,
- strerror(errno));
+ zlog_warn("set-tos: setsockopt(IP_TOS, %d): %s", value,
+ strerror(errno));
return -1;
}
@@ -847,12 +864,12 @@ static void bp_set_ipopts(int sd)
int rcvttl = BFD_RCV_TTL_VAL;
if (bp_set_ttl(sd, BFD_TTL_VAL) != 0)
- log_fatal("set-ipopts: TTL configuration failed");
+ zlog_fatal("set-ipopts: TTL configuration failed");
if (setsockopt(sd, IPPROTO_IP, IP_RECVTTL, &rcvttl, sizeof(rcvttl))
== -1)
- log_fatal("set-ipopts: setsockopt(IP_RECVTTL, %d): %s", rcvttl,
- strerror(errno));
+ zlog_fatal("set-ipopts: setsockopt(IP_RECVTTL, %d): %s", rcvttl,
+ strerror(errno));
#ifdef BFD_LINUX
int pktinfo = BFD_PKT_INFO_VAL;
@@ -860,21 +877,21 @@ static void bp_set_ipopts(int sd)
/* Figure out address and interface to do the peer matching. */
if (setsockopt(sd, IPPROTO_IP, IP_PKTINFO, &pktinfo, sizeof(pktinfo))
== -1)
- log_fatal("set-ipopts: setsockopt(IP_PKTINFO, %d): %s", pktinfo,
- strerror(errno));
+ zlog_fatal("set-ipopts: setsockopt(IP_PKTINFO, %d): %s",
+ pktinfo, strerror(errno));
#endif /* BFD_LINUX */
#ifdef BFD_BSD
int yes = 1;
/* Find out our address for peer matching. */
if (setsockopt(sd, IPPROTO_IP, IP_RECVDSTADDR, &yes, sizeof(yes)) == -1)
- log_fatal("set-ipopts: setsockopt(IP_RECVDSTADDR, %d): %s", yes,
- strerror(errno));
+ zlog_fatal("set-ipopts: setsockopt(IP_RECVDSTADDR, %d): %s",
+ yes, strerror(errno));
/* Find out interface where the packet came in. */
if (setsockopt_ifindex(AF_INET, sd, yes) == -1)
- log_fatal("set-ipopts: setsockopt_ipv4_ifindex(%d): %s", yes,
- strerror(errno));
+ zlog_fatal("set-ipopts: setsockopt_ipv4_ifindex(%d): %s", yes,
+ strerror(errno));
#endif /* BFD_BSD */
}
@@ -887,7 +904,7 @@ static void bp_bind_ip(int sd, uint16_t port)
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(port);
if (bind(sd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
- log_fatal("bind-ip: bind: %s", strerror(errno));
+ zlog_fatal("bind-ip: bind: %s", strerror(errno));
}
int bp_udp_shop(const struct vrf *vrf)
@@ -899,7 +916,7 @@ int bp_udp_shop(const struct vrf *vrf)
vrf->name);
}
if (sd == -1)
- log_fatal("udp-shop: socket: %s", strerror(errno));
+ zlog_fatal("udp-shop: socket: %s", strerror(errno));
bp_set_ipopts(sd);
bp_bind_ip(sd, BFD_DEFDESTPORT);
@@ -915,7 +932,7 @@ int bp_udp_mhop(const struct vrf *vrf)
vrf->name);
}
if (sd == -1)
- log_fatal("udp-mhop: socket: %s", strerror(errno));
+ zlog_fatal("udp-mhop: socket: %s", strerror(errno));
bp_set_ipopts(sd);
bp_bind_ip(sd, BFD_DEF_MHOP_DEST_PORT);
@@ -932,7 +949,7 @@ int bp_peer_socket(const struct bfd_session *bs)
if (bs->key.ifname[0])
device_to_bind = (const char *)bs->key.ifname;
- else if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)
+ else if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)
&& bs->key.vrfname[0])
device_to_bind = (const char *)bs->key.vrfname;
@@ -941,8 +958,8 @@ int bp_peer_socket(const struct bfd_session *bs)
bs->vrf->vrf_id, device_to_bind);
}
if (sd == -1) {
- log_error("ipv4-new: failed to create socket: %s",
- strerror(errno));
+ zlog_err("ipv4-new: failed to create socket: %s",
+ strerror(errno));
return -1;
}
@@ -965,15 +982,15 @@ int bp_peer_socket(const struct bfd_session *bs)
sin.sin_len = sizeof(sin);
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
memcpy(&sin.sin_addr, &bs->key.local, sizeof(sin.sin_addr));
- if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH) == 0)
+ if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH) == 0)
sin.sin_addr.s_addr = INADDR_ANY;
pcount = 0;
do {
if ((++pcount) > (BFD_SRCPORTMAX - BFD_SRCPORTINIT)) {
/* Searched all ports, none available */
- log_error("ipv4-new: failed to bind port: %s",
- strerror(errno));
+ zlog_err("ipv4-new: failed to bind port: %s",
+ strerror(errno));
close(sd);
return -1;
}
@@ -999,7 +1016,7 @@ int bp_peer_socketv6(const struct bfd_session *bs)
if (bs->key.ifname[0])
device_to_bind = (const char *)bs->key.ifname;
- else if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)
+ else if (CHECK_FLAG(bs->flags, BFD_SESS_FLAG_MH)
&& bs->key.vrfname[0])
device_to_bind = (const char *)bs->key.vrfname;
@@ -1008,8 +1025,8 @@ int bp_peer_socketv6(const struct bfd_session *bs)
bs->vrf->vrf_id, device_to_bind);
}
if (sd == -1) {
- log_error("ipv6-new: failed to create socket: %s",
- strerror(errno));
+ zlog_err("ipv6-new: failed to create socket: %s",
+ strerror(errno));
return -1;
}
@@ -1039,8 +1056,8 @@ int bp_peer_socketv6(const struct bfd_session *bs)
do {
if ((++pcount) > (BFD_SRCPORTMAX - BFD_SRCPORTINIT)) {
/* Searched all ports, none available */
- log_error("ipv6-new: failed to bind port: %s",
- strerror(errno));
+ zlog_err("ipv6-new: failed to bind port: %s",
+ strerror(errno));
close(sd);
return -1;
}
@@ -1058,8 +1075,8 @@ int bp_set_ttlv6(int sd, uint8_t value)
if (setsockopt(sd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl))
== -1) {
- log_warning("set-ttlv6: setsockopt(IPV6_UNICAST_HOPS, %d): %s",
- value, strerror(errno));
+ zlog_warn("set-ttlv6: setsockopt(IPV6_UNICAST_HOPS, %d): %s",
+ value, strerror(errno));
return -1;
}
@@ -1072,8 +1089,8 @@ int bp_set_tosv6(int sd, uint8_t value)
if (setsockopt(sd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos))
== -1) {
- log_warning("set-tosv6: setsockopt(IPV6_TCLASS, %d): %s", value,
- strerror(errno));
+ zlog_warn("set-tosv6: setsockopt(IPV6_TCLASS, %d): %s", value,
+ strerror(errno));
return -1;
}
@@ -1086,22 +1103,23 @@ static void bp_set_ipv6opts(int sd)
int ipv6_only = BFD_IPV6_ONLY_VAL;
if (bp_set_ttlv6(sd, BFD_TTL_VAL) == -1)
- log_fatal("set-ipv6opts: setsockopt(IPV6_UNICAST_HOPS, %d): %s",
- BFD_TTL_VAL, strerror(errno));
+ zlog_fatal(
+ "set-ipv6opts: setsockopt(IPV6_UNICAST_HOPS, %d): %s",
+ BFD_TTL_VAL, strerror(errno));
if (setsockopt_ipv6_hoplimit(sd, BFD_RCV_TTL_VAL) == -1)
- log_fatal("set-ipv6opts: setsockopt(IPV6_HOPLIMIT, %d): %s",
- BFD_RCV_TTL_VAL, strerror(errno));
+ zlog_fatal("set-ipv6opts: setsockopt(IPV6_HOPLIMIT, %d): %s",
+ BFD_RCV_TTL_VAL, strerror(errno));
if (setsockopt_ipv6_pktinfo(sd, ipv6_pktinfo) == -1)
- log_fatal("set-ipv6opts: setsockopt(IPV6_PKTINFO, %d): %s",
- ipv6_pktinfo, strerror(errno));
+ zlog_fatal("set-ipv6opts: setsockopt(IPV6_PKTINFO, %d): %s",
+ ipv6_pktinfo, strerror(errno));
if (setsockopt(sd, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6_only,
sizeof(ipv6_only))
== -1)
- log_fatal("set-ipv6opts: setsockopt(IPV6_V6ONLY, %d): %s",
- ipv6_only, strerror(errno));
+ zlog_fatal("set-ipv6opts: setsockopt(IPV6_V6ONLY, %d): %s",
+ ipv6_only, strerror(errno));
}
static void bp_bind_ipv6(int sd, uint16_t port)
@@ -1116,7 +1134,7 @@ static void bp_bind_ipv6(int sd, uint16_t port)
sin6.sin6_len = sizeof(sin6);
#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
if (bind(sd, (struct sockaddr *)&sin6, sizeof(sin6)) == -1)
- log_fatal("bind-ipv6: bind: %s", strerror(errno));
+ zlog_fatal("bind-ipv6: bind: %s", strerror(errno));
}
int bp_udp6_shop(const struct vrf *vrf)
@@ -1128,7 +1146,7 @@ int bp_udp6_shop(const struct vrf *vrf)
vrf->name);
}
if (sd == -1)
- log_fatal("udp6-shop: socket: %s", strerror(errno));
+ zlog_fatal("udp6-shop: socket: %s", strerror(errno));
bp_set_ipv6opts(sd);
bp_bind_ipv6(sd, BFD_DEFDESTPORT);
@@ -1145,7 +1163,7 @@ int bp_udp6_mhop(const struct vrf *vrf)
vrf->name);
}
if (sd == -1)
- log_fatal("udp6-mhop: socket: %s", strerror(errno));
+ zlog_fatal("udp6-mhop: socket: %s", strerror(errno));
bp_set_ipv6opts(sd);
bp_bind_ipv6(sd, BFD_DEF_MHOP_DEST_PORT);
@@ -1161,7 +1179,7 @@ int bp_echo_socket(const struct vrf *vrf)
s = vrf_socket(AF_INET, SOCK_DGRAM, 0, vrf->vrf_id, vrf->name);
}
if (s == -1)
- log_fatal("echo-socket: socket: %s", strerror(errno));
+ zlog_fatal("echo-socket: socket: %s", strerror(errno));
bp_set_ipopts(s);
bp_bind_ip(s, BFD_DEF_ECHO_PORT);
@@ -1177,7 +1195,7 @@ int bp_echov6_socket(const struct vrf *vrf)
s = vrf_socket(AF_INET6, SOCK_DGRAM, 0, vrf->vrf_id, vrf->name);
}
if (s == -1)
- log_fatal("echov6-socket: socket: %s", strerror(errno));
+ zlog_fatal("echov6-socket: socket: %s", strerror(errno));
bp_set_ipv6opts(s);
bp_bind_ipv6(s, BFD_DEF_ECHO_PORT);