Thread: [Ndiswrapper-general] more info for iwconfig
Status: Beta
Brought to you by:
pgiri
From: Joseph D. <jos...@co...> - 2003-11-21 07:34:38
|
Below is a diff that provides additional functions for querying the driver info. The added code provides: frequency tx-power (in mW * 1000 (see comment in code)) bitrate (not sure about this one) rts threshold fragmentation threshold access point MAC address Unfortunately, I could not figure out how to set the current bitrate, nor find the sensitivity or retry limit in the ndis specification. Running iwconfig on the ndiswrapper ethernet device is a little more informative with these. Lastly, is there any reason why we don't read the PCI ids from the inf file rather than requiring them to be typed in on the command line? If we read from the inf then we can try a series of pci_find_device calls at driver start time to locate devices we support. A couple other things would have to be changed, but I'll make the change (and send another diff) unless someone has a reason this is a bad idea. -Joe Dunn ################################################################### diff -Naur --exclude=CVS ndiswrapper.base/driver/ndis.h improve_iwconfig/driver/ndis.h --- ndiswrapper.base/driver/ndis.h 2003-11-20 07:30:29.000000000 -0700 +++ improve_iwconfig/driver/ndis.h 2003-11-21 00:06:54.046514168 -0700 @@ -291,6 +291,20 @@ char essid[32]; }; +struct packed ndis_configuration +{ + __u32 length; + __u32 beacon_period; + __u32 atim_window; + __u32 ds_config; + struct ndis_configuration_fh + { + __u32 length; + __u32 hop_pattern; + __u32 hop_set; + __u32 dwell_time; + } fh_config; +}; STDCALL void NdisMIndicateReceivePacket(struct ndis_handle *handle, struct ndis_packet **packets, unsigned int nr_packets); STDCALL void NdisMSendComplete(struct ndis_handle *handle, struct ndis_packet *packet, unsigned int status); @@ -304,8 +318,16 @@ #define NDIS_OID_STAT_RX_ERROR 0x00020104 #define NDIS_OID_ESSID 0x0D010102 +#define NDIS_OID_BSSID 0x0D010101 #define NDIS_OID_MODE 0x0D010108 #define NDIS_OID_RSSI 0x0D010206 +#define NDIS_OID_CONFIGURATION 0x0D010211 +#define NDIS_OID_TX_POWER_LEVEL 0x0D010205 +#define NDIS_OID_RTS_THRESH 0x0D01020A +#define NDIS_OID_FRAG_THRESH 0x0D010209 + +/* general OIDs */ +#define NDIS_OID_GEN_SPEED 0x00010107 #define UNIMPL() printk(KERN_ERR "%s --UNIMPLEMENTED--\n", __FUNCTION__ ) diff -Naur --exclude=CVS ndiswrapper.base/driver/wrapper.c improve_iwconfig/driver/wrapper.c --- ndiswrapper.base/driver/wrapper.c 2003-11-20 12:22:32.000000000 -0700 +++ improve_iwconfig/driver/wrapper.c 2003-11-21 00:02:37.009589720 -0700 @@ -26,6 +26,7 @@ #include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/wireless.h> +#include <linux/if_arp.h> #include <net/iw_handler.h> #include <asm/uaccess.h> @@ -108,7 +109,6 @@ return 0; } - static int ndis_get_essid(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -164,7 +164,7 @@ int ndis_mode, mode; int res = query_int(handle, NDIS_OID_MODE, &ndis_mode); - if(!res) + if(res) return -1; switch(ndis_mode) @@ -181,7 +181,7 @@ break; } wrqu->mode = mode; - return 0; + return 0; } @@ -193,6 +193,113 @@ return 0; } +static int ndis_get_freq(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct ndis_handle *handle = dev->priv; + unsigned int res, written, needed; + struct ndis_configuration req; + + res = handle->driver->miniport_char.query(handle->adapter_ctx, NDIS_OID_CONFIGURATION, (char*)&req, sizeof(req), &written, &needed); + if(res) + return -1; + + memset(&(wrqu->freq), 0, sizeof(struct iw_freq)); + + /* see comment in wireless.h above the "struct iw_freq" + definition for an explanation of this if + NOTE: 1000000 is due to the kHz + */ + if (req.ds_config > 1000000) + { + wrqu->freq.m = req.ds_config / 10; + wrqu->freq.e = 1; + } + else + wrqu->freq.m = req.ds_config; + + /* convert from kHz to Hz */ + wrqu->freq.e += 3; + return 0; +} + +static int ndis_get_tx_power(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct ndis_handle *handle = dev->priv; + int ndis_power; + + int res = query_int(handle, NDIS_OID_MODE, &ndis_power); + if(res) + return -1; + + /* TODO: convert mW to dBm but, without floating point we + could at best do a table, so for now just + return the mW * 1000 as an obviously bogus value. + */ + wrqu->power.value = ndis_power * 1000; + return 0; +} + +static int ndis_get_bitrate(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct ndis_handle *handle = dev->priv; + int ndis_rate; + + /* not sure if this is the corrent OID or if it gives only the max rate */ + int res = query_int(handle, NDIS_OID_GEN_SPEED, &ndis_rate); + if(res) + return -1; + + /* *of course* windows specifies the rate in multiples of 100 */ + wrqu->bitrate.value = ndis_rate * 100; + return 0; +} + +static int ndis_get_rts_threshold(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct ndis_handle *handle = dev->priv; + int ndis_rts_threshold; + + int res = query_int(handle, NDIS_OID_RTS_THRESH, &ndis_rts_threshold); + if(res) + return -1; + + wrqu->rts.value = ndis_rts_threshold; + return 0; +} + +static int ndis_get_frag_threshold(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct ndis_handle *handle = dev->priv; + int ndis_frag_threshold; + + int res = query_int(handle, NDIS_OID_FRAG_THRESH, &ndis_frag_threshold); + if(res) + return -1; + + wrqu->frag.value = ndis_frag_threshold; + return 0; +} + +static int ndis_get_ap_address(struct net_device *dev, struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + struct ndis_handle *handle = dev->priv; + unsigned int res, written, needed; + __u8 mac_address[6]; + + res = handle->driver->miniport_char.query(handle->adapter_ctx, NDIS_OID_BSSID, (char*)&mac_address, sizeof(mac_address), &written, &needed); + if(res) + return -1; + + memcpy(wrqu->ap_addr.sa_data, mac_address, 6); + wrqu->ap_addr.sa_family = ARPHRD_ETHER; + return 0; +} static const iw_handler ndis_handler[] = { //[SIOCGIWSENS - SIOCIWFIRST] = ndis_get_sens, @@ -201,6 +308,13 @@ [SIOCGIWESSID - SIOCIWFIRST] = ndis_get_essid, [SIOCSIWMODE - SIOCIWFIRST] = ndis_set_mode, [SIOCGIWMODE - SIOCIWFIRST] = ndis_get_mode, + [SIOCGIWFREQ - SIOCIWFIRST] = ndis_get_freq, + [SIOCGIWTXPOW - SIOCIWFIRST] = ndis_get_tx_power, + [SIOCGIWRATE - SIOCIWFIRST] = ndis_get_bitrate, + [SIOCGIWRTS - SIOCIWFIRST] = ndis_get_rts_threshold, + [SIOCGIWFRAG - SIOCIWFIRST] = ndis_get_frag_threshold, + //[SIOCSIWRETRY - SIOCIWFIRST] = ndis_get_rety_limit, + [SIOCGIWAP - SIOCIWFIRST] = ndis_get_ap_address, }; static const struct iw_handler_def ndis_handler_def = { |
From: Pontus F. <pon...@ta...> - 2003-11-21 08:28:52
|
On Fri, 2003-11-21 at 08:34, Joseph Dunn wrote: > Below is a diff that provides additional functions for querying the driver info. The added code provides: > frequency > tx-power (in mW * 1000 (see comment in code)) > bitrate (not sure about this one) > rts threshold > fragmentation threshold > access point MAC address Great job Joseph. I'll commit these to CVS later today. > > Unfortunately, I could not figure out how to set the current bitrate, nor find the sensitivity or retry limit in the ndis specification. Running iwconfig on the ndiswrapper ethernet device is a little more informative with these. > > Lastly, is there any reason why we don't read the PCI ids from the inf file rather than requiring them to be typed in on the command line? If we read from the inf then we can try a series of pci_find_device calls at driver start time to locate devices we support. A couple other things would have to be changed, but I'll make the change (and send another diff) unless someone has a reason this is a bad idea. > -Joe Dunn Thats a good idea. pci_find_device is however not the correct thing to use, because it's the old PCI-API. The pci_find_device you see in the code now is there purely because of debugging. Some inf-files I have seen contain several PCI-id's so for each of these we should add them to the pci-id table (see start_driver in wrapper.c). However I don't see this as an issue right now because it's pretty good to be able to specify any value to loaddriver easily in debugging purposes. Anyway. The inf-file parser needs more work. The biggest issue is that it does not support strings (bcm-drivers uses no strings but other do). /Pontus |