2 * This code lifted from:
3 * Simple `echo' pseudo-device KLD
5 * Converted to 5.X by Søren (Xride) Straarup
9 * /bin/echo "server,port=9999,addr=192.168.69.142,validate" > /dev/krping
10 * /bin/echo "client,port=9999,addr=192.168.69.142,validate" > /dev/krping
13 #include <sys/cdefs.h>
14 __FBSDID("$FreeBSD$");
16 #include <sys/types.h>
17 #include <sys/systm.h> /* uprintf */
18 #include <sys/errno.h>
19 #include <sys/param.h> /* defines used in kernel.h */
20 #include <sys/kernel.h> /* types used in module initialization */
21 #include <sys/conf.h> /* cdevsw struct */
22 #include <sys/uio.h> /* uio struct */
23 #include <sys/malloc.h>
27 #define BUFFERSIZE 512
29 /* Function prototypes */
30 static d_open_t krping_open;
31 static d_close_t krping_close;
32 static d_read_t krping_read;
33 static d_write_t krping_write;
35 /* Character device entry points */
36 static struct cdevsw krping_cdevsw = {
37 .d_version = D_VERSION,
38 .d_open = krping_open,
39 .d_close = krping_close,
40 .d_read = krping_read,
41 .d_write = krping_write,
45 typedef struct s_krping {
51 static struct cdev *krping_dev;
54 #include <sys/module.h>
57 krping_loader(struct module *m, int what, void *arg)
62 case MOD_LOAD: /* kldload */
64 krping_dev = make_dev(&krping_cdevsw, 0, UID_ROOT, GID_WHEEL,
66 printf("Krping device loaded.\n");
69 destroy_dev(krping_dev);
70 printf("Krping device unloaded.\n");
80 krping_open(struct cdev *dev, int oflags, int devtype, struct thread *p)
87 krping_close(struct cdev *dev, int fflag, int devtype, struct thread *p)
93 krping_read(struct cdev *dev, struct uio *uio, int ioflag)
95 struct krping_cb *cb, *cb2;
97 struct krping_cb_list copy_cbs;
99 uprintf("krping: %4s %10s %10s %10s %10s %10s %10s %10s %10s %10s\n",
100 "num", "device", "snd bytes", "snd msgs", "rcv bytes",
101 "rcv msgs", "wr bytes", "wr msgs", "rd bytes", "rd msgs");
102 TAILQ_INIT(©_cbs);
104 mtx_lock(&krping_mutex);
105 TAILQ_FOREACH(cb, &krping_cbs, list) {
106 cb2 = malloc(sizeof(*cb), M_DEVBUF, M_NOWAIT|M_ZERO);
109 bcopy(cb, cb2, sizeof(*cb));
110 TAILQ_INSERT_TAIL(©_cbs, cb2, list);
112 mtx_unlock(&krping_mutex);
114 while (!TAILQ_EMPTY(©_cbs)) {
116 cb = TAILQ_FIRST(©_cbs);
117 TAILQ_REMOVE(©_cbs, cb, list);
119 uprintf("krping: %4d %10s %10u %10u %10u %10u %10u %10u %10u %10u\n",
120 num++, cb->pd->device->name, cb->stats.send_bytes,
121 cb->stats.send_msgs, cb->stats.recv_bytes,
122 cb->stats.recv_msgs, cb->stats.write_bytes,
123 cb->stats.write_msgs,
124 cb->stats.read_bytes,
125 cb->stats.read_msgs);
127 uprintf("krping: %d listen\n", num++);
135 krping_write(struct cdev *dev, struct uio *uio, int ioflag)
139 int remain = BUFFERSIZE;
143 krpingmsg = malloc(sizeof *krpingmsg, M_DEVBUF, M_WAITOK|M_ZERO);
145 uprintf("Could not malloc mem!\n");
150 while (uio->uio_resid) {
151 amt = MIN(uio->uio_resid, remain);
155 /* Copy the string in from user memory to kernel memory */
156 err = uiomove(cp, amt, uio);
158 uprintf("Write failed: bad address!\n");
165 if (uio->uio_resid != 0) {
166 uprintf("Message too big. max size is %d!\n", BUFFERSIZE);
170 /* null terminate and remove the \n */
173 krpingmsg->len = (unsigned long)(cp - krpingmsg->msg);
174 uprintf("krping: write string = |%s|\n", krpingmsg->msg);
175 err = krping_doit(krpingmsg->msg);
176 free(krpingmsg, M_DEVBUF);
180 DEV_MODULE(krping,krping_loader,NULL);