)
{
interface_info_t ifi;
+ int need_refresh = 0;
isc_mem_t *mctx = NULL;
isc_interfaceiter_t *iter = NULL;
isc_boolean_t scan_ipv4 = ISC_FALSE;
unsigned int family;
interface_t interface;
interface_t *iface;
-
+
result = isc_interfaceiter_current(iter, &isc_if);
if (result != ISC_R_SUCCESS)
if (loopback_interface == &interface)
loopback_interface = iface;
+ need_refresh = 1;
+
ifi.action = IFS_CREATED;
ifi.interface = iface;
if (receiver && iface)
peer = ISC_LIST_HEAD(interf->peers);
/*
- * re-assign all peers interface bindings
+ * disconnect peer from deleted interface
*/
while (peer != NULL) {
struct peer *npeer = ISC_LIST_NEXT(peer, ilink);
/*
* this one just lost it's interface
*/
+ need_refresh = 1;
set_peerdstadr(peer, NULL);
- /*
- * see whether we can get a new one for him right now
- */
- peer_refresh_interface(peer);
peer = npeer;
}
delete_interface(interf);
interf = next;
}
}
+
+ /*
+ * now re-configure as the world has changed
+ */
+ if (need_refresh)
+ refresh_all_peerinterfaces();
}
printf("demobilize %u %d %d\n", peer_to_remove->associd,
peer_associations, peer_preempt);
#endif
+ set_peerdstadr(peer_to_remove, NULL);
+
peer_clear(peer_to_remove, "KILL");
hash = NTP_HASH_ADDR(&peer_to_remove->srcadr);
peer_hash_count[hash]--;
void
set_peerdstadr(struct peer *peer, struct interface *interface)
{
- if (peer->dstadr != NULL)
- {
- peer->dstadr->peercnt--;
- ISC_LIST_UNLINK_TYPE(peer->dstadr->peers, peer, ilink, struct peer);
- }
-
- if (peer->dstadr != interface)
- {
- peer->dstadr = interface;
- /* reset crypto information */
- peer_crypto_clear(peer);
- }
+ if (peer->dstadr != interface) {
+ if (peer->dstadr != NULL)
+ {
+ peer->dstadr->peercnt--;
+ ISC_LIST_UNLINK_TYPE(peer->dstadr->peers, peer, ilink, struct peer);
+ }
+ peer->dstadr = interface;
+ /* reset crypto information */
+ peer_crypto_clear(peer);
- if (peer->dstadr != NULL)
- {
- ISC_LIST_APPEND(peer->dstadr->peers, peer, ilink);
- peer->dstadr->peercnt++;
- }
+ if (peer->dstadr != NULL)
+ {
+ ISC_LIST_APPEND(peer->dstadr->peers, peer, ilink);
+ peer->dstadr->peercnt++;
+ }
+ }
}
/*
* attempt to re-rebind interface if necessary
*/
-void
+static void
peer_refresh_interface(struct peer *peer)
{
interface_t *niface;
- if (peer->dstadr) /* we only work for citizens that got lost */
- return;
-
niface = select_peerinterface(peer, &peer->srcadr, NULL, peer->cast_flags);
#ifdef DEBUG
}
}
#endif
+
if (niface != NULL) {
set_peerdstadr(peer, niface);
} else {
}
}
+/*
+ * refresh_all_peerinterfaces - see that all interface bindings are up to date
+ */
+void
+refresh_all_peerinterfaces(void)
+{
+ struct peer *peer, *next_peer;
+ int n;
+
+ /*
+ * this is called when te interfac list has changed
+ * give all peers a chance to find a better interface
+ */
+ for (n = 0; n < NTP_HASH_SIZE; n++) {
+ for (peer = peer_hash[n]; peer != 0; peer = next_peer) {
+ next_peer = peer->next;
+ peer_refresh_interface(peer);
+ }
+ }
+}
+
/*
* find an interface suitable for the src address
*/
/*
* Dump it, something screwed up
*/
+ set_peerdstadr(peer, NULL);
+
peer->next = peer_free;
peer_free = peer;
peer_free_count++;
(u_long)ntohl(ik->errcnt));
}
-#define IF_LIST_FMT "%2d %c %48s %c %12.12s %03x %3d %2d %5d %5d %5d %1d %2d\n"
-#define IF_LIST_FMT_STR "%2s %c %48s %c %12.12s %3s %3s %2s %5s %5s %5s %1s %2s\n"
+#define IF_LIST_FMT "%2d %c %48s %c %c %12.12s %03x %3d %2d %5d %5d %5d %2d %3d\n"
+#define IF_LIST_FMT_STR "%2s %c %48s %c %c %12.12s %3s %3s %2s %5s %5s %5s %2s %3s\n"
#define IF_LIST_AFMT_STR " %48s %c\n"
-#define IF_LIST_LABELS "#", 'A', "Address/Mask/Broadcast", 'T', "IF name", "Flg", "TL", "#M", "recv", "sent", "drop", "S", "PC"
+#define IF_LIST_LABELS "#", 'A', "Address/Mask/Broadcast", 'T', 'E', "IF name", "Flg", "TL", "#M", "recv", "sent", "drop", "S", "PC"
#define IF_LIST_LINE "==========================================================================================================\n"
static void
ntohl(ifs->ifindex),
actions[(ifs->action >= 1 && ifs->action < 4) ? ifs->action : 0],
stoa((&saddr)), 'A',
+ ifs->ignore_packets ? 'D' : 'E',
ifs->name,
ntohl(ifs->flags),
ntohl(ifs->last_ttl),