ioctl
Stephan Uphoff
ups at tree.com
Thu May 6 14:35:20 PDT 2004
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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
>
More information about the freebsd-hackers
mailing list