set_peerdstadr(struct peer *peer, struct interface *interface)
{
if (peer->dstadr != interface) {
- struct interface *prev_dstadr = peer->dstadr;
-
if (peer->dstadr != NULL)
{
peer->dstadr->peercnt--;
peer->dstadr = interface;
- if (prev_dstadr != NULL) {
- /*
- * reset crypto information if we change from an
- * active interface
- * all other crypto updates are handled by the crypto
- * machinery
- */
- peer_crypto_clear(peer);
- }
-
if (peer->dstadr != NULL)
{
ISC_LIST_APPEND(peer->dstadr->peers, peer, ilink);
static void
peer_refresh_interface(struct peer *peer)
{
- struct interface *niface;
+ struct interface *niface, *piface;
niface = select_peerinterface(peer, &peer->srcadr, NULL, peer->cast_flags);
}
#endif
+ piface = peer->dstadr;
+
set_peerdstadr(peer, niface);
if (peer->dstadr) {
+ /*
+ * clear crypto if we change the local address
+ */
+ if (peer->dstadr != piface) {
+ peer_crypto_clear(peer);
+ }
+
/*
* Broadcast needs the socket enabled for broadcast
*/