/* * Copyright (C) 2009 Joshua Oreman <oremanj@rwcr.net>. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ FILE_LICENCE ( GPL2_OR_LATER ); #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gpxe/dhcp.h> #include <gpxe/dhcppkt.h> #include <gpxe/netdevice.h> #include <gpxe/iobuf.h> #include <gpxe/uaccess.h> /** @file * * Cached DHCP packet handling * */ /** * Store cached DHCPACK packet * * @v data User pointer to cached DHCP packet data * @v len Length of cached DHCP packet data * @ret rc Return status code * * This function should be called by the architecture-specific * get_cached_dhcpack() handler. */ void store_cached_dhcpack ( userptr_t data, size_t len ) { struct dhcp_packet *dhcppkt; struct dhcphdr *dhcphdr; struct settings *parent; int rc; /* Create DHCP packet */ dhcppkt = zalloc ( sizeof ( *dhcppkt ) + len ); if ( ! dhcppkt ) return; /* Fill in data for DHCP packet */ dhcphdr = ( ( ( void * ) dhcppkt ) + sizeof ( * dhcppkt ) ); copy_from_user ( dhcphdr, data, 0, len ); dhcppkt_init ( dhcppkt, dhcphdr, len ); DBG_HD ( dhcppkt->options.data, dhcppkt->options.len ); /* Register settings on the last opened network device. * This will have the effect of registering cached settings * with a network device when "dhcp netX" is performed for that * device, which is usually what we want. */ parent = netdev_settings ( last_opened_netdev() ); if ( ( rc = register_settings ( &dhcppkt->settings, parent ) ) != 0 ) DBG ( "DHCP could not register cached settings: %s\n", strerror ( rc ) ); dhcppkt_put ( dhcppkt ); DBG ( "DHCP registered cached settings\n" ); }