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/module.h>
18 #include <sys/systm.h> /* uprintf */
19 #include <sys/errno.h>
20 #include <sys/param.h> /* defines used in kernel.h */
21 #include <sys/kernel.h> /* types used in module initialization */
22 #include <sys/conf.h> /* cdevsw struct */
23 #include <sys/uio.h> /* uio struct */
24 #include <sys/malloc.h>
28 #define BUFFERSIZE 512
30 /* Function prototypes */
31 static d_open_t krping_open;
32 static d_close_t krping_close;
33 static d_read_t krping_read;
34 static d_write_t krping_write;
36 /* Character device entry points */
37 static struct cdevsw krping_cdevsw = {
38 .d_version = D_VERSION,
39 .d_open = krping_open,
40 .d_close = krping_close,
41 .d_read = krping_read,
42 .d_write = krping_write,
46 typedef struct s_krping {
52 static struct cdev *krping_dev;
55 krping_loader(struct module *m, int what, void *arg)
60 case MOD_LOAD: /* kldload */
62 krping_dev = make_dev(&krping_cdevsw, 0, UID_ROOT, GID_WHEEL,
64 printf("Krping device loaded.\n");
67 destroy_dev(krping_dev);
68 printf("Krping device unloaded.\n");
78 krping_open(struct cdev *dev, int oflags, int devtype, struct thread *p)
85 krping_close(struct cdev *dev, int fflag, int devtype, struct thread *p)
91 krping_read(struct cdev *dev, struct uio *uio, int ioflag)
93 struct krping_cb *cb, *cb2;
95 struct krping_cb_list copy_cbs;
97 uprintf("krping: %4s %10s %10s %10s %10s %10s %10s %10s %10s %10s\n",
98 "num", "device", "snd bytes", "snd msgs", "rcv bytes",
99 "rcv msgs", "wr bytes", "wr msgs", "rd bytes", "rd msgs");
100 TAILQ_INIT(©_cbs);
102 mtx_lock(&krping_mutex);
103 TAILQ_FOREACH(cb, &krping_cbs, list) {
104 cb2 = malloc(sizeof(*cb), M_DEVBUF, M_NOWAIT|M_ZERO);
107 bcopy(cb, cb2, sizeof(*cb));
108 TAILQ_INSERT_TAIL(©_cbs, cb2, list);
110 mtx_unlock(&krping_mutex);
112 while (!TAILQ_EMPTY(©_cbs)) {
114 cb = TAILQ_FIRST(©_cbs);
115 TAILQ_REMOVE(©_cbs, cb, list);
117 uprintf("krping: %4d %10s %10u %10u %10u %10u %10u %10u %10u %10u\n",
118 num++, cb->pd->device->name, cb->stats.send_bytes,
119 cb->stats.send_msgs, cb->stats.recv_bytes,
120 cb->stats.recv_msgs, cb->stats.write_bytes,
121 cb->stats.write_msgs,
122 cb->stats.read_bytes,
123 cb->stats.read_msgs);
125 uprintf("krping: %d listen\n", num++);
133 krping_write(struct cdev *dev, struct uio *uio, int ioflag)
137 int remain = BUFFERSIZE;
141 krpingmsg = malloc(sizeof *krpingmsg, M_DEVBUF, M_WAITOK|M_ZERO);
143 uprintf("Could not malloc mem!\n");
148 while (uio->uio_resid) {
149 amt = MIN(uio->uio_resid, remain);
153 /* Copy the string in from user memory to kernel memory */
154 err = uiomove(cp, amt, uio);
156 uprintf("Write failed: bad address!\n");
163 if (uio->uio_resid != 0) {
164 uprintf("Message too big. max size is %d!\n", BUFFERSIZE);
168 /* null terminate and remove the \n */
171 krpingmsg->len = (unsigned long)(cp - krpingmsg->msg);
172 uprintf("krping: write string = |%s|\n", krpingmsg->msg);
173 err = krping_doit(krpingmsg->msg);
174 free(krpingmsg, M_DEVBUF);
178 MODULE_DEPEND(krping, rdma_core, 1, 1, 1);
179 MODULE_DEPEND(krping, rdma_cma, 1, 1, 1);
180 DEV_MODULE(krping,krping_loader,NULL);