int wait_dhcp(int tries) { fnet_netif_desc_t netif; struct fnet_dhcp_params dhcp_params; struct callback_params_t callback_params; /* Get Default netif */ netif = fnet_netif_get_default(); if (!netif) { return -1; } /* Clear params struct */ fnet_memset_zero(&dhcp_params, sizeof(struct fnet_dhcp_params)); /* Turn on link-local support */ dhcp_params.retries_until_link_local = tries; /* Initialise DHCP client */ if(fnet_dhcp_init(netif, &dhcp_params) == FNET_ERR) { return -1; } /* Setup param for callbacks */ callback_params.max_tries = tries + 1; /* Add one so we get link local before timeout */ callback_params.cur_try = 1; callback_params.state = WAITING; /* Print message */ fnet_printf("\nDHCP: Waiting for server \n"); /* Register call backs */ fnet_dhcp_handler_updated_set(handler_updated, &callback_params); fnet_dhcp_handler_discover_set(handler_discover, &callback_params); /* Poll background services until address found or n_tries exceeded */ while (callback_params.state == WAITING) { fnet_poll_services(); } /* Now evaluate response */ if (callback_params.state == SUCCESS) { fnet_printf("DHCP: Success! \n"); return 0; /* Success */ } else { fnet_printf("DHCP: Failed! Using link local address \n"); /* Keep DHCP server running in background */ return -1; /* Failure */ } }
/************************************************************************ * NAME: fapp_dhcp_cmd * * DESCRIPTION: Enable DHCP client. ************************************************************************/ void fapp_dhcp_cmd( fnet_shell_desc_t desc, fnet_index_t argc, fnet_char_t ** argv ) { struct fnet_dhcp_params dhcp_params; fnet_dhcp_desc_t dhcp_desc; fnet_netif_desc_t netif = fnet_netif_get_default(); if(argc == 1u /* By default is "init".*/ #if 0 /* DHCP reboot feature not used too much. */ || fnet_strcasecmp(&FAPP_DHCP_COMMAND_REBOOT[0], argv[1]) == 0 #endif ) /* [reboot] */ { fnet_memset_zero(&dhcp_params, sizeof(struct fnet_dhcp_params)); fapp_dhcp_discover_counter = FAPP_CFG_DHCP_CMD_DISCOVER_MAX; /* reset counter.*/ #if 0 /* DHCP reboot feature not used too much. */ if(fnet_strcasecmp(&FAPP_DHCP_COMMAND_REBOOT[0], argv[1]) == 0) /* [reboot] */ dhcp_params.requested_ip_address.s_addr = fnet_netif_get_ip4_addr(netif); #endif fapp_dhcp_ip_old = fnet_netif_get_ip4_addr(netif); /* Save ip to restore if cancelled. */ /* Enable DHCP client */ dhcp_desc = fnet_dhcp_init(netif, &dhcp_params); if(dhcp_desc != FNET_ERR) { fapp_dhcp_desc = dhcp_desc; /* Register DHCP event handlers. */ fnet_dhcp_handler_updated_set(fapp_dhcp_desc, fapp_dhcp_handler_updated, (void *)desc); fnet_dhcp_handler_discover_set(fapp_dhcp_desc, fapp_dhcp_handler_discover, (void *)desc); fnet_shell_println(desc, FAPP_TOCANCEL_STR); fnet_shell_block(desc, fapp_dhcp_on_ctrlc); /* Block shell. */ } else { fnet_shell_println(desc, FAPP_INIT_ERR, "DHCP"); } } else if((argc == 2u) && (fnet_strcasecmp(&FAPP_COMMAND_RELEASE[0], argv[1]) == 0)) /* [release] */ { fapp_dhcp_release(); } else { fnet_shell_println(desc, FAPP_PARAM_ERR, argv[1]); } }
/************************************************************************ * NAME: fapp_dhcp_handler_updated * * DESCRIPTION: Event handler on new IP from DHCP client. ************************************************************************/ static void fapp_dhcp_handler_updated(fnet_dhcp_desc_t dhcp_desc, fnet_netif_desc_t netif, void *shl_desc ) { fnet_shell_desc_t desc = (fnet_shell_desc_t) shl_desc; fapp_dhcp_discover_counter = -1; /* Infinite for future. */ /* Optionally, unregister DHCP event handlers, just to do not * disturb a user. */ fnet_dhcp_handler_updated_set(dhcp_desc, 0, 0); fnet_dhcp_handler_discover_set(dhcp_desc, 0, 0); fnet_shell_unblock((fnet_shell_desc_t)shl_desc); /* Unblock the shell. */ /* Print updated parameters info. */ fnet_shell_println( desc, "\n%s", FAPP_DELIMITER_STR); fnet_shell_println( desc, FAPP_DHCP_NEWIP_STR); fnet_shell_println( desc, FAPP_DELIMITER_STR); fapp_netif_info_print( desc, netif ); }