netdev_settings.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 FILE_LICENCE ( GPL2_OR_LATER );
00020
00021 #include <string.h>
00022 #include <errno.h>
00023 #include <byteswap.h>
00024 #include <gpxe/dhcp.h>
00025 #include <gpxe/settings.h>
00026 #include <gpxe/device.h>
00027 #include <gpxe/netdevice.h>
00028
00029
00030
00031
00032
00033
00034
00035
00036 struct setting mac_setting __setting = {
00037 .name = "mac",
00038 .description = "MAC address",
00039 .type = &setting_type_hex,
00040 };
00041 struct setting busid_setting __setting = {
00042 .name = "busid",
00043 .description = "Bus ID",
00044 .type = &setting_type_hex,
00045 };
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 static int netdev_store ( struct settings *settings, struct setting *setting,
00057 const void *data, size_t len ) {
00058 struct net_device *netdev = container_of ( settings, struct net_device,
00059 settings.settings );
00060
00061 if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
00062 if ( len != netdev->ll_protocol->ll_addr_len )
00063 return -EINVAL;
00064 memcpy ( netdev->ll_addr, data, len );
00065 return 0;
00066 }
00067
00068 return generic_settings_store ( settings, setting, data, len );
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 static int netdev_fetch ( struct settings *settings, struct setting *setting,
00081 void *data, size_t len ) {
00082 struct net_device *netdev = container_of ( settings, struct net_device,
00083 settings.settings );
00084 struct device_description *desc = &netdev->dev->desc;
00085 struct dhcp_netdev_desc dhcp_desc;
00086
00087 if ( setting_cmp ( setting, &mac_setting ) == 0 ) {
00088 if ( len > netdev->ll_protocol->ll_addr_len )
00089 len = netdev->ll_protocol->ll_addr_len;
00090 memcpy ( data, netdev->ll_addr, len );
00091 return netdev->ll_protocol->ll_addr_len;
00092 }
00093 if ( setting_cmp ( setting, &busid_setting ) == 0 ) {
00094 dhcp_desc.type = desc->bus_type;
00095 dhcp_desc.vendor = htons ( desc->vendor );
00096 dhcp_desc.device = htons ( desc->device );
00097 if ( len > sizeof ( dhcp_desc ) )
00098 len = sizeof ( dhcp_desc );
00099 memcpy ( data, &dhcp_desc, len );
00100 return sizeof ( dhcp_desc );
00101 }
00102
00103 return generic_settings_fetch ( settings, setting, data, len );
00104 }
00105
00106
00107
00108
00109
00110
00111 static void netdev_clear ( struct settings *settings ) {
00112 generic_settings_clear ( settings );
00113 }
00114
00115
00116 struct settings_operations netdev_settings_operations = {
00117 .store = netdev_store,
00118 .fetch = netdev_fetch,
00119 .clear = netdev_clear,
00120 };