コード例 #1
0
int br_add_bridge(const char *brname)
{
	int ret;

	dd_syslog(LOG_INFO, "bridge added successfully\n");
	char ipaddr[32];

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

	sprintf(netmask, "%s_netmask", brname);
#ifdef SIOCBRADDBR
	ret = ioctl(br_socket_fd, SIOCBRADDBR, brname);
	if (ret < 0)
#endif
	{
		char _br[IFNAMSIZ];
		unsigned long arg[3] = { BRCTL_ADD_BRIDGE, (unsigned long)_br };

		strncpy(_br, brname, IFNAMSIZ);
		ret = ioctl(br_socket_fd, SIOCSIFBR, arg);
	}

	if (nvram_get(ipaddr) && nvram_get(netmask)
	    && !nvram_match(ipaddr, "0.0.0.0")
	    && !nvram_match(netmask, "0.0.0.0")) {
		eval("ifconfig", brname, nvram_safe_get(ipaddr), "netmask",
		     nvram_safe_get(netmask), "mtu", getBridgeMTU(brname),
		     "up");
	} else
		eval("ifconfig", brname, "mtu", getBridgeMTU(brname));

	return ret < 0 ? errno : 0;
}
コード例 #2
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;
}
コード例 #3
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;
}
コード例 #4
0
int br_add_bridge(const char *brname)
{
    dd_syslog(LOG_INFO, "bridge added successfully\n");
    char ipaddr[32];
    char brmcast[32];

    sprintf(brmcast, "%s_mcast", brname);
    sprintf(ipaddr, "%s_ipaddr", brname);
    char netmask[32];

    sprintf(netmask, "%s_netmask", brname);
    int ret = eval("brctl", "addbr", brname);

#ifdef HAVE_80211AC
    eval("emf", "add", "bridge", brname);
    eval("igs", "add", "bridge", brname);
#endif

    if (nvram_get(ipaddr) && nvram_get(netmask)
            && !nvram_match(ipaddr, "0.0.0.0")
            && !nvram_match(netmask, "0.0.0.0")) {
        eval("ifconfig", brname, nvram_safe_get(ipaddr), "netmask", nvram_safe_get(netmask), "mtu", getBridgeMTU(brname), "up");
    } else
        eval("ifconfig", brname, "mtu", getBridgeMTU(brname));

    char *mcast = nvram_default_get(brmcast, "0");
    sysprintf("echo %s > /sys/devices/virtual/net/%s/bridge/multicast_snooping", mcast, brname);
    return ret;
}