From 8fc69c9858531ee9af977a0a2b460d03cb6959f4 Mon Sep 17 00:00:00 2001 From: goldsimon Date: Fri, 6 Oct 2017 11:45:10 +0200 Subject: [PATCH] Revert changes of 07434aa73a3eb51b7f311ba38c51c5611a91a52c (accidentally committed local changes) --- src/core/ipv6/dhcp6.c | 253 ++---------------------------------------- 1 file changed, 9 insertions(+), 244 deletions(-) diff --git a/src/core/ipv6/dhcp6.c b/src/core/ipv6/dhcp6.c index ecad68b1..f27a725e 100644 --- a/src/core/ipv6/dhcp6.c +++ b/src/core/ipv6/dhcp6.c @@ -1,10 +1,11 @@ /** * @file - * DHCPv6 - RFC 3315 + * + * DHCPv6. */ /* - * Copyright (c) 2017 Simon Goldschmidt + * Copyright (c) 2010 Inico Technologies Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -31,255 +32,19 @@ * * This file is part of the lwIP TCP/IP stack. * - * Author: Simon Goldschmidt + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * */ #include "lwip/opt.h" #if LWIP_IPV6 && LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ -#include "lwip/dhcp6.h" -#include "lwip/prot/dhcp6.h" +#include "lwip/ip6_addr.h" #include "lwip/def.h" -#include "lwip/udp.h" -#include - -#ifdef LWIP_HOOK_FILENAME -#include LWIP_HOOK_FILENAME -#endif -#ifndef LWIP_HOOK_DHCP6_APPEND_OPTIONS -#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type) -#endif -#ifndef LWIP_HOOK_DHCP6_PARSE_OPTION -#define LWIP_HOOK_DHCP6_PARSE_OPTION(netif, dhcp6, state, msg, msg_type, option, len, pbuf, offset) -#endif - -const ip_addr_t dhcp6_All_DHCP_Relay_Agents_and_Servers = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0x00010002); -const ip_addr_t dhcp6_All_DHCP_Servers = IPADDR6_INIT_HOST(0xFF020000, 0, 0, 0x00010003); - -static struct udp_pcb *dhcp6_pcb; -static u8_t dhcp6_pcb_refcount; - - -/* receive, unfold, parse and free incoming messages */ -static void dhcp6_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port); - -/** Ensure DHCP PCB is allocated and bound */ -static err_t -dhcp6_inc_pcb_refcount(void) -{ - if (dhcp6_pcb_refcount == 0) { - LWIP_ASSERT("dhcp6_inc_pcb_refcount(): memory leak", dhcp6_pcb == NULL); - - /* allocate UDP PCB */ - dhcp6_pcb = udp_new(); - - if (dhcp6_pcb == NULL) { - return ERR_MEM; - } - - ip_set_option(dhcp6_pcb, SOF_BROADCAST); - - /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */ - udp_bind(dhcp6_pcb, IP6_ADDR_ANY, DHCP6_CLIENT_PORT); - udp_recv(dhcp6_pcb, dhcp6_recv, NULL); - } - - dhcp6_pcb_refcount++; - - return ERR_OK; -} - -/** Free DHCP PCB if the last netif stops using it */ -static void -dhcp6_dec_pcb_refcount(void) -{ - LWIP_ASSERT("dhcp6_pcb_refcount(): refcount error", (dhcp6_pcb_refcount > 0)); - dhcp6_pcb_refcount--; - - if (dhcp6_pcb_refcount == 0) { - udp_remove(dhcp6_pcb); - dhcp6_pcb = 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)); - /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */ - netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, dhcp6); -} - -/** - * @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); - } -} - -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(DHCP_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; -} - -static u32_t -dhcp6_create_next_xid(struct netif *netif, struct dhcp6 dhcp6) -{ - LWIP_UNUSED_ARG(netif); - LWIP_UNUSED_ARG(dhcp6); -} - -#if LWIP_IPV6_DHCP6_STATELESS -static err_t -dhcp_information_request(struct netif *netif, struct dhcp6 *dhcp6) -{ - struct dhcp *dhcp = netif_dhcp_data(netif); - err_t result = ERR_OK; - u16_t msecs; - u8_t i; - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n")); - ip4_addr_set_any(&dhcp->offered_ip_addr); - dhcp_set_state(dhcp, DHCP_STATE_SELECTING); - /* create and initialize the DHCP message header */ - result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER); - if (result == ERR_OK) { - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n")); - - dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); - dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); - - dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options)); - for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) { - dhcp_option_byte(dhcp, dhcp_discover_request_options[i]); - } - LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, DHCP_STATE_SELECTING, dhcp->msg_out, DHCP_DISCOVER); - dhcp_option_trailer(dhcp); - - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n")); - udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n")); - dhcp_delete_msg(dhcp); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n")); - } else { - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n")); - } - if (dhcp->tries < 255) { - dhcp->tries++; - } -#if LWIP_DHCP_AUTOIP_COOP - if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) { - dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON; - autoip_start(netif); - } -#endif /* LWIP_DHCP_AUTOIP_COOP */ - msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000); - dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); - LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs)); - return result; -} - -static err_t -dhcp6_request_config(struct netif *netif) -{ - struct dhcp6 *dhcp6; - - LWIP_ASSERT("netif != NULL", netif != NULL); - - dhcp6 = dhcp6_get_struct(netif, "dhcp6_request_config()"); - if (dhcp6 == NULL) { - return ERR_MEM; - } - - /* if state is not idle, set a flag to send an information-request later? */ - if (dhcp6->state != DHCP6_STATE_OFF) { - dhcp6->request_config_pending = 1; - return ERR_OK; - } - - /* send Information-request and wait for answer; setup receive timeout */ - dhcp_information_request(netif, dhcp6); - - return ERR_OK; -} -#endif /* LWIP_IPV6_DHCP6_STATELESS */ - -void -dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config) -{ - LWIP_UNUSED_ARG(managed_addr_config); - LWIP_UNUSED_ARG(other_config); - -#if LWIP_IPV6_DHCP6_STATELESS - if (other_config) { - dhcp6_request_config(netif); - } -#endif /* LWIP_IPV6_DHCP6_STATELESS */ -} - -static void -dhcp6_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) -{ - LWIP_UNUSED_ARG(arg); - LWIP_UNUSED_ARG(pcb); - LWIP_UNUSED_ARG(p); - LWIP_UNUSED_ARG(addr); - LWIP_UNUSED_ARG(port); - -} #endif /* LWIP_IPV6 && LWIP_IPV6_DHCP6 */