1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
5*4882a593Smuzhiyun * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
6*4882a593Smuzhiyun * Copyright Darryl Miles G7LED (dlm@g7led.demon.co.uk)
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun #include <linux/module.h>
9*4882a593Smuzhiyun #include <linux/moduleparam.h>
10*4882a593Smuzhiyun #include <linux/capability.h>
11*4882a593Smuzhiyun #include <linux/errno.h>
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun #include <linux/socket.h>
14*4882a593Smuzhiyun #include <linux/in.h>
15*4882a593Smuzhiyun #include <linux/slab.h>
16*4882a593Smuzhiyun #include <linux/kernel.h>
17*4882a593Smuzhiyun #include <linux/sched/signal.h>
18*4882a593Smuzhiyun #include <linux/timer.h>
19*4882a593Smuzhiyun #include <linux/string.h>
20*4882a593Smuzhiyun #include <linux/sockios.h>
21*4882a593Smuzhiyun #include <linux/net.h>
22*4882a593Smuzhiyun #include <linux/stat.h>
23*4882a593Smuzhiyun #include <net/ax25.h>
24*4882a593Smuzhiyun #include <linux/inet.h>
25*4882a593Smuzhiyun #include <linux/netdevice.h>
26*4882a593Smuzhiyun #include <linux/if_arp.h>
27*4882a593Smuzhiyun #include <linux/skbuff.h>
28*4882a593Smuzhiyun #include <net/net_namespace.h>
29*4882a593Smuzhiyun #include <net/sock.h>
30*4882a593Smuzhiyun #include <linux/uaccess.h>
31*4882a593Smuzhiyun #include <linux/fcntl.h>
32*4882a593Smuzhiyun #include <linux/termios.h> /* For TIOCINQ/OUTQ */
33*4882a593Smuzhiyun #include <linux/mm.h>
34*4882a593Smuzhiyun #include <linux/interrupt.h>
35*4882a593Smuzhiyun #include <linux/notifier.h>
36*4882a593Smuzhiyun #include <net/netrom.h>
37*4882a593Smuzhiyun #include <linux/proc_fs.h>
38*4882a593Smuzhiyun #include <linux/seq_file.h>
39*4882a593Smuzhiyun #include <net/ip.h>
40*4882a593Smuzhiyun #include <net/tcp_states.h>
41*4882a593Smuzhiyun #include <net/arp.h>
42*4882a593Smuzhiyun #include <linux/init.h>
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun static int nr_ndevs = 4;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun int sysctl_netrom_default_path_quality = NR_DEFAULT_QUAL;
47*4882a593Smuzhiyun int sysctl_netrom_obsolescence_count_initialiser = NR_DEFAULT_OBS;
48*4882a593Smuzhiyun int sysctl_netrom_network_ttl_initialiser = NR_DEFAULT_TTL;
49*4882a593Smuzhiyun int sysctl_netrom_transport_timeout = NR_DEFAULT_T1;
50*4882a593Smuzhiyun int sysctl_netrom_transport_maximum_tries = NR_DEFAULT_N2;
51*4882a593Smuzhiyun int sysctl_netrom_transport_acknowledge_delay = NR_DEFAULT_T2;
52*4882a593Smuzhiyun int sysctl_netrom_transport_busy_delay = NR_DEFAULT_T4;
53*4882a593Smuzhiyun int sysctl_netrom_transport_requested_window_size = NR_DEFAULT_WINDOW;
54*4882a593Smuzhiyun int sysctl_netrom_transport_no_activity_timeout = NR_DEFAULT_IDLE;
55*4882a593Smuzhiyun int sysctl_netrom_routing_control = NR_DEFAULT_ROUTING;
56*4882a593Smuzhiyun int sysctl_netrom_link_fails_count = NR_DEFAULT_FAILS;
57*4882a593Smuzhiyun int sysctl_netrom_reset_circuit = NR_DEFAULT_RESET;
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun static unsigned short circuit = 0x101;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun static HLIST_HEAD(nr_list);
62*4882a593Smuzhiyun static DEFINE_SPINLOCK(nr_list_lock);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun static const struct proto_ops nr_proto_ops;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun /*
67*4882a593Smuzhiyun * NETROM network devices are virtual network devices encapsulating NETROM
68*4882a593Smuzhiyun * frames into AX.25 which will be sent through an AX.25 device, so form a
69*4882a593Smuzhiyun * special "super class" of normal net devices; split their locks off into a
70*4882a593Smuzhiyun * separate class since they always nest.
71*4882a593Smuzhiyun */
72*4882a593Smuzhiyun static struct lock_class_key nr_netdev_xmit_lock_key;
73*4882a593Smuzhiyun static struct lock_class_key nr_netdev_addr_lock_key;
74*4882a593Smuzhiyun
nr_set_lockdep_one(struct net_device * dev,struct netdev_queue * txq,void * _unused)75*4882a593Smuzhiyun static void nr_set_lockdep_one(struct net_device *dev,
76*4882a593Smuzhiyun struct netdev_queue *txq,
77*4882a593Smuzhiyun void *_unused)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun lockdep_set_class(&txq->_xmit_lock, &nr_netdev_xmit_lock_key);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
nr_set_lockdep_key(struct net_device * dev)82*4882a593Smuzhiyun static void nr_set_lockdep_key(struct net_device *dev)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun lockdep_set_class(&dev->addr_list_lock, &nr_netdev_addr_lock_key);
85*4882a593Smuzhiyun netdev_for_each_tx_queue(dev, nr_set_lockdep_one, NULL);
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun /*
89*4882a593Smuzhiyun * Socket removal during an interrupt is now safe.
90*4882a593Smuzhiyun */
nr_remove_socket(struct sock * sk)91*4882a593Smuzhiyun static void nr_remove_socket(struct sock *sk)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
94*4882a593Smuzhiyun sk_del_node_init(sk);
95*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /*
99*4882a593Smuzhiyun * Kill all bound sockets on a dropped device.
100*4882a593Smuzhiyun */
nr_kill_by_device(struct net_device * dev)101*4882a593Smuzhiyun static void nr_kill_by_device(struct net_device *dev)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun struct sock *s;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
106*4882a593Smuzhiyun sk_for_each(s, &nr_list)
107*4882a593Smuzhiyun if (nr_sk(s)->device == dev)
108*4882a593Smuzhiyun nr_disconnect(s, ENETUNREACH);
109*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun * Handle device status changes.
114*4882a593Smuzhiyun */
nr_device_event(struct notifier_block * this,unsigned long event,void * ptr)115*4882a593Smuzhiyun static int nr_device_event(struct notifier_block *this, unsigned long event, void *ptr)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun struct net_device *dev = netdev_notifier_info_to_dev(ptr);
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun if (!net_eq(dev_net(dev), &init_net))
120*4882a593Smuzhiyun return NOTIFY_DONE;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun if (event != NETDEV_DOWN)
123*4882a593Smuzhiyun return NOTIFY_DONE;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun nr_kill_by_device(dev);
126*4882a593Smuzhiyun nr_rt_device_down(dev);
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun return NOTIFY_DONE;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /*
132*4882a593Smuzhiyun * Add a socket to the bound sockets list.
133*4882a593Smuzhiyun */
nr_insert_socket(struct sock * sk)134*4882a593Smuzhiyun static void nr_insert_socket(struct sock *sk)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
137*4882a593Smuzhiyun sk_add_node(sk, &nr_list);
138*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun /*
142*4882a593Smuzhiyun * Find a socket that wants to accept the Connect Request we just
143*4882a593Smuzhiyun * received.
144*4882a593Smuzhiyun */
nr_find_listener(ax25_address * addr)145*4882a593Smuzhiyun static struct sock *nr_find_listener(ax25_address *addr)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun struct sock *s;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
150*4882a593Smuzhiyun sk_for_each(s, &nr_list)
151*4882a593Smuzhiyun if (!ax25cmp(&nr_sk(s)->source_addr, addr) &&
152*4882a593Smuzhiyun s->sk_state == TCP_LISTEN) {
153*4882a593Smuzhiyun sock_hold(s);
154*4882a593Smuzhiyun goto found;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun s = NULL;
157*4882a593Smuzhiyun found:
158*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
159*4882a593Smuzhiyun return s;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun /*
163*4882a593Smuzhiyun * Find a connected NET/ROM socket given my circuit IDs.
164*4882a593Smuzhiyun */
nr_find_socket(unsigned char index,unsigned char id)165*4882a593Smuzhiyun static struct sock *nr_find_socket(unsigned char index, unsigned char id)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun struct sock *s;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
170*4882a593Smuzhiyun sk_for_each(s, &nr_list) {
171*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(s);
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun if (nr->my_index == index && nr->my_id == id) {
174*4882a593Smuzhiyun sock_hold(s);
175*4882a593Smuzhiyun goto found;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun s = NULL;
179*4882a593Smuzhiyun found:
180*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
181*4882a593Smuzhiyun return s;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun /*
185*4882a593Smuzhiyun * Find a connected NET/ROM socket given their circuit IDs.
186*4882a593Smuzhiyun */
nr_find_peer(unsigned char index,unsigned char id,ax25_address * dest)187*4882a593Smuzhiyun static struct sock *nr_find_peer(unsigned char index, unsigned char id,
188*4882a593Smuzhiyun ax25_address *dest)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun struct sock *s;
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
193*4882a593Smuzhiyun sk_for_each(s, &nr_list) {
194*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(s);
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun if (nr->your_index == index && nr->your_id == id &&
197*4882a593Smuzhiyun !ax25cmp(&nr->dest_addr, dest)) {
198*4882a593Smuzhiyun sock_hold(s);
199*4882a593Smuzhiyun goto found;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun s = NULL;
203*4882a593Smuzhiyun found:
204*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
205*4882a593Smuzhiyun return s;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun /*
209*4882a593Smuzhiyun * Find next free circuit ID.
210*4882a593Smuzhiyun */
nr_find_next_circuit(void)211*4882a593Smuzhiyun static unsigned short nr_find_next_circuit(void)
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun unsigned short id = circuit;
214*4882a593Smuzhiyun unsigned char i, j;
215*4882a593Smuzhiyun struct sock *sk;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun for (;;) {
218*4882a593Smuzhiyun i = id / 256;
219*4882a593Smuzhiyun j = id % 256;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun if (i != 0 && j != 0) {
222*4882a593Smuzhiyun if ((sk=nr_find_socket(i, j)) == NULL)
223*4882a593Smuzhiyun break;
224*4882a593Smuzhiyun sock_put(sk);
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun id++;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun return id;
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun /*
234*4882a593Smuzhiyun * Deferred destroy.
235*4882a593Smuzhiyun */
236*4882a593Smuzhiyun void nr_destroy_socket(struct sock *);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun /*
239*4882a593Smuzhiyun * Handler for deferred kills.
240*4882a593Smuzhiyun */
nr_destroy_timer(struct timer_list * t)241*4882a593Smuzhiyun static void nr_destroy_timer(struct timer_list *t)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun struct sock *sk = from_timer(sk, t, sk_timer);
244*4882a593Smuzhiyun bh_lock_sock(sk);
245*4882a593Smuzhiyun sock_hold(sk);
246*4882a593Smuzhiyun nr_destroy_socket(sk);
247*4882a593Smuzhiyun bh_unlock_sock(sk);
248*4882a593Smuzhiyun sock_put(sk);
249*4882a593Smuzhiyun }
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun /*
252*4882a593Smuzhiyun * This is called from user mode and the timers. Thus it protects itself
253*4882a593Smuzhiyun * against interrupt users but doesn't worry about being called during
254*4882a593Smuzhiyun * work. Once it is removed from the queue no interrupt or bottom half
255*4882a593Smuzhiyun * will touch it and we are (fairly 8-) ) safe.
256*4882a593Smuzhiyun */
nr_destroy_socket(struct sock * sk)257*4882a593Smuzhiyun void nr_destroy_socket(struct sock *sk)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun struct sk_buff *skb;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun nr_remove_socket(sk);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun nr_stop_heartbeat(sk);
264*4882a593Smuzhiyun nr_stop_t1timer(sk);
265*4882a593Smuzhiyun nr_stop_t2timer(sk);
266*4882a593Smuzhiyun nr_stop_t4timer(sk);
267*4882a593Smuzhiyun nr_stop_idletimer(sk);
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun nr_clear_queues(sk); /* Flush the queues */
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
272*4882a593Smuzhiyun if (skb->sk != sk) { /* A pending connection */
273*4882a593Smuzhiyun /* Queue the unaccepted socket for death */
274*4882a593Smuzhiyun sock_set_flag(skb->sk, SOCK_DEAD);
275*4882a593Smuzhiyun nr_start_heartbeat(skb->sk);
276*4882a593Smuzhiyun nr_sk(skb->sk)->state = NR_STATE_0;
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun kfree_skb(skb);
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun if (sk_has_allocations(sk)) {
283*4882a593Smuzhiyun /* Defer: outstanding buffers */
284*4882a593Smuzhiyun sk->sk_timer.function = nr_destroy_timer;
285*4882a593Smuzhiyun sk->sk_timer.expires = jiffies + 2 * HZ;
286*4882a593Smuzhiyun add_timer(&sk->sk_timer);
287*4882a593Smuzhiyun } else
288*4882a593Smuzhiyun sock_put(sk);
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun /*
292*4882a593Smuzhiyun * Handling for system calls applied via the various interfaces to a
293*4882a593Smuzhiyun * NET/ROM socket object.
294*4882a593Smuzhiyun */
295*4882a593Smuzhiyun
nr_setsockopt(struct socket * sock,int level,int optname,sockptr_t optval,unsigned int optlen)296*4882a593Smuzhiyun static int nr_setsockopt(struct socket *sock, int level, int optname,
297*4882a593Smuzhiyun sockptr_t optval, unsigned int optlen)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun struct sock *sk = sock->sk;
300*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(sk);
301*4882a593Smuzhiyun unsigned int opt;
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun if (level != SOL_NETROM)
304*4882a593Smuzhiyun return -ENOPROTOOPT;
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun if (optlen < sizeof(unsigned int))
307*4882a593Smuzhiyun return -EINVAL;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun if (copy_from_sockptr(&opt, optval, sizeof(opt)))
310*4882a593Smuzhiyun return -EFAULT;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun switch (optname) {
313*4882a593Smuzhiyun case NETROM_T1:
314*4882a593Smuzhiyun if (opt < 1 || opt > UINT_MAX / HZ)
315*4882a593Smuzhiyun return -EINVAL;
316*4882a593Smuzhiyun nr->t1 = opt * HZ;
317*4882a593Smuzhiyun return 0;
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun case NETROM_T2:
320*4882a593Smuzhiyun if (opt < 1 || opt > UINT_MAX / HZ)
321*4882a593Smuzhiyun return -EINVAL;
322*4882a593Smuzhiyun nr->t2 = opt * HZ;
323*4882a593Smuzhiyun return 0;
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun case NETROM_N2:
326*4882a593Smuzhiyun if (opt < 1 || opt > 31)
327*4882a593Smuzhiyun return -EINVAL;
328*4882a593Smuzhiyun nr->n2 = opt;
329*4882a593Smuzhiyun return 0;
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun case NETROM_T4:
332*4882a593Smuzhiyun if (opt < 1 || opt > UINT_MAX / HZ)
333*4882a593Smuzhiyun return -EINVAL;
334*4882a593Smuzhiyun nr->t4 = opt * HZ;
335*4882a593Smuzhiyun return 0;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun case NETROM_IDLE:
338*4882a593Smuzhiyun if (opt > UINT_MAX / (60 * HZ))
339*4882a593Smuzhiyun return -EINVAL;
340*4882a593Smuzhiyun nr->idle = opt * 60 * HZ;
341*4882a593Smuzhiyun return 0;
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun default:
344*4882a593Smuzhiyun return -ENOPROTOOPT;
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
nr_getsockopt(struct socket * sock,int level,int optname,char __user * optval,int __user * optlen)348*4882a593Smuzhiyun static int nr_getsockopt(struct socket *sock, int level, int optname,
349*4882a593Smuzhiyun char __user *optval, int __user *optlen)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun struct sock *sk = sock->sk;
352*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(sk);
353*4882a593Smuzhiyun int val = 0;
354*4882a593Smuzhiyun int len;
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun if (level != SOL_NETROM)
357*4882a593Smuzhiyun return -ENOPROTOOPT;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun if (get_user(len, optlen))
360*4882a593Smuzhiyun return -EFAULT;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun if (len < 0)
363*4882a593Smuzhiyun return -EINVAL;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun switch (optname) {
366*4882a593Smuzhiyun case NETROM_T1:
367*4882a593Smuzhiyun val = nr->t1 / HZ;
368*4882a593Smuzhiyun break;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun case NETROM_T2:
371*4882a593Smuzhiyun val = nr->t2 / HZ;
372*4882a593Smuzhiyun break;
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun case NETROM_N2:
375*4882a593Smuzhiyun val = nr->n2;
376*4882a593Smuzhiyun break;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun case NETROM_T4:
379*4882a593Smuzhiyun val = nr->t4 / HZ;
380*4882a593Smuzhiyun break;
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun case NETROM_IDLE:
383*4882a593Smuzhiyun val = nr->idle / (60 * HZ);
384*4882a593Smuzhiyun break;
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun default:
387*4882a593Smuzhiyun return -ENOPROTOOPT;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun len = min_t(unsigned int, len, sizeof(int));
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun if (put_user(len, optlen))
393*4882a593Smuzhiyun return -EFAULT;
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun return copy_to_user(optval, &val, len) ? -EFAULT : 0;
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun
nr_listen(struct socket * sock,int backlog)398*4882a593Smuzhiyun static int nr_listen(struct socket *sock, int backlog)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun struct sock *sk = sock->sk;
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun lock_sock(sk);
403*4882a593Smuzhiyun if (sk->sk_state != TCP_LISTEN) {
404*4882a593Smuzhiyun memset(&nr_sk(sk)->user_addr, 0, AX25_ADDR_LEN);
405*4882a593Smuzhiyun sk->sk_max_ack_backlog = backlog;
406*4882a593Smuzhiyun sk->sk_state = TCP_LISTEN;
407*4882a593Smuzhiyun release_sock(sk);
408*4882a593Smuzhiyun return 0;
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun release_sock(sk);
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun return -EOPNOTSUPP;
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun static struct proto nr_proto = {
416*4882a593Smuzhiyun .name = "NETROM",
417*4882a593Smuzhiyun .owner = THIS_MODULE,
418*4882a593Smuzhiyun .obj_size = sizeof(struct nr_sock),
419*4882a593Smuzhiyun };
420*4882a593Smuzhiyun
nr_create(struct net * net,struct socket * sock,int protocol,int kern)421*4882a593Smuzhiyun static int nr_create(struct net *net, struct socket *sock, int protocol,
422*4882a593Smuzhiyun int kern)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun struct sock *sk;
425*4882a593Smuzhiyun struct nr_sock *nr;
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun if (!net_eq(net, &init_net))
428*4882a593Smuzhiyun return -EAFNOSUPPORT;
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun if (sock->type != SOCK_SEQPACKET || protocol != 0)
431*4882a593Smuzhiyun return -ESOCKTNOSUPPORT;
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun sk = sk_alloc(net, PF_NETROM, GFP_ATOMIC, &nr_proto, kern);
434*4882a593Smuzhiyun if (sk == NULL)
435*4882a593Smuzhiyun return -ENOMEM;
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun nr = nr_sk(sk);
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun sock_init_data(sock, sk);
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun sock->ops = &nr_proto_ops;
442*4882a593Smuzhiyun sk->sk_protocol = protocol;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun skb_queue_head_init(&nr->ack_queue);
445*4882a593Smuzhiyun skb_queue_head_init(&nr->reseq_queue);
446*4882a593Smuzhiyun skb_queue_head_init(&nr->frag_queue);
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun nr_init_timers(sk);
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun nr->t1 =
451*4882a593Smuzhiyun msecs_to_jiffies(sysctl_netrom_transport_timeout);
452*4882a593Smuzhiyun nr->t2 =
453*4882a593Smuzhiyun msecs_to_jiffies(sysctl_netrom_transport_acknowledge_delay);
454*4882a593Smuzhiyun nr->n2 =
455*4882a593Smuzhiyun msecs_to_jiffies(sysctl_netrom_transport_maximum_tries);
456*4882a593Smuzhiyun nr->t4 =
457*4882a593Smuzhiyun msecs_to_jiffies(sysctl_netrom_transport_busy_delay);
458*4882a593Smuzhiyun nr->idle =
459*4882a593Smuzhiyun msecs_to_jiffies(sysctl_netrom_transport_no_activity_timeout);
460*4882a593Smuzhiyun nr->window = sysctl_netrom_transport_requested_window_size;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun nr->bpqext = 1;
463*4882a593Smuzhiyun nr->state = NR_STATE_0;
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun return 0;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
nr_make_new(struct sock * osk)468*4882a593Smuzhiyun static struct sock *nr_make_new(struct sock *osk)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun struct sock *sk;
471*4882a593Smuzhiyun struct nr_sock *nr, *onr;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun if (osk->sk_type != SOCK_SEQPACKET)
474*4882a593Smuzhiyun return NULL;
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun sk = sk_alloc(sock_net(osk), PF_NETROM, GFP_ATOMIC, osk->sk_prot, 0);
477*4882a593Smuzhiyun if (sk == NULL)
478*4882a593Smuzhiyun return NULL;
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun nr = nr_sk(sk);
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun sock_init_data(NULL, sk);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun sk->sk_type = osk->sk_type;
485*4882a593Smuzhiyun sk->sk_priority = osk->sk_priority;
486*4882a593Smuzhiyun sk->sk_protocol = osk->sk_protocol;
487*4882a593Smuzhiyun sk->sk_rcvbuf = osk->sk_rcvbuf;
488*4882a593Smuzhiyun sk->sk_sndbuf = osk->sk_sndbuf;
489*4882a593Smuzhiyun sk->sk_state = TCP_ESTABLISHED;
490*4882a593Smuzhiyun sock_copy_flags(sk, osk);
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun skb_queue_head_init(&nr->ack_queue);
493*4882a593Smuzhiyun skb_queue_head_init(&nr->reseq_queue);
494*4882a593Smuzhiyun skb_queue_head_init(&nr->frag_queue);
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun nr_init_timers(sk);
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun onr = nr_sk(osk);
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun nr->t1 = onr->t1;
501*4882a593Smuzhiyun nr->t2 = onr->t2;
502*4882a593Smuzhiyun nr->n2 = onr->n2;
503*4882a593Smuzhiyun nr->t4 = onr->t4;
504*4882a593Smuzhiyun nr->idle = onr->idle;
505*4882a593Smuzhiyun nr->window = onr->window;
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun nr->device = onr->device;
508*4882a593Smuzhiyun nr->bpqext = onr->bpqext;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun return sk;
511*4882a593Smuzhiyun }
512*4882a593Smuzhiyun
nr_release(struct socket * sock)513*4882a593Smuzhiyun static int nr_release(struct socket *sock)
514*4882a593Smuzhiyun {
515*4882a593Smuzhiyun struct sock *sk = sock->sk;
516*4882a593Smuzhiyun struct nr_sock *nr;
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun if (sk == NULL) return 0;
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun sock_hold(sk);
521*4882a593Smuzhiyun sock_orphan(sk);
522*4882a593Smuzhiyun lock_sock(sk);
523*4882a593Smuzhiyun nr = nr_sk(sk);
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun switch (nr->state) {
526*4882a593Smuzhiyun case NR_STATE_0:
527*4882a593Smuzhiyun case NR_STATE_1:
528*4882a593Smuzhiyun case NR_STATE_2:
529*4882a593Smuzhiyun nr_disconnect(sk, 0);
530*4882a593Smuzhiyun nr_destroy_socket(sk);
531*4882a593Smuzhiyun break;
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun case NR_STATE_3:
534*4882a593Smuzhiyun nr_clear_queues(sk);
535*4882a593Smuzhiyun nr->n2count = 0;
536*4882a593Smuzhiyun nr_write_internal(sk, NR_DISCREQ);
537*4882a593Smuzhiyun nr_start_t1timer(sk);
538*4882a593Smuzhiyun nr_stop_t2timer(sk);
539*4882a593Smuzhiyun nr_stop_t4timer(sk);
540*4882a593Smuzhiyun nr_stop_idletimer(sk);
541*4882a593Smuzhiyun nr->state = NR_STATE_2;
542*4882a593Smuzhiyun sk->sk_state = TCP_CLOSE;
543*4882a593Smuzhiyun sk->sk_shutdown |= SEND_SHUTDOWN;
544*4882a593Smuzhiyun sk->sk_state_change(sk);
545*4882a593Smuzhiyun sock_set_flag(sk, SOCK_DESTROY);
546*4882a593Smuzhiyun break;
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun default:
549*4882a593Smuzhiyun break;
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun sock->sk = NULL;
553*4882a593Smuzhiyun release_sock(sk);
554*4882a593Smuzhiyun sock_put(sk);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun return 0;
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun
nr_bind(struct socket * sock,struct sockaddr * uaddr,int addr_len)559*4882a593Smuzhiyun static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
560*4882a593Smuzhiyun {
561*4882a593Smuzhiyun struct sock *sk = sock->sk;
562*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(sk);
563*4882a593Smuzhiyun struct full_sockaddr_ax25 *addr = (struct full_sockaddr_ax25 *)uaddr;
564*4882a593Smuzhiyun struct net_device *dev;
565*4882a593Smuzhiyun ax25_uid_assoc *user;
566*4882a593Smuzhiyun ax25_address *source;
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun lock_sock(sk);
569*4882a593Smuzhiyun if (!sock_flag(sk, SOCK_ZAPPED)) {
570*4882a593Smuzhiyun release_sock(sk);
571*4882a593Smuzhiyun return -EINVAL;
572*4882a593Smuzhiyun }
573*4882a593Smuzhiyun if (addr_len < sizeof(struct sockaddr_ax25) || addr_len > sizeof(struct full_sockaddr_ax25)) {
574*4882a593Smuzhiyun release_sock(sk);
575*4882a593Smuzhiyun return -EINVAL;
576*4882a593Smuzhiyun }
577*4882a593Smuzhiyun if (addr_len < (addr->fsa_ax25.sax25_ndigis * sizeof(ax25_address) + sizeof(struct sockaddr_ax25))) {
578*4882a593Smuzhiyun release_sock(sk);
579*4882a593Smuzhiyun return -EINVAL;
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun if (addr->fsa_ax25.sax25_family != AF_NETROM) {
582*4882a593Smuzhiyun release_sock(sk);
583*4882a593Smuzhiyun return -EINVAL;
584*4882a593Smuzhiyun }
585*4882a593Smuzhiyun if ((dev = nr_dev_get(&addr->fsa_ax25.sax25_call)) == NULL) {
586*4882a593Smuzhiyun release_sock(sk);
587*4882a593Smuzhiyun return -EADDRNOTAVAIL;
588*4882a593Smuzhiyun }
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun /*
591*4882a593Smuzhiyun * Only the super user can set an arbitrary user callsign.
592*4882a593Smuzhiyun */
593*4882a593Smuzhiyun if (addr->fsa_ax25.sax25_ndigis == 1) {
594*4882a593Smuzhiyun if (!capable(CAP_NET_BIND_SERVICE)) {
595*4882a593Smuzhiyun dev_put(dev);
596*4882a593Smuzhiyun release_sock(sk);
597*4882a593Smuzhiyun return -EPERM;
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun nr->user_addr = addr->fsa_digipeater[0];
600*4882a593Smuzhiyun nr->source_addr = addr->fsa_ax25.sax25_call;
601*4882a593Smuzhiyun } else {
602*4882a593Smuzhiyun source = &addr->fsa_ax25.sax25_call;
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun user = ax25_findbyuid(current_euid());
605*4882a593Smuzhiyun if (user) {
606*4882a593Smuzhiyun nr->user_addr = user->call;
607*4882a593Smuzhiyun ax25_uid_put(user);
608*4882a593Smuzhiyun } else {
609*4882a593Smuzhiyun if (ax25_uid_policy && !capable(CAP_NET_BIND_SERVICE)) {
610*4882a593Smuzhiyun release_sock(sk);
611*4882a593Smuzhiyun dev_put(dev);
612*4882a593Smuzhiyun return -EPERM;
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun nr->user_addr = *source;
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun nr->source_addr = *source;
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun nr->device = dev;
621*4882a593Smuzhiyun nr_insert_socket(sk);
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun sock_reset_flag(sk, SOCK_ZAPPED);
624*4882a593Smuzhiyun dev_put(dev);
625*4882a593Smuzhiyun release_sock(sk);
626*4882a593Smuzhiyun
627*4882a593Smuzhiyun return 0;
628*4882a593Smuzhiyun }
629*4882a593Smuzhiyun
nr_connect(struct socket * sock,struct sockaddr * uaddr,int addr_len,int flags)630*4882a593Smuzhiyun static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
631*4882a593Smuzhiyun int addr_len, int flags)
632*4882a593Smuzhiyun {
633*4882a593Smuzhiyun struct sock *sk = sock->sk;
634*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(sk);
635*4882a593Smuzhiyun struct sockaddr_ax25 *addr = (struct sockaddr_ax25 *)uaddr;
636*4882a593Smuzhiyun ax25_address *source = NULL;
637*4882a593Smuzhiyun ax25_uid_assoc *user;
638*4882a593Smuzhiyun struct net_device *dev;
639*4882a593Smuzhiyun int err = 0;
640*4882a593Smuzhiyun
641*4882a593Smuzhiyun lock_sock(sk);
642*4882a593Smuzhiyun if (sk->sk_state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
643*4882a593Smuzhiyun sock->state = SS_CONNECTED;
644*4882a593Smuzhiyun goto out_release; /* Connect completed during a ERESTARTSYS event */
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun if (sk->sk_state == TCP_CLOSE && sock->state == SS_CONNECTING) {
648*4882a593Smuzhiyun sock->state = SS_UNCONNECTED;
649*4882a593Smuzhiyun err = -ECONNREFUSED;
650*4882a593Smuzhiyun goto out_release;
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun if (sk->sk_state == TCP_ESTABLISHED) {
654*4882a593Smuzhiyun err = -EISCONN; /* No reconnect on a seqpacket socket */
655*4882a593Smuzhiyun goto out_release;
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun sk->sk_state = TCP_CLOSE;
659*4882a593Smuzhiyun sock->state = SS_UNCONNECTED;
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun if (addr_len != sizeof(struct sockaddr_ax25) && addr_len != sizeof(struct full_sockaddr_ax25)) {
662*4882a593Smuzhiyun err = -EINVAL;
663*4882a593Smuzhiyun goto out_release;
664*4882a593Smuzhiyun }
665*4882a593Smuzhiyun if (addr->sax25_family != AF_NETROM) {
666*4882a593Smuzhiyun err = -EINVAL;
667*4882a593Smuzhiyun goto out_release;
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun if (sock_flag(sk, SOCK_ZAPPED)) { /* Must bind first - autobinding in this may or may not work */
670*4882a593Smuzhiyun sock_reset_flag(sk, SOCK_ZAPPED);
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun if ((dev = nr_dev_first()) == NULL) {
673*4882a593Smuzhiyun err = -ENETUNREACH;
674*4882a593Smuzhiyun goto out_release;
675*4882a593Smuzhiyun }
676*4882a593Smuzhiyun source = (ax25_address *)dev->dev_addr;
677*4882a593Smuzhiyun
678*4882a593Smuzhiyun user = ax25_findbyuid(current_euid());
679*4882a593Smuzhiyun if (user) {
680*4882a593Smuzhiyun nr->user_addr = user->call;
681*4882a593Smuzhiyun ax25_uid_put(user);
682*4882a593Smuzhiyun } else {
683*4882a593Smuzhiyun if (ax25_uid_policy && !capable(CAP_NET_ADMIN)) {
684*4882a593Smuzhiyun dev_put(dev);
685*4882a593Smuzhiyun err = -EPERM;
686*4882a593Smuzhiyun goto out_release;
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun nr->user_addr = *source;
689*4882a593Smuzhiyun }
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun nr->source_addr = *source;
692*4882a593Smuzhiyun nr->device = dev;
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun dev_put(dev);
695*4882a593Smuzhiyun nr_insert_socket(sk); /* Finish the bind */
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun nr->dest_addr = addr->sax25_call;
699*4882a593Smuzhiyun
700*4882a593Smuzhiyun release_sock(sk);
701*4882a593Smuzhiyun circuit = nr_find_next_circuit();
702*4882a593Smuzhiyun lock_sock(sk);
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun nr->my_index = circuit / 256;
705*4882a593Smuzhiyun nr->my_id = circuit % 256;
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun circuit++;
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun /* Move to connecting socket, start sending Connect Requests */
710*4882a593Smuzhiyun sock->state = SS_CONNECTING;
711*4882a593Smuzhiyun sk->sk_state = TCP_SYN_SENT;
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun nr_establish_data_link(sk);
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun nr->state = NR_STATE_1;
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun nr_start_heartbeat(sk);
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun /* Now the loop */
720*4882a593Smuzhiyun if (sk->sk_state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) {
721*4882a593Smuzhiyun err = -EINPROGRESS;
722*4882a593Smuzhiyun goto out_release;
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun /*
726*4882a593Smuzhiyun * A Connect Ack with Choke or timeout or failed routing will go to
727*4882a593Smuzhiyun * closed.
728*4882a593Smuzhiyun */
729*4882a593Smuzhiyun if (sk->sk_state == TCP_SYN_SENT) {
730*4882a593Smuzhiyun DEFINE_WAIT(wait);
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun for (;;) {
733*4882a593Smuzhiyun prepare_to_wait(sk_sleep(sk), &wait,
734*4882a593Smuzhiyun TASK_INTERRUPTIBLE);
735*4882a593Smuzhiyun if (sk->sk_state != TCP_SYN_SENT)
736*4882a593Smuzhiyun break;
737*4882a593Smuzhiyun if (!signal_pending(current)) {
738*4882a593Smuzhiyun release_sock(sk);
739*4882a593Smuzhiyun schedule();
740*4882a593Smuzhiyun lock_sock(sk);
741*4882a593Smuzhiyun continue;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun err = -ERESTARTSYS;
744*4882a593Smuzhiyun break;
745*4882a593Smuzhiyun }
746*4882a593Smuzhiyun finish_wait(sk_sleep(sk), &wait);
747*4882a593Smuzhiyun if (err)
748*4882a593Smuzhiyun goto out_release;
749*4882a593Smuzhiyun }
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun if (sk->sk_state != TCP_ESTABLISHED) {
752*4882a593Smuzhiyun sock->state = SS_UNCONNECTED;
753*4882a593Smuzhiyun err = sock_error(sk); /* Always set at this point */
754*4882a593Smuzhiyun goto out_release;
755*4882a593Smuzhiyun }
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun sock->state = SS_CONNECTED;
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun out_release:
760*4882a593Smuzhiyun release_sock(sk);
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun return err;
763*4882a593Smuzhiyun }
764*4882a593Smuzhiyun
nr_accept(struct socket * sock,struct socket * newsock,int flags,bool kern)765*4882a593Smuzhiyun static int nr_accept(struct socket *sock, struct socket *newsock, int flags,
766*4882a593Smuzhiyun bool kern)
767*4882a593Smuzhiyun {
768*4882a593Smuzhiyun struct sk_buff *skb;
769*4882a593Smuzhiyun struct sock *newsk;
770*4882a593Smuzhiyun DEFINE_WAIT(wait);
771*4882a593Smuzhiyun struct sock *sk;
772*4882a593Smuzhiyun int err = 0;
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun if ((sk = sock->sk) == NULL)
775*4882a593Smuzhiyun return -EINVAL;
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun lock_sock(sk);
778*4882a593Smuzhiyun if (sk->sk_type != SOCK_SEQPACKET) {
779*4882a593Smuzhiyun err = -EOPNOTSUPP;
780*4882a593Smuzhiyun goto out_release;
781*4882a593Smuzhiyun }
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun if (sk->sk_state != TCP_LISTEN) {
784*4882a593Smuzhiyun err = -EINVAL;
785*4882a593Smuzhiyun goto out_release;
786*4882a593Smuzhiyun }
787*4882a593Smuzhiyun
788*4882a593Smuzhiyun /*
789*4882a593Smuzhiyun * The write queue this time is holding sockets ready to use
790*4882a593Smuzhiyun * hooked into the SABM we saved
791*4882a593Smuzhiyun */
792*4882a593Smuzhiyun for (;;) {
793*4882a593Smuzhiyun prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
794*4882a593Smuzhiyun skb = skb_dequeue(&sk->sk_receive_queue);
795*4882a593Smuzhiyun if (skb)
796*4882a593Smuzhiyun break;
797*4882a593Smuzhiyun
798*4882a593Smuzhiyun if (flags & O_NONBLOCK) {
799*4882a593Smuzhiyun err = -EWOULDBLOCK;
800*4882a593Smuzhiyun break;
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun if (!signal_pending(current)) {
803*4882a593Smuzhiyun release_sock(sk);
804*4882a593Smuzhiyun schedule();
805*4882a593Smuzhiyun lock_sock(sk);
806*4882a593Smuzhiyun continue;
807*4882a593Smuzhiyun }
808*4882a593Smuzhiyun err = -ERESTARTSYS;
809*4882a593Smuzhiyun break;
810*4882a593Smuzhiyun }
811*4882a593Smuzhiyun finish_wait(sk_sleep(sk), &wait);
812*4882a593Smuzhiyun if (err)
813*4882a593Smuzhiyun goto out_release;
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun newsk = skb->sk;
816*4882a593Smuzhiyun sock_graft(newsk, newsock);
817*4882a593Smuzhiyun
818*4882a593Smuzhiyun /* Now attach up the new socket */
819*4882a593Smuzhiyun kfree_skb(skb);
820*4882a593Smuzhiyun sk_acceptq_removed(sk);
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun out_release:
823*4882a593Smuzhiyun release_sock(sk);
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun return err;
826*4882a593Smuzhiyun }
827*4882a593Smuzhiyun
nr_getname(struct socket * sock,struct sockaddr * uaddr,int peer)828*4882a593Smuzhiyun static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
829*4882a593Smuzhiyun int peer)
830*4882a593Smuzhiyun {
831*4882a593Smuzhiyun struct full_sockaddr_ax25 *sax = (struct full_sockaddr_ax25 *)uaddr;
832*4882a593Smuzhiyun struct sock *sk = sock->sk;
833*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(sk);
834*4882a593Smuzhiyun int uaddr_len;
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun memset(&sax->fsa_ax25, 0, sizeof(struct sockaddr_ax25));
837*4882a593Smuzhiyun
838*4882a593Smuzhiyun lock_sock(sk);
839*4882a593Smuzhiyun if (peer != 0) {
840*4882a593Smuzhiyun if (sk->sk_state != TCP_ESTABLISHED) {
841*4882a593Smuzhiyun release_sock(sk);
842*4882a593Smuzhiyun return -ENOTCONN;
843*4882a593Smuzhiyun }
844*4882a593Smuzhiyun sax->fsa_ax25.sax25_family = AF_NETROM;
845*4882a593Smuzhiyun sax->fsa_ax25.sax25_ndigis = 1;
846*4882a593Smuzhiyun sax->fsa_ax25.sax25_call = nr->user_addr;
847*4882a593Smuzhiyun memset(sax->fsa_digipeater, 0, sizeof(sax->fsa_digipeater));
848*4882a593Smuzhiyun sax->fsa_digipeater[0] = nr->dest_addr;
849*4882a593Smuzhiyun uaddr_len = sizeof(struct full_sockaddr_ax25);
850*4882a593Smuzhiyun } else {
851*4882a593Smuzhiyun sax->fsa_ax25.sax25_family = AF_NETROM;
852*4882a593Smuzhiyun sax->fsa_ax25.sax25_ndigis = 0;
853*4882a593Smuzhiyun sax->fsa_ax25.sax25_call = nr->source_addr;
854*4882a593Smuzhiyun uaddr_len = sizeof(struct sockaddr_ax25);
855*4882a593Smuzhiyun }
856*4882a593Smuzhiyun release_sock(sk);
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun return uaddr_len;
859*4882a593Smuzhiyun }
860*4882a593Smuzhiyun
nr_rx_frame(struct sk_buff * skb,struct net_device * dev)861*4882a593Smuzhiyun int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
862*4882a593Smuzhiyun {
863*4882a593Smuzhiyun struct sock *sk;
864*4882a593Smuzhiyun struct sock *make;
865*4882a593Smuzhiyun struct nr_sock *nr_make;
866*4882a593Smuzhiyun ax25_address *src, *dest, *user;
867*4882a593Smuzhiyun unsigned short circuit_index, circuit_id;
868*4882a593Smuzhiyun unsigned short peer_circuit_index, peer_circuit_id;
869*4882a593Smuzhiyun unsigned short frametype, flags, window, timeout;
870*4882a593Smuzhiyun int ret;
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun skb_orphan(skb);
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun /*
875*4882a593Smuzhiyun * skb->data points to the netrom frame start
876*4882a593Smuzhiyun */
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun src = (ax25_address *)(skb->data + 0);
879*4882a593Smuzhiyun dest = (ax25_address *)(skb->data + 7);
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun circuit_index = skb->data[15];
882*4882a593Smuzhiyun circuit_id = skb->data[16];
883*4882a593Smuzhiyun peer_circuit_index = skb->data[17];
884*4882a593Smuzhiyun peer_circuit_id = skb->data[18];
885*4882a593Smuzhiyun frametype = skb->data[19] & 0x0F;
886*4882a593Smuzhiyun flags = skb->data[19] & 0xF0;
887*4882a593Smuzhiyun
888*4882a593Smuzhiyun /*
889*4882a593Smuzhiyun * Check for an incoming IP over NET/ROM frame.
890*4882a593Smuzhiyun */
891*4882a593Smuzhiyun if (frametype == NR_PROTOEXT &&
892*4882a593Smuzhiyun circuit_index == NR_PROTO_IP && circuit_id == NR_PROTO_IP) {
893*4882a593Smuzhiyun skb_pull(skb, NR_NETWORK_LEN + NR_TRANSPORT_LEN);
894*4882a593Smuzhiyun skb_reset_transport_header(skb);
895*4882a593Smuzhiyun
896*4882a593Smuzhiyun return nr_rx_ip(skb, dev);
897*4882a593Smuzhiyun }
898*4882a593Smuzhiyun
899*4882a593Smuzhiyun /*
900*4882a593Smuzhiyun * Find an existing socket connection, based on circuit ID, if it's
901*4882a593Smuzhiyun * a Connect Request base it on their circuit ID.
902*4882a593Smuzhiyun *
903*4882a593Smuzhiyun * Circuit ID 0/0 is not valid but it could still be a "reset" for a
904*4882a593Smuzhiyun * circuit that no longer exists at the other end ...
905*4882a593Smuzhiyun */
906*4882a593Smuzhiyun
907*4882a593Smuzhiyun sk = NULL;
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun if (circuit_index == 0 && circuit_id == 0) {
910*4882a593Smuzhiyun if (frametype == NR_CONNACK && flags == NR_CHOKE_FLAG)
911*4882a593Smuzhiyun sk = nr_find_peer(peer_circuit_index, peer_circuit_id, src);
912*4882a593Smuzhiyun } else {
913*4882a593Smuzhiyun if (frametype == NR_CONNREQ)
914*4882a593Smuzhiyun sk = nr_find_peer(circuit_index, circuit_id, src);
915*4882a593Smuzhiyun else
916*4882a593Smuzhiyun sk = nr_find_socket(circuit_index, circuit_id);
917*4882a593Smuzhiyun }
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun if (sk != NULL) {
920*4882a593Smuzhiyun bh_lock_sock(sk);
921*4882a593Smuzhiyun skb_reset_transport_header(skb);
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun if (frametype == NR_CONNACK && skb->len == 22)
924*4882a593Smuzhiyun nr_sk(sk)->bpqext = 1;
925*4882a593Smuzhiyun else
926*4882a593Smuzhiyun nr_sk(sk)->bpqext = 0;
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun ret = nr_process_rx_frame(sk, skb);
929*4882a593Smuzhiyun bh_unlock_sock(sk);
930*4882a593Smuzhiyun sock_put(sk);
931*4882a593Smuzhiyun return ret;
932*4882a593Smuzhiyun }
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun /*
935*4882a593Smuzhiyun * Now it should be a CONNREQ.
936*4882a593Smuzhiyun */
937*4882a593Smuzhiyun if (frametype != NR_CONNREQ) {
938*4882a593Smuzhiyun /*
939*4882a593Smuzhiyun * Here it would be nice to be able to send a reset but
940*4882a593Smuzhiyun * NET/ROM doesn't have one. We've tried to extend the protocol
941*4882a593Smuzhiyun * by sending NR_CONNACK | NR_CHOKE_FLAGS replies but that
942*4882a593Smuzhiyun * apparently kills BPQ boxes... :-(
943*4882a593Smuzhiyun * So now we try to follow the established behaviour of
944*4882a593Smuzhiyun * G8PZT's Xrouter which is sending packets with command type 7
945*4882a593Smuzhiyun * as an extension of the protocol.
946*4882a593Smuzhiyun */
947*4882a593Smuzhiyun if (sysctl_netrom_reset_circuit &&
948*4882a593Smuzhiyun (frametype != NR_RESET || flags != 0))
949*4882a593Smuzhiyun nr_transmit_reset(skb, 1);
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun return 0;
952*4882a593Smuzhiyun }
953*4882a593Smuzhiyun
954*4882a593Smuzhiyun sk = nr_find_listener(dest);
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun user = (ax25_address *)(skb->data + 21);
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun if (sk == NULL || sk_acceptq_is_full(sk) ||
959*4882a593Smuzhiyun (make = nr_make_new(sk)) == NULL) {
960*4882a593Smuzhiyun nr_transmit_refusal(skb, 0);
961*4882a593Smuzhiyun if (sk)
962*4882a593Smuzhiyun sock_put(sk);
963*4882a593Smuzhiyun return 0;
964*4882a593Smuzhiyun }
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun bh_lock_sock(sk);
967*4882a593Smuzhiyun
968*4882a593Smuzhiyun window = skb->data[20];
969*4882a593Smuzhiyun
970*4882a593Smuzhiyun sock_hold(make);
971*4882a593Smuzhiyun skb->sk = make;
972*4882a593Smuzhiyun skb->destructor = sock_efree;
973*4882a593Smuzhiyun make->sk_state = TCP_ESTABLISHED;
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun /* Fill in his circuit details */
976*4882a593Smuzhiyun nr_make = nr_sk(make);
977*4882a593Smuzhiyun nr_make->source_addr = *dest;
978*4882a593Smuzhiyun nr_make->dest_addr = *src;
979*4882a593Smuzhiyun nr_make->user_addr = *user;
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun nr_make->your_index = circuit_index;
982*4882a593Smuzhiyun nr_make->your_id = circuit_id;
983*4882a593Smuzhiyun
984*4882a593Smuzhiyun bh_unlock_sock(sk);
985*4882a593Smuzhiyun circuit = nr_find_next_circuit();
986*4882a593Smuzhiyun bh_lock_sock(sk);
987*4882a593Smuzhiyun
988*4882a593Smuzhiyun nr_make->my_index = circuit / 256;
989*4882a593Smuzhiyun nr_make->my_id = circuit % 256;
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun circuit++;
992*4882a593Smuzhiyun
993*4882a593Smuzhiyun /* Window negotiation */
994*4882a593Smuzhiyun if (window < nr_make->window)
995*4882a593Smuzhiyun nr_make->window = window;
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun /* L4 timeout negotiation */
998*4882a593Smuzhiyun if (skb->len == 37) {
999*4882a593Smuzhiyun timeout = skb->data[36] * 256 + skb->data[35];
1000*4882a593Smuzhiyun if (timeout * HZ < nr_make->t1)
1001*4882a593Smuzhiyun nr_make->t1 = timeout * HZ;
1002*4882a593Smuzhiyun nr_make->bpqext = 1;
1003*4882a593Smuzhiyun } else {
1004*4882a593Smuzhiyun nr_make->bpqext = 0;
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun nr_write_internal(make, NR_CONNACK);
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun nr_make->condition = 0x00;
1010*4882a593Smuzhiyun nr_make->vs = 0;
1011*4882a593Smuzhiyun nr_make->va = 0;
1012*4882a593Smuzhiyun nr_make->vr = 0;
1013*4882a593Smuzhiyun nr_make->vl = 0;
1014*4882a593Smuzhiyun nr_make->state = NR_STATE_3;
1015*4882a593Smuzhiyun sk_acceptq_added(sk);
1016*4882a593Smuzhiyun skb_queue_head(&sk->sk_receive_queue, skb);
1017*4882a593Smuzhiyun
1018*4882a593Smuzhiyun if (!sock_flag(sk, SOCK_DEAD))
1019*4882a593Smuzhiyun sk->sk_data_ready(sk);
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun bh_unlock_sock(sk);
1022*4882a593Smuzhiyun sock_put(sk);
1023*4882a593Smuzhiyun
1024*4882a593Smuzhiyun nr_insert_socket(make);
1025*4882a593Smuzhiyun
1026*4882a593Smuzhiyun nr_start_heartbeat(make);
1027*4882a593Smuzhiyun nr_start_idletimer(make);
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun return 1;
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun
nr_sendmsg(struct socket * sock,struct msghdr * msg,size_t len)1032*4882a593Smuzhiyun static int nr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
1033*4882a593Smuzhiyun {
1034*4882a593Smuzhiyun struct sock *sk = sock->sk;
1035*4882a593Smuzhiyun struct nr_sock *nr = nr_sk(sk);
1036*4882a593Smuzhiyun DECLARE_SOCKADDR(struct sockaddr_ax25 *, usax, msg->msg_name);
1037*4882a593Smuzhiyun int err;
1038*4882a593Smuzhiyun struct sockaddr_ax25 sax;
1039*4882a593Smuzhiyun struct sk_buff *skb;
1040*4882a593Smuzhiyun unsigned char *asmptr;
1041*4882a593Smuzhiyun int size;
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_EOR|MSG_CMSG_COMPAT))
1044*4882a593Smuzhiyun return -EINVAL;
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun lock_sock(sk);
1047*4882a593Smuzhiyun if (sock_flag(sk, SOCK_ZAPPED)) {
1048*4882a593Smuzhiyun err = -EADDRNOTAVAIL;
1049*4882a593Smuzhiyun goto out;
1050*4882a593Smuzhiyun }
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun if (sk->sk_shutdown & SEND_SHUTDOWN) {
1053*4882a593Smuzhiyun send_sig(SIGPIPE, current, 0);
1054*4882a593Smuzhiyun err = -EPIPE;
1055*4882a593Smuzhiyun goto out;
1056*4882a593Smuzhiyun }
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun if (nr->device == NULL) {
1059*4882a593Smuzhiyun err = -ENETUNREACH;
1060*4882a593Smuzhiyun goto out;
1061*4882a593Smuzhiyun }
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun if (usax) {
1064*4882a593Smuzhiyun if (msg->msg_namelen < sizeof(sax)) {
1065*4882a593Smuzhiyun err = -EINVAL;
1066*4882a593Smuzhiyun goto out;
1067*4882a593Smuzhiyun }
1068*4882a593Smuzhiyun sax = *usax;
1069*4882a593Smuzhiyun if (ax25cmp(&nr->dest_addr, &sax.sax25_call) != 0) {
1070*4882a593Smuzhiyun err = -EISCONN;
1071*4882a593Smuzhiyun goto out;
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun if (sax.sax25_family != AF_NETROM) {
1074*4882a593Smuzhiyun err = -EINVAL;
1075*4882a593Smuzhiyun goto out;
1076*4882a593Smuzhiyun }
1077*4882a593Smuzhiyun } else {
1078*4882a593Smuzhiyun if (sk->sk_state != TCP_ESTABLISHED) {
1079*4882a593Smuzhiyun err = -ENOTCONN;
1080*4882a593Smuzhiyun goto out;
1081*4882a593Smuzhiyun }
1082*4882a593Smuzhiyun sax.sax25_family = AF_NETROM;
1083*4882a593Smuzhiyun sax.sax25_call = nr->dest_addr;
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun
1086*4882a593Smuzhiyun /* Build a packet - the conventional user limit is 236 bytes. We can
1087*4882a593Smuzhiyun do ludicrously large NetROM frames but must not overflow */
1088*4882a593Smuzhiyun if (len > 65536) {
1089*4882a593Smuzhiyun err = -EMSGSIZE;
1090*4882a593Smuzhiyun goto out;
1091*4882a593Smuzhiyun }
1092*4882a593Smuzhiyun
1093*4882a593Smuzhiyun size = len + NR_NETWORK_LEN + NR_TRANSPORT_LEN;
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
1096*4882a593Smuzhiyun goto out;
1097*4882a593Smuzhiyun
1098*4882a593Smuzhiyun skb_reserve(skb, size - len);
1099*4882a593Smuzhiyun skb_reset_transport_header(skb);
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun /*
1102*4882a593Smuzhiyun * Push down the NET/ROM header
1103*4882a593Smuzhiyun */
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun asmptr = skb_push(skb, NR_TRANSPORT_LEN);
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun /* Build a NET/ROM Transport header */
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun *asmptr++ = nr->your_index;
1110*4882a593Smuzhiyun *asmptr++ = nr->your_id;
1111*4882a593Smuzhiyun *asmptr++ = 0; /* To be filled in later */
1112*4882a593Smuzhiyun *asmptr++ = 0; /* Ditto */
1113*4882a593Smuzhiyun *asmptr++ = NR_INFO;
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun /*
1116*4882a593Smuzhiyun * Put the data on the end
1117*4882a593Smuzhiyun */
1118*4882a593Smuzhiyun skb_put(skb, len);
1119*4882a593Smuzhiyun
1120*4882a593Smuzhiyun /* User data follows immediately after the NET/ROM transport header */
1121*4882a593Smuzhiyun if (memcpy_from_msg(skb_transport_header(skb), msg, len)) {
1122*4882a593Smuzhiyun kfree_skb(skb);
1123*4882a593Smuzhiyun err = -EFAULT;
1124*4882a593Smuzhiyun goto out;
1125*4882a593Smuzhiyun }
1126*4882a593Smuzhiyun
1127*4882a593Smuzhiyun if (sk->sk_state != TCP_ESTABLISHED) {
1128*4882a593Smuzhiyun kfree_skb(skb);
1129*4882a593Smuzhiyun err = -ENOTCONN;
1130*4882a593Smuzhiyun goto out;
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun nr_output(sk, skb); /* Shove it onto the queue */
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun err = len;
1136*4882a593Smuzhiyun out:
1137*4882a593Smuzhiyun release_sock(sk);
1138*4882a593Smuzhiyun return err;
1139*4882a593Smuzhiyun }
1140*4882a593Smuzhiyun
nr_recvmsg(struct socket * sock,struct msghdr * msg,size_t size,int flags)1141*4882a593Smuzhiyun static int nr_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1142*4882a593Smuzhiyun int flags)
1143*4882a593Smuzhiyun {
1144*4882a593Smuzhiyun struct sock *sk = sock->sk;
1145*4882a593Smuzhiyun DECLARE_SOCKADDR(struct sockaddr_ax25 *, sax, msg->msg_name);
1146*4882a593Smuzhiyun size_t copied;
1147*4882a593Smuzhiyun struct sk_buff *skb;
1148*4882a593Smuzhiyun int er;
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun /*
1151*4882a593Smuzhiyun * This works for seqpacket too. The receiver has ordered the queue for
1152*4882a593Smuzhiyun * us! We do one quick check first though
1153*4882a593Smuzhiyun */
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun lock_sock(sk);
1156*4882a593Smuzhiyun if (sk->sk_state != TCP_ESTABLISHED) {
1157*4882a593Smuzhiyun release_sock(sk);
1158*4882a593Smuzhiyun return -ENOTCONN;
1159*4882a593Smuzhiyun }
1160*4882a593Smuzhiyun
1161*4882a593Smuzhiyun /* Now we can treat all alike */
1162*4882a593Smuzhiyun if ((skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, flags & MSG_DONTWAIT, &er)) == NULL) {
1163*4882a593Smuzhiyun release_sock(sk);
1164*4882a593Smuzhiyun return er;
1165*4882a593Smuzhiyun }
1166*4882a593Smuzhiyun
1167*4882a593Smuzhiyun skb_reset_transport_header(skb);
1168*4882a593Smuzhiyun copied = skb->len;
1169*4882a593Smuzhiyun
1170*4882a593Smuzhiyun if (copied > size) {
1171*4882a593Smuzhiyun copied = size;
1172*4882a593Smuzhiyun msg->msg_flags |= MSG_TRUNC;
1173*4882a593Smuzhiyun }
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun er = skb_copy_datagram_msg(skb, 0, msg, copied);
1176*4882a593Smuzhiyun if (er < 0) {
1177*4882a593Smuzhiyun skb_free_datagram(sk, skb);
1178*4882a593Smuzhiyun release_sock(sk);
1179*4882a593Smuzhiyun return er;
1180*4882a593Smuzhiyun }
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun if (sax != NULL) {
1183*4882a593Smuzhiyun memset(sax, 0, sizeof(*sax));
1184*4882a593Smuzhiyun sax->sax25_family = AF_NETROM;
1185*4882a593Smuzhiyun skb_copy_from_linear_data_offset(skb, 7, sax->sax25_call.ax25_call,
1186*4882a593Smuzhiyun AX25_ADDR_LEN);
1187*4882a593Smuzhiyun msg->msg_namelen = sizeof(*sax);
1188*4882a593Smuzhiyun }
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun skb_free_datagram(sk, skb);
1191*4882a593Smuzhiyun
1192*4882a593Smuzhiyun release_sock(sk);
1193*4882a593Smuzhiyun return copied;
1194*4882a593Smuzhiyun }
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun
nr_ioctl(struct socket * sock,unsigned int cmd,unsigned long arg)1197*4882a593Smuzhiyun static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1198*4882a593Smuzhiyun {
1199*4882a593Smuzhiyun struct sock *sk = sock->sk;
1200*4882a593Smuzhiyun void __user *argp = (void __user *)arg;
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun switch (cmd) {
1203*4882a593Smuzhiyun case TIOCOUTQ: {
1204*4882a593Smuzhiyun long amount;
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun lock_sock(sk);
1207*4882a593Smuzhiyun amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1208*4882a593Smuzhiyun if (amount < 0)
1209*4882a593Smuzhiyun amount = 0;
1210*4882a593Smuzhiyun release_sock(sk);
1211*4882a593Smuzhiyun return put_user(amount, (int __user *)argp);
1212*4882a593Smuzhiyun }
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun case TIOCINQ: {
1215*4882a593Smuzhiyun struct sk_buff *skb;
1216*4882a593Smuzhiyun long amount = 0L;
1217*4882a593Smuzhiyun
1218*4882a593Smuzhiyun lock_sock(sk);
1219*4882a593Smuzhiyun /* These two are safe on a single CPU system as only user tasks fiddle here */
1220*4882a593Smuzhiyun if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1221*4882a593Smuzhiyun amount = skb->len;
1222*4882a593Smuzhiyun release_sock(sk);
1223*4882a593Smuzhiyun return put_user(amount, (int __user *)argp);
1224*4882a593Smuzhiyun }
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun case SIOCGIFADDR:
1227*4882a593Smuzhiyun case SIOCSIFADDR:
1228*4882a593Smuzhiyun case SIOCGIFDSTADDR:
1229*4882a593Smuzhiyun case SIOCSIFDSTADDR:
1230*4882a593Smuzhiyun case SIOCGIFBRDADDR:
1231*4882a593Smuzhiyun case SIOCSIFBRDADDR:
1232*4882a593Smuzhiyun case SIOCGIFNETMASK:
1233*4882a593Smuzhiyun case SIOCSIFNETMASK:
1234*4882a593Smuzhiyun case SIOCGIFMETRIC:
1235*4882a593Smuzhiyun case SIOCSIFMETRIC:
1236*4882a593Smuzhiyun return -EINVAL;
1237*4882a593Smuzhiyun
1238*4882a593Smuzhiyun case SIOCADDRT:
1239*4882a593Smuzhiyun case SIOCDELRT:
1240*4882a593Smuzhiyun case SIOCNRDECOBS:
1241*4882a593Smuzhiyun if (!capable(CAP_NET_ADMIN))
1242*4882a593Smuzhiyun return -EPERM;
1243*4882a593Smuzhiyun return nr_rt_ioctl(cmd, argp);
1244*4882a593Smuzhiyun
1245*4882a593Smuzhiyun default:
1246*4882a593Smuzhiyun return -ENOIOCTLCMD;
1247*4882a593Smuzhiyun }
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun return 0;
1250*4882a593Smuzhiyun }
1251*4882a593Smuzhiyun
1252*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
1253*4882a593Smuzhiyun
nr_info_start(struct seq_file * seq,loff_t * pos)1254*4882a593Smuzhiyun static void *nr_info_start(struct seq_file *seq, loff_t *pos)
1255*4882a593Smuzhiyun __acquires(&nr_list_lock)
1256*4882a593Smuzhiyun {
1257*4882a593Smuzhiyun spin_lock_bh(&nr_list_lock);
1258*4882a593Smuzhiyun return seq_hlist_start_head(&nr_list, *pos);
1259*4882a593Smuzhiyun }
1260*4882a593Smuzhiyun
nr_info_next(struct seq_file * seq,void * v,loff_t * pos)1261*4882a593Smuzhiyun static void *nr_info_next(struct seq_file *seq, void *v, loff_t *pos)
1262*4882a593Smuzhiyun {
1263*4882a593Smuzhiyun return seq_hlist_next(v, &nr_list, pos);
1264*4882a593Smuzhiyun }
1265*4882a593Smuzhiyun
nr_info_stop(struct seq_file * seq,void * v)1266*4882a593Smuzhiyun static void nr_info_stop(struct seq_file *seq, void *v)
1267*4882a593Smuzhiyun __releases(&nr_list_lock)
1268*4882a593Smuzhiyun {
1269*4882a593Smuzhiyun spin_unlock_bh(&nr_list_lock);
1270*4882a593Smuzhiyun }
1271*4882a593Smuzhiyun
nr_info_show(struct seq_file * seq,void * v)1272*4882a593Smuzhiyun static int nr_info_show(struct seq_file *seq, void *v)
1273*4882a593Smuzhiyun {
1274*4882a593Smuzhiyun struct sock *s = sk_entry(v);
1275*4882a593Smuzhiyun struct net_device *dev;
1276*4882a593Smuzhiyun struct nr_sock *nr;
1277*4882a593Smuzhiyun const char *devname;
1278*4882a593Smuzhiyun char buf[11];
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun if (v == SEQ_START_TOKEN)
1281*4882a593Smuzhiyun seq_puts(seq,
1282*4882a593Smuzhiyun "user_addr dest_node src_node dev my your st vs vr va t1 t2 t4 idle n2 wnd Snd-Q Rcv-Q inode\n");
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun else {
1285*4882a593Smuzhiyun
1286*4882a593Smuzhiyun bh_lock_sock(s);
1287*4882a593Smuzhiyun nr = nr_sk(s);
1288*4882a593Smuzhiyun
1289*4882a593Smuzhiyun if ((dev = nr->device) == NULL)
1290*4882a593Smuzhiyun devname = "???";
1291*4882a593Smuzhiyun else
1292*4882a593Smuzhiyun devname = dev->name;
1293*4882a593Smuzhiyun
1294*4882a593Smuzhiyun seq_printf(seq, "%-9s ", ax2asc(buf, &nr->user_addr));
1295*4882a593Smuzhiyun seq_printf(seq, "%-9s ", ax2asc(buf, &nr->dest_addr));
1296*4882a593Smuzhiyun seq_printf(seq,
1297*4882a593Smuzhiyun "%-9s %-3s %02X/%02X %02X/%02X %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3d %5d %5d %ld\n",
1298*4882a593Smuzhiyun ax2asc(buf, &nr->source_addr),
1299*4882a593Smuzhiyun devname,
1300*4882a593Smuzhiyun nr->my_index,
1301*4882a593Smuzhiyun nr->my_id,
1302*4882a593Smuzhiyun nr->your_index,
1303*4882a593Smuzhiyun nr->your_id,
1304*4882a593Smuzhiyun nr->state,
1305*4882a593Smuzhiyun nr->vs,
1306*4882a593Smuzhiyun nr->vr,
1307*4882a593Smuzhiyun nr->va,
1308*4882a593Smuzhiyun ax25_display_timer(&nr->t1timer) / HZ,
1309*4882a593Smuzhiyun nr->t1 / HZ,
1310*4882a593Smuzhiyun ax25_display_timer(&nr->t2timer) / HZ,
1311*4882a593Smuzhiyun nr->t2 / HZ,
1312*4882a593Smuzhiyun ax25_display_timer(&nr->t4timer) / HZ,
1313*4882a593Smuzhiyun nr->t4 / HZ,
1314*4882a593Smuzhiyun ax25_display_timer(&nr->idletimer) / (60 * HZ),
1315*4882a593Smuzhiyun nr->idle / (60 * HZ),
1316*4882a593Smuzhiyun nr->n2count,
1317*4882a593Smuzhiyun nr->n2,
1318*4882a593Smuzhiyun nr->window,
1319*4882a593Smuzhiyun sk_wmem_alloc_get(s),
1320*4882a593Smuzhiyun sk_rmem_alloc_get(s),
1321*4882a593Smuzhiyun s->sk_socket ? SOCK_INODE(s->sk_socket)->i_ino : 0L);
1322*4882a593Smuzhiyun
1323*4882a593Smuzhiyun bh_unlock_sock(s);
1324*4882a593Smuzhiyun }
1325*4882a593Smuzhiyun return 0;
1326*4882a593Smuzhiyun }
1327*4882a593Smuzhiyun
1328*4882a593Smuzhiyun static const struct seq_operations nr_info_seqops = {
1329*4882a593Smuzhiyun .start = nr_info_start,
1330*4882a593Smuzhiyun .next = nr_info_next,
1331*4882a593Smuzhiyun .stop = nr_info_stop,
1332*4882a593Smuzhiyun .show = nr_info_show,
1333*4882a593Smuzhiyun };
1334*4882a593Smuzhiyun #endif /* CONFIG_PROC_FS */
1335*4882a593Smuzhiyun
1336*4882a593Smuzhiyun static const struct net_proto_family nr_family_ops = {
1337*4882a593Smuzhiyun .family = PF_NETROM,
1338*4882a593Smuzhiyun .create = nr_create,
1339*4882a593Smuzhiyun .owner = THIS_MODULE,
1340*4882a593Smuzhiyun };
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun static const struct proto_ops nr_proto_ops = {
1343*4882a593Smuzhiyun .family = PF_NETROM,
1344*4882a593Smuzhiyun .owner = THIS_MODULE,
1345*4882a593Smuzhiyun .release = nr_release,
1346*4882a593Smuzhiyun .bind = nr_bind,
1347*4882a593Smuzhiyun .connect = nr_connect,
1348*4882a593Smuzhiyun .socketpair = sock_no_socketpair,
1349*4882a593Smuzhiyun .accept = nr_accept,
1350*4882a593Smuzhiyun .getname = nr_getname,
1351*4882a593Smuzhiyun .poll = datagram_poll,
1352*4882a593Smuzhiyun .ioctl = nr_ioctl,
1353*4882a593Smuzhiyun .gettstamp = sock_gettstamp,
1354*4882a593Smuzhiyun .listen = nr_listen,
1355*4882a593Smuzhiyun .shutdown = sock_no_shutdown,
1356*4882a593Smuzhiyun .setsockopt = nr_setsockopt,
1357*4882a593Smuzhiyun .getsockopt = nr_getsockopt,
1358*4882a593Smuzhiyun .sendmsg = nr_sendmsg,
1359*4882a593Smuzhiyun .recvmsg = nr_recvmsg,
1360*4882a593Smuzhiyun .mmap = sock_no_mmap,
1361*4882a593Smuzhiyun .sendpage = sock_no_sendpage,
1362*4882a593Smuzhiyun };
1363*4882a593Smuzhiyun
1364*4882a593Smuzhiyun static struct notifier_block nr_dev_notifier = {
1365*4882a593Smuzhiyun .notifier_call = nr_device_event,
1366*4882a593Smuzhiyun };
1367*4882a593Smuzhiyun
1368*4882a593Smuzhiyun static struct net_device **dev_nr;
1369*4882a593Smuzhiyun
1370*4882a593Smuzhiyun static struct ax25_protocol nr_pid = {
1371*4882a593Smuzhiyun .pid = AX25_P_NETROM,
1372*4882a593Smuzhiyun .func = nr_route_frame
1373*4882a593Smuzhiyun };
1374*4882a593Smuzhiyun
1375*4882a593Smuzhiyun static struct ax25_linkfail nr_linkfail_notifier = {
1376*4882a593Smuzhiyun .func = nr_link_failed,
1377*4882a593Smuzhiyun };
1378*4882a593Smuzhiyun
nr_proto_init(void)1379*4882a593Smuzhiyun static int __init nr_proto_init(void)
1380*4882a593Smuzhiyun {
1381*4882a593Smuzhiyun int i;
1382*4882a593Smuzhiyun int rc = proto_register(&nr_proto, 0);
1383*4882a593Smuzhiyun
1384*4882a593Smuzhiyun if (rc)
1385*4882a593Smuzhiyun return rc;
1386*4882a593Smuzhiyun
1387*4882a593Smuzhiyun if (nr_ndevs > 0x7fffffff/sizeof(struct net_device *)) {
1388*4882a593Smuzhiyun pr_err("NET/ROM: %s - nr_ndevs parameter too large\n",
1389*4882a593Smuzhiyun __func__);
1390*4882a593Smuzhiyun rc = -EINVAL;
1391*4882a593Smuzhiyun goto unregister_proto;
1392*4882a593Smuzhiyun }
1393*4882a593Smuzhiyun
1394*4882a593Smuzhiyun dev_nr = kcalloc(nr_ndevs, sizeof(struct net_device *), GFP_KERNEL);
1395*4882a593Smuzhiyun if (!dev_nr) {
1396*4882a593Smuzhiyun pr_err("NET/ROM: %s - unable to allocate device array\n",
1397*4882a593Smuzhiyun __func__);
1398*4882a593Smuzhiyun rc = -ENOMEM;
1399*4882a593Smuzhiyun goto unregister_proto;
1400*4882a593Smuzhiyun }
1401*4882a593Smuzhiyun
1402*4882a593Smuzhiyun for (i = 0; i < nr_ndevs; i++) {
1403*4882a593Smuzhiyun char name[IFNAMSIZ];
1404*4882a593Smuzhiyun struct net_device *dev;
1405*4882a593Smuzhiyun
1406*4882a593Smuzhiyun sprintf(name, "nr%d", i);
1407*4882a593Smuzhiyun dev = alloc_netdev(0, name, NET_NAME_UNKNOWN, nr_setup);
1408*4882a593Smuzhiyun if (!dev) {
1409*4882a593Smuzhiyun rc = -ENOMEM;
1410*4882a593Smuzhiyun goto fail;
1411*4882a593Smuzhiyun }
1412*4882a593Smuzhiyun
1413*4882a593Smuzhiyun dev->base_addr = i;
1414*4882a593Smuzhiyun rc = register_netdev(dev);
1415*4882a593Smuzhiyun if (rc) {
1416*4882a593Smuzhiyun free_netdev(dev);
1417*4882a593Smuzhiyun goto fail;
1418*4882a593Smuzhiyun }
1419*4882a593Smuzhiyun nr_set_lockdep_key(dev);
1420*4882a593Smuzhiyun dev_nr[i] = dev;
1421*4882a593Smuzhiyun }
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun rc = sock_register(&nr_family_ops);
1424*4882a593Smuzhiyun if (rc)
1425*4882a593Smuzhiyun goto fail;
1426*4882a593Smuzhiyun
1427*4882a593Smuzhiyun rc = register_netdevice_notifier(&nr_dev_notifier);
1428*4882a593Smuzhiyun if (rc)
1429*4882a593Smuzhiyun goto out_sock;
1430*4882a593Smuzhiyun
1431*4882a593Smuzhiyun ax25_register_pid(&nr_pid);
1432*4882a593Smuzhiyun ax25_linkfail_register(&nr_linkfail_notifier);
1433*4882a593Smuzhiyun
1434*4882a593Smuzhiyun #ifdef CONFIG_SYSCTL
1435*4882a593Smuzhiyun rc = nr_register_sysctl();
1436*4882a593Smuzhiyun if (rc)
1437*4882a593Smuzhiyun goto out_sysctl;
1438*4882a593Smuzhiyun #endif
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun nr_loopback_init();
1441*4882a593Smuzhiyun
1442*4882a593Smuzhiyun rc = -ENOMEM;
1443*4882a593Smuzhiyun if (!proc_create_seq("nr", 0444, init_net.proc_net, &nr_info_seqops))
1444*4882a593Smuzhiyun goto proc_remove1;
1445*4882a593Smuzhiyun if (!proc_create_seq("nr_neigh", 0444, init_net.proc_net,
1446*4882a593Smuzhiyun &nr_neigh_seqops))
1447*4882a593Smuzhiyun goto proc_remove2;
1448*4882a593Smuzhiyun if (!proc_create_seq("nr_nodes", 0444, init_net.proc_net,
1449*4882a593Smuzhiyun &nr_node_seqops))
1450*4882a593Smuzhiyun goto proc_remove3;
1451*4882a593Smuzhiyun
1452*4882a593Smuzhiyun return 0;
1453*4882a593Smuzhiyun
1454*4882a593Smuzhiyun proc_remove3:
1455*4882a593Smuzhiyun remove_proc_entry("nr_neigh", init_net.proc_net);
1456*4882a593Smuzhiyun proc_remove2:
1457*4882a593Smuzhiyun remove_proc_entry("nr", init_net.proc_net);
1458*4882a593Smuzhiyun proc_remove1:
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun nr_loopback_clear();
1461*4882a593Smuzhiyun nr_rt_free();
1462*4882a593Smuzhiyun
1463*4882a593Smuzhiyun #ifdef CONFIG_SYSCTL
1464*4882a593Smuzhiyun nr_unregister_sysctl();
1465*4882a593Smuzhiyun out_sysctl:
1466*4882a593Smuzhiyun #endif
1467*4882a593Smuzhiyun ax25_linkfail_release(&nr_linkfail_notifier);
1468*4882a593Smuzhiyun ax25_protocol_release(AX25_P_NETROM);
1469*4882a593Smuzhiyun unregister_netdevice_notifier(&nr_dev_notifier);
1470*4882a593Smuzhiyun out_sock:
1471*4882a593Smuzhiyun sock_unregister(PF_NETROM);
1472*4882a593Smuzhiyun fail:
1473*4882a593Smuzhiyun while (--i >= 0) {
1474*4882a593Smuzhiyun unregister_netdev(dev_nr[i]);
1475*4882a593Smuzhiyun free_netdev(dev_nr[i]);
1476*4882a593Smuzhiyun }
1477*4882a593Smuzhiyun kfree(dev_nr);
1478*4882a593Smuzhiyun unregister_proto:
1479*4882a593Smuzhiyun proto_unregister(&nr_proto);
1480*4882a593Smuzhiyun return rc;
1481*4882a593Smuzhiyun }
1482*4882a593Smuzhiyun
1483*4882a593Smuzhiyun module_init(nr_proto_init);
1484*4882a593Smuzhiyun
1485*4882a593Smuzhiyun module_param(nr_ndevs, int, 0);
1486*4882a593Smuzhiyun MODULE_PARM_DESC(nr_ndevs, "number of NET/ROM devices");
1487*4882a593Smuzhiyun
1488*4882a593Smuzhiyun MODULE_AUTHOR("Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>");
1489*4882a593Smuzhiyun MODULE_DESCRIPTION("The amateur radio NET/ROM network and transport layer protocol");
1490*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1491*4882a593Smuzhiyun MODULE_ALIAS_NETPROTO(PF_NETROM);
1492*4882a593Smuzhiyun
nr_exit(void)1493*4882a593Smuzhiyun static void __exit nr_exit(void)
1494*4882a593Smuzhiyun {
1495*4882a593Smuzhiyun int i;
1496*4882a593Smuzhiyun
1497*4882a593Smuzhiyun remove_proc_entry("nr", init_net.proc_net);
1498*4882a593Smuzhiyun remove_proc_entry("nr_neigh", init_net.proc_net);
1499*4882a593Smuzhiyun remove_proc_entry("nr_nodes", init_net.proc_net);
1500*4882a593Smuzhiyun nr_loopback_clear();
1501*4882a593Smuzhiyun
1502*4882a593Smuzhiyun nr_rt_free();
1503*4882a593Smuzhiyun
1504*4882a593Smuzhiyun #ifdef CONFIG_SYSCTL
1505*4882a593Smuzhiyun nr_unregister_sysctl();
1506*4882a593Smuzhiyun #endif
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun ax25_linkfail_release(&nr_linkfail_notifier);
1509*4882a593Smuzhiyun ax25_protocol_release(AX25_P_NETROM);
1510*4882a593Smuzhiyun
1511*4882a593Smuzhiyun unregister_netdevice_notifier(&nr_dev_notifier);
1512*4882a593Smuzhiyun
1513*4882a593Smuzhiyun sock_unregister(PF_NETROM);
1514*4882a593Smuzhiyun
1515*4882a593Smuzhiyun for (i = 0; i < nr_ndevs; i++) {
1516*4882a593Smuzhiyun struct net_device *dev = dev_nr[i];
1517*4882a593Smuzhiyun if (dev) {
1518*4882a593Smuzhiyun unregister_netdev(dev);
1519*4882a593Smuzhiyun free_netdev(dev);
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun }
1522*4882a593Smuzhiyun
1523*4882a593Smuzhiyun kfree(dev_nr);
1524*4882a593Smuzhiyun proto_unregister(&nr_proto);
1525*4882a593Smuzhiyun }
1526*4882a593Smuzhiyun module_exit(nr_exit);
1527