示例#1
0
int brctl_main(int argc, char **argv)
{
    if (argc == 1) {
        fprintf(stderr, "try to be professional!\n");
        return -1;
    }
    br_init();
    if (!strcmp(argv[1], "addif")) {
        if (ifexists(argv[3]))
            br_add_interface(argv[2], argv[3]);
    }
    if (!strcmp(argv[1], "delif")) {
        if (ifexists(argv[3]))
            br_del_interface(argv[2], argv[3]);
    }
    if (!strcmp(argv[1], "addbr")) {
        br_add_bridge(argv[2]);
    }
    if (!strcmp(argv[1], "stp")) {
        br_set_stp_state(argv[2], atoi(argv[3]));
    }
    if (!strcmp(argv[1], "delbr")) {
        if (!ifexists(argv[2]))
            return -1;
        br_del_bridge(argv[2]);
    }
    if (!strcmp(argv[1], "show")) {
        br_cmd_show();
    }
    br_shutdown();
}
示例#2
0
int br_add_interface(const char *br, const char *dev)
{
    if (!ifexists(dev))
        return -1;
    char ipaddr[32];

    sprintf(ipaddr, "%s_ipaddr", dev);
    char netmask[32];

    sprintf(netmask, "%s_netmask", dev);

    eval("ifconfig", dev, "0.0.0.0");
    if (strncmp(dev, "ath", 3) != 0) {	// this is not an ethernet driver
        eval("ifconfig", dev, "down");	//fixup for some ethernet drivers
    }
    eval("ifconfig", dev, "mtu", getBridgeMTU(br));
    if (strncmp(dev, "ath", 3) != 0) {	// this is not an ethernet driver
        eval("ifconfig", dev, "up");
    }

    dd_syslog(LOG_INFO, "interface added successfully\n");
    int ret = eval("brctl", "addif", br, dev);
#ifdef HAVE_80211AC
    eval("emf", "add", "iface", br, dev);
#endif
    return ret;
}
示例#3
0
int br_del_interface(const char *bridge, const char *dev)
{
	if (!ifexists(dev))
		return -1;
	dd_syslog(LOG_INFO, "interface deleted successfully\n");
	struct ifreq ifr;
	int err;
	int ifindex = if_nametoindex(dev);

	if (ifindex == 0)
		return ENODEV;

	strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
#ifdef SIOCBRDELIF
	ifr.ifr_ifindex = ifindex;
	err = ioctl(br_socket_fd, SIOCBRDELIF, &ifr);
	if (err < 0)
#endif
	{
		unsigned long args[4] = { BRCTL_DEL_IF, ifindex, 0, 0 };

		ifr.ifr_data = (char *)args;
		err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
	}

	return err < 0 ? errno : 0;
}
示例#4
0
int br_set_port_prio(const char *bridge, char *port, char *prio)
{
	if (!ifexists(bridge))
		return -1;
	return port_set(bridge, port, "priority", atoi(prio),
			BRCTL_SET_PORT_PRIORITY);
}
示例#5
0
void deconfigure_wimax(void)
{
	char *dev = "ofdm";

	if (ifexists(dev)) {
		br_del_interface("br0", dev);
		eval("ifconfig", dev, "down");
	}
	eval("/sub/common/ssmodunload");
}
示例#6
0
int br_set_bridge_forward_delay(const char *br, int sec)
{
	if (!ifexists(br))
		return -1;
	struct timeval tv;

	tv.tv_sec = sec;
	tv.tv_usec = 0;

	return br_set(br, "forward_delay", __tv_to_jiffies(&tv), BRCTL_SET_BRIDGE_FORWARD_DELAY);
}
示例#7
0
int br_del_interface(const char *br, const char *dev)
{
    if (!ifexists(dev))
        return -1;
    dd_syslog(LOG_INFO, "interface deleted successfully\n");
    int ret = eval("brctl", "delif", br, dev);
#ifdef HAVE_80211AC
    eval("emf", "del", "iface", br, dev);
#endif
    return ret;
}
示例#8
0
int br_set_stp_state(const char *br, int stp_state)
{
    if (!ifexists(br))
        return -1;
    if (stp_state == 1) {
        // syslog (LOG_INFO, "stp is set to on\n");
        return eval("brctl", "stp", br, "1");
    } else {
        // syslog (LOG_INFO, "stp is set to off\n");
        return eval("brctl", "stp", br, "0");
    }
}
示例#9
0
int br_del_bridge(const char *brname)
{
    if (!ifexists(brname))
        return -1;
    dd_syslog(LOG_INFO, "bridge deleted successfully\n");
    /* Stop the EMF for this LAN */
#ifdef HAVE_80211AC
    eval("emf", "stop", brname);
    /* Remove Bridge from igs */
    eval("igs", "del", "bridge", brname);
    eval("emf", "del", "bridge", brname);
#endif
    return eval("brctl", "delbr", brname);
}
示例#10
0
int br_add_interface(const char *bridge, const char *dev)
{

	if (!ifexists(dev))
		return -1;
	char ipaddr[32];

	sprintf(ipaddr, "%s_ipaddr", dev);
	char netmask[32];

	sprintf(netmask, "%s_netmask", dev);

	if (strncmp(dev, "ath", 3) != 0) {	// this is not an ethernet driver
		eval("ifconfig", dev, "down");	//fixup for some ethernet drivers
	}
	if (nvram_get(ipaddr) && nvram_get(netmask)
	    && !nvram_match(ipaddr, "0.0.0.0")
	    && !nvram_match(netmask, "0.0.0.0")) {
		eval("ifconfig", dev, nvram_safe_get(ipaddr), "netmask",
		     nvram_safe_get(netmask), "mtu", getBridgeMTU(bridge));
	} else
		eval("ifconfig", dev, "mtu", getBridgeMTU(bridge));

	if (strncmp(dev, "ath", 3) != 0) {	// this is not an ethernet driver
		eval("ifconfig", dev, "up");
	}

	dd_syslog(LOG_INFO, "interface added successfully\n");

	struct ifreq ifr;
	int err;
	int ifindex = if_nametoindex(dev);

	if (ifindex == 0)
		return ENODEV;

	strncpy(ifr.ifr_name, bridge, IFNAMSIZ);
#ifdef SIOCBRADDIF
	ifr.ifr_ifindex = ifindex;
	err = ioctl(br_socket_fd, SIOCBRADDIF, &ifr);
	if (err < 0)
#endif
	{
		unsigned long args[4] = { BRCTL_ADD_IF, ifindex, 0, 0 };

		ifr.ifr_data = (char *)args;
		err = ioctl(br_socket_fd, SIOCDEVPRIVATE, &ifr);
	}
	return err < 0 ? errno : 0;
}
示例#11
0
int get_wl_instance(char *name)
{
	int unit;
	int ret;

	if (!ifexists(name))
		return -1;
	if (wl_probe(name))
		return -1;
	ret = wl_ioctl(name, WLC_GET_INSTANCE, &unit, sizeof(unit));
//      fprintf(stderr,"wl_instance = %d\n",unit);
	if (ret == 0)
		return unit;
	return ret;
}
示例#12
0
int br_del_bridge(const char *brname)
{
	int ret;
	if (!ifexists(brname))
		return -1;

#ifdef SIOCBRDELBR
	ret = ioctl(br_socket_fd, SIOCBRDELBR, brname);
	if (ret < 0)
#endif
	{
		char _br[IFNAMSIZ];
		unsigned long arg[3] = { BRCTL_DEL_BRIDGE, (unsigned long)_br };

		strncpy(_br, brname, IFNAMSIZ);
		ret = ioctl(br_socket_fd, SIOCSIFBR, arg);
	}
	dd_syslog(LOG_INFO, "bridge deleted successfully\n");
	return ret < 0 ? errno : 0;
}
示例#13
0
int br_set_bridge_prio(const char *br, char *prio)
{
    if (!ifexists(br))
        return -1;
    return eval("brctl", "setbridgeprio", br, prio);
}
示例#14
0
int br_set_port_prio(const char *br, char *port, char *prio)
{
    if (!ifexists(br))
        return -1;
    return eval("brctl", "setportprio", br, port, prio);
}
示例#15
0
int br_set_bridge_prio(const char *br, char *prio)
{
    if (!ifexists(br))
        return -1;
    return eval("mstpctl", "settreeprio", br, "0", prio);
}
示例#16
0
int br_set_stp_state(const char *br, int stp_state)
{
	if (!ifexists(br))
		return -1;
	return br_set(br, "stp_state", stp_state, BRCTL_SET_BRIDGE_STP_STATE);
}
示例#17
0
int br_set_bridge_prio(const char *br, char *prio)
{
	if (!ifexists(br))
		return -1;
	return br_set(br, "priority", atoi(prio), BRCTL_SET_BRIDGE_PRIORITY);
}
示例#18
0
int br_set_port_prio(const char *br, char *port, char *prio)
{
    if (!ifexists(br))
        return -1;
    return eval("mstpctl", "settreeportprio", br, port, "0", prio);
}
示例#19
0
int ej_active_wireless_if_11n(webs_t wp, int argc, char_t ** argv, char *ifname, int cnt, int turbo, int macmask)
{

	unsigned char *cp;
	int s, len;
	struct iwreq iwr;
	char nb[32];
	sprintf(nb, "%s_bias", ifname);
	int bias = atoi(nvram_default_get(nb, "0"));
	if (!ifexists(ifname)) {
		printf("IOCTL_STA_INFO ifresolv %s failed!\n", ifname);
		return cnt;
	}
	int state = 0;
	state = get_radiostate(ifname);
	if (state == 0 || state == -1) {
		printf("IOCTL_STA_INFO radio %s not enabled!\n", ifname);
		return cnt;
	}
	s = getsocket();
	if (s < 0) {
		fprintf(stderr, "socket(SOCK_DRAGM)\n");
		return cnt;
	}
	(void)memset(&iwr, 0, sizeof(struct iwreq));
	(void)strncpy(iwr.ifr_name, ifname, sizeof(iwr.ifr_name));

	iwr.u.data.pointer = (void *)&madbuf[0];
	iwr.u.data.length = 24 * 1024;
	if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) {
		fprintf(stderr, "IOCTL_STA_INFO for %s failed!\n", ifname);
		closesocket();
		return cnt;
	}
	len = iwr.u.data.length;
	if (len < sizeof(struct ieee80211req_sta_info)) {
		// fprintf(stderr,"IOCTL_STA_INFO len<struct %s failed!\n",ifname);
		closesocket();
		return cnt;
	}
	cp = madbuf;
	int bufcount = 0;
	do {
		struct ieee80211req_sta_info *si;
		uint8_t *vp;

		si = (struct ieee80211req_sta_info *)cp;
		vp = (u_int8_t *)(si + 1);

		if (cnt)
			websWrite(wp, ",");
		cnt++;
		char mac[32];

		strncpy(mac, ieee80211_ntoa(si->isi_macaddr), 31);
		if (nvram_match("maskmac", "1") && macmask) {
			mac[0] = 'x';
			mac[1] = 'x';
			mac[3] = 'x';
			mac[4] = 'x';
			mac[6] = 'x';
			mac[7] = 'x';
			mac[9] = 'x';
			mac[10] = 'x';
		}
		if (si->isi_noise == 0) {
			si->isi_noise = -95;
		}
		int qual = (si->isi_noise + si->isi_rssi) * 124 + 11600;
		qual /= 10;
		int rxrate = si->isi_rxrateKbps / 1000;
		int txrate = si->isi_txrateKbps / 1000;
		if (!rxrate)
			rxrate = si->isi_rates[si->isi_rxrate] & IEEE80211_RATE_VAL;
		if (!txrate)
			txrate = si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL;

		char rx[32];
		char tx[32];
		if (rxrate)
			sprintf(rx, "%3dM", rxrate);
		else
			sprintf(rx, "N/A");
		if (txrate)
			sprintf(tx, "%3dM", txrate);
		else
			sprintf(tx, "N/A");
		websWrite(wp, "'%s','%s','%s','%s','%s','%d','%d','%d','%d'", mac, ifname, UPTIME(si->isi_uptime), tx, rx, si->isi_noise + si->isi_rssi + bias, si->isi_noise + bias, si->isi_rssi, qual);
		bufcount += si->isi_len;
		cp += si->isi_len;
		len -= si->isi_len;
	}
	while (len >= sizeof(struct ieee80211req_sta_info)
	       && bufcount < (sizeof(madbuf) - sizeof(struct ieee80211req_sta_info)));

	closesocket();

	return cnt;
}
示例#20
0
int ej_active_wireless_if(webs_t wp, int argc, char_t ** argv, char *iface, char *visible, int cnt)
{
	int rssi = 0, noise = 0;
	FILE *fp2;
	char *mode;
	char mac[30];
	char line[80];
	int macmask;
	macmask = atoi(argv[0]);
	if (!ifexists(iface))
		return cnt;
	unlink(RSSI_TMP);
	char wlmode[32];

	sprintf(wlmode, "%s_mode", visible);
	mode = nvram_safe_get(wlmode);
	unsigned char buf[WLC_IOCTL_MAXLEN];

	memset(buf, 0, WLC_IOCTL_MAXLEN);	// get_wdev
	int r = getassoclist(iface, buf);

	if (r < 0)
		return cnt;
	struct maclist *maclist = (struct maclist *)buf;
	int i;

	for (i = 0; i < maclist->count; i++) {
		ether_etoa((uint8 *) & maclist->ea[i], mac);

		rssi = 0;
		noise = 0;
		// get rssi value
		if (strcmp(mode, "ap") && strcmp(mode, "apsta")
		    && strcmp(mode, "apstawet"))
			sysprintf("wl -i %s rssi > %s", iface, RSSI_TMP);
		else
			sysprintf("wl -i %s rssi \"%s\" > %s", iface, mac, RSSI_TMP);

		// get noise value if not ap mode
		// if (strcmp (mode, "ap"))
		// snprintf (cmd, sizeof (cmd), "wl -i %s noise >> %s", iface,
		// RSSI_TMP);
		// system2 (cmd); // get RSSI value for mac

		fp2 = fopen(RSSI_TMP, "r");
		if (fgets(line, sizeof(line), fp2) != NULL) {

			// get rssi
			if (sscanf(line, "%d", &rssi) != 1)
				continue;
			noise = getNoise(iface, NULL);
			/*
			 * if (strcmp (mode, "ap") && fgets (line, sizeof (line), fp2) != 
			 * NULL && sscanf (line, "%d", &noise) != 1) continue;
			 */
			// get noise for client/wet mode

			fclose(fp2);
		}
		if (nvram_match("maskmac", "1") && macmask) {
			mac[0] = 'x';
			mac[1] = 'x';
			mac[3] = 'x';
			mac[4] = 'x';
			mac[6] = 'x';
			mac[7] = 'x';
			mac[9] = 'x';
			mac[10] = 'x';
		}
		if (cnt)
			websWrite(wp, ",");
		cnt++;
		int rxrate[32];
		int txrate[32];
		int time[32];
		strcpy(rxrate, "N/A");
		strcpy(txrate, "N/A");
		strcpy(time, "N/A");
#ifndef WL_STA_SCBSTATS
#define WL_STA_SCBSTATS		0x4000	/* Per STA debug stats */
#endif
		sta_info_compat_t *sta;
		sta_info_compat_old_t *staold;
		char *param;
		int buflen;
		char buf[WLC_IOCTL_MEDLEN];
		strcpy(buf, "sta_info");
		buflen = strlen(buf) + 1;
		param = (char *)(buf + buflen);
		memcpy(param, (char *)&maclist->ea[i], ETHER_ADDR_LEN);
		if (!wl_ioctl(iface, WLC_GET_VAR, &buf[0], WLC_IOCTL_MEDLEN)) {
			/* display the sta info */
			sta = (sta_info_compat_t *) buf;
			if (sta->ver == 2) {
				staold = (sta_info_compat_old_t *) buf;
				if (staold->flags & WL_STA_SCBSTATS) {
					int tx = staold->tx_rate;
					int rx = staold->rx_rate;
					if (tx > 0)
						sprintf(txrate, "%dM", tx / 1000);

					if (rx > 0)
						sprintf(rxrate, "%dM", rx / 1000);
					strcpy(time, UPTIME(staold->in));
				}
			} else {	// sta->ver == 3
				if (sta->flags & WL_STA_SCBSTATS) {
					int tx = sta->tx_rate;
					int rx = sta->rx_rate;
					if (tx > 0)
						sprintf(txrate, "%dM", tx / 1000);

					if (rx > 0)
						sprintf(rxrate, "%dM", rx / 1000);
					strcpy(time, UPTIME(sta->in));
				}
			}
		}

		/*
		 * if (!strcmp (mode, "ap")) { noise = getNoise(iface,NULL); // null
		 * only for broadcom }
		 */
		int qual = rssi * 124 + 11600;
		qual /= 10;
		websWrite(wp, "'%s','%s','%s','%s','%s','%d','%d','%d','%d'", mac, iface, time, txrate, rxrate, rssi, noise, rssi - noise, qual);
	}
	unlink(RSSI_TMP);

	return cnt;
}
示例#21
0
int ifconfig(char *name, int flags, char *addr, char *netmask)
{
	// char *down="down";
	// if (flags == IFUP)
	// down = "up";
	cprintf("ifconfig %s = %s/%s\n", name, addr, netmask);
	if (!ifexists(name)) {
		cprintf("interface %s does not exists, ignoring\n", name);
		return -1;
	}
	// if (addr==NULL)
	// addr="0.0.0.0";
	// int ret;
	// if (netmask==NULL)
	// {
	// ret = eval("ifconfig",name,addr,down);
	// }else
	// {
	// ret = eval("ifconfig",name,addr,"netmask",netmask,down);
	// }
	int s;
	struct ifreq ifr;
	struct in_addr in_addr, in_netmask, in_broadaddr;

	cprintf("ifconfig(): name=[%s] flags=[%s] addr=[%s] netmask=[%s]\n",
		name, flags == IFUP ? "IFUP" : "0", addr, netmask);

	if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
		goto err;
	cprintf("ifconfig(): socket opened\n");

	strncpy(ifr.ifr_name, name, IFNAMSIZ);
	cprintf("ifconfig(): set interface name\n");
	if (flags) {
		ifr.ifr_flags = flags;
		if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0)
			goto err;
	}
	cprintf("ifconfig(): interface flags configured\n");
	if (addr) {
		inet_aton(addr, &in_addr);
		sin_addr(&ifr.ifr_addr).s_addr = in_addr.s_addr;
		ifr.ifr_addr.sa_family = AF_INET;
		if (ioctl(s, SIOCSIFADDR, &ifr) < 0)
			goto err;
	}
	cprintf("ifconfig() ip configured\n");

	if (addr && netmask) {
		inet_aton(netmask, &in_netmask);
		sin_addr(&ifr.ifr_netmask).s_addr = in_netmask.s_addr;
		ifr.ifr_netmask.sa_family = AF_INET;
		if (ioctl(s, SIOCSIFNETMASK, &ifr) < 0)
			goto err;

		in_broadaddr.s_addr =
		    (in_addr.s_addr & in_netmask.s_addr) | ~in_netmask.s_addr;
		sin_addr(&ifr.ifr_broadaddr).s_addr = in_broadaddr.s_addr;
		ifr.ifr_broadaddr.sa_family = AF_INET;
		if (ioctl(s, SIOCSIFBRDADDR, &ifr) < 0)
			goto err;
	}
	cprintf("ifconfig() mask configured\n");

	close(s);
	cprintf("ifconfig() done()\n");
	return 0;

err:
	cprintf("ifconfig() done with error\n");
	close(s);
#ifndef HAVE_SILENCE
	perror(name);
#endif
	return errno;
	// return ret;
}