1 /* Note : this particular snipset of code is available under
2 * the LGPL, MPL or BSD license (at your choice).
6 /* --------------------------- INCLUDE --------------------------- */
8 #define MAX_KEY_SIZE 16
13 char key_table[MAX_KEYS][MAX_KEY_SIZE];
14 int key_size[MAX_KEYS];
16 /* --------------------------- HANDLERS --------------------------- */
18 static int ioctl_set_encode(struct net_device *dev,
19 struct iw_request_info *info,
23 int index = (erq->flags & IW_ENCODE_INDEX) - 1;
27 /* Check the size of the key */
28 if(erq->length > MAX_KEY_SIZE)
32 if((index < 0) || (index >= MAX_KEYS))
35 /* Copy the key in the driver */
36 memcpy(key_table[index], key, erq->length);
37 key_size[index] = erq->length;
42 /* Do we want to just set the current key ? */
43 if((index >= 0) && (index < MAX_KEYS))
45 if(key_size[index] > 0)
56 if(erq->flags & IW_ENCODE_DISABLED)
57 key_on = 0; /* disable encryption */
58 if(erq->flags & IW_ENCODE_RESTRICTED)
59 key_open = 0; /* disable open mode */
60 if(erq->flags & IW_ENCODE_OPEN)
61 key_open = 1; /* enable open mode */
66 static int ioctl_get_encode(struct net_device *dev,
67 struct iw_request_info *info,
71 int index = (erq->flags & IW_ENCODE_INDEX) - 1;
76 erq->flags |= IW_ENCODE_DISABLED;
78 erq->flags |= IW_ENCODE_RESTRICTED;
80 erq->flags |= IW_ENCODE_OPEN;
82 /* Which key do we want */
83 if((index < 0) || (index >= MAX_KEYS))
85 erq->flags |= index + 1;
87 /* Copy the key to the user buffer */
88 erq->length = key_size[index];
89 memcpy(key, key_table[index], key_size[index]);
94 static int ioctl_get_range(struct net_device *dev,
95 struct iw_request_info *info,
99 struct iw_range *range = (struct iw_range *) extra;
101 rrq->length = sizeof(struct iw_range);
103 memset(range, 0, sizeof(struct iw_range));
105 #if WIRELESS_EXT > 10
106 /* Version we are compiled with */
107 range->we_version_compiled = WIRELESS_EXT;
108 /* Minimum version we recommend */
109 range->we_version_source = 8;
110 #endif /* WIRELESS_EXT > 10 */
113 range->encoding_size[0] = 8; /* DES = 64 bits key */
114 range->encoding_size[1] = 16;
115 range->num_encoding_sizes = 2;
116 range->max_encoding_tokens = 8;
117 #endif /* WIRELESS_EXT > 8 */
121 /* --------------------------- BINDING --------------------------- */
123 #if WIRELESS_EXT > 12
124 static const iw_handler handler_table[] =
127 (iw_handler) ioctl_set_encode, /* SIOCSIWENCODE */
128 (iw_handler) ioctl_get_encode, /* SIOCGIWENCODE */
130 #else /* WIRELESS_EXT < 12 */
132 do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
134 struct iwreq *wrq = (struct iwreq *) ifr;
142 char keybuf[MAX_KEY_SIZE];
143 if(wrq->u.encoding.pointer)
145 /* We actually have a key to set */
146 if(wrq->u.encoding.length > MAX_KEY_SIZE)
151 if(copy_from_user(keybuf, wrq->u.encoding.pointer,
152 wrq->u.encoding.length))
159 if(wrq->u.encoding.length != 0)
164 err = ioctl_set_encode(dev, NULL, &(wrq->u.encoding), keybuf);
169 /* only super-user can see encryption key */
170 if(! capable(CAP_NET_ADMIN))
176 char keybuf[MAX_KEY_SIZE];
177 err = ioctl_get_encode(dev, NULL, &(wrq->u.encoding), keybuf);
178 if(wrq->u.encoding.pointer)
180 if (copy_to_user(wrq->u.encoding.pointer, keybuf,
181 wrq->u.encoding.length))
186 #endif /* WIRELESS_EXT > 8 */
190 #endif /* WIRELESS_EXT < 12 */