From c58b0f46dd84edf707ed0e7dcaf9a2001602e09d Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Thu, 30 Nov 2017 16:58:37 -0500 Subject: [PATCH] bgpd: use FOREACH_AFI_SAFI() Signed-off-by: Quentin Young --- bgpd/bgp_packet.c | 183 +++++++++++++++++++--------------------- ospfd/ospf_vty_clippy.c | 92 ++++++++++++++++++++ 2 files changed, 177 insertions(+), 98 deletions(-) create mode 100644 ospfd/ospf_vty_clippy.c diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c index 867c88111c..2dea82fe56 100644 --- a/bgpd/bgp_packet.c +++ b/bgpd/bgp_packet.c @@ -315,48 +315,45 @@ static void bgp_write_proceed_actions(struct peer *peer) struct bpacket *next_pkt; struct update_subgroup *subgrp; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - paf = peer_af_find(peer, afi, safi); - if (!paf) - continue; - subgrp = paf->subgroup; - if (!subgrp) - continue; + FOREACH_AFI_SAFI (afi, safi) { + paf = peer_af_find(peer, afi, safi); + if (!paf) + continue; + subgrp = paf->subgroup; + if (!subgrp) + continue; - next_pkt = paf->next_pkt_to_send; - if (next_pkt && next_pkt->buffer) { - BGP_TIMER_ON(peer->t_generate_updgrp_packets, - bgp_generate_updgrp_packets, 0); - return; - } + next_pkt = paf->next_pkt_to_send; + if (next_pkt && next_pkt->buffer) { + BGP_TIMER_ON(peer->t_generate_updgrp_packets, + bgp_generate_updgrp_packets, 0); + return; + } + + /* No packets readily available for AFI/SAFI, are there + * subgroup packets + * that need to be generated? */ + if (bpacket_queue_is_full(SUBGRP_INST(subgrp), + SUBGRP_PKTQ(subgrp)) + || subgroup_packets_to_build(subgrp)) { + BGP_TIMER_ON(peer->t_generate_updgrp_packets, + bgp_generate_updgrp_packets, 0); + return; + } - /* No packets readily available for AFI/SAFI, are there - * subgroup packets - * that need to be generated? */ - if (bpacket_queue_is_full(SUBGRP_INST(subgrp), - SUBGRP_PKTQ(subgrp)) - || subgroup_packets_to_build(subgrp)) { + /* No packets to send, see if EOR is pending */ + if (CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) { + if (!subgrp->t_coalesce && peer->afc_nego[afi][safi] + && peer->synctime + && !CHECK_FLAG(peer->af_sflags[afi][safi], + PEER_STATUS_EOR_SEND) + && safi != SAFI_MPLS_VPN) { BGP_TIMER_ON(peer->t_generate_updgrp_packets, bgp_generate_updgrp_packets, 0); return; } - - /* No packets to send, see if EOR is pending */ - if (CHECK_FLAG(peer->cap, PEER_CAP_RESTART_RCV)) { - if (!subgrp->t_coalesce - && peer->afc_nego[afi][safi] - && peer->synctime - && !CHECK_FLAG(peer->af_sflags[afi][safi], - PEER_STATUS_EOR_SEND) - && safi != SAFI_MPLS_VPN) { - BGP_TIMER_ON( - peer->t_generate_updgrp_packets, - bgp_generate_updgrp_packets, 0); - return; - } - } } + } } /** @@ -393,77 +390,67 @@ int bgp_generate_updgrp_packets(struct thread *thread) do { s = NULL; - for (afi = AFI_IP; afi < AFI_MAX; afi++) - for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) { - paf = peer_af_find(peer, afi, safi); - if (!paf || !PAF_SUBGRP(paf)) - continue; - next_pkt = paf->next_pkt_to_send; + FOREACH_AFI_SAFI (afi, safi) { + paf = peer_af_find(peer, afi, safi); + if (!paf || !PAF_SUBGRP(paf)) + continue; + next_pkt = paf->next_pkt_to_send; - /* - * Try to generate a packet for the peer if we - * are at the end of the list. Always try to - * push out WITHDRAWs first. - */ - if (!next_pkt || !next_pkt->buffer) { - next_pkt = subgroup_withdraw_packet( - PAF_SUBGRP(paf)); - if (!next_pkt || !next_pkt->buffer) - subgroup_update_packet( - PAF_SUBGRP(paf)); - next_pkt = paf->next_pkt_to_send; - } + /* + * Try to generate a packet for the peer if we are at + * the end of the list. Always try to push out + * WITHDRAWs first. + */ + if (!next_pkt || !next_pkt->buffer) { + next_pkt = subgroup_withdraw_packet( + PAF_SUBGRP(paf)); + if (!next_pkt || !next_pkt->buffer) + subgroup_update_packet(PAF_SUBGRP(paf)); + next_pkt = paf->next_pkt_to_send; + } - /* - * If we still don't have a packet to send to - * the peer, then try to find out out if we - * have to send eor or if not, skip to the next - * AFI, SAFI. Don't send the EOR prematurely... - * if the subgroup's coalesce timer is running, - * the adjacency-out structure is not created - * yet. - */ - if (!next_pkt || !next_pkt->buffer) { - if (CHECK_FLAG(peer->cap, - PEER_CAP_RESTART_RCV)) { - if (!(PAF_SUBGRP(paf)) - ->t_coalesce - && peer->afc_nego[afi][safi] - && peer->synctime - && !CHECK_FLAG( - peer->af_sflags - [afi] - [safi], - PEER_STATUS_EOR_SEND)) { - SET_FLAG( - peer->af_sflags - [afi] + /* + * If we still don't have a packet to send to the peer, + * then try to find out out if we have to send eor or + * if not, skip to the next AFI, SAFI. Don't send the + * EOR prematurely; if the subgroup's coalesce timer is + * running, the adjacency-out structure is not created + * yet. + */ + if (!next_pkt || !next_pkt->buffer) { + if (CHECK_FLAG(peer->cap, + PEER_CAP_RESTART_RCV)) { + if (!(PAF_SUBGRP(paf))->t_coalesce + && peer->afc_nego[afi][safi] + && peer->synctime + && !CHECK_FLAG( + peer->af_sflags[afi] + [safi], + PEER_STATUS_EOR_SEND)) { + SET_FLAG(peer->af_sflags[afi] [safi], - PEER_STATUS_EOR_SEND); - - if ((s = bgp_update_packet_eor( - peer, afi, - safi))) { - bgp_packet_add( - peer, - s); - bgp_writes_on( - peer); - } + PEER_STATUS_EOR_SEND); + + if ((s = bgp_update_packet_eor( + peer, afi, + safi))) { + bgp_packet_add(peer, s); + bgp_writes_on(peer); } } - continue; } + continue; + } - /* Found a packet template to send, overwrite - * packet with appropriate attributes from peer - * and advance peer */ - s = bpacket_reformat_for_peer(next_pkt, paf); - bgp_packet_add(peer, s); - bgp_writes_on(peer); - bpacket_queue_advance_peer(paf); - } + /* Found a packet template to send, overwrite + * packet with appropriate attributes from peer + * and advance peer */ + s = bpacket_reformat_for_peer(next_pkt, paf); + bgp_packet_add(peer, s); + bgp_writes_on(peer); + bpacket_queue_advance_peer(paf); + } } while (s && (++generated < wpq)); bgp_write_proceed_actions(peer); diff --git a/ospfd/ospf_vty_clippy.c b/ospfd/ospf_vty_clippy.c new file mode 100644 index 0000000000..bf75dd4236 --- /dev/null +++ b/ospfd/ospf_vty_clippy.c @@ -0,0 +1,92 @@ +/* ospf_router_id => "ospf router-id A.B.C.D" */ +DEFUN_CMD_FUNC_DECL(ospf_router_id) +#define funcdecl_ospf_router_id static int ospf_router_id_magic(\ + const struct cmd_element *self __attribute__ ((unused)),\ + struct vty *vty __attribute__ ((unused)),\ + int argc __attribute__ ((unused)),\ + struct cmd_token *argv[] __attribute__ ((unused)),\ + struct in_addr router_id,\ + const char * router_id_str __attribute__ ((unused))) +funcdecl_ospf_router_id; +DEFUN_CMD_FUNC_TEXT(ospf_router_id) +{ +#if 1 /* anything to parse? */ + int _i; +#if 1 /* anything that can fail? */ + unsigned _fail = 0, _failcnt = 0; +#endif + struct in_addr router_id = { INADDR_ANY }; + const char *router_id_str = NULL; + + for (_i = 0; _i < argc; _i++) { + if (!argv[_i]->varname) + continue; +#if 1 /* anything that can fail? */ + _fail = 0; +#endif + + if (!strcmp(argv[_i]->varname, "router_id")) { + router_id_str = argv[_i]->arg; + _fail = !inet_aton(argv[_i]->arg, &router_id); + } +#if 1 /* anything that can fail? */ + if (_fail) + vty_out (vty, "%% invalid input for %s: %s\n", + argv[_i]->varname, argv[_i]->arg); + _failcnt += _fail; +#endif + } +#if 1 /* anything that can fail? */ + if (_failcnt) + return CMD_WARNING; +#endif +#endif + return ospf_router_id_magic(self, vty, argc, argv, router_id, router_id_str); +} + +/* no_ospf_router_id => "no ospf router-id [A.B.C.D]" */ +DEFUN_CMD_FUNC_DECL(no_ospf_router_id) +#define funcdecl_no_ospf_router_id static int no_ospf_router_id_magic(\ + const struct cmd_element *self __attribute__ ((unused)),\ + struct vty *vty __attribute__ ((unused)),\ + int argc __attribute__ ((unused)),\ + struct cmd_token *argv[] __attribute__ ((unused)),\ + struct in_addr router_id,\ + const char * router_id_str __attribute__ ((unused))) +funcdecl_no_ospf_router_id; +DEFUN_CMD_FUNC_TEXT(no_ospf_router_id) +{ +#if 1 /* anything to parse? */ + int _i; +#if 1 /* anything that can fail? */ + unsigned _fail = 0, _failcnt = 0; +#endif + struct in_addr router_id = { INADDR_ANY }; + const char *router_id_str = NULL; + + for (_i = 0; _i < argc; _i++) { + if (!argv[_i]->varname) + continue; +#if 1 /* anything that can fail? */ + _fail = 0; +#endif + + if (!strcmp(argv[_i]->varname, "router_id")) { + router_id_str = argv[_i]->arg; + _fail = !inet_aton(argv[_i]->arg, &router_id); + } +#if 1 /* anything that can fail? */ + if (_fail) + vty_out (vty, "%% invalid input for %s: %s\n", + argv[_i]->varname, argv[_i]->arg); + _failcnt += _fail; +#endif + } +#if 1 /* anything that can fail? */ + if (_failcnt) + return CMD_WARNING; +#endif +#endif + return no_ospf_router_id_magic(self, vty, argc, argv, router_id, router_id_str); +} + -- 2.39.5