X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fiface.c;h=39a860ae7cc9eff13ec8bd3678d9e57904afcb90;hb=0b78399f4f9d4b3cd53bf9f0ee923c1001bc2645;hp=38dfde1bd7850c105e617dbb6177ff335e4e57ee;hpb=1d74250dcd65768655d643010d4b884596d3fcc0;p=catta diff --git a/avahi-core/iface.c b/avahi-core/iface.c index 38dfde1..39a860a 100644 --- a/avahi-core/iface.c +++ b/avahi-core/iface.c @@ -90,12 +90,12 @@ void avahi_interface_address_update_rrs(AvahiInterfaceAddress *a, int remove_rrs char t[AVAHI_ADDRESS_STR_MAX]; avahi_address_snprint(t, sizeof(t), &a->address); + avahi_log_info("Withdrawing address record for %s on %s.", t, a->interface->hardware->name); + if (avahi_s_entry_group_get_state(a->entry_group) == AVAHI_ENTRY_GROUP_REGISTERING && m->server->state == AVAHI_SERVER_REGISTERING) avahi_server_decrease_host_rr_pending(m->server); - avahi_log_info("Withdrawing address record for %s on %s.", t, a->interface->hardware->name); - avahi_s_entry_group_reset(a->entry_group); } } @@ -151,7 +151,10 @@ void avahi_hw_interface_update_rrs(AvahiHwInterface *hw, int remove_rrs) { if (hw->entry_group && !avahi_s_entry_group_is_empty(hw->entry_group)) { - if (avahi_s_entry_group_get_state(hw->entry_group) == AVAHI_ENTRY_GROUP_REGISTERING) + avahi_log_info("Withdrawing workstation service for %s.", hw->name); + + if (avahi_s_entry_group_get_state(hw->entry_group) == AVAHI_ENTRY_GROUP_REGISTERING && + m->server->state == AVAHI_SERVER_REGISTERING) avahi_server_decrease_host_rr_pending(m->server); avahi_s_entry_group_reset(hw->entry_group); @@ -387,6 +390,9 @@ AvahiHwInterface *avahi_hw_interface_new(AvahiInterfaceMonitor *m, AvahiIfIndex hw->index = idx; hw->mac_address_size = 0; hw->entry_group = NULL; + hw->ratelimit_begin.tv_sec = 0; + hw->ratelimit_begin.tv_usec = 0; + hw->ratelimit_counter = 0; AVAHI_LLIST_HEAD_INIT(AvahiInterface, hw->interfaces); AVAHI_LLIST_PREPEND(AvahiHwInterface, hardware, m->hw_interfaces, hw); @@ -568,6 +574,27 @@ void avahi_interface_send_packet_unicast(AvahiInterface *i, AvahiDnsPacket *p, c assert(!a || a->proto == i->protocol); + if (i->monitor->server->config.ratelimit_interval > 0) { + struct timeval now, end; + + gettimeofday(&now, NULL); + + end = i->hardware->ratelimit_begin; + avahi_timeval_add(&end, i->monitor->server->config.ratelimit_interval); + + if (i->hardware->ratelimit_begin.tv_sec <= 0 || + avahi_timeval_compare(&end, &now) < 0) { + + i->hardware->ratelimit_begin = now; + i->hardware->ratelimit_counter = 0; + } + + if (i->hardware->ratelimit_counter > i->monitor->server->config.ratelimit_burst) + return; + + i->hardware->ratelimit_counter++; + } + if (i->protocol == AVAHI_PROTO_INET && i->monitor->server->fd_ipv4 >= 0) avahi_send_dns_packet_ipv4(i->monitor->server->fd_ipv4, i->hardware->index, p, i->mcast_joined ? &i->local_mcast_address.data.ipv4 : NULL, a ? &a->data.ipv4 : NULL, port); else if (i->protocol == AVAHI_PROTO_INET6 && i->monitor->server->fd_ipv6 >= 0)