00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00021
00022
00023 #include <sys/types.h>
00024 #include <sys/ipc.h>
00025 #include <sys/shm.h>
00026 #include <errno.h>
00027 #include <stdio.h>
00028 #include <string.h>
00029 #include "vif.h"
00030
00031
00032
00033
00035 typedef struct vif_list
00036 {
00037 int8_t vif_total_num;
00038 vif_info vif_entries[MAX_NUM_VIF];
00039 }
00040 vif_list;
00041
00042 #define VIF_LIST_SIZE sizeof(vif_list)
00043 #define MATCH_ID(id) ((id) == list_id)
00044
00045
00046
00047
00049 int list_id = -1;
00050
00052 vif_list *list = NULL;
00053
00054
00055
00056
00057 int vif_config_create(void);
00058 int vif_config_load(void);
00059 int vif_config_list(int, char[MAX_NUM_VIF][IFNAMSIZ + 1]);
00060 vif_info *vif_config_vif_info(int, const char *);
00061 int vif_config_add(int, const char *);
00062 int vif_config_delete(int, const char *);
00063 int vif_config_destory(int);
00064 void vif_config_print(int);
00065
00066 extern int (*vif_debug)(const char *format, ...);
00067 extern int (*vif_error)(const char *format, ...);
00068
00069
00070
00071
00077 int
00078 vif_config_init(int flags)
00079 {
00080 key_t shm_key = 42;
00081
00082
00083 if ((list_id = shmget(shm_key, VIF_LIST_SIZE, flags)) == -1)
00084 {
00085 vif_debug("vif_config_init(): shmget (%s)\n", strerror(errno));
00086 return -1;
00087 }
00088
00089
00090 if ((list = (vif_list *) shmat(list_id, NULL, 0)) == (vif_list *) -1)
00091 {
00092 vif_debug("vif_config_init(): shmat(%i) (%s)\n",
00093 list_id, strerror(errno));
00094 return -1;
00095 }
00096
00097 vif_debug("vif_config_init(): shmget (list_id = %i)\n", list_id);
00098 return list_id;
00099 }
00100
00104 int
00105 vif_config_device_index(const char *dev_name)
00106 {
00107 int i = 0;
00108 int index = -1;
00109
00110 if (list == NULL)
00111 {
00112 vif_error("vif_config_device_index(): No configuration loaded\n");
00113 return -1;
00114 }
00115 for (i = 0; i < list->vif_total_num; i++)
00116 if (strcmp(list->vif_entries[i].vif_name, dev_name) == 0)
00117 index = i;
00118
00119 return index;
00120 }
00121
00122
00123
00124
00132 void
00133 vif_config_init_iwrange(iwrange *wlan_range)
00134 {
00135 int i = 0;
00136
00137 wlan_range->min_nwid = 0;
00138 wlan_range->max_nwid = 0;
00139 wlan_range->sensitivity = 3;
00140 wlan_range->min_frag = 256;
00141 wlan_range->max_frag = 2346;
00142 wlan_range->we_version_compiled = WIRELESS_EXT;
00143 wlan_range->we_version_source = VIF_WE_VERSION;
00144 wlan_range->num_channels = VIF_NUM_CHANNEL;
00145 wlan_range->num_frequency = VIF_NUM_FREQ;
00146 for (i = 0; i < VIF_NUM_FREQ; i++)
00147 {
00148 iw_float2freq(channel_frequency[i] * MEGA, &(wlan_range->freq[i]));
00149 wlan_range->freq[i].i = i;
00150 }
00151 wlan_range->min_retry = 0;
00152 wlan_range->max_retry = VIF_MAX_RETRY;
00153 wlan_range->retry_capa = IW_RETRY_LIMIT;
00154 wlan_range->retry_flags = IW_RETRY_LIMIT;
00155 wlan_range->min_rts = 0;
00156 wlan_range->max_rts = VIF_MAX_RTS;
00157 }
00158
00166 void
00167 vif_config_init_wlan(const char *dev_name)
00168 {
00169 vif_info *vif_entry = vif_config_vif_info(list_id, dev_name);
00170 struct wireless_info *wlan_info = &vif_entry->vif_wlaninfo;
00171 if (wlan_info == NULL)
00172 return;
00173
00174
00175 strcpy(wlan_info->b.name, "IEEE 802.11b");
00176
00177
00178 vif_config_init_iwrange(&(wlan_info->range));
00179
00180
00181 wlan_info->has_nickname = 0;
00182 wlan_info->nickname[0] = '\0';
00183
00184
00185 wlan_info->has_ap_addr = 0;
00186 memset((char *) wlan_info->ap_addr.sa_data, 0x00, ETH_ALEN);
00187
00188
00189 wlan_info->power.value = 0;
00190 wlan_info->power.disabled = 1;
00191 wlan_info->power.fixed = 1;
00192 wlan_info->has_power = iw_get_param_state(&(wlan_info->power));
00193
00194
00195 wlan_info->sens.value = 0;
00196 wlan_info->sens.disabled = 0;
00197 wlan_info->sens.fixed = 1;
00198 wlan_info->has_sens = iw_get_param_state(&(wlan_info->sens));
00199
00200
00201 wlan_info->bitrate.value = 0;
00202 wlan_info->bitrate.disabled = 1;
00203 wlan_info->bitrate.fixed = 0;
00204 wlan_info->has_bitrate = iw_get_param_state(&(wlan_info->bitrate));
00205
00206
00207 wlan_info->rts.value = 0;
00208 wlan_info->rts.disabled = 1;
00209 wlan_info->rts.fixed = 1;
00210 wlan_info->has_rts = iw_get_param_state(&(wlan_info->rts));
00211
00212
00213 wlan_info->frag.value = 0;
00214 wlan_info->frag.disabled = 1;
00215 wlan_info->frag.fixed = 1;
00216 wlan_info->has_frag = iw_get_param_state(&(wlan_info->frag));
00217
00218
00219 wlan_info->txpower.value = VIF_DEFAULT_TXPWR;
00220 wlan_info->txpower.disabled = 0;
00221 wlan_info->txpower.flags = IW_TXPOW_DBM;
00222 wlan_info->txpower.fixed = 1;
00223 wlan_info->has_txpower = iw_get_param_state(&(wlan_info->txpower));
00224
00225
00226 wlan_info->retry.value = 0;
00227 wlan_info->retry.disabled = 1;
00228 wlan_info->retry.fixed = 1;
00229 wlan_info->has_retry = iw_get_param_state(&(wlan_info->retry));
00230
00231
00232 wlan_info->b.nwid.value = 0;
00233 wlan_info->b.nwid.disabled = 1;
00234 wlan_info->b.nwid.fixed = 1;
00235 wlan_info->b.has_nwid = iw_get_param_state(&(wlan_info->b.nwid));
00236
00237
00238 wlan_info->b.has_freq = 0;
00239 wlan_info->b.freq = channel_frequency[0] * MEGA;
00240 wlan_info->b.freq_flags = IW_FREQ_AUTO;
00241
00242
00243 wlan_info->b.has_key = 0;
00244 wlan_info->b.key_size = 0;
00245 wlan_info->b.key[0] = '\0';
00246 wlan_info->b.key_flags = IW_ENCODE_DISABLED;
00247
00248
00249 wlan_info->b.has_mode = 1;
00250 wlan_info->b.mode = IW_MODE_INFRA;
00251
00252
00253 wlan_info->b.has_essid = 0;
00254 wlan_info->b.essid_on = 1;
00255 wlan_info->b.essid[0] = '\0';
00256 }
00257
00258
00259
00260
00265 int
00266 vif_config_create(void)
00267 {
00268 int i = 0;
00269
00270 int shm_flags = 0644 | IPC_CREAT;
00271
00272 if (vif_config_init(shm_flags) < 0)
00273 return -1;
00274
00275 list->vif_total_num = 0;
00276 for (i = 0; i < MAX_NUM_VIF; i++)
00277 memset(&list->vif_entries[i], 0, sizeof(vif_info));
00278
00279
00280
00281
00282
00283 return list_id;
00284 }
00285
00290 int
00291 vif_config_load(void)
00292 {
00293 int shm_flags = 0644;
00294
00295 vif_config_init(shm_flags);
00296
00297
00298
00299
00300
00301 return list_id;
00302 }
00303
00305 int
00306 vif_config_unload(int id)
00307 {
00308 if (!MATCH_ID(id))
00309 return -1;
00310
00311 if (shmdt(list) < 0)
00312 {
00313 vif_error("vif_config_unload(%i): shmdt (%s)", id, strerror(errno));
00314 return -1;
00315 }
00316
00317 return 0;
00318 }
00319
00324 int
00325 vif_config_destory(int id)
00326 {
00327 if (!MATCH_ID(id))
00328 return -1;
00329
00330 return shmctl(id, IPC_RMID, NULL);
00331 }
00332
00338 int
00339 vif_config_delete(int id, const char *dev_name)
00340 {
00341 int i = 0, j = 0;
00342 int vif_index = -1;
00343 vif_info *vif_entry = NULL;
00344
00345 if (!MATCH_ID(id))
00346 return -1;
00347
00348 for (i = 0; i < list->vif_total_num; i++)
00349 {
00350 vif_entry = &list->vif_entries[i];
00351 if (strncmp(dev_name, vif_entry->vif_name, IFNAMSIZ) == 0)
00352 {
00353 vif_index = i;
00354 memset(vif_entry, 0, sizeof(vif_info));
00355 if (i < list->vif_total_num - 1)
00356 {
00357 for (j = i; j < list->vif_total_num; j++)
00358 memmove(&list->vif_entries[j], &list->vif_entries[j + 1],
00359 sizeof(vif_info));
00360 }
00361 break;
00362 }
00363 }
00364 if (vif_index < 0)
00365 {
00366 vif_debug("vif_config_delete(): interface %s not found\n", dev_name);
00367 return -1;
00368 }
00369 if (list->vif_total_num-- == 0)
00370 vif_config_destory(id);
00371
00372 return 0;
00373 }
00374
00381 int
00382 vif_config_list(int id, char vif_names[MAX_NUM_VIF][IFNAMSIZ + 1])
00383 {
00384 int i = 0;
00385 vif_info *vif_entry = NULL;
00386
00387 if (!MATCH_ID(id))
00388 return -1;
00389
00390 if (vif_names != NULL)
00391 {
00392 for (i = 0; i < list->vif_total_num; i++)
00393 {
00394 vif_entry = &list->vif_entries[i];
00395 strcpy(vif_names[i], vif_entry->vif_name);
00396 }
00397 }
00398
00399 return list->vif_total_num;
00400 }
00401
00408 vif_info *vif_config_vif_info(int id, const char *dev_name)
00409 {
00410 int vif_index = -1;
00411
00412 if (!MATCH_ID(id))
00413 return NULL;
00414
00415 vif_index = vif_config_device_index(dev_name);
00416 if (vif_index < 0)
00417 return NULL;
00418 else
00419 return &list->vif_entries[vif_index];
00420 }
00421
00429 int vif_config_add(int id, const char *dev_name)
00430 {
00431 vif_info *vif_entry = NULL;
00432
00433 if (!MATCH_ID(id))
00434 return -1;
00435
00436 if (vif_config_device_index(dev_name) >= 0)
00437 {
00438 vif_debug("vif_config_add(): device %s already exists\n");
00439 return -1;
00440 }
00441
00442
00443 vif_entry = &list->vif_entries[list->vif_total_num];
00444 list->vif_total_num++;
00445 strncpy(vif_entry->vif_name, dev_name, IFNAMSIZ);
00446 vif_entry->vif_name[IFNAMSIZ] = '\0';
00447 vif_config_init_wlan(dev_name);
00448
00449 return 0;
00450 }
00451
00456 void
00457 vif_config_print(int id)
00458 {
00459 int i = 0;
00460 vif_info *vif_entry = NULL;
00461
00462 if (!MATCH_ID(id))
00463 {
00464 vif_error("Couldn't find valid vif configuration\n");
00465 return;
00466 }
00467 vif_debug("Virtual interface configuration list:\n");
00468 vif_debug("| vif_total_num = %i\n", list->vif_total_num);
00469 for (i = 0; i < list->vif_total_num; i++)
00470 {
00471 vif_entry = &(list->vif_entries[i]);
00472 vif_debug("| vif_entries[%i]->vif_name = %s\t\t(address: %p)\n",
00473 i, (char *) &(vif_entry->vif_name), &(vif_entry->vif_name));
00474 vif_debug("| vif_entries[%i]->vif_mac = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\t(address: %p)\n",
00475 i, vif_entry->vif_mac[0], vif_entry->vif_mac[1],
00476 vif_entry->vif_mac[2], vif_entry->vif_mac[3],
00477 vif_entry->vif_mac[4], vif_entry->vif_mac[5],
00478 &(vif_entry->vif_mac));
00479
00480
00481
00482
00483 }
00484 }