int gpio_init_int(gpio_t pin, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg) { DEBUG("gpio_init_int(): pin %u\n", pin); int isr_map_entry; /* check if interrupt is possible for this pin */ if ((isr_map_entry = _isr_map_entry(pin)) == -1) { DEBUG("gpio_init_int(): pin %u cannot be used to generate interrupts.\n", pin); return -1; } /* find free isr state entry */ int _state_index = _gpio_isr_map[isr_map_entry]; if (_state_index == 0xff) { _state_index = bf_get_unset(_gpio_config_bitfield, GPIO_NUM_ISR); _gpio_isr_map[isr_map_entry] = _state_index; DEBUG("gpio_init_int(): pin has state_index=%i isr_map_entry=%i\n", _state_index, isr_map_entry); } if (_state_index == 0xff) { #ifdef DEVELHELP puts("lpc2387: gpio: warning: no free gpio callback state!"); #endif return -1; } /* store callback */ _gpio_states[_state_index].cb = cb; _gpio_states[_state_index].arg = arg; extern void GPIO_IRQHandler(void); gpio_init(pin, GPIO_DIR_IN, pullup); if (flank & GPIO_FALLING) { bf_set(_gpio_falling, _state_index); } else { bf_unset(_gpio_falling, _state_index); } if (flank & GPIO_RISING) { bf_set(_gpio_rising, _state_index); } else { bf_unset(_gpio_rising, _state_index); } _gpio_configure(pin, flank & GPIO_RISING, flank & GPIO_FALLING); /* activate irq */ INTWAKE |= GPIO0WAKE | GPIO2WAKE; /* allow GPIO to wake up from power down */ install_irq(GPIO_INT, &GPIO_IRQHandler, IRQP_GPIO); /* install irq handler */ return 0; }
void gnrc_ipv6_whitelist_del(const ipv6_addr_t *addr) { for (int i = 0; i < GNRC_IPV6_WHITELIST_SIZE; i++) { if (ipv6_addr_equal(addr, &gnrc_ipv6_whitelist[i])) { bf_unset(gnrc_ipv6_whitelist_set, i); DEBUG("IPv6 whitelist: unwhitelisted %s\n", ipv6_addr_to_str(addr_str, addr, sizeof(addr_str))); } } }
void gnrc_sixlowpan_nd_router_abr_remove(gnrc_sixlowpan_nd_router_abr_t *abr) { for (int i = 0; i < GNRC_SIXLOWPAN_CTX_SIZE; i++) { if (bf_isset(abr->ctxs, i)) { gnrc_sixlowpan_ctx_remove(i); bf_unset(abr->ctxs, i); } } while (abr->prfs != NULL) { gnrc_sixlowpan_nd_router_prf_t *prefix = abr->prfs; LL_DELETE(abr->prfs, prefix); gnrc_ipv6_netif_remove_addr(prefix->iface->pid, &prefix->prefix->addr); prefix->next = NULL; prefix->iface = NULL; prefix->prefix = NULL; } ipv6_addr_set_unspecified(&abr->addr); abr->version = 0; }
/* UINT16_MAX min < UINT32_MAX ms so no risk of overflow */ MS_PER_SEC * SEC_PER_MIN * ltime); } return abr; } #endif /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ #if GNRC_IPV6_NIB_CONF_MULTIHOP_P6C uint32_t _handle_6co(const icmpv6_hdr_t *icmpv6, const sixlowpan_nd_opt_6ctx_t *sixco, _nib_abr_entry_t *abr) #else /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ uint32_t _handle_6co(const icmpv6_hdr_t *icmpv6, const sixlowpan_nd_opt_6ctx_t *sixco) #endif /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ { uint16_t ltime; #ifdef MODULE_GNRC_SIXLOWPAN_CTX uint8_t cid; #endif /* MODULE_GNRC_SIXLOWPAN_CTX */ if ((sixco->len != SIXLOWPAN_ND_OPT_6CTX_LEN_MIN) || ((sixco->len != SIXLOWPAN_ND_OPT_6CTX_LEN_MAX) && (sixco->ctx_len > 64U)) || (icmpv6->type != ICMPV6_RTR_ADV)) { DEBUG("nib: received 6CO of invalid length (%u), must be %u " "or wasn't delivered by RA." "\n", sixco->len, (sixco->ctx_len > 64U) ? SIXLOWPAN_ND_OPT_6CTX_LEN_MAX : SIXLOWPAN_ND_OPT_6CTX_LEN_MIN); return UINT32_MAX; } ltime = byteorder_ntohs(sixco->ltime); #ifdef MODULE_GNRC_SIXLOWPAN_CTX cid = sixlowpan_nd_opt_6ctx_get_cid(sixco); gnrc_sixlowpan_ctx_update(cid, (ipv6_addr_t *)(sixco + 1), sixco->ctx_len, ltime, sixlowpan_nd_opt_6ctx_is_comp(sixco)); #if GNRC_IPV6_NIB_CONF_MULTIHOP_P6C assert(abr != NULL); /* should have been set in _handle_abro() */ if (ltime == 0) { bf_unset(abr->ctxs, cid); } else { bf_set(abr->ctxs, cid); } #endif /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ #else /* MODULE_GNRC_SIXLOWPAN_CTX */ (void)abr; #endif /* MODULE_GNRC_SIXLOWPAN_CTX */ return ltime * SEC_PER_MIN * MS_PER_SEC; }