diff options
Diffstat (limited to 'package/nvram/src/wl.c')
| -rw-r--r-- | package/nvram/src/wl.c | 57 | 
1 files changed, 57 insertions, 0 deletions
| diff --git a/package/nvram/src/wl.c b/package/nvram/src/wl.c index 5738e2cd0..c33610310 100644 --- a/package/nvram/src/wl.c +++ b/package/nvram/src/wl.c @@ -11,12 +11,69 @@   *   * $Id$   */ +#include <stdio.h> +#include <unistd.h>  #include <string.h> +#include <errno.h> +#include <sys/ioctl.h> +#include <net/if.h>  #include <typedefs.h>  #include <wlutils.h>  int +wl_ioctl(char *name, int cmd, void *buf, int len) +{ +	struct ifreq ifr; +	wl_ioctl_t ioc; +	int ret = 0; + 	int s; + +	/* open socket to kernel */ +	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { +		perror("socket"); +		return errno; +	} + +	/* do it */ +	ioc.cmd = cmd; +	ioc.buf = buf; +	ioc.len = len; +	strncpy(ifr.ifr_name, name, IFNAMSIZ); +	ifr.ifr_data = (caddr_t) &ioc; +	if ((ret = ioctl(s, SIOCDEVPRIVATE, &ifr)) < 0) +		if (cmd != WLC_GET_MAGIC) +			perror(ifr.ifr_name); + +	/* cleanup */ +	close(s); +	return ret; +} + +int +wl_hwaddr(char *name, unsigned char *hwaddr) +{ +	struct ifreq ifr; +	int ret = 0; + 	int s; + +	/* open socket to kernel */ +	if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { +		perror("socket"); +		return errno; +	} + +	/* do it */ +	strncpy(ifr.ifr_name, name, IFNAMSIZ); +	if ((ret = ioctl(s, SIOCGIFHWADDR, &ifr)) == 0) +		memcpy(hwaddr, ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN); + +	/* cleanup */ +	close(s); +	return ret; +}	 + +int  wl_probe(char *name)  {  	int ret, val; | 
