xref: /netbsd/sys/modules/examples/ping_block/ping.c (revision 7aca4c9d)
1*7aca4c9dSpgoyette /*	$NetBSD: ping.c,v 1.2 2020/02/05 14:10:47 pgoyette Exp $	*/
25bfd7728Skamil 
35bfd7728Skamil /*-
45bfd7728Skamil  * Copyright (c) 2020 The NetBSD Foundation, Inc.
55bfd7728Skamil  * All rights reserved.
65bfd7728Skamil  *
75bfd7728Skamil  * Redistribution and use in source and binary forms, with or without
85bfd7728Skamil  * modification, are permitted provided that the following conditions
95bfd7728Skamil  * are met:
105bfd7728Skamil  * 1. Redistributions of source code must retain the above copyright
115bfd7728Skamil  *    notice, this list of conditions and the following disclaimer.
125bfd7728Skamil  * 2. Redistributions in binary form must reproduce the above copyright
135bfd7728Skamil  *    notice, this list of conditions and the following disclaimer in the
145bfd7728Skamil  *    documentation and/or other materials provided with the distribution.
155bfd7728Skamil  *
165bfd7728Skamil  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
175bfd7728Skamil  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
185bfd7728Skamil  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
195bfd7728Skamil  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
205bfd7728Skamil  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
215bfd7728Skamil  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
225bfd7728Skamil  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
235bfd7728Skamil  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
245bfd7728Skamil  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
255bfd7728Skamil  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
265bfd7728Skamil  * POSSIBILITY OF SUCH DAMAGE.
275bfd7728Skamil  */
285bfd7728Skamil 
295bfd7728Skamil #include <sys/cdefs.h>
30*7aca4c9dSpgoyette __KERNEL_RCSID(0, "$NetBSD: ping.c,v 1.2 2020/02/05 14:10:47 pgoyette Exp $");
315bfd7728Skamil 
325bfd7728Skamil #include <sys/param.h>
335bfd7728Skamil #include <sys/conf.h>
345bfd7728Skamil #include <sys/device.h>
355bfd7728Skamil #include <sys/kernel.h>
365bfd7728Skamil #include <sys/module.h>
375bfd7728Skamil 
385bfd7728Skamil #include "ping.h"
395bfd7728Skamil 
405bfd7728Skamil /*
415bfd7728Skamil  * Create a device /dev/ping in order to test this module.
425bfd7728Skamil  *
435bfd7728Skamil  * To use this device you need to do:
445bfd7728Skamil  *     mknod /dev/ping b 351 0
455bfd7728Skamil  *
465bfd7728Skamil  */
475bfd7728Skamil 
485bfd7728Skamil dev_type_open(ping_open);
495bfd7728Skamil dev_type_close(ping_close);
505bfd7728Skamil dev_type_ioctl(ping_ioctl);
515bfd7728Skamil 
525bfd7728Skamil static struct cdevsw ping_cdevsw = {
535bfd7728Skamil 	.d_open = noopen,
545bfd7728Skamil 	.d_close = noclose,
555bfd7728Skamil 	.d_read = noread,
565bfd7728Skamil 	.d_write = nowrite,
575bfd7728Skamil 	.d_ioctl = noioctl,
585bfd7728Skamil 	.d_stop = nostop,
595bfd7728Skamil 	.d_tty = notty,
605bfd7728Skamil 	.d_poll = nopoll,
615bfd7728Skamil 	.d_mmap = nommap,
625bfd7728Skamil 	.d_kqfilter = nokqfilter,
635bfd7728Skamil 	.d_discard = nodiscard,
645bfd7728Skamil 	.d_flag = D_OTHER
655bfd7728Skamil };
665bfd7728Skamil 
675bfd7728Skamil static struct bdevsw ping_bdevsw = {
685bfd7728Skamil 	.d_open = ping_open,
695bfd7728Skamil 	.d_close = ping_close,
705bfd7728Skamil 	.d_strategy = NULL,
715bfd7728Skamil 	.d_ioctl = ping_ioctl,
725bfd7728Skamil 	.d_dump = nodump,
735bfd7728Skamil 	.d_psize = nosize,
745bfd7728Skamil 	.d_discard = nodiscard,
755bfd7728Skamil 	.d_flag = D_OTHER
765bfd7728Skamil };
775bfd7728Skamil 
785bfd7728Skamil struct ping_softc {
795bfd7728Skamil 	int		refcnt;
805bfd7728Skamil };
815bfd7728Skamil 
825bfd7728Skamil static struct ping_softc sc;
835bfd7728Skamil 
845bfd7728Skamil int
ping_open(dev_t self __unused,int flag __unused,int mode __unused,struct lwp * l __unused)855bfd7728Skamil ping_open(dev_t self __unused, int flag __unused, int mode __unused,
865bfd7728Skamil           struct lwp *l __unused)
875bfd7728Skamil {
885bfd7728Skamil 	if (sc.refcnt > 0)
895bfd7728Skamil 		return EBUSY;
905bfd7728Skamil 
915bfd7728Skamil 	++sc.refcnt;
925bfd7728Skamil 
935bfd7728Skamil 	return 0;
945bfd7728Skamil }
955bfd7728Skamil 
965bfd7728Skamil int
ping_close(dev_t self __unused,int flag __unused,int mode __unused,struct lwp * l __unused)975bfd7728Skamil ping_close(dev_t self __unused, int flag __unused, int mode __unused,
985bfd7728Skamil            struct lwp *l __unused)
995bfd7728Skamil {
1005bfd7728Skamil 	--sc.refcnt;
1015bfd7728Skamil 
1025bfd7728Skamil 	return 0;
1035bfd7728Skamil }
1045bfd7728Skamil 
1055bfd7728Skamil int
ping_ioctl(dev_t self __unused,u_long cmd,void * data,int flag,struct lwp * l __unused)1065bfd7728Skamil ping_ioctl(dev_t self __unused, u_long cmd, void *data, int flag,
1075bfd7728Skamil            struct lwp *l __unused)
1085bfd7728Skamil {
1095bfd7728Skamil 	switch(cmd) {
1105bfd7728Skamil 	case CMD_PING:
1115bfd7728Skamil 		printf("ping: pong!\n");
1125bfd7728Skamil 		return 0;
1135bfd7728Skamil 	default:
114*7aca4c9dSpgoyette 		return ENOTTY;
1155bfd7728Skamil 	}
1165bfd7728Skamil }
1175bfd7728Skamil 
1185bfd7728Skamil MODULE(MODULE_CLASS_MISC, ping, NULL);
1195bfd7728Skamil 
1205bfd7728Skamil static int
ping_modcmd(modcmd_t cmd,void * arg __unused)1215bfd7728Skamil ping_modcmd(modcmd_t cmd, void *arg __unused)
1225bfd7728Skamil {
1235bfd7728Skamil 	int bmajor = 351, cmajor = -1;
1245bfd7728Skamil 
1255bfd7728Skamil 	switch (cmd) {
1265bfd7728Skamil 	case MODULE_CMD_INIT:
1275bfd7728Skamil 		if (devsw_attach("ping", &ping_bdevsw, &bmajor, &ping_cdevsw, &cmajor))
1285bfd7728Skamil 			return ENXIO;
1295bfd7728Skamil 		return 0;
1305bfd7728Skamil 	case MODULE_CMD_FINI:
1315bfd7728Skamil 		if (sc.refcnt > 0)
1325bfd7728Skamil 			return EBUSY;
1335bfd7728Skamil 
1345bfd7728Skamil 		devsw_detach(&ping_bdevsw, &ping_cdevsw);
1355bfd7728Skamil 		return 0;
1365bfd7728Skamil 	default:
1375bfd7728Skamil 		return ENOTTY;
1385bfd7728Skamil 	}
1395bfd7728Skamil }
140