If the rfkill switch is enabled, do not react to netlink notifications
until the rfkill is disabled. They will mostly fail outright.
This commit is contained in:
parent
cf81573082
commit
5b050ba498
@ -47,6 +47,7 @@ struct client_state_t {
|
|||||||
struct nk_random_state_u32 rnd32_state;
|
struct nk_random_state_u32 rnd32_state;
|
||||||
uint8_t routerArp[6], serverArp[6];
|
uint8_t routerArp[6], serverArp[6];
|
||||||
uint8_t using_dhcp_bpf, init, got_router_arp, got_server_arp;
|
uint8_t using_dhcp_bpf, init, got_router_arp, got_server_arp;
|
||||||
|
uint8_t rfkill_set;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct client_config_t {
|
struct client_config_t {
|
||||||
|
@ -48,6 +48,12 @@ static void nl_process_msgs(const struct nlmsghdr *nlh, void *data)
|
|||||||
struct ifinfomsg *ifm = NLMSG_DATA(nlh);
|
struct ifinfomsg *ifm = NLMSG_DATA(nlh);
|
||||||
struct client_state_t *cs = data;
|
struct client_state_t *cs = data;
|
||||||
|
|
||||||
|
// If the rfkill switch is set, a lot of netlink state change
|
||||||
|
// commands will fail outright, so just ignore events until
|
||||||
|
// it is gone.
|
||||||
|
if (cs->rfkill_set)
|
||||||
|
return;
|
||||||
|
|
||||||
switch(nlh->nlmsg_type) {
|
switch(nlh->nlmsg_type) {
|
||||||
case RTM_NEWLINK:
|
case RTM_NEWLINK:
|
||||||
if (ifm->ifi_index != client_config.ifindex)
|
if (ifm->ifi_index != client_config.ifindex)
|
||||||
|
@ -70,6 +70,7 @@ void handle_rfkill_notice(struct client_state_t cs[static 1], uint32_t rfkidx)
|
|||||||
if (event.op != RFKILL_OP_CHANGE && event.op != RFKILL_OP_CHANGE_ALL)
|
if (event.op != RFKILL_OP_CHANGE && event.op != RFKILL_OP_CHANGE_ALL)
|
||||||
return;
|
return;
|
||||||
if (event.soft || event.hard) {
|
if (event.soft || event.hard) {
|
||||||
|
cs->rfkill_set = 1;
|
||||||
if (cs->ifsPrevState == IFS_UP) {
|
if (cs->ifsPrevState == IFS_UP) {
|
||||||
log_line("rfkill: radio now blocked; bringing interface down");
|
log_line("rfkill: radio now blocked; bringing interface down");
|
||||||
cs->ifsPrevState = IFS_DOWN;
|
cs->ifsPrevState = IFS_DOWN;
|
||||||
@ -77,6 +78,7 @@ void handle_rfkill_notice(struct client_state_t cs[static 1], uint32_t rfkidx)
|
|||||||
} else
|
} else
|
||||||
log_line("rfkill: radio now blocked, but interface isn't up");
|
log_line("rfkill: radio now blocked, but interface isn't up");
|
||||||
} else {
|
} else {
|
||||||
|
cs->rfkill_set = 0;
|
||||||
if (cs->ifsPrevState == IFS_DOWN) {
|
if (cs->ifsPrevState == IFS_DOWN) {
|
||||||
log_line("rfkill: radio now unblocked; bringing interface up");
|
log_line("rfkill: radio now unblocked; bringing interface up");
|
||||||
cs->ifsPrevState = IFS_UP;
|
cs->ifsPrevState = IFS_UP;
|
||||||
|
Loading…
Reference in New Issue
Block a user