Exemplo n.º 1
0
/*
 * route_rp_filter
 *
 * Modifies the /proc/sys/net/ipv4/conf/INTERFACE/rp_filter config file.
 */
int
route_rp_filter(int family, char *dev, int enable)
{
	int len, err, ret = 0;
	int flush_fd;

	/* The path is /proc/sys/net/ipv4/conf/INTERFACE/rp_filter */
	const char *RP_FILTER_SYSCTL_1 = "/proc/sys/net/ipv4/conf/";
	const char *RP_FILTER_SYSCTL_1_IPV6 = "/proc/sys/net/ipv6/conf/";
	const char *RP_FILTER_SYSCTL_2 = "/rp_filter";
	char *final_path = 0, buf[2];

	buf[0] = '1';
	buf[1] = 0;
#define RP_FILTER_PATH_SZ (strlen(RP_FILTER_SYSCTL_1)+		   \
			   strlen(RP_FILTER_SYSCTL_2)+IF_NAMESIZE+1)
	final_path = xzalloc(RP_FILTER_PATH_SZ);

	len = strlen(buf);
	if (family == AF_INET) {
		strcpy(final_path, RP_FILTER_SYSCTL_1);
	} else if (family == AF_INET6) {
		strcpy(final_path, RP_FILTER_SYSCTL_1_IPV6);
	} else
		ERROR_FINISH(ret, -1, finish);

	strcat(final_path, dev);
	strcat(final_path, RP_FILTER_SYSCTL_2);

	if (!enable)
		buf[0] = '0';

	flush_fd = open(final_path, O_WRONLY);
	if (flush_fd < 0) {
		debug(DBG_NORMAL, "Cannot open \"%s\"\n", final_path);
		ERROR_FINISH(ret, -1, finish);
	}

	if ((err = write(flush_fd, (void *) buf, len)) == 0) {
		debug(DBG_NORMAL, "Warning: rp_filter setting changed\n");
		ERROR_FINISH(ret, -1, finish);
	} else if (err == -1) {
		debug(DBG_NORMAL, "Cannot change the rp_filter setting: %s\n",
			  strerror(errno));
		ERROR_FINISH(ret, -1, finish);
	}
	close(flush_fd);

  finish:
	if (final_path)
		xfree(final_path);
	return ret;
}
Exemplo n.º 2
0
/*
 * get_dev_ip: fetches the ip currently assigned to the interface named `dev'
 * and stores it to `ip'.
 * On success 0 is returned, -1 otherwise.
 */
int get_dev_ip(inet_prefix *ip, int family, char *dev)
{
	int s=-1;
	int ret=0;

	setzero(ip, sizeof(inet_prefix));

	if((s=new_socket(family)) < 0) {
		error("Error while setting \"%s\" ip: Cannot open socket", dev);
		return -1;
	}

	if(family == AF_INET) {
		struct ifreq req;

		strncpy(req.ifr_name, dev, IFNAMSIZ);
		req.ifr_addr.sa_family = family;
		
		if(ioctl(s, SIOCGIFADDR, &req))
			ERROR_FINISH(ret, -1, finish);

		sockaddr_to_inet(&req.ifr_addr, ip, 0);
	} else if(family == AF_INET6) {
		struct in6_ifreq req6;

		/*
		 * XXX: NOT TESTED
		 */

		req6.ifr6_ifindex=ll_name_to_index(dev);
		req6.ifr6_prefixlen=0;

		if(ioctl(s, SIOCGIFADDR, &req6))
			ERROR_FINISH(ret, -1, finish);

		inet_setip(ip, (u_int *)&req6.ifr6_addr, family);
	}

finish:
	if(s != -1)
		close(s);
	return ret;
}