176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>. 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * modify it under the terms of the GNU General Public License as 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * published by the Free Software Foundation; either version 2 of the 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * License, or any later version. 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is distributed in the hope that it will be useful, but 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WITHOUT ANY WARRANTY; without even the implied warranty of 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * General Public License for more details. 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * You should have received a copy of the GNU General Public License 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * along with this program; if not, write to the Free Software 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <errno.h> 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/netdevice.h> 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/dhcp.h> 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/monojob.h> 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/process.h> 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <usr/ifmgmt.h> 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <usr/dhcpmgmt.h> 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LINK_WAIT_MS 15000 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * DHCP management 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint dhcp ( struct net_device *netdev ) { 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t *chaddr; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t hlen; 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Check we can open the interface first */ 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ifopen ( netdev ) ) != 0 ) 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rc; 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Wait for link-up */ 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = iflinkwait ( netdev, LINK_WAIT_MS ) ) != 0 ) 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rc; 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Perform DHCP */ 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman chaddr = dhcp_chaddr ( netdev, &hlen, &flags ); 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "DHCP (%s ", netdev->name ); 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while ( hlen-- ) 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "%02x%c", *(chaddr++), ( hlen ? ':' : ')' ) ); 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = start_dhcp ( &monojob, netdev ) ) == 0 ) { 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rc = monojob_wait ( "" ); 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if ( rc > 0 ) { 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( " using cached\n" ); 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rc = 0; 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rc; 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint pxebs ( struct net_device *netdev, unsigned int pxe_type ) { 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Perform PXE Boot Server Discovery */ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman printf ( "PXEBS (%s type %d)", netdev->name, pxe_type ); 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = start_pxebs ( &monojob, netdev, pxe_type ) ) == 0 ) 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rc = monojob_wait ( "" ); 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rc; 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 79