Speed up interface carrier checking.
This is done by performing one synchronous query for carrier state at the start of the program; after that, we just monitor the nlsocket for carrier state changes and update the cached state accordingly. The benefit is that ifchd needs to do a lot less work and this should reduce the CPU cycle consumption; prior to this commit, the CPU time ends up being a few CPU-minutes per month.
This commit is contained in:
parent
ad1546ecb0
commit
f3766990f9
@ -224,7 +224,7 @@ static int ifchwrite(const char buf[static 1], size_t count)
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool carrier_isup(void)
|
||||
bool ifchange_carrier_isup(void)
|
||||
{
|
||||
char buf[256];
|
||||
snprintf(buf, sizeof buf, "carrier:;");
|
||||
|
@ -31,7 +31,7 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
bool carrier_isup(void);
|
||||
bool ifchange_carrier_isup(void);
|
||||
int ifchange_bind(struct client_state_t cs[static 1],
|
||||
struct dhcpmsg packet[static 1]);
|
||||
int ifchange_deconfig(struct client_state_t cs[static 1]);
|
||||
|
@ -110,6 +110,8 @@ int signals_flagged(void)
|
||||
return SIGNAL_NONE;
|
||||
}
|
||||
|
||||
bool carrier_isup(void) { return cs.carrier_up; }
|
||||
|
||||
void set_client_addr(const char v[static 1]) { cs.clientAddr = inet_addr(v); }
|
||||
|
||||
void print_version(void)
|
||||
@ -311,6 +313,7 @@ static void do_ndhc_work(void)
|
||||
if (pfds[0].revents & POLLIN) {
|
||||
had_event = true;
|
||||
sev_nl = nl_event_get(&cs);
|
||||
cs.carrier_up = (sev_nl == IFS_UP);
|
||||
}
|
||||
if (pfds[0].revents & (POLLHUP|POLLERR|POLLRDHUP)) {
|
||||
suicide("nlfd closed unexpectedly");
|
||||
@ -494,6 +497,7 @@ static void ndhc_main(void) {
|
||||
memset(chroot_dir, '\0', sizeof chroot_dir);
|
||||
nk_set_uidgid(ndhc_uid, ndhc_gid, (const unsigned char *)0, 0);
|
||||
|
||||
cs.carrier_up = ifchange_carrier_isup();
|
||||
if (!carrier_isup()) {
|
||||
if (ifchange_deconfig(&cs) < 0)
|
||||
suicide("%s: can't deconfigure interface settings", __func__);
|
||||
|
@ -61,7 +61,7 @@ struct client_state_t {
|
||||
enum arp_state server_arp_state, router_arp_state;
|
||||
enum fprint_state fp_state;
|
||||
bool using_dhcp_bpf, arp_is_defense, check_fingerprint, program_init,
|
||||
sent_renew_or_rebind;
|
||||
sent_renew_or_rebind, carrier_up;
|
||||
bool sent_gw_query, sent_first_announce, sent_second_announce;
|
||||
};
|
||||
|
||||
@ -99,6 +99,7 @@ extern uid_t ndhc_uid;
|
||||
extern gid_t ndhc_gid;
|
||||
|
||||
int signals_flagged(void);
|
||||
bool carrier_isup(void);
|
||||
void set_client_addr(const char v[static 1]);
|
||||
void show_usage(void);
|
||||
void signal_exit(int status);
|
||||
|
Loading…
Reference in New Issue
Block a user