Skip site navigation (1)Skip section navigation (2)
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> 

next in thread | previous in thread | raw e-mail | index | archive | help


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"
> 






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200405062103.RAA12984>