diff options
Diffstat (limited to 'pimd/pim_msdp.c')
| -rw-r--r-- | pimd/pim_msdp.c | 37 | 
1 files changed, 32 insertions, 5 deletions
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c index 0bb2d93a3a..215cc3c502 100644 --- a/pimd/pim_msdp.c +++ b/pimd/pim_msdp.c @@ -773,7 +773,10 @@ static void pim_msdp_peer_listen(struct pim_msdp_peer *mp)  	* first listening peer is configured; but don't bother tearing it down  	* when  	* all the peers go down */ -	pim_msdp_sock_listen(mp->pim); +	if (mp->auth_type == MSDP_AUTH_NONE) +		pim_msdp_sock_listen(mp->pim); +	else +		pim_msdp_sock_auth_listen(mp);  }  /* 11.2.A4 and 11.2.A5: transition active or passive peer to @@ -1045,6 +1048,7 @@ struct pim_msdp_peer *pim_msdp_peer_add(struct pim_instance *pim,  	mp->state = PIM_MSDP_INACTIVE;  	mp->fd = -1; +	mp->auth_listen_sock = -1;  	strlcpy(mp->last_reset, "-", sizeof(mp->last_reset));  	/* higher IP address is listener */  	if (ntohl(mp->local.s_addr) > ntohl(mp->peer.s_addr)) { @@ -1100,6 +1104,12 @@ static void pim_msdp_peer_free(struct pim_msdp_peer *mp)  		stream_fifo_free(mp->obuf);  	} +	/* Free authentication data. */ +	event_cancel(&mp->auth_listen_ev); +	XFREE(MTYPE_PIM_MSDP_AUTH_KEY, mp->auth_key); +	if (mp->auth_listen_sock != -1) +		close(mp->auth_listen_sock); +  	XFREE(MTYPE_PIM_MSDP_MG_NAME, mp->mesh_group_name);  	mp->pim = NULL; @@ -1128,19 +1138,32 @@ void pim_msdp_peer_del(struct pim_msdp_peer **mp)  	*mp = NULL;  } -void pim_msdp_peer_change_source(struct pim_msdp_peer *mp, -				 const struct in_addr *addr) +void pim_msdp_peer_restart(struct pim_msdp_peer *mp)  { -	pim_msdp_peer_stop_tcp_conn(mp, true); +	/* Stop auth listening socket if any. */ +	event_cancel(&mp->auth_listen_ev); +	if (mp->auth_listen_sock != -1) { +		close(mp->auth_listen_sock); +		mp->auth_listen_sock = -1; +	} -	mp->local = *addr; +	/* Stop previously running connection. */ +	pim_msdp_peer_stop_tcp_conn(mp, true); +	/* Start connection again. */  	if (PIM_MSDP_PEER_IS_LISTENER(mp))  		pim_msdp_peer_listen(mp);  	else  		pim_msdp_peer_connect(mp);  } +void pim_msdp_peer_change_source(struct pim_msdp_peer *mp, +				 const struct in_addr *addr) +{ +	mp->local = *addr; +	pim_msdp_peer_restart(mp); +} +  /* peer hash and peer list helpers */  static unsigned int pim_msdp_peer_hash_key_make(const void *p)  { @@ -1318,6 +1341,10 @@ bool pim_msdp_peer_config_write(struct vty *vty, struct pim_instance *pim)  		vty_out(vty, " msdp peer %pI4 source %pI4\n", &mp->peer,  			&mp->local); +		if (mp->auth_type == MSDP_AUTH_MD5) +			vty_out(vty, " msdp peer %pI4 password %s\n", &mp->peer, +				mp->auth_key); +  		if (mp->acl_in)  			vty_out(vty, " msdp peer %pI4 sa-filter %s in\n",  				&mp->peer, mp->acl_in);  | 
