Blame view

samples/connector/cn_test.c 3.85 KB
1a59d1b8e   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
2
3
4
  /*
   * 	cn_test.c
   * 
acb9c1b2f   Evgeniy Polyakov   connector: mainta...
5
   * 2004+ Copyright (c) Evgeniy Polyakov <zbr@ioremap.net>
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
6
   * All rights reserved.
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
7
   */
37cf2b8d1   Mike Frysinger   connector: get te...
8
  #define pr_fmt(fmt) "cn_test: " fmt
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
9
10
11
12
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/skbuff.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
13
  #include <linux/slab.h>
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
14
  #include <linux/timer.h>
18a0c2361   Carlo Comin   [CONNECTOR]: Fix ...
15
  #include <linux/connector.h>
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
16

37cf2b8d1   Mike Frysinger   connector: get te...
17
  static struct cb_id cn_test_id = { CN_NETLINK_USERS + 3, 0x456 };
7672d0b54   Evgeniy Polyakov   [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   Philipp Reisner   connector: Provid...
21
  static void cn_test_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
22
  {
37cf2b8d1   Mike Frysinger   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   Evgeniy Polyakov   [NET]: Add netlin...
28
  }
28f06c6f4   Jaswinder Singh Rajput   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   Evgeniy Polyakov   [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   Mike Frysinger   connector: get te...
51
52
  		pr_err("failed to allocate new skb with size=%u
  ", size);
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
53
54
  		return -ENOMEM;
  	}
8786395c6   David S. Miller   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   Evgeniy Polyakov   [NET]: Add netlin...
60

8786395c6   David S. Miller   connector: Move c...
61
  	msg = nlmsg_data(nlh);
7672d0b54   Evgeniy Polyakov   [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   Carlo Comin   [CONNECTOR]: Fix ...
99
  	NETLINK_CB(skb).dst_group = ctl->group;
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
100
101
  	//netlink_broadcast(nls, skb, 0, ctl->group, GFP_ATOMIC);
  	netlink_unicast(nls, skb, 0, 0);
37cf2b8d1   Mike Frysinger   connector: get te...
102
103
  	pr_info("request was sent: group=0x%x
  ", ctl->group);
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
104
105
  
  	return 0;
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
106
  }
28f06c6f4   Jaswinder Singh Rajput   Documentation/con...
107
  #endif
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
108
109
  
  static u32 cn_test_timer_counter;
0d6942348   Kees Cook   samples: Convert ...
110
  static void cn_test_timer_func(struct timer_list *unused)
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
111
112
113
  {
  	struct cn_msg *m;
  	char data[32];
0d6942348   Kees Cook   samples: Convert ...
114
115
  	pr_debug("%s: timer fired
  ", __func__);
37cf2b8d1   Mike Frysinger   connector: get te...
116

dd00cc486   Yoann Padioleau   some kmalloc/mems...
117
  	m = kzalloc(sizeof(*m) + sizeof(data), GFP_ATOMIC);
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
118
  	if (m) {
7672d0b54   Evgeniy Polyakov   [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   David Fries   connector: add po...
129
  		cn_netlink_send(m, 0, 0, GFP_ATOMIC);
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
130
131
132
133
  		kfree(m);
  	}
  
  	cn_test_timer_counter++;
37cf2b8d1   Mike Frysinger   connector: get te...
134
  	mod_timer(&cn_test_timer, jiffies + msecs_to_jiffies(1000));
7672d0b54   Evgeniy Polyakov   [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   Kees Cook   samples: Convert ...
150
  	timer_setup(&cn_test_timer, cn_test_timer_func, 0);
37cf2b8d1   Mike Frysinger   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   Evgeniy Polyakov   [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   Evgeniy Polyakov   connector: mainta...
180
  MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
7672d0b54   Evgeniy Polyakov   [NET]: Add netlin...
181
  MODULE_DESCRIPTION("Connector's test module");