📄 iwconfig.c
字号:
/* Pointer is absent in new API */ if(wrq.u.data.pointer == NULL) wrq.u.data.flags |= IW_ENCODE_NOKEY; /* Check if we have any invalid argument */ if(!gotone) { errarg = 0; return(IWERR_ARG_TYPE); } } if(iw_set_ext(skfd, ifname, SIOCSIWENCODE, &wrq) < 0) return(IWERR_SET_EXT); /* Var arg */ return(i);}/*------------------------------------------------------------------*//* * Set Power Management */static intset_power_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; int i = 1; if(!strcasecmp(args[0], "off")) wrq.u.power.disabled = 1; /* i.e. max size */ else if(!strcasecmp(args[0], "on")) { /* Get old Power info */ wrq.u.power.flags = 0; if(iw_get_ext(skfd, ifname, SIOCGIWPOWER, &wrq) < 0) return(IWERR_GET_EXT); wrq.u.power.disabled = 0; } else { double value; char * unit; int gotone = 0; /* Parse modifiers */ i = parse_modifiers(args, count, &wrq.u.power.flags, iwmod_power, IWMOD_POWER_NUM); if(i < 0) return(i); wrq.u.power.disabled = 0; /* Is there any value to grab ? */ value = strtod(args[0], &unit); if(unit != args[0]) { struct iw_range range; int flags; /* Extract range info to handle properly 'relative' */ if(iw_get_range_info(skfd, ifname, &range) < 0) memset(&range, 0, sizeof(range)); /* Get the flags to be able to do the proper conversion */ switch(wrq.u.power.flags & IW_POWER_TYPE) { case IW_POWER_SAVING: flags = range.pms_flags; break; case IW_POWER_TIMEOUT: flags = range.pmt_flags; break; default: flags = range.pmp_flags; break; } /* Check if time or relative */ if(flags & IW_POWER_RELATIVE) { if(range.we_version_compiled < 21) value *= MEGA; else wrq.u.power.flags |= IW_POWER_RELATIVE; } else { value *= MEGA; /* default = s */ if(unit[0] == 'u') value /= MEGA; if(unit[0] == 'm') value /= KILO; } wrq.u.power.value = (long) value; /* Set some default type if none */ if((wrq.u.power.flags & IW_POWER_TYPE) == 0) wrq.u.power.flags |= IW_POWER_PERIOD; ++i; gotone = 1; } /* Now, check the mode */ if(i < count) { if(!strcasecmp(args[i], "all")) wrq.u.power.flags |= IW_POWER_ALL_R; if(!strncasecmp(args[i], "unicast", 4)) wrq.u.power.flags |= IW_POWER_UNICAST_R; if(!strncasecmp(args[i], "multicast", 5)) wrq.u.power.flags |= IW_POWER_MULTICAST_R; if(!strncasecmp(args[i], "force", 5)) wrq.u.power.flags |= IW_POWER_FORCE_S; if(!strcasecmp(args[i], "repeat")) wrq.u.power.flags |= IW_POWER_REPEATER; if(wrq.u.power.flags & IW_POWER_MODE) { ++i; gotone = 1; } } if(!gotone) { errarg = i; return(IWERR_ARG_TYPE); } } if(iw_set_ext(skfd, ifname, SIOCSIWPOWER, &wrq) < 0) return(IWERR_SET_EXT); /* Var args */ return(i);}#ifndef WE_ESSENTIAL/*------------------------------------------------------------------*//* * Set Nickname */static intset_nick_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; int we_kernel_version; /* Avoid "Unused parameter" warning */ count = count; if(strlen(args[0]) > IW_ESSID_MAX_SIZE) { errmax = IW_ESSID_MAX_SIZE; return(IWERR_ARG_SIZE); } we_kernel_version = iw_get_kernel_we_version(); wrq.u.essid.pointer = (caddr_t) args[0]; wrq.u.essid.length = strlen(args[0]); if(we_kernel_version < 21) wrq.u.essid.length++; if(iw_set_ext(skfd, ifname, SIOCSIWNICKN, &wrq) < 0) return(IWERR_SET_EXT); /* 1 args */ return(1);}/*------------------------------------------------------------------*//* * Set commit */static intset_nwid_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; unsigned long temp; /* Avoid "Unused parameter" warning */ count = count; if((!strcasecmp(args[0], "off")) || (!strcasecmp(args[0], "any"))) wrq.u.nwid.disabled = 1; else if(!strcasecmp(args[0], "on")) { /* Get old nwid */ if(iw_get_ext(skfd, ifname, SIOCGIWNWID, &wrq) < 0) return(IWERR_GET_EXT); wrq.u.nwid.disabled = 0; } else if(sscanf(args[0], "%lX", &(temp)) != 1) { errarg = 0; return(IWERR_ARG_TYPE); } else { wrq.u.nwid.value = temp; wrq.u.nwid.disabled = 0; } wrq.u.nwid.fixed = 1; /* Set new nwid */ if(iw_set_ext(skfd, ifname, SIOCSIWNWID, &wrq) < 0) return(IWERR_SET_EXT); /* 1 arg */ return(1);}/*------------------------------------------------------------------*//* * Set AP Address */static intset_apaddr_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; /* Avoid "Unused parameter" warning */ count = count; if((!strcasecmp(args[0], "auto")) || (!strcasecmp(args[0], "any"))) { /* Send a broadcast address */ iw_broad_ether(&(wrq.u.ap_addr)); } else { if(!strcasecmp(args[0], "off")) { /* Send a NULL address */ iw_null_ether(&(wrq.u.ap_addr)); } else { /* Get the address and check if the interface supports it */ if(iw_in_addr(skfd, ifname, args[0], &(wrq.u.ap_addr)) < 0) { errarg = 0; return(IWERR_ARG_TYPE); } } } if(iw_set_ext(skfd, ifname, SIOCSIWAP, &wrq) < 0) return(IWERR_SET_EXT); /* 1 args */ return(1);}/*------------------------------------------------------------------*//* * Set Tx Power */static intset_txpower_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; int i = 1; /* Avoid "Unused parameter" warning */ args = args; count = count; /* Prepare the request */ wrq.u.txpower.value = -1; wrq.u.txpower.fixed = 1; wrq.u.txpower.disabled = 0; wrq.u.txpower.flags = IW_TXPOW_DBM; if(!strcasecmp(args[0], "off")) wrq.u.txpower.disabled = 1; /* i.e. turn radio off */ else if(!strcasecmp(args[0], "auto")) wrq.u.txpower.fixed = 0; /* i.e. use power control */ else { if(!strcasecmp(args[0], "on")) { /* Get old tx-power */ if(iw_get_ext(skfd, ifname, SIOCGIWTXPOW, &wrq) < 0) return(IWERR_GET_EXT); wrq.u.txpower.disabled = 0; } else { if(!strcasecmp(args[0], "fixed")) { /* Get old tx-power */ if(iw_get_ext(skfd, ifname, SIOCGIWTXPOW, &wrq) < 0) return(IWERR_GET_EXT); wrq.u.txpower.fixed = 1; wrq.u.txpower.disabled = 0; } else /* Should be a numeric value */ { int power; int ismwatt = 0; struct iw_range range; /* Extract range info to do proper conversion */ if(iw_get_range_info(skfd, ifname, &range) < 0) memset(&range, 0, sizeof(range)); /* Get the value */ if(sscanf(args[0], "%i", &(power)) != 1) { errarg = 0; return(IWERR_ARG_TYPE); } /* Check if milliWatt * We authorise a single 'm' as a shorthand for 'mW', * on the other hand a 'd' probably means 'dBm'... */ ismwatt = ((strchr(args[0], 'm') != NULL) && (strchr(args[0], 'd') == NULL)); /* We could check 'W' alone... Another time... */ /* Convert */ if(range.txpower_capa & IW_TXPOW_RELATIVE) { /* Can't convert */ if(ismwatt) { errarg = 0; return(IWERR_ARG_TYPE); } wrq.u.txpower.flags = IW_TXPOW_RELATIVE; } else if(range.txpower_capa & IW_TXPOW_MWATT) { if(!ismwatt) power = iw_dbm2mwatt(power); wrq.u.txpower.flags = IW_TXPOW_MWATT; } else { if(ismwatt) power = iw_mwatt2dbm(power); wrq.u.txpower.flags = IW_TXPOW_DBM; } wrq.u.txpower.value = power; /* Check for an additional argument */ if((i < count) && (!strcasecmp(args[i], "auto"))) { wrq.u.txpower.fixed = 0; ++i; } if((i < count) && (!strcasecmp(args[i], "fixed"))) { wrq.u.txpower.fixed = 1; ++i; } } } } if(iw_set_ext(skfd, ifname, SIOCSIWTXPOW, &wrq) < 0) return(IWERR_SET_EXT); /* Var args */ return(i);}/*------------------------------------------------------------------*//* * Set Sensitivity */static intset_sens_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; int temp; /* Avoid "Unused parameter" warning */ count = count; if(sscanf(args[0], "%i", &(temp)) != 1) { errarg = 0; return(IWERR_ARG_TYPE); } wrq.u.sens.value = temp; if(iw_set_ext(skfd, ifname, SIOCSIWSENS, &wrq) < 0) return(IWERR_SET_EXT); /* 1 arg */ return(1);}/*------------------------------------------------------------------*//* * Set Retry Limit */static intset_retry_info(int skfd, char * ifname, char * args[], /* Command line args */ int count) /* Args count */{ struct iwreq wrq; int i = 0; double value; char * unit; /* Parse modifiers */ i = parse_modifiers(args, count, &wrq.u.retry.flags, iwmod_retry, IWMOD_RETRY_NUM); if(i < 0) return(i); /* Add default type if none */ if((wrq.u.retry.flags & IW_RETRY_TYPE) == 0) wrq.u.retry.flags |= IW_RETRY_LIMIT; wrq.u.retry.disabled = 0; /* Is there any value to grab ? */ value = strtod(args[0], &unit); if(unit == args[0]) { errarg = i; return(IWERR_ARG_TYPE); } /* Limit is absolute, on the other hand lifetime is seconds */ if(wrq.u.retry.flags & IW_RETRY_LIFETIME) { struct iw_range range; /* Extract range info to handle properly 'relative' */ if(iw_get_range_info(skfd, ifname, &range) < 0) memset(&range, 0, sizeof(range)); if(range.r_time_flags & IW_RETRY_RELATIVE) { if(range.we_version_compiled < 21) value *= MEGA; else wrq.u.retry.flags |= IW_RETRY_RELATIVE; } else { /* Normalise lifetime */ value *= MEGA; /* default = s */ if(unit[0] == 'u') value /= MEGA; if(unit[0] == 'm') value /= KILO; } } wrq.u.retry.value = (long) value; ++i; if(iw_set_ext(skfd, ifname, SIOCSIWRETRY, &wrq) < 0) return(IWERR_SET_EXT); /* Var args */ return(i);}/*------------------------------------------------------------------*//* * Set RTS Threshold */static int
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -