Annotation of qemu/roms/ipxe/src/net/netdev_settings.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (C) 2008 Michael Brown <[email protected]>.
                      3:  *
                      4:  * This program is free software; you can redistribute it and/or
                      5:  * modify it under the terms of the GNU General Public License as
                      6:  * published by the Free Software Foundation; either version 2 of the
                      7:  * License, or any later version.
                      8:  *
                      9:  * This program is distributed in the hope that it will be useful, but
                     10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     12:  * General Public License for more details.
                     13:  *
                     14:  * You should have received a copy of the GNU General Public License
                     15:  * along with this program; if not, write to the Free Software
                     16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     17:  */
                     18: 
                     19: FILE_LICENCE ( GPL2_OR_LATER );
                     20: 
                     21: #include <string.h>
                     22: #include <errno.h>
                     23: #include <byteswap.h>
                     24: #include <ipxe/dhcp.h>
                     25: #include <ipxe/dhcpopts.h>
                     26: #include <ipxe/settings.h>
                     27: #include <ipxe/device.h>
                     28: #include <ipxe/netdevice.h>
                     29: 
                     30: /** @file
                     31:  *
                     32:  * Network device configuration settings
                     33:  *
                     34:  */
                     35: 
                     36: /** Network device named settings */
                     37: struct setting mac_setting __setting ( SETTING_NETDEV ) = {
                     38:        .name = "mac",
                     39:        .description = "MAC address",
                     40:        .type = &setting_type_hex,
                     41:        .tag = NETDEV_SETTING_TAG_MAC,
                     42: };
                     43: struct setting busid_setting __setting ( SETTING_NETDEV ) = {
                     44:        .name = "busid",
                     45:        .description = "Bus ID",
                     46:        .type = &setting_type_hex,
                     47:        .tag = NETDEV_SETTING_TAG_BUS_ID,
                     48: };
                     49: 
                     50: /**
                     51:  * Check applicability of network device setting
                     52:  *
                     53:  * @v settings         Settings block
                     54:  * @v setting          Setting
                     55:  * @ret applies                Setting applies within this settings block
                     56:  */
                     57: static int netdev_applies ( struct settings *settings __unused,
                     58:                            struct setting *setting ) {
                     59: 
                     60:        return ( IS_NETDEV_SETTING_TAG ( setting->tag ) ||
                     61:                 dhcpopt_applies ( setting->tag ) );
                     62: }
                     63: 
                     64: /**
                     65:  * Store value of network device setting
                     66:  *
                     67:  * @v settings         Settings block
                     68:  * @v setting          Setting to store
                     69:  * @v data             Setting data, or NULL to clear setting
                     70:  * @v len              Length of setting data
                     71:  * @ret rc             Return status code
                     72:  */
                     73: static int netdev_store ( struct settings *settings, struct setting *setting,
                     74:                          const void *data, size_t len ) {
                     75:        struct net_device *netdev = container_of ( settings, struct net_device,
                     76:                                                   settings.settings );
                     77: 
                     78:        if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
                     79:                if ( len != netdev->ll_protocol->ll_addr_len )
                     80:                        return -EINVAL;
                     81:                memcpy ( netdev->ll_addr, data, len );
                     82:                return 0;
                     83:        }
                     84:        if ( setting_cmp ( setting, &busid_setting ) == 0 )
                     85:                return -ENOTSUP;
                     86: 
                     87:        return generic_settings_store ( settings, setting, data, len );
                     88: }
                     89: 
                     90: /**
                     91:  * Fetch value of network device setting
                     92:  *
                     93:  * @v settings         Settings block
                     94:  * @v setting          Setting to fetch
                     95:  * @v data             Setting data, or NULL to clear setting
                     96:  * @v len              Length of setting data
                     97:  * @ret rc             Return status code
                     98:  */
                     99: static int netdev_fetch ( struct settings *settings, struct setting *setting,
                    100:                          void *data, size_t len ) {
                    101:        struct net_device *netdev = container_of ( settings, struct net_device,
                    102:                                                   settings.settings );
                    103:        struct device_description *desc = &netdev->dev->desc;
                    104:        struct dhcp_netdev_desc dhcp_desc;
                    105: 
                    106:        if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
                    107:                if ( len > netdev->ll_protocol->ll_addr_len )
                    108:                        len = netdev->ll_protocol->ll_addr_len;
                    109:                memcpy ( data, netdev->ll_addr, len );
                    110:                return netdev->ll_protocol->ll_addr_len;
                    111:        }
                    112:        if ( setting_cmp ( setting, &busid_setting ) == 0 ) {
                    113:                dhcp_desc.type = desc->bus_type;
                    114:                dhcp_desc.vendor = htons ( desc->vendor );
                    115:                dhcp_desc.device = htons ( desc->device );
                    116:                if ( len > sizeof ( dhcp_desc ) )
                    117:                        len = sizeof ( dhcp_desc );
                    118:                memcpy ( data, &dhcp_desc, len );
                    119:                return sizeof ( dhcp_desc );
                    120:        }
                    121: 
                    122:        return generic_settings_fetch ( settings, setting, data, len );
                    123: }
                    124: 
                    125: /**
                    126:  * Clear network device settings
                    127:  *
                    128:  * @v settings         Settings block
                    129:  */
                    130: static void netdev_clear ( struct settings *settings ) {
                    131:        generic_settings_clear ( settings );
                    132: }
                    133: 
                    134: /** Network device configuration settings operations */
                    135: struct settings_operations netdev_settings_operations = {
                    136:        .applies = netdev_applies,
                    137:        .store = netdev_store,
                    138:        .fetch = netdev_fetch,
                    139:        .clear = netdev_clear,
                    140: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.