diff options
| author | kamil <kamil@NetBSD.org> | 2020-02-05 13:23:42 +0000 |
|---|---|---|
| committer | kamil <kamil@NetBSD.org> | 2020-02-05 13:23:42 +0000 |
| commit | 5bfd77288e87b325c5c751db96cc067854b8c678 (patch) | |
| tree | 6b3c327c8e4721ba67178f7381c799bf30e132ee /sys/modules/examples | |
| parent | 9b809844290486b90df38979b0a478e77e4e0f5d (diff) | |
Import new example kernel module ping_block
Subbmitted by Nisarg Joshi.
Diffstat (limited to 'sys/modules/examples')
| -rw-r--r-- | sys/modules/examples/Makefile | 3 | ||||
| -rw-r--r-- | sys/modules/examples/README | 5 | ||||
| -rw-r--r-- | sys/modules/examples/ping_block/Makefile | 18 | ||||
| -rw-r--r-- | sys/modules/examples/ping_block/cmd_ping.c | 61 | ||||
| -rw-r--r-- | sys/modules/examples/ping_block/ping.c | 139 | ||||
| -rw-r--r-- | sys/modules/examples/ping_block/ping.h | 8 |
6 files changed, 232 insertions, 2 deletions
diff --git a/sys/modules/examples/Makefile b/sys/modules/examples/Makefile index 7ae88066a4c..07be75ab1b7 100644 --- a/sys/modules/examples/Makefile +++ b/sys/modules/examples/Makefile @@ -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 additional Lua script 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 diff --git a/sys/modules/examples/README b/sys/modules/examples/README index b5cdaec0f71..07857a7262c 100644 --- a/sys/modules/examples/README +++ b/sys/modules/examples/README @@ -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. diff --git a/sys/modules/examples/ping_block/Makefile b/sys/modules/examples/ping_block/Makefile new file mode 100644 index 00000000000..90b3824b812 --- /dev/null +++ b/sys/modules/examples/ping_block/Makefile @@ -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> + diff --git a/sys/modules/examples/ping_block/cmd_ping.c b/sys/modules/examples/ping_block/cmd_ping.c new file mode 100644 index 00000000000..4d78b7b24af --- /dev/null +++ b/sys/modules/examples/ping_block/cmd_ping.c @@ -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; +} diff --git a/sys/modules/examples/ping_block/ping.c b/sys/modules/examples/ping_block/ping.c new file mode 100644 index 00000000000..bb516b3336d --- /dev/null +++ b/sys/modules/examples/ping_block/ping.c @@ -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; + } +} diff --git a/sys/modules/examples/ping_block/ping.h b/sys/modules/examples/ping_block/ping.h new file mode 100644 index 00000000000..25691907bf8 --- /dev/null +++ b/sys/modules/examples/ping_block/ping.h @@ -0,0 +1,8 @@ +#ifndef _PING_H_ +#define _PING_H_ + +#include <sys/ioccom.h> + +#define CMD_PING _IO('p', 2) + +#endif /* _PING_H_ */ |
