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