]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/econet/af_econet.c
sock: Introduce named constants for sk_reuse
[mirror_ubuntu-bionic-kernel.git] / net / econet / af_econet.c
CommitLineData
1da177e4
LT
1/*
2 * An implementation of the Acorn Econet and AUN protocols.
3 * Philip Blundell <philb@gnu.org>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version
8 * 2 of the License, or (at your option) any later version.
9 *
10 */
11
ee9c88f2
JP
12#define pr_fmt(fmt) fmt
13
1da177e4
LT
14#include <linux/module.h>
15
16#include <linux/types.h>
17#include <linux/kernel.h>
1da177e4
LT
18#include <linux/string.h>
19#include <linux/mm.h>
20#include <linux/socket.h>
21#include <linux/sockios.h>
22#include <linux/in.h>
23#include <linux/errno.h>
24#include <linux/interrupt.h>
25#include <linux/if_ether.h>
26#include <linux/netdevice.h>
27#include <linux/inetdevice.h>
28#include <linux/route.h>
29#include <linux/inet.h>
30#include <linux/etherdevice.h>
31#include <linux/if_arp.h>
32#include <linux/wireless.h>
33#include <linux/skbuff.h>
14c85021 34#include <linux/udp.h>
5a0e3ad6 35#include <linux/slab.h>
a27e13d3 36#include <linux/vmalloc.h>
1da177e4
LT
37#include <net/sock.h>
38#include <net/inet_common.h>
39#include <linux/stat.h>
40#include <linux/init.h>
41#include <linux/if_ec.h>
42#include <net/udp.h>
43#include <net/ip.h>
44#include <linux/spinlock.h>
45#include <linux/rcupdate.h>
46#include <linux/bitops.h>
1d181831 47#include <linux/mutex.h>
1da177e4 48
ee9c88f2 49#include <linux/uaccess.h>
1da177e4 50
90ddc4f0 51static const struct proto_ops econet_ops;
1da177e4 52static struct hlist_head econet_sklist;
0c78a92f 53static DEFINE_SPINLOCK(econet_lock);
1d181831 54static DEFINE_MUTEX(econet_mutex);
1da177e4
LT
55
56/* Since there are only 256 possible network numbers (or fewer, depends
57 how you count) it makes sense to use a simple lookup table. */
58static struct net_device *net2dev_map[256];
59
60#define EC_PORT_IP 0xd2
61
62#ifdef CONFIG_ECONET_AUNUDP
ca403302 63static DEFINE_SPINLOCK(aun_queue_lock);
1da177e4
LT
64static struct socket *udpsock;
65#define AUN_PORT 0x8000
66
ee9c88f2 67struct aunhdr {
1da177e4
LT
68 unsigned char code; /* AUN magic protocol byte */
69 unsigned char port;
70 unsigned char cb;
71 unsigned char pad;
72 unsigned long handle;
73};
74
75static unsigned long aun_seq;
76
77/* Queue of packets waiting to be transmitted. */
78static struct sk_buff_head aun_queue;
79static struct timer_list ab_cleanup_timer;
80
81#endif /* CONFIG_ECONET_AUNUDP */
82
83/* Per-packet information */
ee9c88f2 84struct ec_cb {
1da177e4
LT
85 struct sockaddr_ec sec;
86 unsigned long cookie; /* Supplied by user. */
87#ifdef CONFIG_ECONET_AUNUDP
88 int done;
89 unsigned long seq; /* Sequencing */
90 unsigned long timeout; /* Timeout */
91 unsigned long start; /* jiffies */
92#endif
93#ifdef CONFIG_ECONET_NATIVE
94 void (*sent)(struct sk_buff *, int result);
95#endif
96};
97
98static void econet_remove_socket(struct hlist_head *list, struct sock *sk)
99{
0c78a92f 100 spin_lock_bh(&econet_lock);
1da177e4 101 sk_del_node_init(sk);
0c78a92f 102 spin_unlock_bh(&econet_lock);
1da177e4
LT
103}
104
105static void econet_insert_socket(struct hlist_head *list, struct sock *sk)
106{
0c78a92f 107 spin_lock_bh(&econet_lock);
1da177e4 108 sk_add_node(sk, list);
0c78a92f 109 spin_unlock_bh(&econet_lock);
1da177e4
LT
110}
111
112/*
113 * Pull a packet from our receive queue and hand it to the user.
114 * If necessary we block.
115 */
116
117static int econet_recvmsg(struct kiocb *iocb, struct socket *sock,
118 struct msghdr *msg, size_t len, int flags)
119{
120 struct sock *sk = sock->sk;
121 struct sk_buff *skb;
122 size_t copied;
123 int err;
124
125 msg->msg_namelen = sizeof(struct sockaddr_ec);
126
1d181831
DM
127 mutex_lock(&econet_mutex);
128
1da177e4
LT
129 /*
130 * Call the generic datagram receiver. This handles all sorts
131 * of horrible races and re-entrancy so we can forget about it
132 * in the protocol layers.
133 *
134 * Now it will return ENETDOWN, if device have just gone down,
135 * but then it will block.
136 */
137
ee9c88f2 138 skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err);
1da177e4
LT
139
140 /*
c9b6aab9 141 * An error occurred so return it. Because skb_recv_datagram()
1da177e4
LT
142 * handles the blocking we don't see and worry about blocking
143 * retries.
144 */
145
ee9c88f2 146 if (skb == NULL)
1da177e4
LT
147 goto out;
148
149 /*
150 * You lose any data beyond the buffer you gave. If it worries a
151 * user program they can ask the device for its MTU anyway.
152 */
153
154 copied = skb->len;
ee9c88f2
JP
155 if (copied > len) {
156 copied = len;
157 msg->msg_flags |= MSG_TRUNC;
1da177e4
LT
158 }
159
160 /* We can't use skb_copy_datagram here */
161 err = memcpy_toiovec(msg->msg_iov, skb->data, copied);
162 if (err)
163 goto out_free;
b7aa0bf7 164 sk->sk_stamp = skb->tstamp;
1da177e4
LT
165
166 if (msg->msg_name)
167 memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
168
169 /*
170 * Free or return the buffer as appropriate. Again this
171 * hides all the races and re-entrancy issues from us.
172 */
173 err = copied;
174
175out_free:
176 skb_free_datagram(sk, skb);
177out:
1d181831 178 mutex_unlock(&econet_mutex);
1da177e4
LT
179 return err;
180}
181
182/*
183 * Bind an Econet socket.
184 */
185
ee9c88f2
JP
186static int econet_bind(struct socket *sock, struct sockaddr *uaddr,
187 int addr_len)
1da177e4
LT
188{
189 struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr;
1d181831
DM
190 struct sock *sk;
191 struct econet_sock *eo;
c9b6aab9 192
1da177e4
LT
193 /*
194 * Check legality
195 */
c9b6aab9 196
1da177e4
LT
197 if (addr_len < sizeof(struct sockaddr_ec) ||
198 sec->sec_family != AF_ECONET)
199 return -EINVAL;
c9b6aab9 200
1d181831
DM
201 mutex_lock(&econet_mutex);
202
203 sk = sock->sk;
204 eo = ec_sk(sk);
205
1da177e4
LT
206 eo->cb = sec->cb;
207 eo->port = sec->port;
208 eo->station = sec->addr.station;
209 eo->net = sec->addr.net;
210
1d181831
DM
211 mutex_unlock(&econet_mutex);
212
1da177e4
LT
213 return 0;
214}
215
216#if defined(CONFIG_ECONET_AUNUDP) || defined(CONFIG_ECONET_NATIVE)
217/*
218 * Queue a transmit result for the user to be told about.
219 */
220
221static void tx_result(struct sock *sk, unsigned long cookie, int result)
222{
223 struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC);
224 struct ec_cb *eb;
225 struct sockaddr_ec *sec;
226
ee9c88f2
JP
227 if (skb == NULL) {
228 pr_debug("econet: memory squeeze, transmit result dropped\n");
1da177e4
LT
229 return;
230 }
231
232 eb = (struct ec_cb *)&skb->cb;
233 sec = (struct sockaddr_ec *)&eb->sec;
234 memset(sec, 0, sizeof(struct sockaddr_ec));
235 sec->cookie = cookie;
236 sec->type = ECTYPE_TRANSMIT_STATUS | result;
237 sec->sec_family = AF_ECONET;
238
239 if (sock_queue_rcv_skb(sk, skb) < 0)
240 kfree_skb(skb);
241}
242#endif
243
244#ifdef CONFIG_ECONET_NATIVE
245/*
246 * Called by the Econet hardware driver when a packet transmit
247 * has completed. Tell the user.
248 */
249
250static void ec_tx_done(struct sk_buff *skb, int result)
251{
252 struct ec_cb *eb = (struct ec_cb *)&skb->cb;
253 tx_result(skb->sk, eb->cookie, result);
254}
255#endif
256
257/*
258 * Send a packet. We have to work out which device it's going out on
259 * and hence whether to use real Econet or the UDP emulation.
260 */
261
262static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
263 struct msghdr *msg, size_t len)
264{
ee9c88f2 265 struct sockaddr_ec *saddr = (struct sockaddr_ec *)msg->msg_name;
1da177e4
LT
266 struct net_device *dev;
267 struct ec_addr addr;
268 int err;
269 unsigned char port, cb;
270#if defined(CONFIG_ECONET_AUNUDP) || defined(CONFIG_ECONET_NATIVE)
389f2a18 271 struct sock *sk = sock->sk;
1da177e4
LT
272 struct sk_buff *skb;
273 struct ec_cb *eb;
274#endif
275#ifdef CONFIG_ECONET_AUNUDP
276 struct msghdr udpmsg;
a27e13d3 277 struct iovec iov[2];
1da177e4
LT
278 struct aunhdr ah;
279 struct sockaddr_in udpdest;
280 __kernel_size_t size;
1da177e4 281 mm_segment_t oldfs;
a27e13d3 282 char *userbuf;
1da177e4 283#endif
c9b6aab9 284
1da177e4 285 /*
c9b6aab9 286 * Check the flags.
1da177e4
LT
287 */
288
c9b6aab9 289 if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
1da177e4
LT
290 return -EINVAL;
291
292 /*
c9b6aab9 293 * Get and verify the address.
1da177e4 294 */
c9b6aab9 295
1d181831
DM
296 mutex_lock(&econet_mutex);
297
ee9c88f2
JP
298 if (saddr == NULL || msg->msg_namelen < sizeof(struct sockaddr_ec)) {
299 mutex_unlock(&econet_mutex);
300 return -EINVAL;
301 }
302 addr.station = saddr->addr.station;
303 addr.net = saddr->addr.net;
304 port = saddr->port;
305 cb = saddr->cb;
1da177e4
LT
306
307 /* Look for a device with the right network number. */
308 dev = net2dev_map[addr.net];
309
310 /* If not directly reachable, use some default */
1d181831 311 if (dev == NULL) {
1da177e4
LT
312 dev = net2dev_map[0];
313 /* No interfaces at all? */
1d181831
DM
314 if (dev == NULL) {
315 mutex_unlock(&econet_mutex);
1da177e4 316 return -ENETDOWN;
1d181831 317 }
1da177e4
LT
318 }
319
1d181831 320 if (dev->type == ARPHRD_ECONET) {
1da177e4
LT
321 /* Real hardware Econet. We're not worthy etc. */
322#ifdef CONFIG_ECONET_NATIVE
323 unsigned short proto = 0;
ae641949 324 int hlen, tlen;
0c4e8581 325 int res;
1da177e4 326
a27e13d3
PB
327 if (len + 15 > dev->mtu) {
328 mutex_unlock(&econet_mutex);
329 return -EMSGSIZE;
330 }
331
1da177e4 332 dev_hold(dev);
c9b6aab9 333
ae641949
HX
334 hlen = LL_RESERVED_SPACE(dev);
335 tlen = dev->needed_tailroom;
336 skb = sock_alloc_send_skb(sk, len + hlen + tlen,
1da177e4 337 msg->msg_flags & MSG_DONTWAIT, &err);
ee9c88f2 338 if (skb == NULL)
1da177e4 339 goto out_unlock;
c9b6aab9 340
ae641949 341 skb_reserve(skb, hlen);
c1d2bbe1 342 skb_reset_network_header(skb);
c9b6aab9 343
1da177e4 344 eb = (struct ec_cb *)&skb->cb;
c9b6aab9 345
1da177e4
LT
346 eb->cookie = saddr->cookie;
347 eb->sec = *saddr;
348 eb->sent = ec_tx_done;
349
0c4e8581
SH
350 err = -EINVAL;
351 res = dev_hard_header(skb, dev, ntohs(proto), &addr, NULL, len);
352 if (res < 0)
353 goto out_free;
354 if (res > 0) {
1da177e4 355 struct ec_framehdr *fh;
1da177e4
LT
356 /* Poke in our control byte and
357 port number. Hack, hack. */
ee9c88f2 358 fh = (struct ec_framehdr *)skb->data;
1da177e4
LT
359 fh->cb = cb;
360 fh->port = port;
361 if (sock->type != SOCK_DGRAM) {
27a884dc 362 skb_reset_tail_pointer(skb);
1da177e4 363 skb->len = 0;
0c4e8581 364 }
1da177e4 365 }
c9b6aab9 366
1da177e4 367 /* Copy the data. Returns -EFAULT on error */
ee9c88f2 368 err = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
1da177e4
LT
369 skb->protocol = proto;
370 skb->dev = dev;
371 skb->priority = sk->sk_priority;
372 if (err)
373 goto out_free;
c9b6aab9 374
1da177e4
LT
375 err = -ENETDOWN;
376 if (!(dev->flags & IFF_UP))
377 goto out_free;
c9b6aab9 378
1da177e4
LT
379 /*
380 * Now send it
381 */
c9b6aab9 382
1da177e4
LT
383 dev_queue_xmit(skb);
384 dev_put(dev);
1d181831 385 mutex_unlock(&econet_mutex);
a02cec21 386 return len;
1da177e4 387
ee9c88f2 388out_free:
1da177e4 389 kfree_skb(skb);
ee9c88f2 390out_unlock:
1da177e4
LT
391 if (dev)
392 dev_put(dev);
393#else
394 err = -EPROTOTYPE;
395#endif
1d181831
DM
396 mutex_unlock(&econet_mutex);
397
1da177e4
LT
398 return err;
399 }
400
401#ifdef CONFIG_ECONET_AUNUDP
402 /* AUN virtual Econet. */
403
1d181831
DM
404 if (udpsock == NULL) {
405 mutex_unlock(&econet_mutex);
1da177e4 406 return -ENETDOWN; /* No socket - can't send */
1d181831 407 }
c9b6aab9 408
a27e13d3
PB
409 if (len > 32768) {
410 err = -E2BIG;
411 goto error;
412 }
413
1da177e4
LT
414 /* Make up a UDP datagram and hand it off to some higher intellect. */
415
416 memset(&udpdest, 0, sizeof(udpdest));
417 udpdest.sin_family = AF_INET;
418 udpdest.sin_port = htons(AUN_PORT);
419
420 /* At the moment we use the stupid Acorn scheme of Econet address
421 y.x maps to IP a.b.c.x. This should be replaced with something
422 more flexible and more aware of subnet masks. */
423 {
424 struct in_device *idev;
425 unsigned long network = 0;
426
427 rcu_read_lock();
e5ed6399 428 idev = __in_dev_get_rcu(dev);
1da177e4
LT
429 if (idev) {
430 if (idev->ifa_list)
c9b6aab9 431 network = ntohl(idev->ifa_list->ifa_address) &
1da177e4
LT
432 0xffffff00; /* !!! */
433 }
434 rcu_read_unlock();
435 udpdest.sin_addr.s_addr = htonl(network | addr.station);
436 }
437
67c5c6cb 438 memset(&ah, 0, sizeof(ah));
1da177e4
LT
439 ah.port = port;
440 ah.cb = cb & 0x7f;
441 ah.code = 2; /* magic */
1da177e4
LT
442
443 /* tack our header on the front of the iovec */
444 size = sizeof(struct aunhdr);
1da177e4
LT
445 iov[0].iov_base = (void *)&ah;
446 iov[0].iov_len = size;
a27e13d3
PB
447
448 userbuf = vmalloc(len);
449 if (userbuf == NULL) {
450 err = -ENOMEM;
451 goto error;
1da177e4
LT
452 }
453
a27e13d3
PB
454 iov[1].iov_base = userbuf;
455 iov[1].iov_len = len;
456 err = memcpy_fromiovec(userbuf, msg->msg_iov, len);
457 if (err)
458 goto error_free_buf;
459
1da177e4 460 /* Get a skbuff (no data, just holds our cb information) */
ee9c88f2
JP
461 skb = sock_alloc_send_skb(sk, 0, msg->msg_flags & MSG_DONTWAIT, &err);
462 if (skb == NULL)
a27e13d3 463 goto error_free_buf;
1da177e4
LT
464
465 eb = (struct ec_cb *)&skb->cb;
466
467 eb->cookie = saddr->cookie;
ee9c88f2 468 eb->timeout = 5 * HZ;
1da177e4
LT
469 eb->start = jiffies;
470 ah.handle = aun_seq;
471 eb->seq = (aun_seq++);
472 eb->sec = *saddr;
473
474 skb_queue_tail(&aun_queue, skb);
475
476 udpmsg.msg_name = (void *)&udpdest;
477 udpmsg.msg_namelen = sizeof(udpdest);
478 udpmsg.msg_iov = &iov[0];
a27e13d3 479 udpmsg.msg_iovlen = 2;
1da177e4
LT
480 udpmsg.msg_control = NULL;
481 udpmsg.msg_controllen = 0;
ee9c88f2 482 udpmsg.msg_flags = 0;
1da177e4 483
ee9c88f2
JP
484 oldfs = get_fs();
485 set_fs(KERNEL_DS); /* More privs :-) */
1da177e4
LT
486 err = sock_sendmsg(udpsock, &udpmsg, size);
487 set_fs(oldfs);
a27e13d3
PB
488
489error_free_buf:
490 vfree(userbuf);
389f2a18 491error:
1da177e4
LT
492#else
493 err = -EPROTOTYPE;
494#endif
1d181831
DM
495 mutex_unlock(&econet_mutex);
496
1da177e4
LT
497 return err;
498}
499
500/*
501 * Look up the address of a socket.
502 */
503
504static int econet_getname(struct socket *sock, struct sockaddr *uaddr,
505 int *uaddr_len, int peer)
506{
1d181831
DM
507 struct sock *sk;
508 struct econet_sock *eo;
1da177e4
LT
509 struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr;
510
511 if (peer)
512 return -EOPNOTSUPP;
513
80922bbb 514 memset(sec, 0, sizeof(*sec));
1d181831
DM
515 mutex_lock(&econet_mutex);
516
517 sk = sock->sk;
518 eo = ec_sk(sk);
519
1da177e4
LT
520 sec->sec_family = AF_ECONET;
521 sec->port = eo->port;
522 sec->addr.station = eo->station;
523 sec->addr.net = eo->net;
524
1d181831
DM
525 mutex_unlock(&econet_mutex);
526
1da177e4
LT
527 *uaddr_len = sizeof(*sec);
528 return 0;
529}
530
531static void econet_destroy_timer(unsigned long data)
532{
ee9c88f2 533 struct sock *sk = (struct sock *)data;
1da177e4 534
c564039f 535 if (!sk_has_allocations(sk)) {
1da177e4
LT
536 sk_free(sk);
537 return;
538 }
539
540 sk->sk_timer.expires = jiffies + 10 * HZ;
541 add_timer(&sk->sk_timer);
ee9c88f2 542 pr_debug("econet: socket destroy delayed\n");
1da177e4
LT
543}
544
545/*
546 * Close an econet socket.
547 */
548
549static int econet_release(struct socket *sock)
550{
1d181831 551 struct sock *sk;
1da177e4 552
1d181831
DM
553 mutex_lock(&econet_mutex);
554
555 sk = sock->sk;
1da177e4 556 if (!sk)
1d181831 557 goto out_unlock;
1da177e4
LT
558
559 econet_remove_socket(&econet_sklist, sk);
560
561 /*
562 * Now the socket is dead. No more input will appear.
563 */
564
565 sk->sk_state_change(sk); /* It is useless. Just for sanity. */
566
0efffaf9 567 sock_orphan(sk);
1da177e4
LT
568
569 /* Purge queues */
570
571 skb_queue_purge(&sk->sk_receive_queue);
572
c564039f 573 if (sk_has_allocations(sk)) {
1da177e4
LT
574 sk->sk_timer.data = (unsigned long)sk;
575 sk->sk_timer.expires = jiffies + HZ;
576 sk->sk_timer.function = econet_destroy_timer;
577 add_timer(&sk->sk_timer);
1d181831
DM
578
579 goto out_unlock;
1da177e4
LT
580 }
581
582 sk_free(sk);
1d181831
DM
583
584out_unlock:
585 mutex_unlock(&econet_mutex);
1da177e4
LT
586 return 0;
587}
588
589static struct proto econet_proto = {
590 .name = "ECONET",
591 .owner = THIS_MODULE,
592 .obj_size = sizeof(struct econet_sock),
593};
594
595/*
596 * Create an Econet socket
597 */
598
3f378b68
EP
599static int econet_create(struct net *net, struct socket *sock, int protocol,
600 int kern)
1da177e4
LT
601{
602 struct sock *sk;
603 struct econet_sock *eo;
604 int err;
605
09ad9bc7 606 if (!net_eq(net, &init_net))
1b8d7ae4
EB
607 return -EAFNOSUPPORT;
608
1da177e4
LT
609 /* Econet only provides datagram services. */
610 if (sock->type != SOCK_DGRAM)
611 return -ESOCKTNOSUPPORT;
612
613 sock->state = SS_UNCONNECTED;
614
615 err = -ENOBUFS;
6257ff21 616 sk = sk_alloc(net, PF_ECONET, GFP_KERNEL, &econet_proto);
1da177e4
LT
617 if (sk == NULL)
618 goto out;
619
4a17fd52 620 sk->sk_reuse = SK_CAN_REUSE;
1da177e4
LT
621 sock->ops = &econet_ops;
622 sock_init_data(sock, sk);
623
624 eo = ec_sk(sk);
625 sock_reset_flag(sk, SOCK_ZAPPED);
626 sk->sk_family = PF_ECONET;
627 eo->num = protocol;
628
629 econet_insert_socket(&econet_sklist, sk);
a02cec21 630 return 0;
1da177e4
LT
631out:
632 return err;
633}
634
635/*
636 * Handle Econet specific ioctls
637 */
638
639static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
640{
641 struct ifreq ifr;
642 struct ec_device *edev;
643 struct net_device *dev;
644 struct sockaddr_ec *sec;
1d181831 645 int err;
1da177e4
LT
646
647 /*
648 * Fetch the caller's info block into kernel space
649 */
650
651 if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
652 return -EFAULT;
653
ee9c88f2
JP
654 dev = dev_get_by_name(&init_net, ifr.ifr_name);
655 if (dev == NULL)
1da177e4
LT
656 return -ENODEV;
657
658 sec = (struct sockaddr_ec *)&ifr.ifr_addr;
659
1d181831
DM
660 mutex_lock(&econet_mutex);
661
662 err = 0;
663 switch (cmd) {
1da177e4 664 case SIOCSIFADDR:
0c62fc6d
NE
665 if (!capable(CAP_NET_ADMIN)) {
666 err = -EPERM;
667 break;
668 }
16c41745 669
1da177e4 670 edev = dev->ec_ptr;
1d181831 671 if (edev == NULL) {
1da177e4 672 /* Magic up a new one. */
0da974f4 673 edev = kzalloc(sizeof(struct ec_device), GFP_KERNEL);
1da177e4 674 if (edev == NULL) {
1d181831
DM
675 err = -ENOMEM;
676 break;
1da177e4 677 }
1da177e4 678 dev->ec_ptr = edev;
1d181831 679 } else
1da177e4
LT
680 net2dev_map[edev->net] = NULL;
681 edev->station = sec->addr.station;
682 edev->net = sec->addr.net;
683 net2dev_map[sec->addr.net] = dev;
684 if (!net2dev_map[0])
685 net2dev_map[0] = dev;
1d181831 686 break;
1da177e4
LT
687
688 case SIOCGIFADDR:
689 edev = dev->ec_ptr;
1d181831
DM
690 if (edev == NULL) {
691 err = -ENODEV;
692 break;
1da177e4
LT
693 }
694 memset(sec, 0, sizeof(struct sockaddr_ec));
695 sec->addr.station = edev->station;
696 sec->addr.net = edev->net;
697 sec->sec_family = AF_ECONET;
698 dev_put(dev);
699 if (copy_to_user(arg, &ifr, sizeof(struct ifreq)))
1d181831
DM
700 err = -EFAULT;
701 break;
702
703 default:
704 err = -EINVAL;
705 break;
1da177e4
LT
706 }
707
1d181831
DM
708 mutex_unlock(&econet_mutex);
709
1da177e4 710 dev_put(dev);
1d181831
DM
711
712 return err;
1da177e4
LT
713}
714
715/*
716 * Handle generic ioctls
717 */
718
ee9c88f2
JP
719static int econet_ioctl(struct socket *sock, unsigned int cmd,
720 unsigned long arg)
1da177e4
LT
721{
722 struct sock *sk = sock->sk;
723 void __user *argp = (void __user *)arg;
724
075e1913
JP
725 switch (cmd) {
726 case SIOCGSTAMP:
727 return sock_get_timestamp(sk, argp);
1da177e4 728
075e1913
JP
729 case SIOCGSTAMPNS:
730 return sock_get_timestampns(sk, argp);
ae40eb1e 731
075e1913
JP
732 case SIOCSIFADDR:
733 case SIOCGIFADDR:
734 return ec_dev_ioctl(sock, cmd, argp);
1da177e4 735
1da177e4 736 }
075e1913
JP
737
738 return -ENOIOCTLCMD;
1da177e4
LT
739}
740
ec1b4cf7 741static const struct net_proto_family econet_family_ops = {
1da177e4
LT
742 .family = PF_ECONET,
743 .create = econet_create,
744 .owner = THIS_MODULE,
745};
746
1d181831 747static const struct proto_ops econet_ops = {
1da177e4
LT
748 .family = PF_ECONET,
749 .owner = THIS_MODULE,
750 .release = econet_release,
751 .bind = econet_bind,
752 .connect = sock_no_connect,
753 .socketpair = sock_no_socketpair,
754 .accept = sock_no_accept,
c9b6aab9 755 .getname = econet_getname,
1da177e4
LT
756 .poll = datagram_poll,
757 .ioctl = econet_ioctl,
758 .listen = sock_no_listen,
759 .shutdown = sock_no_shutdown,
760 .setsockopt = sock_no_setsockopt,
761 .getsockopt = sock_no_getsockopt,
762 .sendmsg = econet_sendmsg,
763 .recvmsg = econet_recvmsg,
764 .mmap = sock_no_mmap,
765 .sendpage = sock_no_sendpage,
766};
767
1da177e4
LT
768#if defined(CONFIG_ECONET_AUNUDP) || defined(CONFIG_ECONET_NATIVE)
769/*
770 * Find the listening socket, if any, for the given data.
771 */
772
773static struct sock *ec_listening_socket(unsigned char port, unsigned char
774 station, unsigned char net)
775{
776 struct sock *sk;
777 struct hlist_node *node;
778
0c78a92f 779 spin_lock(&econet_lock);
1da177e4
LT
780 sk_for_each(sk, node, &econet_sklist) {
781 struct econet_sock *opt = ec_sk(sk);
c9b6aab9 782 if ((opt->port == port || opt->port == 0) &&
1da177e4 783 (opt->station == station || opt->station == 0) &&
0c78a92f
ED
784 (opt->net == net || opt->net == 0)) {
785 sock_hold(sk);
1da177e4 786 goto found;
0c78a92f 787 }
1da177e4
LT
788 }
789 sk = NULL;
790found:
0c78a92f 791 spin_unlock(&econet_lock);
1da177e4
LT
792 return sk;
793}
794
795/*
796 * Queue a received packet for a socket.
797 */
798
799static int ec_queue_packet(struct sock *sk, struct sk_buff *skb,
800 unsigned char stn, unsigned char net,
801 unsigned char cb, unsigned char port)
802{
803 struct ec_cb *eb = (struct ec_cb *)&skb->cb;
804 struct sockaddr_ec *sec = (struct sockaddr_ec *)&eb->sec;
805
806 memset(sec, 0, sizeof(struct sockaddr_ec));
807 sec->sec_family = AF_ECONET;
808 sec->type = ECTYPE_PACKET_RECEIVED;
809 sec->port = port;
810 sec->cb = cb;
811 sec->addr.net = net;
812 sec->addr.station = stn;
813
814 return sock_queue_rcv_skb(sk, skb);
815}
816#endif
817
818#ifdef CONFIG_ECONET_AUNUDP
819/*
c9b6aab9 820 * Send an AUN protocol response.
1da177e4
LT
821 */
822
823static void aun_send_response(__u32 addr, unsigned long seq, int code, int cb)
824{
825 struct sockaddr_in sin = {
826 .sin_family = AF_INET,
827 .sin_port = htons(AUN_PORT),
828 .sin_addr = {.s_addr = addr}
829 };
830 struct aunhdr ah = {.code = code, .cb = cb, .handle = seq};
831 struct kvec iov = {.iov_base = (void *)&ah, .iov_len = sizeof(ah)};
832 struct msghdr udpmsg;
c9b6aab9 833
1da177e4
LT
834 udpmsg.msg_name = (void *)&sin;
835 udpmsg.msg_namelen = sizeof(sin);
836 udpmsg.msg_control = NULL;
837 udpmsg.msg_controllen = 0;
ee9c88f2 838 udpmsg.msg_flags = 0;
1da177e4
LT
839
840 kernel_sendmsg(udpsock, &udpmsg, &iov, 1, sizeof(ah));
841}
842
843
844/*
845 * Handle incoming AUN packets. Work out if anybody wants them,
846 * and send positive or negative acknowledgements as appropriate.
847 */
848
849static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
850{
eddc9ec5 851 struct iphdr *ip = ip_hdr(skb);
1da177e4 852 unsigned char stn = ntohl(ip->saddr) & 0xff;
4e085e76
DM
853 struct dst_entry *dst = skb_dst(skb);
854 struct ec_device *edev = NULL;
0c78a92f 855 struct sock *sk = NULL;
1da177e4 856 struct sk_buff *newskb;
4e085e76
DM
857
858 if (dst)
859 edev = dst->dev->ec_ptr;
1da177e4 860
ee9c88f2 861 if (!edev)
1da177e4
LT
862 goto bad;
863
ee9c88f2
JP
864 sk = ec_listening_socket(ah->port, stn, edev->net);
865 if (sk == NULL)
1da177e4
LT
866 goto bad; /* Nobody wants it */
867
c9b6aab9 868 newskb = alloc_skb((len - sizeof(struct aunhdr) + 15) & ~15,
1da177e4 869 GFP_ATOMIC);
ee9c88f2
JP
870 if (newskb == NULL) {
871 pr_debug("AUN: memory squeeze, dropping packet\n");
1da177e4
LT
872 /* Send nack and hope sender tries again */
873 goto bad;
874 }
875
ee9c88f2 876 memcpy(skb_put(newskb, len - sizeof(struct aunhdr)), (void *)(ah + 1),
1da177e4
LT
877 len - sizeof(struct aunhdr));
878
ee9c88f2 879 if (ec_queue_packet(sk, newskb, stn, edev->net, ah->cb, ah->port)) {
1da177e4
LT
880 /* Socket is bankrupt. */
881 kfree_skb(newskb);
882 goto bad;
883 }
884
885 aun_send_response(ip->saddr, ah->handle, 3, 0);
0c78a92f 886 sock_put(sk);
1da177e4
LT
887 return;
888
889bad:
890 aun_send_response(ip->saddr, ah->handle, 4, 0);
0c78a92f
ED
891 if (sk)
892 sock_put(sk);
1da177e4
LT
893}
894
895/*
896 * Handle incoming AUN transmit acknowledgements. If the sequence
897 * number matches something in our backlog then kill it and tell
898 * the user. If the remote took too long to reply then we may have
899 * dropped the packet already.
900 */
901
902static void aun_tx_ack(unsigned long seq, int result)
903{
904 struct sk_buff *skb;
905 unsigned long flags;
906 struct ec_cb *eb;
907
908 spin_lock_irqsave(&aun_queue_lock, flags);
de103342 909 skb_queue_walk(&aun_queue, skb) {
1da177e4
LT
910 eb = (struct ec_cb *)&skb->cb;
911 if (eb->seq == seq)
912 goto foundit;
1da177e4
LT
913 }
914 spin_unlock_irqrestore(&aun_queue_lock, flags);
ee9c88f2 915 pr_debug("AUN: unknown sequence %ld\n", seq);
1da177e4
LT
916 return;
917
918foundit:
919 tx_result(skb->sk, eb->cookie, result);
8728b834 920 skb_unlink(skb, &aun_queue);
1da177e4
LT
921 spin_unlock_irqrestore(&aun_queue_lock, flags);
922 kfree_skb(skb);
923}
924
925/*
926 * Deal with received AUN frames - sort out what type of thing it is
927 * and hand it to the right function.
928 */
929
930static void aun_data_available(struct sock *sk, int slen)
931{
932 int err;
933 struct sk_buff *skb;
934 unsigned char *data;
935 struct aunhdr *ah;
1da177e4
LT
936 size_t len;
937
938 while ((skb = skb_recv_datagram(sk, 0, 1, &err)) == NULL) {
939 if (err == -EAGAIN) {
ee9c88f2 940 pr_err("AUN: no data available?!\n");
1da177e4
LT
941 return;
942 }
ee9c88f2 943 pr_debug("AUN: recvfrom() error %d\n", -err);
1da177e4
LT
944 }
945
9c70220b 946 data = skb_transport_header(skb) + sizeof(struct udphdr);
1da177e4
LT
947 ah = (struct aunhdr *)data;
948 len = skb->len - sizeof(struct udphdr);
1da177e4 949
ee9c88f2 950 switch (ah->code) {
1da177e4
LT
951 case 2:
952 aun_incoming(skb, ah, len);
953 break;
954 case 3:
955 aun_tx_ack(ah->handle, ECTYPE_TRANSMIT_OK);
956 break;
957 case 4:
958 aun_tx_ack(ah->handle, ECTYPE_TRANSMIT_NOT_LISTENING);
959 break;
1da177e4 960 default:
ee9c88f2 961 pr_debug("AUN: unknown packet type: %d\n", data[0]);
1da177e4
LT
962 }
963
964 skb_free_datagram(sk, skb);
965}
966
967/*
968 * Called by the timer to manage the AUN transmit queue. If a packet
969 * was sent to a dead or nonexistent host then we will never get an
970 * acknowledgement back. After a few seconds we need to spot this and
971 * drop the packet.
972 */
973
974static void ab_cleanup(unsigned long h)
975{
de103342 976 struct sk_buff *skb, *n;
1da177e4
LT
977 unsigned long flags;
978
979 spin_lock_irqsave(&aun_queue_lock, flags);
de103342 980 skb_queue_walk_safe(&aun_queue, skb, n) {
1da177e4 981 struct ec_cb *eb = (struct ec_cb *)&skb->cb;
de103342 982 if ((jiffies - eb->start) > eb->timeout) {
c9b6aab9 983 tx_result(skb->sk, eb->cookie,
1da177e4 984 ECTYPE_TRANSMIT_NOT_PRESENT);
8728b834 985 skb_unlink(skb, &aun_queue);
1da177e4
LT
986 kfree_skb(skb);
987 }
1da177e4
LT
988 }
989 spin_unlock_irqrestore(&aun_queue_lock, flags);
990
ee9c88f2 991 mod_timer(&ab_cleanup_timer, jiffies + (HZ * 2));
1da177e4
LT
992}
993
994static int __init aun_udp_initialise(void)
995{
996 int error;
997 struct sockaddr_in sin;
998
999 skb_queue_head_init(&aun_queue);
b24b8a24 1000 setup_timer(&ab_cleanup_timer, ab_cleanup, 0);
ee9c88f2 1001 ab_cleanup_timer.expires = jiffies + (HZ * 2);
1da177e4
LT
1002 add_timer(&ab_cleanup_timer);
1003
1004 memset(&sin, 0, sizeof(sin));
1005 sin.sin_port = htons(AUN_PORT);
1006
1007 /* We can count ourselves lucky Acorn machines are too dim to
1008 speak IPv6. :-) */
ee9c88f2
JP
1009 error = sock_create_kern(PF_INET, SOCK_DGRAM, 0, &udpsock);
1010 if (error < 0) {
1011 pr_err("AUN: socket error %d\n", -error);
1da177e4
LT
1012 return error;
1013 }
c9b6aab9 1014
4a17fd52 1015 udpsock->sk->sk_reuse = SK_CAN_REUSE;
1da177e4
LT
1016 udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it
1017 from interrupts */
c9b6aab9 1018
1da177e4 1019 error = udpsock->ops->bind(udpsock, (struct sockaddr *)&sin,
ee9c88f2
JP
1020 sizeof(sin));
1021 if (error < 0) {
1022 pr_err("AUN: bind error %d\n", -error);
1da177e4
LT
1023 goto release;
1024 }
1025
1026 udpsock->sk->sk_data_ready = aun_data_available;
1027
1028 return 0;
1029
1030release:
1031 sock_release(udpsock);
1032 udpsock = NULL;
1033 return error;
1034}
1035#endif
1036
1037#ifdef CONFIG_ECONET_NATIVE
1038
1039/*
1040 * Receive an Econet frame from a device.
1041 */
1042
ee9c88f2
JP
1043static int econet_rcv(struct sk_buff *skb, struct net_device *dev,
1044 struct packet_type *pt, struct net_device *orig_dev)
1da177e4
LT
1045{
1046 struct ec_framehdr *hdr;
0c78a92f 1047 struct sock *sk = NULL;
1da177e4
LT
1048 struct ec_device *edev = dev->ec_ptr;
1049
721499e8 1050 if (!net_eq(dev_net(dev), &init_net))
e730c155
EB
1051 goto drop;
1052
1da177e4
LT
1053 if (skb->pkt_type == PACKET_OTHERHOST)
1054 goto drop;
1055
1056 if (!edev)
1057 goto drop;
1058
ee9c88f2
JP
1059 skb = skb_share_check(skb, GFP_ATOMIC);
1060 if (skb == NULL)
1da177e4
LT
1061 return NET_RX_DROP;
1062
1063 if (!pskb_may_pull(skb, sizeof(struct ec_framehdr)))
1064 goto drop;
1065
ee9c88f2 1066 hdr = (struct ec_framehdr *)skb->data;
1da177e4
LT
1067
1068 /* First check for encapsulated IP */
1069 if (hdr->port == EC_PORT_IP) {
1070 skb->protocol = htons(ETH_P_IP);
1071 skb_pull(skb, sizeof(struct ec_framehdr));
1072 netif_rx(skb);
482d804c 1073 return NET_RX_SUCCESS;
1da177e4
LT
1074 }
1075
1076 sk = ec_listening_socket(hdr->port, hdr->src_stn, hdr->src_net);
1077 if (!sk)
1078 goto drop;
1079
1080 if (ec_queue_packet(sk, skb, edev->net, hdr->src_stn, hdr->cb,
1081 hdr->port))
1082 goto drop;
0c78a92f 1083 sock_put(sk);
482d804c 1084 return NET_RX_SUCCESS;
1da177e4
LT
1085
1086drop:
0c78a92f
ED
1087 if (sk)
1088 sock_put(sk);
1da177e4
LT
1089 kfree_skb(skb);
1090 return NET_RX_DROP;
1091}
1092
7546dd97 1093static struct packet_type econet_packet_type __read_mostly = {
ee9c88f2
JP
1094 .type = cpu_to_be16(ETH_P_ECONET),
1095 .func = econet_rcv,
1da177e4
LT
1096};
1097
1098static void econet_hw_initialise(void)
1099{
1100 dev_add_pack(&econet_packet_type);
1101}
1102
1103#endif
1104
ee9c88f2
JP
1105static int econet_notifier(struct notifier_block *this, unsigned long msg,
1106 void *data)
1da177e4 1107{
ee9c88f2 1108 struct net_device *dev = data;
1da177e4
LT
1109 struct ec_device *edev;
1110
721499e8 1111 if (!net_eq(dev_net(dev), &init_net))
e9dc8653
EB
1112 return NOTIFY_DONE;
1113
1da177e4
LT
1114 switch (msg) {
1115 case NETDEV_UNREGISTER:
1116 /* A device has gone down - kill any data we hold for it. */
1117 edev = dev->ec_ptr;
ee9c88f2 1118 if (edev) {
1da177e4
LT
1119 if (net2dev_map[0] == dev)
1120 net2dev_map[0] = NULL;
1121 net2dev_map[edev->net] = NULL;
1122 kfree(edev);
1123 dev->ec_ptr = NULL;
1124 }
1125 break;
1126 }
1127
1128 return NOTIFY_DONE;
1129}
1130
1131static struct notifier_block econet_netdev_notifier = {
ee9c88f2 1132 .notifier_call = econet_notifier,
1da177e4
LT
1133};
1134
1135static void __exit econet_proto_exit(void)
1136{
1137#ifdef CONFIG_ECONET_AUNUDP
1138 del_timer(&ab_cleanup_timer);
1139 if (udpsock)
1140 sock_release(udpsock);
1141#endif
1142 unregister_netdevice_notifier(&econet_netdev_notifier);
9c29a377
AD
1143#ifdef CONFIG_ECONET_NATIVE
1144 dev_remove_pack(&econet_packet_type);
1145#endif
1da177e4
LT
1146 sock_unregister(econet_family_ops.family);
1147 proto_unregister(&econet_proto);
1148}
1149
1150static int __init econet_proto_init(void)
1151{
1152 int err = proto_register(&econet_proto, 0);
1153
1154 if (err != 0)
1155 goto out;
1156 sock_register(&econet_family_ops);
1157#ifdef CONFIG_ECONET_AUNUDP
1da177e4
LT
1158 aun_udp_initialise();
1159#endif
1160#ifdef CONFIG_ECONET_NATIVE
1161 econet_hw_initialise();
1162#endif
1163 register_netdevice_notifier(&econet_netdev_notifier);
1164out:
1165 return err;
1166}
1167
1168module_init(econet_proto_init);
1169module_exit(econet_proto_exit);
1170
1171MODULE_LICENSE("GPL");
1172MODULE_ALIAS_NETPROTO(PF_ECONET);