xref: /netbsd-src/sys/modules/examples/ping/ping.c (revision 7fa5b1d2e938a8c905bee5f3d38bda8450277ea2)
1*7fa5b1d2Schristos /*	$NetBSD: ping.c,v 1.5 2020/04/30 10:55:32 christos Exp $	*/
214e25719Spgoyette 
314e25719Spgoyette /*-
414e25719Spgoyette  * Copyright (c) 2015 The NetBSD Foundation, Inc.
514e25719Spgoyette  * All rights reserved.
614e25719Spgoyette  *
714e25719Spgoyette  * Redistribution and use in source and binary forms, with or without
814e25719Spgoyette  * modification, are permitted provided that the following conditions
914e25719Spgoyette  * are met:
1014e25719Spgoyette  * 1. Redistributions of source code must retain the above copyright
1114e25719Spgoyette  *    notice, this list of conditions and the following disclaimer.
1214e25719Spgoyette  * 2. Redistributions in binary form must reproduce the above copyright
1314e25719Spgoyette  *    notice, this list of conditions and the following disclaimer in the
1414e25719Spgoyette  *    documentation and/or other materials provided with the distribution.
1514e25719Spgoyette  *
1614e25719Spgoyette  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1714e25719Spgoyette  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1814e25719Spgoyette  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1914e25719Spgoyette  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2014e25719Spgoyette  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2114e25719Spgoyette  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2214e25719Spgoyette  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2314e25719Spgoyette  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2414e25719Spgoyette  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2514e25719Spgoyette  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2614e25719Spgoyette  * POSSIBILITY OF SUCH DAMAGE.
2714e25719Spgoyette  */
2814e25719Spgoyette 
2914e25719Spgoyette #include <sys/cdefs.h>
30*7fa5b1d2Schristos __KERNEL_RCSID(0, "$NetBSD: ping.c,v 1.5 2020/04/30 10:55:32 christos Exp $");
3114e25719Spgoyette 
3214e25719Spgoyette #include <sys/param.h>
3314e25719Spgoyette #include <sys/conf.h>
3414e25719Spgoyette #include <sys/device.h>
3514e25719Spgoyette #include <sys/kernel.h>
3614e25719Spgoyette #include <sys/module.h>
3714e25719Spgoyette 
3814e25719Spgoyette #include "ping.h"
3914e25719Spgoyette 
4014e25719Spgoyette /*
4114e25719Spgoyette  * Create a device /dev/ping in order to test this module.
4214e25719Spgoyette  *
4314e25719Spgoyette  * To use this device you need to do:
4467a548a8Skamil  *     mknod /dev/ping c 351 0
4514e25719Spgoyette  *
4614e25719Spgoyette  */
4714e25719Spgoyette 
4814e25719Spgoyette dev_type_open(ping_open);
4914e25719Spgoyette dev_type_close(ping_close);
5014e25719Spgoyette dev_type_ioctl(ping_ioctl);
5114e25719Spgoyette 
5214e25719Spgoyette static struct cdevsw ping_cdevsw = {
5314e25719Spgoyette 	.d_open = ping_open,
5414e25719Spgoyette 	.d_close = ping_close,
5514e25719Spgoyette 	.d_read = noread,
5614e25719Spgoyette 	.d_write = nowrite,
5714e25719Spgoyette 	.d_ioctl = ping_ioctl,
5814e25719Spgoyette 	.d_stop = nostop,
5914e25719Spgoyette 	.d_tty = notty,
6014e25719Spgoyette 	.d_poll = nopoll,
6114e25719Spgoyette 	.d_mmap = nommap,
6214e25719Spgoyette 	.d_kqfilter = nokqfilter,
6314e25719Spgoyette 	.d_discard = nodiscard,
6414e25719Spgoyette 	.d_flag = D_OTHER
6514e25719Spgoyette };
6614e25719Spgoyette 
6714e25719Spgoyette 
6814e25719Spgoyette struct ping_softc {
6914e25719Spgoyette 	int		refcnt;
7014e25719Spgoyette };
7114e25719Spgoyette 
7214e25719Spgoyette static struct ping_softc sc;
7314e25719Spgoyette 
7414e25719Spgoyette int
ping_open(dev_t self __unused,int flag __unused,int mode __unused,struct lwp * l __unused)7514e25719Spgoyette ping_open(dev_t self __unused, int flag __unused, int mode __unused,
7614e25719Spgoyette           struct lwp *l __unused)
7714e25719Spgoyette {
7814e25719Spgoyette 	if (sc.refcnt > 0)
7914e25719Spgoyette 		return EBUSY;
8014e25719Spgoyette 
8114e25719Spgoyette 	++sc.refcnt;
8214e25719Spgoyette 
8314e25719Spgoyette 	return 0;
8414e25719Spgoyette }
8514e25719Spgoyette 
8614e25719Spgoyette int
ping_close(dev_t self __unused,int flag __unused,int mode __unused,struct lwp * l __unused)8714e25719Spgoyette ping_close(dev_t self __unused, int flag __unused, int mode __unused,
8814e25719Spgoyette            struct lwp *l __unused)
8914e25719Spgoyette {
9014e25719Spgoyette 	--sc.refcnt;
9114e25719Spgoyette 
9214e25719Spgoyette 	return 0;
9314e25719Spgoyette }
9414e25719Spgoyette 
9514e25719Spgoyette int
ping_ioctl(dev_t self __unused,u_long cmd,void * data,int flag,struct lwp * l __unused)9614e25719Spgoyette ping_ioctl(dev_t self __unused, u_long cmd, void *data, int flag,
9714e25719Spgoyette            struct lwp *l __unused)
9814e25719Spgoyette {
9914e25719Spgoyette 	switch(cmd) {
10014e25719Spgoyette 	case CMD_PING:
10114e25719Spgoyette 		printf("ping: pong!\n");
10214e25719Spgoyette 		return 0;
10314e25719Spgoyette 	default:
10454483494Spgoyette 		return ENOTTY;
10514e25719Spgoyette 	}
10614e25719Spgoyette }
10714e25719Spgoyette 
10814e25719Spgoyette MODULE(MODULE_CLASS_MISC, ping, NULL);
10914e25719Spgoyette 
11014e25719Spgoyette static int
ping_modcmd(modcmd_t cmd,void * arg __unused)11114e25719Spgoyette ping_modcmd(modcmd_t cmd, void *arg __unused)
11214e25719Spgoyette {
11314e25719Spgoyette 	/* The major should be verified and changed if needed to avoid
11414e25719Spgoyette 	 * conflicts with other devices. */
11567a548a8Skamil 	int cmajor = 351, bmajor = -1;
11614e25719Spgoyette 
11714e25719Spgoyette 	switch (cmd) {
11814e25719Spgoyette 	case MODULE_CMD_INIT:
11914e25719Spgoyette 		if (devsw_attach("ping", NULL, &bmajor, &ping_cdevsw, &cmajor))
12014e25719Spgoyette 			return ENXIO;
12114e25719Spgoyette 		return 0;
12214e25719Spgoyette 	case MODULE_CMD_FINI:
12314e25719Spgoyette 		if (sc.refcnt > 0)
12414e25719Spgoyette 			return EBUSY;
12514e25719Spgoyette 
12614e25719Spgoyette 		devsw_detach(NULL, &ping_cdevsw);
12714e25719Spgoyette 		return 0;
12814e25719Spgoyette 	default:
12914e25719Spgoyette 		return ENOTTY;
13014e25719Spgoyette 	}
13114e25719Spgoyette }
132