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>
26 #include <sys/sysctl.h>
27 #include <machine/stdarg.h>
31 #define BUFFERSIZE 512
33 SYSCTL_NODE(_dev, OID_AUTO, krping, CTLFLAG_RW, 0, "kernel rping module");
36 SYSCTL_INT(_dev_krping, OID_AUTO, debug, CTLFLAG_RW, &krping_debug, 0 , "");
38 /* Function prototypes */
39 static d_open_t krping_open;
40 static d_close_t krping_close;
41 static d_read_t krping_read;
42 static d_write_t krping_write;
43 static d_purge_t krping_purge;
45 /* Character device entry points */
46 static struct cdevsw krping_cdevsw = {
47 .d_version = D_VERSION,
48 .d_open = krping_open,
49 .d_close = krping_close,
50 .d_read = krping_read,
51 .d_write = krping_write,
52 .d_purge = krping_purge,
56 typedef struct s_krping {
61 struct stats_list_entry {
62 STAILQ_ENTRY(stats_list_entry) link;
63 struct krping_stats *stats;
65 STAILQ_HEAD(stats_list, stats_list_entry);
68 static struct cdev *krping_dev;
71 krping_loader(struct module *m, int what, void *arg)
76 case MOD_LOAD: /* kldload */
77 krping_dev = make_dev(&krping_cdevsw, 0, UID_ROOT, GID_WHEEL,
79 printf("Krping device loaded.\n");
82 destroy_dev(krping_dev);
83 printf("Krping device unloaded.\n");
94 krping_open(struct cdev *dev, int oflags, int devtype, struct thread *p)
101 krping_close(struct cdev *dev, int fflag, int devtype, struct thread *p)
108 krping_copy_stats(struct krping_stats *stats, void *arg)
110 struct stats_list_entry *s;
111 struct stats_list *list = arg;
113 s = malloc(sizeof(*s), M_DEVBUF, M_NOWAIT | M_ZERO);
117 s->stats = malloc(sizeof(*stats), M_DEVBUF, M_NOWAIT | M_ZERO);
118 if (s->stats == NULL) {
124 STAILQ_INSERT_TAIL(list, s, link);
128 krping_read(struct cdev *dev, struct uio *uio, int ioflag)
131 struct stats_list list;
132 struct stats_list_entry *e;
135 krping_walk_cb_list(krping_copy_stats, &list);
137 if (STAILQ_EMPTY(&list))
140 uprintf("krping: %4s %10s %10s %10s %10s %10s %10s %10s %10s %10s\n",
141 "num", "device", "snd bytes", "snd msgs", "rcv bytes", "rcv msgs",
142 "wr bytes", "wr msgs", "rd bytes", "rd msgs");
144 while (!STAILQ_EMPTY(&list)) {
145 e = STAILQ_FIRST(&list);
146 STAILQ_REMOVE_HEAD(&list, link);
147 if (e->stats == NULL)
148 uprintf("krping: %d listen\n", num);
150 struct krping_stats *stats = e->stats;
152 uprintf("krping: %4d %10s %10llu %10llu %10llu %10llu "
153 "%10llu %10llu %10llu %10llu\n", num, stats->name,
154 stats->send_bytes, stats->send_msgs,
155 stats->recv_bytes, stats->recv_msgs,
156 stats->write_bytes, stats->write_msgs,
157 stats->read_bytes, stats->read_msgs);
158 free(stats, M_DEVBUF);
168 krping_write(struct cdev *dev, struct uio *uio, int ioflag)
172 int remain = BUFFERSIZE;
176 krpingmsg = malloc(sizeof *krpingmsg, M_DEVBUF, M_WAITOK|M_ZERO);
178 uprintf("Could not malloc mem!\n");
183 while (uio->uio_resid) {
184 amt = MIN(uio->uio_resid, remain);
188 /* Copy the string in from user memory to kernel memory */
189 err = uiomove(cp, amt, uio);
191 uprintf("Write failed: bad address!\n");
198 if (uio->uio_resid != 0) {
199 uprintf("Message too big. max size is %d!\n", BUFFERSIZE);
204 /* null terminate and remove the \n */
207 krpingmsg->len = (unsigned long)(cp - krpingmsg->msg);
208 uprintf("krping: write string = |%s|\n", krpingmsg->msg);
209 err = krping_doit(krpingmsg->msg);
211 free(krpingmsg, M_DEVBUF);
216 krping_purge(struct cdev *dev __unused)
223 krping_sigpending(void)
226 return (SIGPENDING(curthread));
229 DEV_MODULE(krping, krping_loader, NULL);
230 MODULE_DEPEND(krping, ibcore, 1, 1, 1);