Date: Thu, 06 May 2004 17:03:54 -0400 From: Stephan Uphoff <ups@tree.com> To: Artis Caune <artis-ml@fbsd.lv> Cc: freebsd-hackers@freebsd.org Subject: Re: ioctl Message-ID: <200405062103.RAA12984@tree.com> In-Reply-To: Message from Artis Caune <artis-ml@fbsd.lv> of "Thu, 06 May 2004 10:57:25 %2B0300." <20040506075725.GA1056@fbsd.lv>
index | next in thread | previous in thread | raw e-mail
Artis Caune wrote:
> Is it correct to use code like this
> instead of copyin() / copyout() ?
> Kernel module gets pointer to structure
> which resides in userland memory space
> and modify it directly!!!
The copyout() is just hidden.
The ioctl request codes are magic and contain the size of the
argument and if the argument should be copied in/out by
the kernel ioctl function. ( see ioctl(td, uap) in sys_generic.c )
Stephan
> > userland: ioctl(tp_fd, TP_GET_TP_STATS, &tp_stats)
> > kernel: tp_stats->hooked = hooked;
> (freebsd 5.x, KLD)
>
>
> ----- START userland -----
>
> #define TP_GET_TP_STATS _IOR('D', 200, struct tp_stats_s)
>
> struct tp_stats_s {
> int hooked;
> u_short policer_active_pipes;
> } tp_stats;
>
> if (ioctl(tp_fd, TP_GET_TP_STATS, &tp_stats) != -1) {
>
> printf("Traffic Policer is %s\n",
> tp_stats.hooked ? "enabled" : "disabled");
> printf("statistics:\n");
> printf(" %-30s%u\n", "pipes hash table depth",
> tp_stats.policer_pipes_hash_depth);
> printf(" %-30s%u\n", "active pipes",
> tp_stats.policer_active_pipes);
> } else
> fprintf(stderr, "IOCTL error\n");
>
> ----- END userland -----
>
>
>
> ----- START kernel -----
>
> static int
> tp_dev_ioctl (dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
> {
> switch (cmd) {
> case TP_GET_TP_STATS:
> err = get_tp_stats((struct tp_stats_s *)addr);
> break;
> ...
> }
>
> static int
> get_tp_stats (struct tp_stats_s *tp_stats)
> {
> TP_LOCK;
> tp_stats->hooked = hooked;
> /* hash depth will be gone in -release, just for debug */
> tp_stats->policer_pipes_hash_depth = policer_pipes_hash_depth;
> tp_stats->policer_active_pipes = policer_get_active_pipes();
> TP_UNLOCK;
>
> return (0);
> }
> ...
> ----- END kernel -----
>
>
>
> thanks,
>
> --
> Artis
>
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
>
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200405062103.RAA12984>
