ioctl
John Baldwin
jhb at FreeBSD.org
Thu May 6 09:40:08 PDT 2004
On Thursday 06 May 2004 03:57 am, 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!!!
No, that's probably bogus.
> > 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,
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-hackers
mailing list