static struct dhcp6* dhcp6_get_struct(struct netif *netif, const char *dbg_requester) { struct dhcp6 *dhcp6 = netif_dhcp6_data(netif); if (dhcp6 == NULL) { LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: mallocing new DHCPv6 client\n", dbg_requester)); dhcp6 = (struct dhcp6 *)mem_malloc(sizeof(struct dhcp6)); if (dhcp6 == NULL) { LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: could not allocate dhcp6\n", dbg_requester)); return NULL; } /* clear data structure, this implies DHCP6_STATE_OFF */ memset(dhcp6, 0, sizeof(struct dhcp6)); /* store this dhcp6 client in the netif */ netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6); } else { /* already has DHCP6 client attached */ LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("%s: using existing DHCPv6 client\n", dbg_requester)); } if (!dhcp6->pcb_allocated) { if (dhcp6_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP6 PCB is allocated */ mem_free(dhcp6); netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL); return NULL; } LWIP_DEBUGF(DHCP6_DEBUG | LWIP_DBG_TRACE, ("%s: allocated dhcp6", dbg_requester)); dhcp6->pcb_allocated = 1; } return dhcp6; }
/** * Stop IGMP processing on interface * * @param netif network interface on which stop IGMP processing */ err_t igmp_stop(struct netif *netif) { struct igmp_group *group = netif_igmp_data(netif); netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, NULL); while (group != NULL) { struct igmp_group *next = group->next; /* avoid use-after-free below */ /* disable the group at the MAC level */ if (netif->igmp_mac_filter != NULL) { LWIP_DEBUGF(IGMP_DEBUG, ("igmp_stop: igmp_mac_filter(DEL ")); ip4_addr_debug_print(IGMP_DEBUG, &group->group_address); LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", (void*)netif)); netif->igmp_mac_filter(netif, &(group->group_address), NETIF_DEL_MAC_FILTER); } /* free group */ memp_free(MEMP_IGMP_GROUP, group); /* move to "next" */ group = next; } return ERR_OK; }
/** * @ingroup dhcp6 * Removes a struct dhcp6 from a netif. * * ATTENTION: Only use this when not using dhcp6_set_struct() to allocate the * struct dhcp6 since the memory is passed back to the heap. * * @param netif the netif from which to remove the struct dhcp */ void dhcp6_cleanup(struct netif *netif) { LWIP_ASSERT("netif != NULL", netif != NULL); if (netif_dhcp6_data(netif) != NULL) { mem_free(netif_dhcp6_data(netif)); netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL); } }
/** * @ingroup dhcp6 * Set a statically allocated struct dhcp6 to work with. * Using this prevents dhcp6_start to allocate it using mem_malloc. * * @param netif the netif for which to set the struct dhcp * @param dhcp6 (uninitialised) dhcp6 struct allocated by the application */ void dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6) { LWIP_ASSERT("netif != NULL", netif != NULL); LWIP_ASSERT("dhcp6 != NULL", dhcp6 != NULL); LWIP_ASSERT("netif already has a struct dhcp6 set", netif_dhcp6_data(netif) == NULL); /* clear data structure */ memset(dhcp6, 0, sizeof(struct dhcp6)); /* dhcp6_set_state(&dhcp, DHCP6_STATE_OFF); */ netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6); }
/** * Search for a specific igmp group and create a new one if not found- * * @param ifp the network interface for which to look * @param addr the group ip address to search * @return a struct igmp_group*, * NULL on memory error. */ struct igmp_group * igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr) { struct igmp_group *group; struct igmp_group *list_head = netif_igmp_data(ifp); /* Search if the group already exists */ group = igmp_lookfor_group(ifp, addr); if (group != NULL) { /* Group already exists. */ return group; } /* Group doesn't exist yet, create a new one */ group = (struct igmp_group *)memp_malloc(MEMP_IGMP_GROUP); if (group != NULL) { ip4_addr_set(&(group->group_address), addr); group->timer = 0; /* Not running */ group->group_state = IGMP_GROUP_NON_MEMBER; group->last_reporter_flag = 0; group->use = 0; /* Ensure allsystems group is always first in list */ if (list_head == NULL) { /* this is the first entry in linked list */ LWIP_ASSERT("igmp_lookup_group: first group must be allsystems", (ip4_addr_cmp(addr, &allsystems) != 0)); group->next = NULL; netif_set_client_data(ifp, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, group); } else { /* append _after_ first entry */ LWIP_ASSERT("igmp_lookup_group: all except first group must not be allsystems", (ip4_addr_cmp(addr, &allsystems) == 0)); group->next = list_head->next; list_head->next = group; } } LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group?"":"impossible to "))); ip4_addr_debug_print(IGMP_DEBUG, addr); LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", (void*)ifp)); return group; }