From owner-freebsd-hackers@FreeBSD.ORG Thu May 6 00:57:28 2004 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1ACD716A4CE for ; Thu, 6 May 2004 00:57:28 -0700 (PDT) Received: from fbsd.lv (fbsd.lv [159.148.95.82]) by mx1.FreeBSD.org (Postfix) with ESMTP id C0D0E43D39 for ; Thu, 6 May 2004 00:57:27 -0700 (PDT) (envelope-from artis@fbsd.lv) Received: by fbsd.lv (Postfix, from userid 10000) id D9D44C12A; Thu, 6 May 2004 10:57:25 +0300 (EEST) Date: Thu, 6 May 2004 10:57:25 +0300 From: Artis Caune To: freebsd-hackers@freebsd.org Message-ID: <20040506075725.GA1056@fbsd.lv> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Subject: ioctl X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 06 May 2004 07:57:28 -0000 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