ioctl
Artis Caune
artis-ml at fbsd.lv
Thu May 6 00:57:28 PDT 2004
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!!!
> 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
More information about the freebsd-hackers
mailing list