Skip to content
Snippets Groups Projects
bootp.c 25.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
    		 * Wait an appropriate time for any potential DHCPOFFER packets
    
    		 * to arrive.  Then select one, and generate DHCPREQUEST
    		 * response.  If filename is in format we recognize, assume it
    		 * is a valid OFFER from a server we want.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		 */
    
    		debug("DHCP: state=SELECTING bp_file: \"%s\"\n", bp->bp_file);
    
    #ifdef CONFIG_SYS_BOOTFILE_PREFIX
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		if (strncmp(bp->bp_file,
    
    			    CONFIG_SYS_BOOTFILE_PREFIX,
    
    			    strlen(CONFIG_SYS_BOOTFILE_PREFIX)) == 0) {
    
    #endif	/* CONFIG_SYS_BOOTFILE_PREFIX */
    
    			dhcp_packet_process_options(bp);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    			debug("TRANSITIONING TO REQUESTING STATE\n");
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    			dhcp_state = REQUESTING;
    
    			net_set_timeout_handler(5000, bootp_timeout_handler);
    
    			dhcp_send_request_packet(bp);
    
    #ifdef CONFIG_SYS_BOOTFILE_PREFIX
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		}
    
    #endif	/* CONFIG_SYS_BOOTFILE_PREFIX */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    		return;
    		break;
    	case REQUESTING:
    
    		debug("DHCP State: REQUESTING\n");
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    		if (dhcp_message_type((u8 *)bp->bp_vend) == DHCP_ACK) {
    
    			dhcp_packet_process_options(bp);
    
    			/* Store net params from reply */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    			dhcp_state = BOUND;
    
    			printf("DHCP client bound to address %pI4 (%lu ms)\n",
    
    			       &net_ip, get_timer(bootp_start));
    
    			net_set_timeout_handler(0, (thand_f *)0);
    
    			bootstage_mark_name(BOOTSTAGE_ID_BOOTP_STOP,
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    			net_auto_load();
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    			return;
    		}
    		break;
    
    	case BOUND:
    		/* DHCP client bound to address */
    		break;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	default:
    
    		puts("DHCP: INVALID STATE\n");
    
    void dhcp_request(void)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    }
    
    #endif	/* CONFIG_CMD_DHCP */