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