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