Module Name: src Committed By: kamil Date: Wed Feb 5 13:23:42 UTC 2020
Modified Files: src/sys/modules/examples: Makefile README Added Files: src/sys/modules/examples/ping_block: Makefile cmd_ping.c ping.c ping.h Log Message: Import new example kernel module ping_block Subbmitted by Nisarg Joshi. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/modules/examples/Makefile cvs rdiff -u -r1.9 -r1.10 src/sys/modules/examples/README cvs rdiff -u -r0 -r1.1 src/sys/modules/examples/ping_block/Makefile \ src/sys/modules/examples/ping_block/cmd_ping.c \ src/sys/modules/examples/ping_block/ping.c \ src/sys/modules/examples/ping_block/ping.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/modules/examples/Makefile diff -u src/sys/modules/examples/Makefile:1.7 src/sys/modules/examples/Makefile:1.8 --- src/sys/modules/examples/Makefile:1.7 Thu Jan 17 20:47:42 2019 +++ src/sys/modules/examples/Makefile Wed Feb 5 13:23:42 2020 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.7 2019/01/17 20:47:42 kamil Exp $ +# $NetBSD: Makefile,v 1.8 2020/02/05 13:23:42 kamil Exp $ .include <bsd.own.mk> @@ -9,6 +9,7 @@ SUBDIR+= luareadhappy # Needs an additi SUBDIR+= mapper # Needs an additional helper program SUBDIR+= panic_string # Crashes the system SUBDIR+= ping # Needs an additional helper program +SUBDIR+= ping_block # Needs an additional helper program SUBDIR+= properties SUBDIR+= readhappy SUBDIR+= readhappy_mpsafe # Contains an additional helper program Index: src/sys/modules/examples/README diff -u src/sys/modules/examples/README:1.9 src/sys/modules/examples/README:1.10 --- src/sys/modules/examples/README:1.9 Thu Jan 17 20:47:42 2019 +++ src/sys/modules/examples/README Wed Feb 5 13:23:42 2020 @@ -1,4 +1,4 @@ - $NetBSD: README,v 1.9 2019/01/17 20:47:42 kamil Exp $ + $NetBSD: README,v 1.10 2020/02/05 13:23:42 kamil Exp $ Kernel Developer's Manual @@ -69,6 +69,9 @@ HISTORY The mapper module first appeared in NetBSD 9.0 and was authored by Akul Pillai. + + The ping_block module first appeared in NetBSD 10.0 and was authored by + Nisarg Joshi. AUTHORS This document was written by Kamil Rytarowski. Added files: Index: src/sys/modules/examples/ping_block/Makefile diff -u /dev/null src/sys/modules/examples/ping_block/Makefile:1.1 --- /dev/null Wed Feb 5 13:23:42 2020 +++ src/sys/modules/examples/ping_block/Makefile Wed Feb 5 13:23:42 2020 @@ -0,0 +1,18 @@ +# $NetBSD: Makefile,v 1.1 2020/02/05 13:23:42 kamil Exp $ + +.include "../Makefile.inc" + +#S?= /usr/src/sys + +KMOD= ping_block +SRCS= ping.c + +.include <bsd.kmodule.mk> + +# To make use of this module, you'll need to separately build the +# cmd_ping program, with a Makefile similar to +# +# MKMAN= NO +# PROG= cmd_ping +# .include <bsd.prog.mk> + Index: src/sys/modules/examples/ping_block/cmd_ping.c diff -u /dev/null src/sys/modules/examples/ping_block/cmd_ping.c:1.1 --- /dev/null Wed Feb 5 13:23:42 2020 +++ src/sys/modules/examples/ping_block/cmd_ping.c Wed Feb 5 13:23:42 2020 @@ -0,0 +1,61 @@ +/* $NetBSD: cmd_ping.c,v 1.1 2020/02/05 13:23:42 kamil Exp $ */ + +/*- + * Copyright (c) 2015 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__RCSID("$NetBSD: cmd_ping.c,v 1.1 2020/02/05 13:23:42 kamil Exp $"); + +#include <err.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/ioctl.h> +#include <unistd.h> + +#include "ping.h" + +#define _PATH_DEV_PING "/dev/ping" + +int main(int argc, char **argv) +{ + int devfd; + + setprogname(argv[0]); + + if ((devfd = open(_PATH_DEV_PING, O_RDWR)) == -1) + err(EXIT_FAILURE, "Cannot open %s", _PATH_DEV_PING); + + if (ioctl(devfd, CMD_PING) == -1) + err(EXIT_FAILURE, "ping failed"); + + printf("%s: ping sent successfully\n", getprogname()); + + if (close(devfd) == -1) + err(EXIT_FAILURE, "Cannot close %s", _PATH_DEV_PING); + + return EXIT_SUCCESS; +} Index: src/sys/modules/examples/ping_block/ping.c diff -u /dev/null src/sys/modules/examples/ping_block/ping.c:1.1 --- /dev/null Wed Feb 5 13:23:42 2020 +++ src/sys/modules/examples/ping_block/ping.c Wed Feb 5 13:23:42 2020 @@ -0,0 +1,139 @@ +/* $NetBSD: ping.c,v 1.1 2020/02/05 13:23:42 kamil Exp $ */ + +/*- + * Copyright (c) 2020 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: ping.c,v 1.1 2020/02/05 13:23:42 kamil Exp $"); + +#include <sys/param.h> +#include <sys/conf.h> +#include <sys/device.h> +#include <sys/kernel.h> +#include <sys/module.h> + +#include "ping.h" + +/* + * Create a device /dev/ping in order to test this module. + * + * To use this device you need to do: + * mknod /dev/ping b 351 0 + * + */ + +dev_type_open(ping_open); +dev_type_close(ping_close); +dev_type_ioctl(ping_ioctl); + +static struct cdevsw ping_cdevsw = { + .d_open = noopen, + .d_close = noclose, + .d_read = noread, + .d_write = nowrite, + .d_ioctl = noioctl, + .d_stop = nostop, + .d_tty = notty, + .d_poll = nopoll, + .d_mmap = nommap, + .d_kqfilter = nokqfilter, + .d_discard = nodiscard, + .d_flag = D_OTHER +}; + +static struct bdevsw ping_bdevsw = { + .d_open = ping_open, + .d_close = ping_close, + .d_strategy = NULL, + .d_ioctl = ping_ioctl, + .d_dump = nodump, + .d_psize = nosize, + .d_discard = nodiscard, + .d_flag = D_OTHER +}; + +struct ping_softc { + int refcnt; +}; + +static struct ping_softc sc; + +int +ping_open(dev_t self __unused, int flag __unused, int mode __unused, + struct lwp *l __unused) +{ + if (sc.refcnt > 0) + return EBUSY; + + ++sc.refcnt; + + return 0; +} + +int +ping_close(dev_t self __unused, int flag __unused, int mode __unused, + struct lwp *l __unused) +{ + --sc.refcnt; + + return 0; +} + +int +ping_ioctl(dev_t self __unused, u_long cmd, void *data, int flag, + struct lwp *l __unused) +{ + switch(cmd) { + case CMD_PING: + printf("ping: pong!\n"); + return 0; + default: + return 1; + } +} + +MODULE(MODULE_CLASS_MISC, ping, NULL); + +static int +ping_modcmd(modcmd_t cmd, void *arg __unused) +{ + int bmajor = 351, cmajor = -1; + + switch (cmd) { + case MODULE_CMD_INIT: + if (devsw_attach("ping", &ping_bdevsw, &bmajor, &ping_cdevsw, &cmajor)) + return ENXIO; + return 0; + case MODULE_CMD_FINI: + if (sc.refcnt > 0) + return EBUSY; + + devsw_detach(&ping_bdevsw, &ping_cdevsw); + return 0; + default: + return ENOTTY; + } +} Index: src/sys/modules/examples/ping_block/ping.h diff -u /dev/null src/sys/modules/examples/ping_block/ping.h:1.1 --- /dev/null Wed Feb 5 13:23:42 2020 +++ src/sys/modules/examples/ping_block/ping.h Wed Feb 5 13:23:42 2020 @@ -0,0 +1,8 @@ +#ifndef _PING_H_ +#define _PING_H_ + +#include <sys/ioccom.h> + +#define CMD_PING _IO('p', 2) + +#endif /* _PING_H_ */