Ejemplo n.º 1
0
/*
 *	Handle the ioctls that control the routing functions.
 */
int rose_rt_ioctl(unsigned int cmd, void *arg)
{
	struct rose_route_struct rose_route;
	struct net_device *dev;
	int err;

	switch (cmd) {

		case SIOCADDRT:
			if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
				return -EFAULT;
			if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
				return -EINVAL;
			if (rose_dev_exists(&rose_route.address)) { /* Can't add routes to ourself */
				dev_put(dev);
				return -EINVAL;
			}
			if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
				return -EINVAL;
			if (rose_route.ndigis > AX25_MAX_DIGIS)
				return -EINVAL;

			err = rose_add_node(&rose_route, dev);
			dev_put(dev);
			return err;

		case SIOCDELRT:
			if (copy_from_user(&rose_route, arg, sizeof(struct rose_route_struct)))
				return -EFAULT;
			if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
				return -EINVAL;
			err = rose_del_node(&rose_route, dev);
			dev_put(dev);
			return err;
				

		case SIOCRSCLRRT:
			return rose_clear_routes();

		default:
			return -EINVAL;
	}

	return 0;
}
Ejemplo n.º 2
0
/*
 *	Handle the ioctls that control the routing functions.
 */
int rose_rt_ioctl(unsigned int cmd, void *arg)
{
	struct rose_route_struct rose_route;
	struct device *dev;
	int err;

	switch (cmd) {

		case SIOCADDRT:
			if ((err = verify_area(VERIFY_READ, arg, sizeof(struct rose_route_struct))) != 0)
				return err;
			memcpy_fromfs(&rose_route, arg, sizeof(struct rose_route_struct));
			if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
				return -EINVAL;
			/* if (rose_dev_get(&rose_route.address) != NULL)	/ Can't add routes to ourself /
				return -EINVAL; */
			if (rose_route.mask > 10) /* Mask can't be more than 10 digits */
				return -EINVAL;

			return rose_add_node(&rose_route, dev);

		case SIOCDELRT:
			if ((err = verify_area(VERIFY_READ, arg, sizeof(struct rose_route_struct))) != 0)
				return err;
			memcpy_fromfs(&rose_route, arg, sizeof(struct rose_route_struct));
			if ((dev = rose_ax25_dev_get(rose_route.device)) == NULL)
				return -EINVAL;
			return rose_del_node(&rose_route, dev);

		case SIOCRSCLRRT:
			return rose_clear_routes();

		default:
			return -EINVAL;
	}

	return 0;
}