int madwifing_build_vap(const char *ifname, char *errstr, const char *vapname, char *retvapname, int vapmode, int vapflags) { struct ieee80211_clone_params { char icp_name[IFNAMSIZ]; uint16_t icp_opmode; uint16_t icp_flags; }; struct ieee80211_clone_params cp; struct ifreq ifr; int sock; char tnam[IFNAMSIZ]; int n; // Find a numbered vapname which is useable for (n = 0; n < 10; n++) { short fl; snprintf(tnam, IFNAMSIZ, "%s%d", vapname, n); if (ifconfig_get_flags(tnam, errstr, &fl) < 0) break; // Default to no temp name as error tnam[0] = '\0'; } if (tnam[0] == '\0') { snprintf(errstr, 1024, "Unable to find free slot for VAP %s", vapname); return -1; } memset(&ifr, 0, sizeof(ifr)); memset(&cp, 0, sizeof(cp)); strncpy(cp.icp_name, tnam, IFNAMSIZ); cp.icp_opmode = vapmode; cp.icp_flags = vapflags; strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ifr.ifr_data = (caddr_t) &cp; if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { snprintf(errstr, 1024, "Unable to create socket to madwifi-ng: %s", strerror(errno)); return -1; } if (ioctl(sock, SIOC80211IFCREATE, &ifr) < 0) { snprintf(errstr, 1024, "Unable to create VAP: %s", strerror(errno)); close(sock); return -1; } if (madwifing_setdevtype(ifr.ifr_name, ARPHDR_RADIOTAP, errstr) < 0) { return -1; } strncpy(retvapname, ifr.ifr_name, IFNAMSIZ); close(sock); return 1; }
int ifconfig_ifupdown(const char *in_dev, int devup) { int ret; short rflags; if ((ret = ifconfig_get_flags(in_dev, &rflags)) < 0) return ret; if (devup) { rflags |= IFF_UP; } else { rflags &= ~IFF_UP; } return ifconfig_set_flags(in_dev, rflags); }