コード例 #1
0
ファイル: if.c プロジェクト: kusumi/DragonFlyBSD
int
interface_up(char *name)
{
	struct ifreq ifr;
	int llflag;

	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));

	if (ioctl(ifsock, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
		warnmsg(LOG_WARNING, __func__, "ioctl(SIOCGIFFLAGS): %s",
		       strerror(errno));
		return(-1);
	}
	if (!(ifr.ifr_flags & IFF_UP)) {
		ifr.ifr_flags |= IFF_UP;
		if (ioctl(ifsock, SIOCSIFFLAGS, (caddr_t)&ifr) < 0) {
			warnmsg(LOG_ERR, __func__,
				"ioctl(SIOCSIFFLAGS): %s", strerror(errno));
		}
		return(-1);
	}

	warnmsg(LOG_DEBUG, __func__, "checking if %s is ready...", name);

	llflag = get_llflag(name);
	if (llflag < 0) {
		warnmsg(LOG_WARNING, __func__,
			"get_llflag() failed, anyway I'll try");
		return 0;
	}

	if (!(llflag & IN6_IFF_NOTREADY)) {
		warnmsg(LOG_DEBUG, __func__,
			"%s is ready", name);
		return(0);
	} else {
		if (llflag & IN6_IFF_TENTATIVE) {
			warnmsg(LOG_DEBUG, __func__, "%s is tentative",
			       name);
			return IFS_TENTATIVE;
		}
		if (llflag & IN6_IFF_DUPLICATED)
			warnmsg(LOG_DEBUG, __func__, "%s is duplicated",
			       name);
		return -1;
	}
}
コード例 #2
0
ファイル: if.c プロジェクト: AhmadTux/freebsd
int
interface_up(char *name)
{
	struct ifreq ifr;
	struct in6_ndireq nd;
	int llflag;
	int s;

	memset(&ifr, 0, sizeof(ifr));
	strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
	memset(&nd, 0, sizeof(nd));
	strlcpy(nd.ifname, name, sizeof(nd.ifname));

	if (ioctl(ifsock, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
		warnmsg(LOG_WARNING, __func__, "ioctl(SIOCGIFFLAGS): %s",
		    strerror(errno));
		return (-1);
	}
	if (!(ifr.ifr_flags & IFF_UP)) {
		ifr.ifr_flags |= IFF_UP;
		if (ioctl(ifsock, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
			warnmsg(LOG_ERR, __func__,
			    "ioctl(SIOCSIFFLAGS): %s", strerror(errno));
		return (-1);
	}
	if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
		warnmsg(LOG_WARNING, __func__, "socket(AF_INET6, SOCK_DGRAM): %s",
		    strerror(errno));
		return (-1);
	}
	if (ioctl(s, SIOCGIFINFO_IN6, (caddr_t)&nd) < 0) {
		warnmsg(LOG_WARNING, __func__, "ioctl(SIOCGIFINFO_IN6): %s",
		    strerror(errno));
		close(s);
		return (-1);
	}

	warnmsg(LOG_DEBUG, __func__, "checking if %s is ready...", name);

	if (nd.ndi.flags & ND6_IFF_IFDISABLED) {
		if (Fflag) {
			nd.ndi.flags &= ~ND6_IFF_IFDISABLED;
			if (ioctl(s, SIOCSIFINFO_IN6, (caddr_t)&nd)) {
				warnmsg(LOG_WARNING, __func__,
				    "ioctl(SIOCSIFINFO_IN6): %s",
		    		    strerror(errno));
				close(s);
				return (-1);
			}
		} else {
			warnmsg(LOG_WARNING, __func__,
			    "%s is disabled.", name);
			close(s);
			return (-1);
		}
	}
	if (!(nd.ndi.flags & ND6_IFF_ACCEPT_RTADV)) {
		if (Fflag) {
			nd.ndi.flags |= ND6_IFF_ACCEPT_RTADV;
			if (ioctl(s, SIOCSIFINFO_IN6, (caddr_t)&nd)) {
				warnmsg(LOG_WARNING, __func__,
				    "ioctl(SIOCSIFINFO_IN6): %s",
		    		    strerror(errno));
				close(s);
				return (-1);
			}
		} else {
			warnmsg(LOG_WARNING, __func__,
			    "%s does not accept Router Advertisement.", name);
			close(s);
			return (-1);
		}
	}
	close(s);

	llflag = get_llflag(name);
	if (llflag < 0) {
		warnmsg(LOG_WARNING, __func__,
		    "get_llflag() failed, anyway I'll try");
		return (0);
	}

	if (!(llflag & IN6_IFF_NOTREADY)) {
		warnmsg(LOG_DEBUG, __func__, "%s is ready", name);
		return (0);
	} else {
		if (llflag & IN6_IFF_TENTATIVE) {
			warnmsg(LOG_DEBUG, __func__, "%s is tentative",
			    name);
			return (IFS_TENTATIVE);
		}
		if (llflag & IN6_IFF_DUPLICATED)
			warnmsg(LOG_DEBUG, __func__, "%s is duplicated",
			    name);
		return (-1);
	}
}