2 * Warning : this program need wireless extensions...
5 #include <sys/socket.h>
7 #include <linux/netdevice.h>
9 #include <linux/if_arp.h>
10 #include <linux/if_ether.h>
11 #include <linux/ipx.h>
12 #include <linux/wireless.h>
21 int skfd = -1; /* generic raw socket desc. */
22 int ipx_sock = -1; /* IPX socket */
23 int ax25_sock = -1; /* AX.25 socket */
24 int inet_sock = -1; /* INET socket */
25 int ddp_sock = -1; /* Appletalk DDP socket */
27 static int sockets_open()
29 inet_sock=socket(AF_INET, SOCK_DGRAM, 0);
30 ipx_sock=socket(AF_IPX, SOCK_DGRAM, 0);
31 ax25_sock=socket(AF_AX25, SOCK_DGRAM, 0);
32 ddp_sock=socket(AF_APPLETALK, SOCK_DGRAM, 0);
34 * Now pick any (exisiting) useful socket family for generic queries
43 * If this is -1 we have no known network layers and its time to jump.
52 int ret = args & IW_PRIV_SIZE_MASK;
54 if(((args & IW_PRIV_TYPE_MASK) == IW_PRIV_TYPE_INT) ||
55 ((args & IW_PRIV_TYPE_MASK) == IW_PRIV_TYPE_FLOAT))
58 if((args & IW_PRIV_TYPE_MASK) == IW_PRIV_TYPE_NONE)
69 char * ifname = argv[1];
70 struct iw_priv_args priv[16];
76 /* Create a channel to the NET kernel. */
77 if((skfd = sockets_open()) < 0)
83 strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
84 wrq.u.data.pointer = (caddr_t) priv;
85 wrq.u.data.length = 0;
87 if(ioctl(skfd, SIOCGIWPRIV, &wrq) < 0)
89 fprintf(stderr, "Interface doesn't provide private interface info...\n");
90 fprintf(stderr, "SIOCGIWPRIV: %s\n", strerror(errno));
97 char * argtype[] = { " ", "byte", "char", "", "int", "float" };
99 printf("Available private ioctl :\n");
100 for(k = 0; k < wrq.u.data.length; k++)
101 printf("%s (%lX) : set %3d %s & get %3d %s\n",
102 priv[k].name, priv[k].cmd,
103 priv[k].set_args & IW_PRIV_SIZE_MASK,
104 argtype[(priv[k].set_args & IW_PRIV_TYPE_MASK) >> 12],
105 priv[k].get_args & IW_PRIV_SIZE_MASK,
106 argtype[(priv[k].get_args & IW_PRIV_TYPE_MASK) >> 12]);
112 /* Seach the correct ioctl */
114 while((++k < wrq.u.data.length) && strcmp(priv[k].name, argv[2]))
116 /* If not found... */
117 if(k == wrq.u.data.length)
118 fprintf(stderr, "Invalid argument : %s\n", argv[2]);
120 /* If we have to set some data */
121 if((priv[k].set_args & IW_PRIV_TYPE_MASK) &&
122 (priv[k].set_args & IW_PRIV_SIZE_MASK))
126 /* Warning : we may have no args to set... */
128 switch(priv[k].set_args & IW_PRIV_TYPE_MASK)
130 case IW_PRIV_TYPE_BYTE:
131 /* Number of args to fetch */
132 wrq.u.data.length = argc - 3;
133 if(wrq.u.data.length > (priv[k].set_args & IW_PRIV_SIZE_MASK))
134 wrq.u.data.length = priv[k].set_args & IW_PRIV_SIZE_MASK;
137 for(i = 0; i < wrq.u.data.length; i++)
138 sscanf(argv[i + 3], "%d", buffer + i);
141 case IW_PRIV_TYPE_INT:
142 /* Number of args to fetch */
143 wrq.u.data.length = argc - 3;
144 if(wrq.u.data.length > (priv[k].set_args & IW_PRIV_SIZE_MASK))
145 wrq.u.data.length = priv[k].set_args & IW_PRIV_SIZE_MASK;
148 for(i = 0; i < wrq.u.data.length; i++)
149 sscanf(argv[i + 3], "%d", ((u_int *) buffer) + i);
153 fprintf(stderr, "Not yet implemented...\n");
157 if((priv[k].set_args & IW_PRIV_SIZE_FIXED) &&
158 (wrq.u.data.length != (priv[k].set_args & IW_PRIV_SIZE_MASK)))
160 printf("The command %s need exactly %d argument...\n",
161 priv[k].name, priv[k].set_args & IW_PRIV_SIZE_MASK);
164 } /* if args to set */
167 wrq.u.data.length = 0L;
170 strncpy(wrq.ifr_name, ifname, IFNAMSIZ);
172 if((priv[k].set_args & IW_PRIV_SIZE_FIXED) &&
173 (byte_size(priv[k].set_args) < IFNAMSIZ))
174 memcpy(wrq.u.name, buffer, IFNAMSIZ);
177 wrq.u.data.pointer = (caddr_t) buffer;
178 wrq.u.data.flags = 0;
181 if(ioctl(skfd, priv[k].cmd, &wrq) < 0)
183 fprintf(stderr, "Interface doesn't accept private ioctl...\n");
184 fprintf(stderr, "%X: %s\n", priv[k].cmd, strerror(errno));
188 /* If we have to get some data */
189 if((priv[k].get_args & IW_PRIV_TYPE_MASK) &&
190 (priv[k].get_args & IW_PRIV_SIZE_MASK))
193 int n; /* number of args */
195 if((priv[k].get_args & IW_PRIV_SIZE_FIXED) &&
196 (byte_size(priv[k].get_args) < IFNAMSIZ))
198 memcpy(buffer, wrq.u.name, IFNAMSIZ);
199 n = priv[k].get_args & IW_PRIV_SIZE_MASK;
202 n = wrq.u.data.length;
204 switch(priv[k].get_args & IW_PRIV_TYPE_MASK)
206 case IW_PRIV_TYPE_BYTE:
208 for(i = 0; i < n; i++)
209 printf("%d ", buffer[i]);
213 case IW_PRIV_TYPE_INT:
215 for(i = 0; i < n; i++)
216 printf("%d ", ((u_int *) buffer)[i]);
221 fprintf(stderr, "Not yet implemented...\n");
225 } /* if args to set */
227 } /* if ioctl list else ioctl exec */
229 /* Close the socket. */