ldpd: changes for code maintainability

these changes are for improving the code maintainability and readability

Signed-off-by: sri-mohan1 <sri.mohan@samsung.com>
This commit is contained in:
sri-mohan1 2023-05-23 23:20:01 +05:30
parent 575a0c5e3c
commit bcffa75902

View File

@ -41,8 +41,8 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
/* multicast destination address */ /* multicast destination address */
switch (af) { switch (af) {
case AF_INET: case AF_INET:
if (!(leconf->ipv4.flags & F_LDPD_AF_NO_GTSM)) if (!CHECK_FLAG(leconf->ipv4.flags, F_LDPD_AF_NO_GTSM))
flags |= F_HELLO_GTSM; SET_FLAG(flags, F_HELLO_GTSM);
dst.v4 = global.mcast_addr_v4; dst.v4 = global.mcast_addr_v4;
break; break;
case AF_INET6: case AF_INET6:
@ -56,9 +56,11 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
af = tnbr->af; af = tnbr->af;
holdtime = tnbr_get_hello_holdtime(tnbr); holdtime = tnbr_get_hello_holdtime(tnbr);
flags = F_HELLO_TARGETED; flags = F_HELLO_TARGETED;
if ((tnbr->flags & F_TNBR_CONFIGURED) || tnbr->pw_count if (CHECK_FLAG(tnbr->flags, F_TNBR_CONFIGURED) ||
|| tnbr->rlfa_count) tnbr->pw_count ||
tnbr->rlfa_count)
flags |= F_HELLO_REQ_TARG; flags |= F_HELLO_REQ_TARG;
fd = (ldp_af_global_get(&global, af))->ldp_edisc_socket; fd = (ldp_af_global_get(&global, af))->ldp_edisc_socket;
/* unicast destination address */ /* unicast destination address */
@ -88,10 +90,10 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
if ((buf = ibuf_open(size)) == NULL) if ((buf = ibuf_open(size)) == NULL)
fatal(__func__); fatal(__func__);
err |= gen_ldp_hdr(buf, size); SET_FLAG(err, gen_ldp_hdr(buf, size));
size -= LDP_HDR_SIZE; size -= LDP_HDR_SIZE;
err |= gen_msg_hdr(buf, MSG_TYPE_HELLO, size); SET_FLAG(err, gen_msg_hdr(buf, MSG_TYPE_HELLO, size));
err |= gen_hello_prms_tlv(buf, holdtime, flags); SET_FLAG(err, gen_hello_prms_tlv(buf, holdtime, flags));
/* /*
* RFC 7552 - Section 6.1: * RFC 7552 - Section 6.1:
@ -101,19 +103,19 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
*/ */
switch (af) { switch (af) {
case AF_INET: case AF_INET:
err |= gen_opt4_hello_prms_tlv(buf, TLV_TYPE_IPV4TRANSADDR, SET_FLAG(err, gen_opt4_hello_prms_tlv(buf, TLV_TYPE_IPV4TRANSADDR,
leconf->ipv4.trans_addr.v4.s_addr); leconf->ipv4.trans_addr.v4.s_addr));
break; break;
case AF_INET6: case AF_INET6:
err |= gen_opt16_hello_prms_tlv(buf, TLV_TYPE_IPV6TRANSADDR, SET_FLAG(err, gen_opt16_hello_prms_tlv(buf, TLV_TYPE_IPV6TRANSADDR,
leconf->ipv6.trans_addr.v6.s6_addr); leconf->ipv6.trans_addr.v6.s6_addr));
break; break;
default: default:
fatalx("send_hello: unknown af"); fatalx("send_hello: unknown af");
} }
err |= gen_opt4_hello_prms_tlv(buf, TLV_TYPE_CONFIG, SET_FLAG(err, gen_opt4_hello_prms_tlv(buf, TLV_TYPE_CONFIG,
htonl(global.conf_seqnum)); htonl(global.conf_seqnum)));
/* /*
* RFC 7552 - Section 6.1.1: * RFC 7552 - Section 6.1.1:
@ -121,7 +123,7 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
* MUST include the Dual-Stack capability TLV in all of its LDP Hellos". * MUST include the Dual-Stack capability TLV in all of its LDP Hellos".
*/ */
if (ldp_is_dual_stack(leconf)) if (ldp_is_dual_stack(leconf))
err |= gen_ds_hello_prms_tlv(buf, leconf->trans_pref); SET_FLAG(err, gen_ds_hello_prms_tlv(buf, leconf->trans_pref));
if (err) { if (err) {
ibuf_free(buf); ibuf_free(buf);
@ -169,8 +171,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
r = tlv_decode_hello_prms(buf, len, &holdtime, &flags); r = tlv_decode_hello_prms(buf, len, &holdtime, &flags);
if (r == -1) { if (r == -1) {
log_debug("%s: lsr-id %pI4: failed to decode params", __func__, log_debug("%s: lsr-id %pI4: failed to decode params", __func__, &lsr_id);
&lsr_id);
return; return;
} }
/* safety checks */ /* safety checks */
@ -179,14 +180,12 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
__func__, &lsr_id, holdtime); __func__, &lsr_id, holdtime);
return; return;
} }
if (multicast && (flags & F_HELLO_TARGETED)) { if (multicast && CHECK_FLAG(flags, F_HELLO_TARGETED)) {
log_debug("%s: lsr-id %pI4: multicast targeted hello", __func__, log_debug("%s: lsr-id %pI4: multicast targeted hello", __func__, &lsr_id);
&lsr_id);
return; return;
} }
if (!multicast && !((flags & F_HELLO_TARGETED))) { if (!multicast && !CHECK_FLAG(flags, F_HELLO_TARGETED)) {
log_debug("%s: lsr-id %pI4: unicast link hello", __func__, log_debug("%s: lsr-id %pI4: unicast link hello", __func__, &lsr_id);
&lsr_id);
return; return;
} }
buf += r; buf += r;
@ -204,10 +203,10 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
__func__, &lsr_id); __func__, &lsr_id);
return; return;
} }
ds_tlv = (tlvs_rcvd & F_HELLO_TLV_RCVD_DS) ? 1 : 0; ds_tlv = CHECK_FLAG(tlvs_rcvd, F_HELLO_TLV_RCVD_DS) ? 1 : 0;
/* implicit transport address */ /* implicit transport address */
if (!(tlvs_rcvd & F_HELLO_TLV_RCVD_ADDR)) if (!CHECK_FLAG(tlvs_rcvd, F_HELLO_TLV_RCVD_ADDR))
trans_addr = *src; trans_addr = *src;
if (bad_addr(af, &trans_addr)) { if (bad_addr(af, &trans_addr)) {
log_debug("%s: lsr-id %pI4: invalid transport address %s", log_debug("%s: lsr-id %pI4: invalid transport address %s",
@ -223,7 +222,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
* (i.e., MUST discard the targeted Hello if it failed the * (i.e., MUST discard the targeted Hello if it failed the
* check)". * check)".
*/ */
if (flags & F_HELLO_TARGETED) { if (CHECK_FLAG(flags, F_HELLO_TARGETED)) {
log_debug("%s: lsr-id %pI4: invalid targeted hello transport address %s", __func__, &lsr_id, log_debug("%s: lsr-id %pI4: invalid targeted hello transport address %s", __func__, &lsr_id,
log_addr(af, &trans_addr)); log_addr(af, &trans_addr));
return; return;
@ -232,7 +231,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
} }
memset(&source, 0, sizeof(source)); memset(&source, 0, sizeof(source));
if (flags & F_HELLO_TARGETED) { if (CHECK_FLAG(flags, F_HELLO_TARGETED)) {
/* /*
* RFC 7552 - Section 5.2: * RFC 7552 - Section 5.2:
* "The link-local IPv6 addresses MUST NOT be used as the * "The link-local IPv6 addresses MUST NOT be used as the
@ -247,26 +246,27 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
tnbr = tnbr_find(leconf, af, src); tnbr = tnbr_find(leconf, af, src);
/* remove the dynamic tnbr if the 'R' bit was cleared */ /* remove the dynamic tnbr if the 'R' bit was cleared */
if (tnbr && (tnbr->flags & F_TNBR_DYNAMIC) && if (tnbr &&
!((flags & F_HELLO_REQ_TARG))) { CHECK_FLAG(tnbr->flags, F_TNBR_DYNAMIC) &&
tnbr->flags &= ~F_TNBR_DYNAMIC; !CHECK_FLAG(flags, F_HELLO_REQ_TARG)) {
UNSET_FLAG(tnbr->flags, F_TNBR_DYNAMIC);
tnbr = tnbr_check(leconf, tnbr); tnbr = tnbr_check(leconf, tnbr);
} }
if (!tnbr) { if (!tnbr) {
struct ldpd_af_conf *af_conf; struct ldpd_af_conf *af_conf;
if (!(flags & F_HELLO_REQ_TARG)) if (!CHECK_FLAG(flags, F_HELLO_REQ_TARG))
return; return;
af_conf = ldp_af_conf_get(leconf, af); af_conf = ldp_af_conf_get(leconf, af);
if (!(af_conf->flags & F_LDPD_AF_THELLO_ACCEPT)) if (!CHECK_FLAG(af_conf->flags, F_LDPD_AF_THELLO_ACCEPT))
return; return;
if (ldpe_acl_check(af_conf->acl_thello_accept_from, af, if (ldpe_acl_check(af_conf->acl_thello_accept_from, af,
src, (af == AF_INET) ? 32 : 128) != FILTER_PERMIT) src, (af == AF_INET) ? 32 : 128) != FILTER_PERMIT)
return; return;
tnbr = tnbr_new(af, src); tnbr = tnbr_new(af, src);
tnbr->flags |= F_TNBR_DYNAMIC; SET_FLAG(tnbr->flags, F_TNBR_DYNAMIC);
tnbr_update(tnbr); tnbr_update(tnbr);
RB_INSERT(tnbr_head, &leconf->tnbr_tree, tnbr); RB_INSERT(tnbr_head, &leconf->tnbr_tree, tnbr);
} }
@ -308,8 +308,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
*/ */
log_debug("%s: lsr-id %pI4: remote transport preference does not match the local preference", __func__, &lsr_id); log_debug("%s: lsr-id %pI4: remote transport preference does not match the local preference", __func__, &lsr_id);
if (nbr) if (nbr)
session_shutdown(nbr, S_TRANS_MISMTCH, msg->id, session_shutdown(nbr, S_TRANS_MISMTCH, msg->id, msg->type);
msg->type);
if (adj) if (adj)
adj_del(adj, S_SHUTDOWN); adj_del(adj, S_SHUTDOWN);
return; return;
@ -323,15 +322,13 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
switch (af) { switch (af) {
case AF_INET: case AF_INET:
if (nbr_adj_count(nbr, AF_INET6) > 0) { if (nbr_adj_count(nbr, AF_INET6) > 0) {
session_shutdown(nbr, S_DS_NONCMPLNCE, session_shutdown(nbr, S_DS_NONCMPLNCE, msg->id, msg->type);
msg->id, msg->type);
return; return;
} }
break; break;
case AF_INET6: case AF_INET6:
if (nbr_adj_count(nbr, AF_INET) > 0) { if (nbr_adj_count(nbr, AF_INET) > 0) {
session_shutdown(nbr, S_DS_NONCMPLNCE, session_shutdown(nbr, S_DS_NONCMPLNCE, msg->id, msg->type);
msg->id, msg->type);
return; return;
} }
break; break;
@ -384,16 +381,15 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *msg, int af,
/* dynamic LDPv4 GTSM negotiation as per RFC 6720 */ /* dynamic LDPv4 GTSM negotiation as per RFC 6720 */
if (nbr) { if (nbr) {
if (flags & F_HELLO_GTSM) if (CHECK_FLAG(flags, F_HELLO_GTSM))
nbr->flags |= F_NBR_GTSM_NEGOTIATED; SET_FLAG(nbr->flags, F_NBR_GTSM_NEGOTIATED);
else else
nbr->flags &= ~F_NBR_GTSM_NEGOTIATED; UNSET_FLAG(nbr->flags, F_NBR_GTSM_NEGOTIATED);
} }
/* update neighbor's configuration sequence number */ /* update neighbor's configuration sequence number */
if (nbr && (tlvs_rcvd & F_HELLO_TLV_RCVD_CONF)) { if (nbr && (tlvs_rcvd & F_HELLO_TLV_RCVD_CONF)) {
if (conf_seqnum > nbr->conf_seqnum && if (conf_seqnum > nbr->conf_seqnum && nbr_pending_idtimer(nbr))
nbr_pending_idtimer(nbr))
nbr_stop_idtimer(nbr); nbr_stop_idtimer(nbr);
nbr->conf_seqnum = conf_seqnum; nbr->conf_seqnum = conf_seqnum;
} }
@ -465,7 +461,7 @@ gen_opt16_hello_prms_tlv(struct ibuf *buf, uint16_t type, uint8_t *value)
static int static int
gen_ds_hello_prms_tlv(struct ibuf *buf, uint32_t value) gen_ds_hello_prms_tlv(struct ibuf *buf, uint32_t value)
{ {
if (leconf->flags & F_LDPD_DS_CISCO_INTEROP) if (CHECK_FLAG(leconf->flags, F_LDPD_DS_CISCO_INTEROP))
value = htonl(value); value = htonl(value);
else else
value = htonl(value << 28); value = htonl(value << 28);
@ -533,26 +529,26 @@ tlv_decode_opt_hello_prms(char *buf, uint16_t len, int *tlvs_rcvd, int af,
return (-1); return (-1);
if (af != AF_INET) if (af != AF_INET)
return (-1); return (-1);
if (*tlvs_rcvd & F_HELLO_TLV_RCVD_ADDR) if (CHECK_FLAG(*tlvs_rcvd, F_HELLO_TLV_RCVD_ADDR))
break; break;
memcpy(&addr->v4, buf, sizeof(addr->v4)); memcpy(&addr->v4, buf, sizeof(addr->v4));
*tlvs_rcvd |= F_HELLO_TLV_RCVD_ADDR; SET_FLAG(*tlvs_rcvd, F_HELLO_TLV_RCVD_ADDR);
break; break;
case TLV_TYPE_IPV6TRANSADDR: case TLV_TYPE_IPV6TRANSADDR:
if (tlv_len != sizeof(addr->v6)) if (tlv_len != sizeof(addr->v6))
return (-1); return (-1);
if (af != AF_INET6) if (af != AF_INET6)
return (-1); return (-1);
if (*tlvs_rcvd & F_HELLO_TLV_RCVD_ADDR) if (CHECK_FLAG(*tlvs_rcvd, F_HELLO_TLV_RCVD_ADDR))
break; break;
memcpy(&addr->v6, buf, sizeof(addr->v6)); memcpy(&addr->v6, buf, sizeof(addr->v6));
*tlvs_rcvd |= F_HELLO_TLV_RCVD_ADDR; SET_FLAG(*tlvs_rcvd, F_HELLO_TLV_RCVD_ADDR);
break; break;
case TLV_TYPE_CONFIG: case TLV_TYPE_CONFIG:
if (tlv_len != sizeof(uint32_t)) if (tlv_len != sizeof(uint32_t))
return (-1); return (-1);
memcpy(conf_number, buf, sizeof(uint32_t)); memcpy(conf_number, buf, sizeof(uint32_t));
*tlvs_rcvd |= F_HELLO_TLV_RCVD_CONF; SET_FLAG(*tlvs_rcvd, F_HELLO_TLV_RCVD_CONF);
break; break;
case TLV_TYPE_DUALSTACK: case TLV_TYPE_DUALSTACK:
if (tlv_len != sizeof(uint32_t)) if (tlv_len != sizeof(uint32_t))
@ -566,19 +562,18 @@ tlv_decode_opt_hello_prms(char *buf, uint16_t len, int *tlvs_rcvd, int af,
if (!ldp_is_dual_stack(leconf)) if (!ldp_is_dual_stack(leconf))
break; break;
/* Shame on you, Cisco! */ /* Shame on you, Cisco! */
if (leconf->flags & F_LDPD_DS_CISCO_INTEROP) { if (CHECK_FLAG(leconf->flags, F_LDPD_DS_CISCO_INTEROP)) {
memcpy(trans_pref, buf + sizeof(uint16_t), memcpy(trans_pref, buf + sizeof(uint16_t), sizeof(uint16_t));
sizeof(uint16_t));
*trans_pref = ntohs(*trans_pref); *trans_pref = ntohs(*trans_pref);
} else { } else {
memcpy(trans_pref, buf , sizeof(uint16_t)); memcpy(trans_pref, buf , sizeof(uint16_t));
*trans_pref = ntohs(*trans_pref) >> 12; *trans_pref = ntohs(*trans_pref) >> 12;
} }
*tlvs_rcvd |= F_HELLO_TLV_RCVD_DS; SET_FLAG(*tlvs_rcvd, F_HELLO_TLV_RCVD_DS);
break; break;
default: default:
/* if unknown flag set, ignore TLV */ /* if unknown flag set, ignore TLV */
if (!(ntohs(tlv.type) & UNKNOWN_FLAG)) if (!CHECK_FLAG(ntohs(tlv.type), UNKNOWN_FLAG))
return (-1); return (-1);
break; break;
} }