123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #if WIRELESS_EXT <= 12
- struct iw_request_info
- {
- __u16 cmd;
- __u16 flags;
- };
- #endif
- #ifndef IW_PRIV_TYPE_ADDR
- #define IW_PRIV_TYPE_ADDR 0x6000
- #endif
- static int sample_ioctl_set_mac(struct net_device *dev,
- struct iw_request_info *info,
- struct iw_point *data,
- struct sockaddr *mac_addr)
- {
- unsigned char * addr = (char *) &mac_addr->sa_data;
- switch(data->flags) {
- case 0:
- printk(KERN_DEBUG "%s: mac_add %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- case 1:
- printk(KERN_DEBUG "%s: mac_del %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- case 2:
- printk(KERN_DEBUG "%s: mac_kick %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- default:
- printk(KERN_DEBUG "%s: mac_undefined %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- }
- return 0;
- }
- static int sample_ioctl_set_addr(struct net_device *dev,
- struct iw_request_info *info,
- struct sockaddr *mac_addr, char *extra)
- {
- unsigned char * addr = (char *) &mac_addr->sa_data;
- switch(info->cmd) {
- case SIOCIWFIRSTPRIV + 28:
- printk(KERN_DEBUG "%s: addr_add %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- case SIOCIWFIRSTPRIV + 30:
- printk(KERN_DEBUG "%s: addr_del %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- default:
- printk(KERN_DEBUG "%s: mac_undefined %02X:%02X:%02X:%02X:%02X:%02X\n", dev->name, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
- break;
- }
- return 0;
- }
- static int sample_ioctl_get_mac(struct net_device *dev,
- struct iw_request_info *info,
- struct iw_point *data,
- struct sockaddr *mac_addr)
- {
- unsigned char fake_addr[6];
- int i;
- int j;
- for(i = 0; i < 16; i++) {
-
- for(j = 0; j < 6; j++)
- fake_addr[j] = (unsigned char) ((j << 4) + i);
-
- memcpy(&(mac_addr[i]).sa_data, fake_addr, ETH_ALEN);
- mac_addr[i].sa_family = ARPHRD_ETHER;
- }
- data->length = 16;
- return 0;
- }
- static int sample_ioctl_set_float(struct net_device *dev,
- struct iw_request_info *info,
- struct iw_freq *freq, char *extra)
- {
- printk(KERN_DEBUG "%s: set_float %d;%d\n",
- dev->name, freq->m, freq->e);
- return 0;
- }
- static const struct iw_priv_args sample_priv[] = {
-
-
- { SIOCIWFIRSTPRIV + 0,
- IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "" },
-
- { 0,
- IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "macadd" },
- { 1,
- IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "macdel" },
- { 2,
- IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "mackick" },
-
- { SIOCIWFIRSTPRIV + 2,
- IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "addradd" },
- { SIOCIWFIRSTPRIV + 4,
- IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, "addrdel" },
-
- { SIOCIWFIRSTPRIV + 1,
- 0, IW_PRIV_TYPE_ADDR | 16, "macget" },
- { SIOCIWFIRSTPRIV + 6,
- IW_PRIV_TYPE_FLOAT | IW_PRIV_SIZE_FIXED | 1, 0, "setfloat" },
- };
- static const iw_handler sample_private_handler[] =
- {
- #if WIRELESS_EXT >= 15
-
- (iw_handler) sample_ioctl_set_mac,
- (iw_handler) sample_ioctl_get_mac,
- (iw_handler) sample_ioctl_set_addr,
- (iw_handler) NULL,
- (iw_handler) sample_ioctl_set_addr,
- (iw_handler) NULL,
- (iw_handler) sample_ioctl_set_float,
- #endif
- };
- #if WIRELESS_EXT < 15
-
- case SIOCIWFIRSTPRIV + 0:
- if (wrq->u.data.length > 1)
- ret = -E2BIG;
- else if (wrq->u.data.pointer) {
- struct sockaddr mac_addr;
- if (copy_from_user(&mac_addr, wrq->u.data.pointer,
- sizeof(struct sockaddr))) {
- ret = -EFAULT;
- break;
- }
- ret = sample_ioctl_set_mac(dev, NULL, &wrq->u.data,
- &mac_addr);
- }
- break;
- case SIOCIWFIRSTPRIV + 2:
- case SIOCIWFIRSTPRIV + 4:
- if (!capable(CAP_NET_ADMIN))
- ret = -EPERM;
- else {
- struct iw_request_info info;
- info.cmd = cmd;
- ret = sample_ioctl_set_addr(dev, &info,
- &wrq->u.ap_addr,
- NULL);
- }
- break;
- case SIOCIWFIRSTPRIV + 1:
- if (wrq->u.essid.pointer) {
- struct sockaddr mac_addr[16];
- char nickbuf[IW_ESSID_MAX_SIZE + 1];
- ret = sample_ioctl_get_mac(dev, NULL, &wrq->u.data,
- mac_addr);
- if (copy_to_user(wrq->u.data.pointer, nickbuf,
- wrq->u.data.length *
- sizeof(struct sockaddr)))
- ret = -EFAULT;
- }
- break;
- case SIOCIWFIRSTPRIV + 6:
- if (!capable(CAP_NET_ADMIN))
- ret = -EPERM;
- else {
- ret = sample_ioctl_set_float(dev, NULL,
- &wrq->u.freq,
- NULL);
- }
- break;
- #endif
|