/* 11.2.A6, 11.2.A7 and 11.2.A8: shutdown the peer tcp connection */ void pim_msdp_peer_stop_tcp_conn(struct pim_msdp_peer *mp, bool chg_state) { if (chg_state) { if (mp->state == PIM_MSDP_ESTABLISHED) { ++mp->est_flaps; } mp->state = PIM_MSDP_INACTIVE; if (PIM_DEBUG_MSDP_EVENTS) { pim_msdp_peer_state_chg_log(mp); } } if (PIM_DEBUG_MSDP_INTERNAL) { zlog_debug("MSDP peer %s pim_msdp_peer_stop_tcp_conn", mp->key_str); } /* stop read and write threads */ PIM_MSDP_PEER_READ_OFF(mp); PIM_MSDP_PEER_WRITE_OFF(mp); /* reset buffers */ mp->packet_size = 0; if (mp->ibuf) stream_reset(mp->ibuf); if (mp->obuf) stream_fifo_clean(mp->obuf); /* stop all peer timers */ pim_msdp_peer_ka_timer_setup(mp, false /* start */); pim_msdp_peer_cr_timer_setup(mp, false /* start */); pim_msdp_peer_hold_timer_setup(mp, false /* start */); /* close connection */ if (mp->fd >= 0) { close(mp->fd); mp->fd = -1; } }
static void ppp_connect_mcp_error_deal(struct ppp_mcp_sock *peer) { PPPD_DEBUG_TCP("ppp mcp connect error deal, close fd"); MCP_READ_OFF (peer->t_read); MCP_WRITE_OFF (peer->t_write); MCP_TIMER_OFF (peer->t_holdtime); MCP_TIMER_OFF (peer->t_keepalive); MCP_WRITE_OFF (peer->t_check); if (peer->fd > 0) { close (peer->fd); peer->fd = -1; } if (peer->ibuf) stream_reset (peer->ibuf); if (peer->obuf) stream_fifo_clean (peer->obuf); peer->connect_status = 0; return; }
/* May be called multiple times for the same peer */ int bgp_stop (struct peer *peer) { afi_t afi; safi_t safi; char orf_name[BUFSIZ]; /* Can't do this in Clearing; events are used for state transitions */ if (peer->status != Clearing) { /* Delete all existing events of the peer */ BGP_EVENT_FLUSH (peer); } /* Increment Dropped count. */ if (peer->status == Established) { peer->dropped++; /* bgp log-neighbor-changes of neighbor Down */ if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) zlog_info ("%%ADJCHANGE: neighbor %s Down %s", peer->host, peer_down_str [(int) peer->last_reset]); /* graceful restart */ if (peer->t_gr_stale) { BGP_TIMER_OFF (peer->t_gr_stale); if (BGP_DEBUG (events, EVENTS)) zlog_debug ("%s graceful restart stalepath timer stopped", peer->host); } if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)) { if (BGP_DEBUG (events, EVENTS)) { zlog_debug ("%s graceful restart timer started for %d sec", peer->host, peer->v_gr_restart); zlog_debug ("%s graceful restart stalepath timer started for %d sec", peer->host, peer->bgp->stalepath_time); } BGP_TIMER_ON (peer->t_gr_restart, bgp_graceful_restart_timer_expire, peer->v_gr_restart); BGP_TIMER_ON (peer->t_gr_stale, bgp_graceful_stale_timer_expire, peer->bgp->stalepath_time); } else { UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++) peer->nsf[afi][safi] = 0; } /* set last reset time */ peer->resettime = peer->uptime = bgp_clock (); #ifdef HAVE_SNMP bgpTrapBackwardTransition (peer); #endif /* HAVE_SNMP */ /* Reset peer synctime */ peer->synctime = 0; } /* Stop read and write threads when exists. */ BGP_READ_OFF (peer->t_read); BGP_WRITE_OFF (peer->t_write); /* Stop all timers. */ BGP_TIMER_OFF (peer->t_start); BGP_TIMER_OFF (peer->t_connect); BGP_TIMER_OFF (peer->t_holdtime); BGP_TIMER_OFF (peer->t_keepalive); BGP_TIMER_OFF (peer->t_asorig); BGP_TIMER_OFF (peer->t_routeadv); /* Stream reset. */ peer->packet_size = 0; /* Clear input and output buffer. */ if (peer->ibuf) stream_reset (peer->ibuf); if (peer->work) stream_reset (peer->work); if (peer->obuf) stream_fifo_clean (peer->obuf); /* Close of file descriptor. */ if (peer->fd >= 0) { close (peer->fd); peer->fd = -1; } for (afi = AFI_IP ; afi < AFI_MAX ; afi++) for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) { /* Reset all negotiated variables */ peer->afc_nego[afi][safi] = 0; peer->afc_adv[afi][safi] = 0; peer->afc_recv[afi][safi] = 0; /* peer address family capability flags*/ peer->af_cap[afi][safi] = 0; /* peer address family status flags*/ peer->af_sflags[afi][safi] = 0; /* Received ORF prefix-filter */ peer->orf_plist[afi][safi] = NULL; /* ORF received prefix-filter pnt */ sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi); prefix_bgp_orf_remove_all (orf_name); } /* Reset keepalive and holdtime */ if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)) { peer->v_keepalive = peer->keepalive; peer->v_holdtime = peer->holdtime; } else { peer->v_keepalive = peer->bgp->default_keepalive; peer->v_holdtime = peer->bgp->default_holdtime; } peer->update_time = 0; /* Until we are sure that there is no problem about prefix count this should be commented out.*/ #if 0 /* Reset prefix count */ peer->pcount[AFI_IP][SAFI_UNICAST] = 0; peer->pcount[AFI_IP][SAFI_MULTICAST] = 0; peer->pcount[AFI_IP][SAFI_MPLS_VPN] = 0; peer->pcount[AFI_IP6][SAFI_UNICAST] = 0; peer->pcount[AFI_IP6][SAFI_MULTICAST] = 0; #endif /* 0 */ return 0; }
/* Administrative BGP peer stop event. */ int bgp_stop (struct peer *peer) { int established = 0; afi_t afi; safi_t safi; char orf_name[BUFSIZ]; /* Increment Dropped count. */ if (peer->status == Established) { established = 1; peer->dropped++; bgp_fsm_change_status (peer, Idle); #ifdef HAVE_SNMP bgpTrapBackwardTransition (peer); #endif /* HAVE_SNMP */ } /* Reset uptime. */ bgp_uptime_reset (peer); /* Need of clear of peer. */ if (established) bgp_clear_route_all (peer); /* Stop read and write threads when exists. */ BGP_READ_OFF (peer->t_read); BGP_WRITE_OFF (peer->t_write); /* Stop all timers. */ BGP_TIMER_OFF (peer->t_start); BGP_TIMER_OFF (peer->t_connect); BGP_TIMER_OFF (peer->t_holdtime); BGP_TIMER_OFF (peer->t_keepalive); BGP_TIMER_OFF (peer->t_asorig); BGP_TIMER_OFF (peer->t_routeadv); /* Delete all existing events of the peer. */ BGP_EVENT_DELETE (peer); /* Stream reset. */ peer->packet_size = 0; /* Clear input and output buffer. */ if (peer->ibuf) stream_reset (peer->ibuf); if (peer->work) stream_reset (peer->work); stream_fifo_clean (peer->obuf); /* Close of file descriptor. */ if (peer->fd >= 0) { close (peer->fd); peer->fd = -1; } /* Connection information. */ if (peer->su_local) { XFREE (MTYPE_SOCKUNION, peer->su_local); peer->su_local = NULL; } if (peer->su_remote) { XFREE (MTYPE_SOCKUNION, peer->su_remote); peer->su_remote = NULL; } /* Clear remote router-id. */ peer->remote_id.s_addr = 0; /* Reset all negotiated variables */ peer->afc_nego[AFI_IP][SAFI_UNICAST] = 0; peer->afc_nego[AFI_IP][SAFI_MULTICAST] = 0; peer->afc_nego[AFI_IP][SAFI_MPLS_VPN] = 0; peer->afc_nego[AFI_IP6][SAFI_UNICAST] = 0; peer->afc_nego[AFI_IP6][SAFI_MULTICAST] = 0; peer->afc_adv[AFI_IP][SAFI_UNICAST] = 0; peer->afc_adv[AFI_IP][SAFI_MULTICAST] = 0; peer->afc_adv[AFI_IP][SAFI_MPLS_VPN] = 0; peer->afc_adv[AFI_IP6][SAFI_UNICAST] = 0; peer->afc_adv[AFI_IP6][SAFI_MULTICAST] = 0; peer->afc_recv[AFI_IP][SAFI_UNICAST] = 0; peer->afc_recv[AFI_IP][SAFI_MULTICAST] = 0; peer->afc_recv[AFI_IP][SAFI_MPLS_VPN] = 0; peer->afc_recv[AFI_IP6][SAFI_UNICAST] = 0; peer->afc_recv[AFI_IP6][SAFI_MULTICAST] = 0; /* Reset route refresh flag. */ UNSET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV); UNSET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV); UNSET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV); UNSET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV); UNSET_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV); for (afi = AFI_IP ; afi < AFI_MAX ; afi++) for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++) { /* peer address family capability flags*/ peer->af_cap[afi][safi] = 0; /* peer address family status flags*/ peer->af_sflags[afi][safi] = 0; /* Received ORF prefix-filter */ peer->orf_plist[afi][safi] = NULL; /* ORF received prefix-filter pnt */ sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi); prefix_bgp_orf_remove_all (orf_name); } UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST], PEER_FLAG_DEFAULT_ORIGINATE_CHECK); UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MULTICAST], PEER_FLAG_DEFAULT_ORIGINATE_CHECK); UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST], PEER_FLAG_DEFAULT_ORIGINATE_CHECK); UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_MULTICAST], PEER_FLAG_DEFAULT_ORIGINATE_CHECK); /* Reset keepalive and holdtime */ if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)) { peer->v_keepalive = peer->keepalive; peer->v_holdtime = peer->holdtime; } else { peer->v_keepalive = peer->bgp->default_keepalive; peer->v_holdtime = peer->bgp->default_holdtime; } peer->update_time = 0; /* Until we are sure that there is no problem about prefix count this should be commented out.*/ #if 0 /* Reset prefix count */ peer->pcount[AFI_IP][SAFI_UNICAST] = 0; peer->pcount[AFI_IP][SAFI_MULTICAST] = 0; peer->pcount[AFI_IP][SAFI_MPLS_VPN] = 0; peer->pcount[AFI_IP6][SAFI_UNICAST] = 0; peer->pcount[AFI_IP6][SAFI_MULTICAST] = 0; #endif /* 0 */ return 0; }