Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}