Blame view
samples/connector/cn_test.c
3.85 KB
1a59d1b8e treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
7672d0b54 [NET]: Add netlin... |
2 3 4 |
/* * cn_test.c * |
acb9c1b2f connector: mainta... |
5 |
* 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net> |
7672d0b54 [NET]: Add netlin... |
6 |
* All rights reserved. |
7672d0b54 [NET]: Add netlin... |
7 |
*/ |
37cf2b8d1 connector: get te... |
8 |
#define pr_fmt(fmt) "cn_test: " fmt |
7672d0b54 [NET]: Add netlin... |
9 10 11 12 |
#include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/skbuff.h> |
5a0e3ad6a include cleanup: ... |
13 |
#include <linux/slab.h> |
7672d0b54 [NET]: Add netlin... |
14 |
#include <linux/timer.h> |
18a0c2361 [CONNECTOR]: Fix ... |
15 |
#include <linux/connector.h> |
7672d0b54 [NET]: Add netlin... |
16 |
|
37cf2b8d1 connector: get te... |
17 |
static struct cb_id cn_test_id = { CN_NETLINK_USERS + 3, 0x456 }; |
7672d0b54 [NET]: Add netlin... |
18 19 20 |
static char cn_test_name[] = "cn_test"; static struct sock *nls; static struct timer_list cn_test_timer; |
7069331db connector: Provid... |
21 |
static void cn_test_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) |
7672d0b54 [NET]: Add netlin... |
22 |
{ |
37cf2b8d1 connector: get te... |
23 24 25 26 27 |
pr_info("%s: %lu: idx=%x, val=%x, seq=%u, ack=%u, len=%d: %s. ", __func__, jiffies, msg->id.idx, msg->id.val, msg->seq, msg->ack, msg->len, msg->len ? (char *)msg->data : ""); |
7672d0b54 [NET]: Add netlin... |
28 |
} |
28f06c6f4 Documentation/con... |
29 30 31 32 33 34 |
/* * Do not remove this function even if no one is using it as * this is an example of how to get notifications about new * connector user registration */ #if 0 |
7672d0b54 [NET]: Add netlin... |
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
static int cn_test_want_notify(void) { struct cn_ctl_msg *ctl; struct cn_notify_req *req; struct cn_msg *msg = NULL; int size, size0; struct sk_buff *skb; struct nlmsghdr *nlh; u32 group = 1; size0 = sizeof(*msg) + sizeof(*ctl) + 3 * sizeof(*req); size = NLMSG_SPACE(size0); skb = alloc_skb(size, GFP_ATOMIC); if (!skb) { |
37cf2b8d1 connector: get te... |
51 52 |
pr_err("failed to allocate new skb with size=%u ", size); |
7672d0b54 [NET]: Add netlin... |
53 54 |
return -ENOMEM; } |
8786395c6 connector: Move c... |
55 56 57 58 59 |
nlh = nlmsg_put(skb, 0, 0x123, NLMSG_DONE, size - sizeof(*nlh), 0); if (!nlh) { kfree_skb(skb); return -EMSGSIZE; } |
7672d0b54 [NET]: Add netlin... |
60 |
|
8786395c6 connector: Move c... |
61 |
msg = nlmsg_data(nlh); |
7672d0b54 [NET]: Add netlin... |
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
memset(msg, 0, size0); msg->id.idx = -1; msg->id.val = -1; msg->seq = 0x123; msg->ack = 0x345; msg->len = size0 - sizeof(*msg); ctl = (struct cn_ctl_msg *)(msg + 1); ctl->idx_notify_num = 1; ctl->val_notify_num = 2; ctl->group = group; ctl->len = msg->len - sizeof(*ctl); req = (struct cn_notify_req *)(ctl + 1); /* * Idx. */ req->first = cn_test_id.idx; req->range = 10; /* * Val 0. */ req++; req->first = cn_test_id.val; req->range = 10; /* * Val 1. */ req++; req->first = cn_test_id.val + 20; req->range = 10; |
18a0c2361 [CONNECTOR]: Fix ... |
99 |
NETLINK_CB(skb).dst_group = ctl->group; |
7672d0b54 [NET]: Add netlin... |
100 101 |
//netlink_broadcast(nls, skb, 0, ctl->group, GFP_ATOMIC); netlink_unicast(nls, skb, 0, 0); |
37cf2b8d1 connector: get te... |
102 103 |
pr_info("request was sent: group=0x%x ", ctl->group); |
7672d0b54 [NET]: Add netlin... |
104 105 |
return 0; |
7672d0b54 [NET]: Add netlin... |
106 |
} |
28f06c6f4 Documentation/con... |
107 |
#endif |
7672d0b54 [NET]: Add netlin... |
108 109 |
static u32 cn_test_timer_counter; |
0d6942348 samples: Convert ... |
110 |
static void cn_test_timer_func(struct timer_list *unused) |
7672d0b54 [NET]: Add netlin... |
111 112 113 |
{ struct cn_msg *m; char data[32]; |
0d6942348 samples: Convert ... |
114 115 |
pr_debug("%s: timer fired ", __func__); |
37cf2b8d1 connector: get te... |
116 |
|
dd00cc486 some kmalloc/mems... |
117 |
m = kzalloc(sizeof(*m) + sizeof(data), GFP_ATOMIC); |
7672d0b54 [NET]: Add netlin... |
118 |
if (m) { |
7672d0b54 [NET]: Add netlin... |
119 120 121 122 123 124 125 126 127 128 |
memcpy(&m->id, &cn_test_id, sizeof(m->id)); m->seq = cn_test_timer_counter; m->len = sizeof(data); m->len = scnprintf(data, sizeof(data), "counter = %u", cn_test_timer_counter) + 1; memcpy(m + 1, data, m->len); |
ac8f73305 connector: add po... |
129 |
cn_netlink_send(m, 0, 0, GFP_ATOMIC); |
7672d0b54 [NET]: Add netlin... |
130 131 132 133 |
kfree(m); } cn_test_timer_counter++; |
37cf2b8d1 connector: get te... |
134 |
mod_timer(&cn_test_timer, jiffies + msecs_to_jiffies(1000)); |
7672d0b54 [NET]: Add netlin... |
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
} static int cn_test_init(void) { int err; err = cn_add_callback(&cn_test_id, cn_test_name, cn_test_callback); if (err) goto err_out; cn_test_id.val++; err = cn_add_callback(&cn_test_id, cn_test_name, cn_test_callback); if (err) { cn_del_callback(&cn_test_id); goto err_out; } |
0d6942348 samples: Convert ... |
150 |
timer_setup(&cn_test_timer, cn_test_timer_func, 0); |
37cf2b8d1 connector: get te... |
151 152 153 154 155 |
mod_timer(&cn_test_timer, jiffies + msecs_to_jiffies(1000)); pr_info("initialized with id={%u.%u} ", cn_test_id.idx, cn_test_id.val); |
7672d0b54 [NET]: Add netlin... |
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
return 0; err_out: if (nls && nls->sk_socket) sock_release(nls->sk_socket); return err; } static void cn_test_fini(void) { del_timer_sync(&cn_test_timer); cn_del_callback(&cn_test_id); cn_test_id.val--; cn_del_callback(&cn_test_id); if (nls && nls->sk_socket) sock_release(nls->sk_socket); } module_init(cn_test_init); module_exit(cn_test_fini); MODULE_LICENSE("GPL"); |
acb9c1b2f connector: mainta... |
180 |
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>"); |
7672d0b54 [NET]: Add netlin... |
181 |
MODULE_DESCRIPTION("Connector's test module"); |