linux/net/appletalk/ddp.c
<<
>>
Prefs
   1/*
   2 *      DDP:    An implementation of the AppleTalk DDP protocol for
   3 *              Ethernet 'ELAP'.
   4 *
   5 *              Alan Cox  <alan@lxorguk.ukuu.org.uk>
   6 *
   7 *              With more than a little assistance from
   8 *
   9 *              Wesley Craig <netatalk@umich.edu>
  10 *
  11 *      Fixes:
  12 *              Neil Horman             :       Added missing device ioctls
  13 *              Michael Callahan        :       Made routing work
  14 *              Wesley Craig            :       Fix probing to listen to a
  15 *                                              passed node id.
  16 *              Alan Cox                :       Added send/recvmsg support
  17 *              Alan Cox                :       Moved at. to protinfo in
  18 *                                              socket.
  19 *              Alan Cox                :       Added firewall hooks.
  20 *              Alan Cox                :       Supports new ARPHRD_LOOPBACK
  21 *              Christer Weinigel       :       Routing and /proc fixes.
  22 *              Bradford Johnson        :       LocalTalk.
  23 *              Tom Dyas                :       Module support.
  24 *              Alan Cox                :       Hooks for PPP (based on the
  25 *                                              LocalTalk hook).
  26 *              Alan Cox                :       Posix bits
  27 *              Alan Cox/Mike Freeman   :       Possible fix to NBP problems
  28 *              Bradford Johnson        :       IP-over-DDP (experimental)
  29 *              Jay Schulist            :       Moved IP-over-DDP to its own
  30 *                                              driver file. (ipddp.c & ipddp.h)
  31 *              Jay Schulist            :       Made work as module with
  32 *                                              AppleTalk drivers, cleaned it.
  33 *              Rob Newberry            :       Added proxy AARP and AARP
  34 *                                              procfs, moved probing to AARP
  35 *                                              module.
  36 *              Adrian Sun/
  37 *              Michael Zuelsdorff      :       fix for net.0 packets. don't
  38 *                                              allow illegal ether/tokentalk
  39 *                                              port assignment. we lose a
  40 *                                              valid localtalk port as a
  41 *                                              result.
  42 *              Arnaldo C. de Melo      :       Cleanup, in preparation for
  43 *                                              shared skb support 8)
  44 *              Arnaldo C. de Melo      :       Move proc stuff to atalk_proc.c,
  45 *                                              use seq_file
  46 *
  47 *              This program is free software; you can redistribute it and/or
  48 *              modify it under the terms of the GNU General Public License
  49 *              as published by the Free Software Foundation; either version
  50 *              2 of the License, or (at your option) any later version.
  51 *
  52 */
  53
  54#include <linux/capability.h>
  55#include <linux/module.h>
  56#include <linux/if_arp.h>
  57#include <linux/smp_lock.h>
  58#include <linux/termios.h>      /* For TIOCOUTQ/INQ */
  59#include <net/datalink.h>
  60#include <net/psnap.h>
  61#include <net/sock.h>
  62#include <net/tcp_states.h>
  63#include <net/route.h>
  64#include <linux/atalk.h>
  65#include "../core/kmap_skb.h"
  66
  67struct datalink_proto *ddp_dl, *aarp_dl;
  68static const struct proto_ops atalk_dgram_ops;
  69
  70/**************************************************************************\
  71*                                                                          *
  72* Handlers for the socket list.                                            *
  73*                                                                          *
  74\**************************************************************************/
  75
  76HLIST_HEAD(atalk_sockets);
  77DEFINE_RWLOCK(atalk_sockets_lock);
  78
  79static inline void __atalk_insert_socket(struct sock *sk)
  80{
  81        sk_add_node(sk, &atalk_sockets);
  82}
  83
  84static inline void atalk_remove_socket(struct sock *sk)
  85{
  86        write_lock_bh(&atalk_sockets_lock);
  87        sk_del_node_init(sk);
  88        write_unlock_bh(&atalk_sockets_lock);
  89}
  90
  91static struct sock *atalk_search_socket(struct sockaddr_at *to,
  92                                        struct atalk_iface *atif)
  93{
  94        struct sock *s;
  95        struct hlist_node *node;
  96
  97        read_lock_bh(&atalk_sockets_lock);
  98        sk_for_each(s, node, &atalk_sockets) {
  99                struct atalk_sock *at = at_sk(s);
 100
 101                if (to->sat_port != at->src_port)
 102                        continue;
 103
 104                if (to->sat_addr.s_net == ATADDR_ANYNET &&
 105                    to->sat_addr.s_node == ATADDR_BCAST)
 106                        goto found;
 107
 108                if (to->sat_addr.s_net == at->src_net &&
 109                    (to->sat_addr.s_node == at->src_node ||
 110                     to->sat_addr.s_node == ATADDR_BCAST ||
 111                     to->sat_addr.s_node == ATADDR_ANYNODE))
 112                        goto found;
 113
 114                /* XXXX.0 -- we got a request for this router. make sure
 115                 * that the node is appropriately set. */
 116                if (to->sat_addr.s_node == ATADDR_ANYNODE &&
 117                    to->sat_addr.s_net != ATADDR_ANYNET &&
 118                    atif->address.s_node == at->src_node) {
 119                        to->sat_addr.s_node = atif->address.s_node;
 120                        goto found;
 121                }
 122        }
 123        s = NULL;
 124found:
 125        read_unlock_bh(&atalk_sockets_lock);
 126        return s;
 127}
 128
 129/**
 130 * atalk_find_or_insert_socket - Try to find a socket matching ADDR
 131 * @sk - socket to insert in the list if it is not there already
 132 * @sat - address to search for
 133 *
 134 * Try to find a socket matching ADDR in the socket list, if found then return
 135 * it. If not, insert SK into the socket list.
 136 *
 137 * This entire operation must execute atomically.
 138 */
 139static struct sock *atalk_find_or_insert_socket(struct sock *sk,
 140                                                struct sockaddr_at *sat)
 141{
 142        struct sock *s;
 143        struct hlist_node *node;
 144        struct atalk_sock *at;
 145
 146        write_lock_bh(&atalk_sockets_lock);
 147        sk_for_each(s, node, &atalk_sockets) {
 148                at = at_sk(s);
 149
 150                if (at->src_net == sat->sat_addr.s_net &&
 151                    at->src_node == sat->sat_addr.s_node &&
 152                    at->src_port == sat->sat_port)
 153                        goto found;
 154        }
 155        s = NULL;
 156        __atalk_insert_socket(sk); /* Wheee, it's free, assign and insert. */
 157found:
 158        write_unlock_bh(&atalk_sockets_lock);
 159        return s;
 160}
 161
 162static void atalk_destroy_timer(unsigned long data)
 163{
 164        struct sock *sk = (struct sock *)data;
 165
 166        if (sk_has_allocations(sk)) {
 167                sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME;
 168                add_timer(&sk->sk_timer);
 169        } else
 170                sock_put(sk);
 171}
 172
 173static inline void atalk_destroy_socket(struct sock *sk)
 174{
 175        atalk_remove_socket(sk);
 176        skb_queue_purge(&sk->sk_receive_queue);
 177
 178        if (sk_has_allocations(sk)) {
 179                setup_timer(&sk->sk_timer, atalk_destroy_timer,
 180                                (unsigned long)sk);
 181                sk->sk_timer.expires    = jiffies + SOCK_DESTROY_TIME;
 182                add_timer(&sk->sk_timer);
 183        } else
 184                sock_put(sk);
 185}
 186
 187/**************************************************************************\
 188*                                                                          *
 189* Routing tables for the AppleTalk socket layer.                           *
 190*                                                                          *
 191\**************************************************************************/
 192
 193/* Anti-deadlock ordering is atalk_routes_lock --> iface_lock -DaveM */
 194struct atalk_route *atalk_routes;
 195DEFINE_RWLOCK(atalk_routes_lock);
 196
 197struct atalk_iface *atalk_interfaces;
 198DEFINE_RWLOCK(atalk_interfaces_lock);
 199
 200/* For probing devices or in a routerless network */
 201struct atalk_route atrtr_default;
 202
 203/* AppleTalk interface control */
 204/*
 205 * Drop a device. Doesn't drop any of its routes - that is the caller's
 206 * problem. Called when we down the interface or delete the address.
 207 */
 208static void atif_drop_device(struct net_device *dev)
 209{
 210        struct atalk_iface **iface = &atalk_interfaces;
 211        struct atalk_iface *tmp;
 212
 213        write_lock_bh(&atalk_interfaces_lock);
 214        while ((tmp = *iface) != NULL) {
 215                if (tmp->dev == dev) {
 216                        *iface = tmp->next;
 217                        dev_put(dev);
 218                        kfree(tmp);
 219                        dev->atalk_ptr = NULL;
 220                } else
 221                        iface = &tmp->next;
 222        }
 223        write_unlock_bh(&atalk_interfaces_lock);
 224}
 225
 226static struct atalk_iface *atif_add_device(struct net_device *dev,
 227                                           struct atalk_addr *sa)
 228{
 229        struct atalk_iface *iface = kzalloc(sizeof(*iface), GFP_KERNEL);
 230
 231        if (!iface)
 232                goto out;
 233
 234        dev_hold(dev);
 235        iface->dev = dev;
 236        dev->atalk_ptr = iface;
 237        iface->address = *sa;
 238        iface->status = 0;
 239
 240        write_lock_bh(&atalk_interfaces_lock);
 241        iface->next = atalk_interfaces;
 242        atalk_interfaces = iface;
 243        write_unlock_bh(&atalk_interfaces_lock);
 244out:
 245        return iface;
 246}
 247
 248/* Perform phase 2 AARP probing on our tentative address */
 249static int atif_probe_device(struct atalk_iface *atif)
 250{
 251        int netrange = ntohs(atif->nets.nr_lastnet) -
 252                        ntohs(atif->nets.nr_firstnet) + 1;
 253        int probe_net = ntohs(atif->address.s_net);
 254        int probe_node = atif->address.s_node;
 255        int netct, nodect;
 256
 257        /* Offset the network we start probing with */
 258        if (probe_net == ATADDR_ANYNET) {
 259                probe_net = ntohs(atif->nets.nr_firstnet);
 260                if (netrange)
 261                        probe_net += jiffies % netrange;
 262        }
 263        if (probe_node == ATADDR_ANYNODE)
 264                probe_node = jiffies & 0xFF;
 265
 266        /* Scan the networks */
 267        atif->status |= ATIF_PROBE;
 268        for (netct = 0; netct <= netrange; netct++) {
 269                /* Sweep the available nodes from a given start */
 270                atif->address.s_net = htons(probe_net);
 271                for (nodect = 0; nodect < 256; nodect++) {
 272                        atif->address.s_node = (nodect + probe_node) & 0xFF;
 273                        if (atif->address.s_node > 0 &&
 274                            atif->address.s_node < 254) {
 275                                /* Probe a proposed address */
 276                                aarp_probe_network(atif);
 277
 278                                if (!(atif->status & ATIF_PROBE_FAIL)) {
 279                                        atif->status &= ~ATIF_PROBE;
 280                                        return 0;
 281                                }
 282                        }
 283                        atif->status &= ~ATIF_PROBE_FAIL;
 284                }
 285                probe_net++;
 286                if (probe_net > ntohs(atif->nets.nr_lastnet))
 287                        probe_net = ntohs(atif->nets.nr_firstnet);
 288        }
 289        atif->status &= ~ATIF_PROBE;
 290
 291        return -EADDRINUSE;     /* Network is full... */
 292}
 293
 294
 295/* Perform AARP probing for a proxy address */
 296static int atif_proxy_probe_device(struct atalk_iface *atif,
 297                                   struct atalk_addr* proxy_addr)
 298{
 299        int netrange = ntohs(atif->nets.nr_lastnet) -
 300                        ntohs(atif->nets.nr_firstnet) + 1;
 301        /* we probe the interface's network */
 302        int probe_net = ntohs(atif->address.s_net);
 303        int probe_node = ATADDR_ANYNODE;            /* we'll take anything */
 304        int netct, nodect;
 305
 306        /* Offset the network we start probing with */
 307        if (probe_net == ATADDR_ANYNET) {
 308                probe_net = ntohs(atif->nets.nr_firstnet);
 309                if (netrange)
 310                        probe_net += jiffies % netrange;
 311        }
 312
 313        if (probe_node == ATADDR_ANYNODE)
 314                probe_node = jiffies & 0xFF;
 315
 316        /* Scan the networks */
 317        for (netct = 0; netct <= netrange; netct++) {
 318                /* Sweep the available nodes from a given start */
 319                proxy_addr->s_net = htons(probe_net);
 320                for (nodect = 0; nodect < 256; nodect++) {
 321                        proxy_addr->s_node = (nodect + probe_node) & 0xFF;
 322                        if (proxy_addr->s_node > 0 &&
 323                            proxy_addr->s_node < 254) {
 324                                /* Tell AARP to probe a proposed address */
 325                                int ret = aarp_proxy_probe_network(atif,
 326                                                                    proxy_addr);
 327
 328                                if (ret != -EADDRINUSE)
 329                                        return ret;
 330                        }
 331                }
 332                probe_net++;
 333                if (probe_net > ntohs(atif->nets.nr_lastnet))
 334                        probe_net = ntohs(atif->nets.nr_firstnet);
 335        }
 336
 337        return -EADDRINUSE;     /* Network is full... */
 338}
 339
 340
 341struct atalk_addr *atalk_find_dev_addr(struct net_device *dev)
 342{
 343        struct atalk_iface *iface = dev->atalk_ptr;
 344        return iface ? &iface->address : NULL;
 345}
 346
 347static struct atalk_addr *atalk_find_primary(void)
 348{
 349        struct atalk_iface *fiface = NULL;
 350        struct atalk_addr *retval;
 351        struct atalk_iface *iface;
 352
 353        /*
 354         * Return a point-to-point interface only if
 355         * there is no non-ptp interface available.
 356         */
 357        read_lock_bh(&atalk_interfaces_lock);
 358        for (iface = atalk_interfaces; iface; iface = iface->next) {
 359                if (!fiface && !(iface->dev->flags & IFF_LOOPBACK))
 360                        fiface = iface;
 361                if (!(iface->dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) {
 362                        retval = &iface->address;
 363                        goto out;
 364                }
 365        }
 366
 367        if (fiface)
 368                retval = &fiface->address;
 369        else if (atalk_interfaces)
 370                retval = &atalk_interfaces->address;
 371        else
 372                retval = NULL;
 373out:
 374        read_unlock_bh(&atalk_interfaces_lock);
 375        return retval;
 376}
 377
 378/*
 379 * Find a match for 'any network' - ie any of our interfaces with that
 380 * node number will do just nicely.
 381 */
 382static struct atalk_iface *atalk_find_anynet(int node, struct net_device *dev)
 383{
 384        struct atalk_iface *iface = dev->atalk_ptr;
 385
 386        if (!iface || iface->status & ATIF_PROBE)
 387                goto out_err;
 388
 389        if (node != ATADDR_BCAST &&
 390            iface->address.s_node != node &&
 391            node != ATADDR_ANYNODE)
 392                goto out_err;
 393out:
 394        return iface;
 395out_err:
 396        iface = NULL;
 397        goto out;
 398}
 399
 400/* Find a match for a specific network:node pair */
 401static struct atalk_iface *atalk_find_interface(__be16 net, int node)
 402{
 403        struct atalk_iface *iface;
 404
 405        read_lock_bh(&atalk_interfaces_lock);
 406        for (iface = atalk_interfaces; iface; iface = iface->next) {
 407                if ((node == ATADDR_BCAST ||
 408                     node == ATADDR_ANYNODE ||
 409                     iface->address.s_node == node) &&
 410                    iface->address.s_net == net &&
 411                    !(iface->status & ATIF_PROBE))
 412                        break;
 413
 414                /* XXXX.0 -- net.0 returns the iface associated with net */
 415                if (node == ATADDR_ANYNODE && net != ATADDR_ANYNET &&
 416                    ntohs(iface->nets.nr_firstnet) <= ntohs(net) &&
 417                    ntohs(net) <= ntohs(iface->nets.nr_lastnet))
 418                        break;
 419        }
 420        read_unlock_bh(&atalk_interfaces_lock);
 421        return iface;
 422}
 423
 424
 425/*
 426 * Find a route for an AppleTalk packet. This ought to get cached in
 427 * the socket (later on...). We know about host routes and the fact
 428 * that a route must be direct to broadcast.
 429 */
 430static struct atalk_route *atrtr_find(struct atalk_addr *target)
 431{
 432        /*
 433         * we must search through all routes unless we find a
 434         * host route, because some host routes might overlap
 435         * network routes
 436         */
 437        struct atalk_route *net_route = NULL;
 438        struct atalk_route *r;
 439
 440        read_lock_bh(&atalk_routes_lock);
 441        for (r = atalk_routes; r; r = r->next) {
 442                if (!(r->flags & RTF_UP))
 443                        continue;
 444
 445                if (r->target.s_net == target->s_net) {
 446                        if (r->flags & RTF_HOST) {
 447                                /*
 448                                 * if this host route is for the target,
 449                                 * the we're done
 450                                 */
 451                                if (r->target.s_node == target->s_node)
 452                                        goto out;
 453                        } else
 454                                /*
 455                                 * this route will work if there isn't a
 456                                 * direct host route, so cache it
 457                                 */
 458                                net_route = r;
 459                }
 460        }
 461
 462        /*
 463         * if we found a network route but not a direct host
 464         * route, then return it
 465         */
 466        if (net_route)
 467                r = net_route;
 468        else if (atrtr_default.dev)
 469                r = &atrtr_default;
 470        else /* No route can be found */
 471                r = NULL;
 472out:
 473        read_unlock_bh(&atalk_routes_lock);
 474        return r;
 475}
 476
 477
 478/*
 479 * Given an AppleTalk network, find the device to use. This can be
 480 * a simple lookup.
 481 */
 482struct net_device *atrtr_get_dev(struct atalk_addr *sa)
 483{
 484        struct atalk_route *atr = atrtr_find(sa);
 485        return atr ? atr->dev : NULL;
 486}
 487
 488/* Set up a default router */
 489static void atrtr_set_default(struct net_device *dev)
 490{
 491        atrtr_default.dev            = dev;
 492        atrtr_default.flags          = RTF_UP;
 493        atrtr_default.gateway.s_net  = htons(0);
 494        atrtr_default.gateway.s_node = 0;
 495}
 496
 497/*
 498 * Add a router. Basically make sure it looks valid and stuff the
 499 * entry in the list. While it uses netranges we always set them to one
 500 * entry to work like netatalk.
 501 */
 502static int atrtr_create(struct rtentry *r, struct net_device *devhint)
 503{
 504        struct sockaddr_at *ta = (struct sockaddr_at *)&r->rt_dst;
 505        struct sockaddr_at *ga = (struct sockaddr_at *)&r->rt_gateway;
 506        struct atalk_route *rt;
 507        struct atalk_iface *iface, *riface;
 508        int retval = -EINVAL;
 509
 510        /*
 511         * Fixme: Raise/Lower a routing change semaphore for these
 512         * operations.
 513         */
 514
 515        /* Validate the request */
 516        if (ta->sat_family != AF_APPLETALK ||
 517            (!devhint && ga->sat_family != AF_APPLETALK))
 518                goto out;
 519
 520        /* Now walk the routing table and make our decisions */
 521        write_lock_bh(&atalk_routes_lock);
 522        for (rt = atalk_routes; rt; rt = rt->next) {
 523                if (r->rt_flags != rt->flags)
 524                        continue;
 525
 526                if (ta->sat_addr.s_net == rt->target.s_net) {
 527                        if (!(rt->flags & RTF_HOST))
 528                                break;
 529                        if (ta->sat_addr.s_node == rt->target.s_node)
 530                                break;
 531                }
 532        }
 533
 534        if (!devhint) {
 535                riface = NULL;
 536
 537                read_lock_bh(&atalk_interfaces_lock);
 538                for (iface = atalk_interfaces; iface; iface = iface->next) {
 539                        if (!riface &&
 540                            ntohs(ga->sat_addr.s_net) >=
 541                                        ntohs(iface->nets.nr_firstnet) &&
 542                            ntohs(ga->sat_addr.s_net) <=
 543                                        ntohs(iface->nets.nr_lastnet))
 544                                riface = iface;
 545
 546                        if (ga->sat_addr.s_net == iface->address.s_net &&
 547                            ga->sat_addr.s_node == iface->address.s_node)
 548                                riface = iface;
 549                }
 550                read_unlock_bh(&atalk_interfaces_lock);
 551
 552                retval = -ENETUNREACH;
 553                if (!riface)
 554                        goto out_unlock;
 555
 556                devhint = riface->dev;
 557        }
 558
 559        if (!rt) {
 560                rt = kzalloc(sizeof(*rt), GFP_ATOMIC);
 561
 562                retval = -ENOBUFS;
 563                if (!rt)
 564                        goto out_unlock;
 565
 566                rt->next = atalk_routes;
 567                atalk_routes = rt;
 568        }
 569
 570        /* Fill in the routing entry */
 571        rt->target  = ta->sat_addr;
 572        dev_hold(devhint);
 573        rt->dev     = devhint;
 574        rt->flags   = r->rt_flags;
 575        rt->gateway = ga->sat_addr;
 576
 577        retval = 0;
 578out_unlock:
 579        write_unlock_bh(&atalk_routes_lock);
 580out:
 581        return retval;
 582}
 583
 584/* Delete a route. Find it and discard it */
 585static int atrtr_delete(struct atalk_addr * addr)
 586{
 587        struct atalk_route **r = &atalk_routes;
 588        int retval = 0;
 589        struct atalk_route *tmp;
 590
 591        write_lock_bh(&atalk_routes_lock);
 592        while ((tmp = *r) != NULL) {
 593                if (tmp->target.s_net == addr->s_net &&
 594                    (!(tmp->flags&RTF_GATEWAY) ||
 595                     tmp->target.s_node == addr->s_node)) {
 596                        *r = tmp->next;
 597                        dev_put(tmp->dev);
 598                        kfree(tmp);
 599                        goto out;
 600                }
 601                r = &tmp->next;
 602        }
 603        retval = -ENOENT;
 604out:
 605        write_unlock_bh(&atalk_routes_lock);
 606        return retval;
 607}
 608
 609/*
 610 * Called when a device is downed. Just throw away any routes
 611 * via it.
 612 */
 613static void atrtr_device_down(struct net_device *dev)
 614{
 615        struct atalk_route **r = &atalk_routes;
 616        struct atalk_route *tmp;
 617
 618        write_lock_bh(&atalk_routes_lock);
 619        while ((tmp = *r) != NULL) {
 620                if (tmp->dev == dev) {
 621                        *r = tmp->next;
 622                        dev_put(dev);
 623                        kfree(tmp);
 624                } else
 625                        r = &tmp->next;
 626        }
 627        write_unlock_bh(&atalk_routes_lock);
 628
 629        if (atrtr_default.dev == dev)
 630                atrtr_set_default(NULL);
 631}
 632
 633/* Actually down the interface */
 634static inline void atalk_dev_down(struct net_device *dev)
 635{
 636        atrtr_device_down(dev); /* Remove all routes for the device */
 637        aarp_device_down(dev);  /* Remove AARP entries for the device */
 638        atif_drop_device(dev);  /* Remove the device */
 639}
 640
 641/*
 642 * A device event has occurred. Watch for devices going down and
 643 * delete our use of them (iface and route).
 644 */
 645static int ddp_device_event(struct notifier_block *this, unsigned long event,
 646                            void *ptr)
 647{
 648        struct net_device *dev = ptr;
 649
 650        if (!net_eq(dev_net(dev), &init_net))
 651                return NOTIFY_DONE;
 652
 653        if (event == NETDEV_DOWN)
 654                /* Discard any use of this */
 655                atalk_dev_down(dev);
 656
 657        return NOTIFY_DONE;
 658}
 659
 660/* ioctl calls. Shouldn't even need touching */
 661/* Device configuration ioctl calls */
 662static int atif_ioctl(int cmd, void __user *arg)
 663{
 664        static char aarp_mcast[6] = { 0x09, 0x00, 0x00, 0xFF, 0xFF, 0xFF };
 665        struct ifreq atreq;
 666        struct atalk_netrange *nr;
 667        struct sockaddr_at *sa;
 668        struct net_device *dev;
 669        struct atalk_iface *atif;
 670        int ct;
 671        int limit;
 672        struct rtentry rtdef;
 673        int add_route;
 674
 675        if (copy_from_user(&atreq, arg, sizeof(atreq)))
 676                return -EFAULT;
 677
 678        dev = __dev_get_by_name(&init_net, atreq.ifr_name);
 679        if (!dev)
 680                return -ENODEV;
 681
 682        sa = (struct sockaddr_at *)&atreq.ifr_addr;
 683        atif = atalk_find_dev(dev);
 684
 685        switch (cmd) {
 686                case SIOCSIFADDR:
 687                        if (!capable(CAP_NET_ADMIN))
 688                                return -EPERM;
 689                        if (sa->sat_family != AF_APPLETALK)
 690                                return -EINVAL;
 691                        if (dev->type != ARPHRD_ETHER &&
 692                            dev->type != ARPHRD_LOOPBACK &&
 693                            dev->type != ARPHRD_LOCALTLK &&
 694                            dev->type != ARPHRD_PPP)
 695                                return -EPROTONOSUPPORT;
 696
 697                        nr = (struct atalk_netrange *)&sa->sat_zero[0];
 698                        add_route = 1;
 699
 700                        /*
 701                         * if this is a point-to-point iface, and we already
 702                         * have an iface for this AppleTalk address, then we
 703                         * should not add a route
 704                         */
 705                        if ((dev->flags & IFF_POINTOPOINT) &&
 706                            atalk_find_interface(sa->sat_addr.s_net,
 707                                                 sa->sat_addr.s_node)) {
 708                                printk(KERN_DEBUG "AppleTalk: point-to-point "
 709                                                  "interface added with "
 710                                                  "existing address\n");
 711                                add_route = 0;
 712                        }
 713
 714                        /*
 715                         * Phase 1 is fine on LocalTalk but we don't do
 716                         * EtherTalk phase 1. Anyone wanting to add it go ahead.
 717                         */
 718                        if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
 719                                return -EPROTONOSUPPORT;
 720                        if (sa->sat_addr.s_node == ATADDR_BCAST ||
 721                            sa->sat_addr.s_node == 254)
 722                                return -EINVAL;
 723                        if (atif) {
 724                                /* Already setting address */
 725                                if (atif->status & ATIF_PROBE)
 726                                        return -EBUSY;
 727
 728                                atif->address.s_net  = sa->sat_addr.s_net;
 729                                atif->address.s_node = sa->sat_addr.s_node;
 730                                atrtr_device_down(dev); /* Flush old routes */
 731                        } else {
 732                                atif = atif_add_device(dev, &sa->sat_addr);
 733                                if (!atif)
 734                                        return -ENOMEM;
 735                        }
 736                        atif->nets = *nr;
 737
 738                        /*
 739                         * Check if the chosen address is used. If so we
 740                         * error and atalkd will try another.
 741                         */
 742
 743                        if (!(dev->flags & IFF_LOOPBACK) &&
 744                            !(dev->flags & IFF_POINTOPOINT) &&
 745                            atif_probe_device(atif) < 0) {
 746                                atif_drop_device(dev);
 747                                return -EADDRINUSE;
 748                        }
 749
 750                        /* Hey it worked - add the direct routes */
 751                        sa = (struct sockaddr_at *)&rtdef.rt_gateway;
 752                        sa->sat_family = AF_APPLETALK;
 753                        sa->sat_addr.s_net  = atif->address.s_net;
 754                        sa->sat_addr.s_node = atif->address.s_node;
 755                        sa = (struct sockaddr_at *)&rtdef.rt_dst;
 756                        rtdef.rt_flags = RTF_UP;
 757                        sa->sat_family = AF_APPLETALK;
 758                        sa->sat_addr.s_node = ATADDR_ANYNODE;
 759                        if (dev->flags & IFF_LOOPBACK ||
 760                            dev->flags & IFF_POINTOPOINT)
 761                                rtdef.rt_flags |= RTF_HOST;
 762
 763                        /* Routerless initial state */
 764                        if (nr->nr_firstnet == htons(0) &&
 765                            nr->nr_lastnet == htons(0xFFFE)) {
 766                                sa->sat_addr.s_net = atif->address.s_net;
 767                                atrtr_create(&rtdef, dev);
 768                                atrtr_set_default(dev);
 769                        } else {
 770                                limit = ntohs(nr->nr_lastnet);
 771                                if (limit - ntohs(nr->nr_firstnet) > 4096) {
 772                                        printk(KERN_WARNING "Too many routes/"
 773                                                            "iface.\n");
 774                                        return -EINVAL;
 775                                }
 776                                if (add_route)
 777                                        for (ct = ntohs(nr->nr_firstnet);
 778                                             ct <= limit; ct++) {
 779                                                sa->sat_addr.s_net = htons(ct);
 780                                                atrtr_create(&rtdef, dev);
 781                                        }
 782                        }
 783                        dev_mc_add(dev, aarp_mcast, 6, 1);
 784                        return 0;
 785
 786                case SIOCGIFADDR:
 787                        if (!atif)
 788                                return -EADDRNOTAVAIL;
 789
 790                        sa->sat_family = AF_APPLETALK;
 791                        sa->sat_addr = atif->address;
 792                        break;
 793
 794                case SIOCGIFBRDADDR:
 795                        if (!atif)
 796                                return -EADDRNOTAVAIL;
 797
 798                        sa->sat_family = AF_APPLETALK;
 799                        sa->sat_addr.s_net = atif->address.s_net;
 800                        sa->sat_addr.s_node = ATADDR_BCAST;
 801                        break;
 802
 803                case SIOCATALKDIFADDR:
 804                case SIOCDIFADDR:
 805                        if (!capable(CAP_NET_ADMIN))
 806                                return -EPERM;
 807                        if (sa->sat_family != AF_APPLETALK)
 808                                return -EINVAL;
 809                        atalk_dev_down(dev);
 810                        break;
 811
 812                case SIOCSARP:
 813                        if (!capable(CAP_NET_ADMIN))
 814                                return -EPERM;
 815                        if (sa->sat_family != AF_APPLETALK)
 816                                return -EINVAL;
 817                        /*
 818                         * for now, we only support proxy AARP on ELAP;
 819                         * we should be able to do it for LocalTalk, too.
 820                         */
 821                        if (dev->type != ARPHRD_ETHER)
 822                                return -EPROTONOSUPPORT;
 823
 824                        /*
 825                         * atif points to the current interface on this network;
 826                         * we aren't concerned about its current status (at
 827                         * least for now), but it has all the settings about
 828                         * the network we're going to probe. Consequently, it
 829                         * must exist.
 830                         */
 831                        if (!atif)
 832                                return -EADDRNOTAVAIL;
 833
 834                        nr = (struct atalk_netrange *)&(atif->nets);
 835                        /*
 836                         * Phase 1 is fine on Localtalk but we don't do
 837                         * Ethertalk phase 1. Anyone wanting to add it go ahead.
 838                         */
 839                        if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
 840                                return -EPROTONOSUPPORT;
 841
 842                        if (sa->sat_addr.s_node == ATADDR_BCAST ||
 843                            sa->sat_addr.s_node == 254)
 844                                return -EINVAL;
 845
 846                        /*
 847                         * Check if the chosen address is used. If so we
 848                         * error and ATCP will try another.
 849                         */
 850                        if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0)
 851                                return -EADDRINUSE;
 852
 853                        /*
 854                         * We now have an address on the local network, and
 855                         * the AARP code will defend it for us until we take it
 856                         * down. We don't set up any routes right now, because
 857                         * ATCP will install them manually via SIOCADDRT.
 858                         */
 859                        break;
 860
 861                case SIOCDARP:
 862                        if (!capable(CAP_NET_ADMIN))
 863                                return -EPERM;
 864                        if (sa->sat_family != AF_APPLETALK)
 865                                return -EINVAL;
 866                        if (!atif)
 867                                return -EADDRNOTAVAIL;
 868
 869                        /* give to aarp module to remove proxy entry */
 870                        aarp_proxy_remove(atif->dev, &(sa->sat_addr));
 871                        return 0;
 872        }
 873
 874        return copy_to_user(arg, &atreq, sizeof(atreq)) ? -EFAULT : 0;
 875}
 876
 877/* Routing ioctl() calls */
 878static int atrtr_ioctl(unsigned int cmd, void __user *arg)
 879{
 880        struct rtentry rt;
 881
 882        if (copy_from_user(&rt, arg, sizeof(rt)))
 883                return -EFAULT;
 884
 885        switch (cmd) {
 886                case SIOCDELRT:
 887                        if (rt.rt_dst.sa_family != AF_APPLETALK)
 888                                return -EINVAL;
 889                        return atrtr_delete(&((struct sockaddr_at *)
 890                                                &rt.rt_dst)->sat_addr);
 891
 892                case SIOCADDRT: {
 893                        struct net_device *dev = NULL;
 894                        if (rt.rt_dev) {
 895                                char name[IFNAMSIZ];
 896                                if (copy_from_user(name, rt.rt_dev, IFNAMSIZ-1))
 897                                        return -EFAULT;
 898                                name[IFNAMSIZ-1] = '\0';
 899                                dev = __dev_get_by_name(&init_net, name);
 900                                if (!dev)
 901                                        return -ENODEV;
 902                        }
 903                        return atrtr_create(&rt, dev);
 904                }
 905        }
 906        return -EINVAL;
 907}
 908
 909/**************************************************************************\
 910*                                                                          *
 911* Handling for system calls applied via the various interfaces to an       *
 912* AppleTalk socket object.                                                 *
 913*                                                                          *
 914\**************************************************************************/
 915
 916/*
 917 * Checksum: This is 'optional'. It's quite likely also a good
 918 * candidate for assembler hackery 8)
 919 */
 920static unsigned long atalk_sum_partial(const unsigned char *data,
 921                                       int len, unsigned long sum)
 922{
 923        /* This ought to be unwrapped neatly. I'll trust gcc for now */
 924        while (len--) {
 925                sum += *data;
 926                sum <<= 1;
 927                if (sum & 0x10000) {
 928                        sum++;
 929                        sum &= 0xffff;
 930                }
 931                data++;
 932        }
 933        return sum;
 934}
 935
 936/*  Checksum skb data --  similar to skb_checksum  */
 937static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
 938                                   int len, unsigned long sum)
 939{
 940        int start = skb_headlen(skb);
 941        struct sk_buff *frag_iter;
 942        int i, copy;
 943
 944        /* checksum stuff in header space */
 945        if ( (copy = start - offset) > 0) {
 946                if (copy > len)
 947                        copy = len;
 948                sum = atalk_sum_partial(skb->data + offset, copy, sum);
 949                if ( (len -= copy) == 0)
 950                        return sum;
 951
 952                offset += copy;
 953        }
 954
 955        /* checksum stuff in frags */
 956        for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
 957                int end;
 958
 959                WARN_ON(start > offset + len);
 960
 961                end = start + skb_shinfo(skb)->frags[i].size;
 962                if ((copy = end - offset) > 0) {
 963                        u8 *vaddr;
 964                        skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
 965
 966                        if (copy > len)
 967                                copy = len;
 968                        vaddr = kmap_skb_frag(frag);
 969                        sum = atalk_sum_partial(vaddr + frag->page_offset +
 970                                                  offset - start, copy, sum);
 971                        kunmap_skb_frag(vaddr);
 972
 973                        if (!(len -= copy))
 974                                return sum;
 975                        offset += copy;
 976                }
 977                start = end;
 978        }
 979
 980        skb_walk_frags(skb, frag_iter) {
 981                int end;
 982
 983                WARN_ON(start > offset + len);
 984
 985                end = start + frag_iter->len;
 986                if ((copy = end - offset) > 0) {
 987                        if (copy > len)
 988                                copy = len;
 989                        sum = atalk_sum_skb(frag_iter, offset - start,
 990                                            copy, sum);
 991                        if ((len -= copy) == 0)
 992                                return sum;
 993                        offset += copy;
 994                }
 995                start = end;
 996        }
 997
 998        BUG_ON(len > 0);
 999
1000        return sum;
1001}
1002
1003static __be16 atalk_checksum(const struct sk_buff *skb, int len)
1004{
1005        unsigned long sum;
1006
1007        /* skip header 4 bytes */
1008        sum = atalk_sum_skb(skb, 4, len-4, 0);
1009
1010        /* Use 0xFFFF for 0. 0 itself means none */
1011        return sum ? htons((unsigned short)sum) : htons(0xFFFF);
1012}
1013
1014static struct proto ddp_proto = {
1015        .name     = "DDP",
1016        .owner    = THIS_MODULE,
1017        .obj_size = sizeof(struct atalk_sock),
1018};
1019
1020/*
1021 * Create a socket. Initialise the socket, blank the addresses
1022 * set the state.
1023 */
1024static int atalk_create(struct net *net, struct socket *sock, int protocol)
1025{
1026        struct sock *sk;
1027        int rc = -ESOCKTNOSUPPORT;
1028
1029        if (net != &init_net)
1030                return -EAFNOSUPPORT;
1031
1032        /*
1033         * We permit SOCK_DGRAM and RAW is an extension. It is trivial to do
1034         * and gives you the full ELAP frame. Should be handy for CAP 8)
1035         */
1036        if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
1037                goto out;
1038        rc = -ENOMEM;
1039        sk = sk_alloc(net, PF_APPLETALK, GFP_KERNEL, &ddp_proto);
1040        if (!sk)
1041                goto out;
1042        rc = 0;
1043        sock->ops = &atalk_dgram_ops;
1044        sock_init_data(sock, sk);
1045
1046        /* Checksums on by default */
1047        sock_set_flag(sk, SOCK_ZAPPED);
1048out:
1049        return rc;
1050}
1051
1052/* Free a socket. No work needed */
1053static int atalk_release(struct socket *sock)
1054{
1055        struct sock *sk = sock->sk;
1056
1057        if (sk) {
1058                sock_orphan(sk);
1059                sock->sk = NULL;
1060                atalk_destroy_socket(sk);
1061        }
1062        return 0;
1063}
1064
1065/**
1066 * atalk_pick_and_bind_port - Pick a source port when one is not given
1067 * @sk - socket to insert into the tables
1068 * @sat - address to search for
1069 *
1070 * Pick a source port when one is not given. If we can find a suitable free
1071 * one, we insert the socket into the tables using it.
1072 *
1073 * This whole operation must be atomic.
1074 */
1075static int atalk_pick_and_bind_port(struct sock *sk, struct sockaddr_at *sat)
1076{
1077        int retval;
1078
1079        write_lock_bh(&atalk_sockets_lock);
1080
1081        for (sat->sat_port = ATPORT_RESERVED;
1082             sat->sat_port < ATPORT_LAST;
1083             sat->sat_port++) {
1084                struct sock *s;
1085                struct hlist_node *node;
1086
1087                sk_for_each(s, node, &atalk_sockets) {
1088                        struct atalk_sock *at = at_sk(s);
1089
1090                        if (at->src_net == sat->sat_addr.s_net &&
1091                            at->src_node == sat->sat_addr.s_node &&
1092                            at->src_port == sat->sat_port)
1093                                goto try_next_port;
1094                }
1095
1096                /* Wheee, it's free, assign and insert. */
1097                __atalk_insert_socket(sk);
1098                at_sk(sk)->src_port = sat->sat_port;
1099                retval = 0;
1100                goto out;
1101
1102try_next_port:;
1103        }
1104
1105        retval = -EBUSY;
1106out:
1107        write_unlock_bh(&atalk_sockets_lock);
1108        return retval;
1109}
1110
1111static int atalk_autobind(struct sock *sk)
1112{
1113        struct atalk_sock *at = at_sk(sk);
1114        struct sockaddr_at sat;
1115        struct atalk_addr *ap = atalk_find_primary();
1116        int n = -EADDRNOTAVAIL;
1117
1118        if (!ap || ap->s_net == htons(ATADDR_ANYNET))
1119                goto out;
1120
1121        at->src_net  = sat.sat_addr.s_net  = ap->s_net;
1122        at->src_node = sat.sat_addr.s_node = ap->s_node;
1123
1124        n = atalk_pick_and_bind_port(sk, &sat);
1125        if (!n)
1126                sock_reset_flag(sk, SOCK_ZAPPED);
1127out:
1128        return n;
1129}
1130
1131/* Set the address 'our end' of the connection */
1132static int atalk_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
1133{
1134        struct sockaddr_at *addr = (struct sockaddr_at *)uaddr;
1135        struct sock *sk = sock->sk;
1136        struct atalk_sock *at = at_sk(sk);
1137
1138        if (!sock_flag(sk, SOCK_ZAPPED) ||
1139            addr_len != sizeof(struct sockaddr_at))
1140                return -EINVAL;
1141
1142        if (addr->sat_family != AF_APPLETALK)
1143                return -EAFNOSUPPORT;
1144
1145        if (addr->sat_addr.s_net == htons(ATADDR_ANYNET)) {
1146                struct atalk_addr *ap = atalk_find_primary();
1147
1148                if (!ap)
1149                        return -EADDRNOTAVAIL;
1150
1151                at->src_net  = addr->sat_addr.s_net = ap->s_net;
1152                at->src_node = addr->sat_addr.s_node= ap->s_node;
1153        } else {
1154                if (!atalk_find_interface(addr->sat_addr.s_net,
1155                                          addr->sat_addr.s_node))
1156                        return -EADDRNOTAVAIL;
1157
1158                at->src_net  = addr->sat_addr.s_net;
1159                at->src_node = addr->sat_addr.s_node;
1160        }
1161
1162        if (addr->sat_port == ATADDR_ANYPORT) {
1163                int n = atalk_pick_and_bind_port(sk, addr);
1164
1165                if (n < 0)
1166                        return n;
1167        } else {
1168                at->src_port = addr->sat_port;
1169
1170                if (atalk_find_or_insert_socket(sk, addr))
1171                        return -EADDRINUSE;
1172        }
1173
1174        sock_reset_flag(sk, SOCK_ZAPPED);
1175        return 0;
1176}
1177
1178/* Set the address we talk to */
1179static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
1180                         int addr_len, int flags)
1181{
1182        struct sock *sk = sock->sk;
1183        struct atalk_sock *at = at_sk(sk);
1184        struct sockaddr_at *addr;
1185
1186        sk->sk_state   = TCP_CLOSE;
1187        sock->state = SS_UNCONNECTED;
1188
1189        if (addr_len != sizeof(*addr))
1190                return -EINVAL;
1191
1192        addr = (struct sockaddr_at *)uaddr;
1193
1194        if (addr->sat_family != AF_APPLETALK)
1195                return -EAFNOSUPPORT;
1196
1197        if (addr->sat_addr.s_node == ATADDR_BCAST &&
1198            !sock_flag(sk, SOCK_BROADCAST)) {
1199#if 1
1200                printk(KERN_WARNING "%s is broken and did not set "
1201                                    "SO_BROADCAST. It will break when 2.2 is "
1202                                    "released.\n",
1203                        current->comm);
1204#else
1205                return -EACCES;
1206#endif
1207        }
1208
1209        if (sock_flag(sk, SOCK_ZAPPED))
1210                if (atalk_autobind(sk) < 0)
1211                        return -EBUSY;
1212
1213        if (!atrtr_get_dev(&addr->sat_addr))
1214                return -ENETUNREACH;
1215
1216        at->dest_port = addr->sat_port;
1217        at->dest_net  = addr->sat_addr.s_net;
1218        at->dest_node = addr->sat_addr.s_node;
1219
1220        sock->state  = SS_CONNECTED;
1221        sk->sk_state = TCP_ESTABLISHED;
1222        return 0;
1223}
1224
1225/*
1226 * Find the name of an AppleTalk socket. Just copy the right
1227 * fields into the sockaddr.
1228 */
1229static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
1230                         int *uaddr_len, int peer)
1231{
1232        struct sockaddr_at sat;
1233        struct sock *sk = sock->sk;
1234        struct atalk_sock *at = at_sk(sk);
1235
1236        if (sock_flag(sk, SOCK_ZAPPED))
1237                if (atalk_autobind(sk) < 0)
1238                        return -ENOBUFS;
1239
1240        *uaddr_len = sizeof(struct sockaddr_at);
1241        memset(&sat.sat_zero, 0, sizeof(sat.sat_zero));
1242
1243        if (peer) {
1244                if (sk->sk_state != TCP_ESTABLISHED)
1245                        return -ENOTCONN;
1246
1247                sat.sat_addr.s_net  = at->dest_net;
1248                sat.sat_addr.s_node = at->dest_node;
1249                sat.sat_port        = at->dest_port;
1250        } else {
1251                sat.sat_addr.s_net  = at->src_net;
1252                sat.sat_addr.s_node = at->src_node;
1253                sat.sat_port        = at->src_port;
1254        }
1255
1256        sat.sat_family = AF_APPLETALK;
1257        memcpy(uaddr, &sat, sizeof(sat));
1258        return 0;
1259}
1260
1261#if defined(CONFIG_IPDDP) || defined(CONFIG_IPDDP_MODULE)
1262static __inline__ int is_ip_over_ddp(struct sk_buff *skb)
1263{
1264        return skb->data[12] == 22;
1265}
1266
1267static int handle_ip_over_ddp(struct sk_buff *skb)
1268{
1269        struct net_device *dev = __dev_get_by_name(&init_net, "ipddp0");
1270        struct net_device_stats *stats;
1271
1272        /* This needs to be able to handle ipddp"N" devices */
1273        if (!dev) {
1274                kfree_skb(skb);
1275                return NET_RX_DROP;
1276        }
1277
1278        skb->protocol = htons(ETH_P_IP);
1279        skb_pull(skb, 13);
1280        skb->dev   = dev;
1281        skb_reset_transport_header(skb);
1282
1283        stats = netdev_priv(dev);
1284        stats->rx_packets++;
1285        stats->rx_bytes += skb->len + 13;
1286        return netif_rx(skb);  /* Send the SKB up to a higher place. */
1287}
1288#else
1289/* make it easy for gcc to optimize this test out, i.e. kill the code */
1290#define is_ip_over_ddp(skb) 0
1291#define handle_ip_over_ddp(skb) 0
1292#endif
1293
1294static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
1295                              struct ddpehdr *ddp, __u16 len_hops, int origlen)
1296{
1297        struct atalk_route *rt;
1298        struct atalk_addr ta;
1299
1300        /*
1301         * Don't route multicast, etc., packets, or packets sent to "this
1302         * network"
1303         */
1304        if (skb->pkt_type != PACKET_HOST || !ddp->deh_dnet) {
1305                /*
1306                 * FIXME:
1307                 *
1308                 * Can it ever happen that a packet is from a PPP iface and
1309                 * needs to be broadcast onto the default network?
1310                 */
1311                if (dev->type == ARPHRD_PPP)
1312                        printk(KERN_DEBUG "AppleTalk: didn't forward broadcast "
1313                                          "packet received from PPP iface\n");
1314                goto free_it;
1315        }
1316
1317        ta.s_net  = ddp->deh_dnet;
1318        ta.s_node = ddp->deh_dnode;
1319
1320        /* Route the packet */
1321        rt = atrtr_find(&ta);
1322        /* increment hops count */
1323        len_hops += 1 << 10;
1324        if (!rt || !(len_hops & (15 << 10)))
1325                goto free_it;
1326
1327        /* FIXME: use skb->cb to be able to use shared skbs */
1328
1329        /*
1330         * Route goes through another gateway, so set the target to the
1331         * gateway instead.
1332         */
1333
1334        if (rt->flags & RTF_GATEWAY) {
1335                ta.s_net  = rt->gateway.s_net;
1336                ta.s_node = rt->gateway.s_node;
1337        }
1338
1339        /* Fix up skb->len field */
1340        skb_trim(skb, min_t(unsigned int, origlen,
1341                            (rt->dev->hard_header_len +
1342                             ddp_dl->header_length + (len_hops & 1023))));
1343
1344        /* FIXME: use skb->cb to be able to use shared skbs */
1345        ddp->deh_len_hops = htons(len_hops);
1346
1347        /*
1348         * Send the buffer onwards
1349         *
1350         * Now we must always be careful. If it's come from LocalTalk to
1351         * EtherTalk it might not fit
1352         *
1353         * Order matters here: If a packet has to be copied to make a new
1354         * headroom (rare hopefully) then it won't need unsharing.
1355         *
1356         * Note. ddp-> becomes invalid at the realloc.
1357         */
1358        if (skb_headroom(skb) < 22) {
1359                /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
1360                struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
1361                kfree_skb(skb);
1362                skb = nskb;
1363        } else
1364                skb = skb_unshare(skb, GFP_ATOMIC);
1365
1366        /*
1367         * If the buffer didn't vanish into the lack of space bitbucket we can
1368         * send it.
1369         */
1370        if (skb == NULL)
1371                goto drop;
1372
1373        if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP)
1374                return NET_RX_DROP;
1375        return NET_RX_SUCCESS;
1376free_it:
1377        kfree_skb(skb);
1378drop:
1379        return NET_RX_DROP;
1380}
1381
1382/**
1383 *      atalk_rcv - Receive a packet (in skb) from device dev
1384 *      @skb - packet received
1385 *      @dev - network device where the packet comes from
1386 *      @pt - packet type
1387 *
1388 *      Receive a packet (in skb) from device dev. This has come from the SNAP
1389 *      decoder, and on entry skb->transport_header is the DDP header, skb->len
1390 *      is the DDP header, skb->len is the DDP length. The physical headers
1391 *      have been extracted. PPP should probably pass frames marked as for this
1392 *      layer.  [ie ARPHRD_ETHERTALK]
1393 */
1394static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
1395                     struct packet_type *pt, struct net_device *orig_dev)
1396{
1397        struct ddpehdr *ddp;
1398        struct sock *sock;
1399        struct atalk_iface *atif;
1400        struct sockaddr_at tosat;
1401        int origlen;
1402        __u16 len_hops;
1403
1404        if (!net_eq(dev_net(dev), &init_net))
1405                goto drop;
1406
1407        /* Don't mangle buffer if shared */
1408        if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
1409                goto out;
1410
1411        /* Size check and make sure header is contiguous */
1412        if (!pskb_may_pull(skb, sizeof(*ddp)))
1413                goto drop;
1414
1415        ddp = ddp_hdr(skb);
1416
1417        len_hops = ntohs(ddp->deh_len_hops);
1418
1419        /* Trim buffer in case of stray trailing data */
1420        origlen = skb->len;
1421        skb_trim(skb, min_t(unsigned int, skb->len, len_hops & 1023));
1422
1423        /*
1424         * Size check to see if ddp->deh_len was crap
1425         * (Otherwise we'll detonate most spectacularly
1426         * in the middle of atalk_checksum() or recvmsg()).
1427         */
1428        if (skb->len < sizeof(*ddp) || skb->len < (len_hops & 1023)) {
1429                pr_debug("AppleTalk: dropping corrupted frame (deh_len=%u, "
1430                         "skb->len=%u)\n", len_hops & 1023, skb->len);
1431                goto drop;
1432        }
1433
1434        /*
1435         * Any checksums. Note we don't do htons() on this == is assumed to be
1436         * valid for net byte orders all over the networking code...
1437         */
1438        if (ddp->deh_sum &&
1439            atalk_checksum(skb, len_hops & 1023) != ddp->deh_sum)
1440                /* Not a valid AppleTalk frame - dustbin time */
1441                goto drop;
1442
1443        /* Check the packet is aimed at us */
1444        if (!ddp->deh_dnet)     /* Net 0 is 'this network' */
1445                atif = atalk_find_anynet(ddp->deh_dnode, dev);
1446        else
1447                atif = atalk_find_interface(ddp->deh_dnet, ddp->deh_dnode);
1448
1449        if (!atif) {
1450                /* Not ours, so we route the packet via the correct
1451                 * AppleTalk iface
1452                 */
1453                return atalk_route_packet(skb, dev, ddp, len_hops, origlen);
1454        }
1455
1456        /* if IP over DDP is not selected this code will be optimized out */
1457        if (is_ip_over_ddp(skb))
1458                return handle_ip_over_ddp(skb);
1459        /*
1460         * Which socket - atalk_search_socket() looks for a *full match*
1461         * of the <net, node, port> tuple.
1462         */
1463        tosat.sat_addr.s_net  = ddp->deh_dnet;
1464        tosat.sat_addr.s_node = ddp->deh_dnode;
1465        tosat.sat_port        = ddp->deh_dport;
1466
1467        sock = atalk_search_socket(&tosat, atif);
1468        if (!sock) /* But not one of our sockets */
1469                goto drop;
1470
1471        /* Queue packet (standard) */
1472        skb->sk = sock;
1473
1474        if (sock_queue_rcv_skb(sock, skb) < 0)
1475                goto drop;
1476
1477        return NET_RX_SUCCESS;
1478
1479drop:
1480        kfree_skb(skb);
1481out:
1482        return NET_RX_DROP;
1483
1484}
1485
1486/*
1487 * Receive a LocalTalk frame. We make some demands on the caller here.
1488 * Caller must provide enough headroom on the packet to pull the short
1489 * header and append a long one.
1490 */
1491static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
1492                     struct packet_type *pt, struct net_device *orig_dev)
1493{
1494        if (!net_eq(dev_net(dev), &init_net))
1495                goto freeit;
1496
1497        /* Expand any short form frames */
1498        if (skb_mac_header(skb)[2] == 1) {
1499                struct ddpehdr *ddp;
1500                /* Find our address */
1501                struct atalk_addr *ap = atalk_find_dev_addr(dev);
1502
1503                if (!ap || skb->len < sizeof(__be16) || skb->len > 1023)
1504                        goto freeit;
1505
1506                /* Don't mangle buffer if shared */
1507                if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
1508                        return 0;
1509
1510                /*
1511                 * The push leaves us with a ddephdr not an shdr, and
1512                 * handily the port bytes in the right place preset.
1513                 */
1514                ddp = (struct ddpehdr *) skb_push(skb, sizeof(*ddp) - 4);
1515
1516                /* Now fill in the long header */
1517
1518                /*
1519                 * These two first. The mac overlays the new source/dest
1520                 * network information so we MUST copy these before
1521                 * we write the network numbers !
1522                 */
1523
1524                ddp->deh_dnode = skb_mac_header(skb)[0];     /* From physical header */
1525                ddp->deh_snode = skb_mac_header(skb)[1];     /* From physical header */
1526
1527                ddp->deh_dnet  = ap->s_net;     /* Network number */
1528                ddp->deh_snet  = ap->s_net;
1529                ddp->deh_sum   = 0;             /* No checksum */
1530                /*
1531                 * Not sure about this bit...
1532                 */
1533                /* Non routable, so force a drop if we slip up later */
1534                ddp->deh_len_hops = htons(skb->len + (DDP_MAXHOPS << 10));
1535        }
1536        skb_reset_transport_header(skb);
1537
1538        return atalk_rcv(skb, dev, pt, orig_dev);
1539freeit:
1540        kfree_skb(skb);
1541        return 0;
1542}
1543
1544static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
1545                         size_t len)
1546{
1547        struct sock *sk = sock->sk;
1548        struct atalk_sock *at = at_sk(sk);
1549        struct sockaddr_at *usat = (struct sockaddr_at *)msg->msg_name;
1550        int flags = msg->msg_flags;
1551        int loopback = 0;
1552        struct sockaddr_at local_satalk, gsat;
1553        struct sk_buff *skb;
1554        struct net_device *dev;
1555        struct ddpehdr *ddp;
1556        int size;
1557        struct atalk_route *rt;
1558        int err;
1559
1560        if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
1561                return -EINVAL;
1562
1563        if (len > DDP_MAXSZ)
1564                return -EMSGSIZE;
1565
1566        if (usat) {
1567                if (sock_flag(sk, SOCK_ZAPPED))
1568                        if (atalk_autobind(sk) < 0)
1569                                return -EBUSY;
1570
1571                if (msg->msg_namelen < sizeof(*usat) ||
1572                    usat->sat_family != AF_APPLETALK)
1573                        return -EINVAL;
1574
1575                /* netatalk didn't implement this check */
1576                if (usat->sat_addr.s_node == ATADDR_BCAST &&
1577                    !sock_flag(sk, SOCK_BROADCAST)) {
1578                        return -EPERM;
1579                }
1580        } else {
1581                if (sk->sk_state != TCP_ESTABLISHED)
1582                        return -ENOTCONN;
1583                usat = &local_satalk;
1584                usat->sat_family      = AF_APPLETALK;
1585                usat->sat_port        = at->dest_port;
1586                usat->sat_addr.s_node = at->dest_node;
1587                usat->sat_addr.s_net  = at->dest_net;
1588        }
1589
1590        /* Build a packet */
1591        SOCK_DEBUG(sk, "SK %p: Got address.\n", sk);
1592
1593        /* For headers */
1594        size = sizeof(struct ddpehdr) + len + ddp_dl->header_length;
1595
1596        if (usat->sat_addr.s_net || usat->sat_addr.s_node == ATADDR_ANYNODE) {
1597                rt = atrtr_find(&usat->sat_addr);
1598        } else {
1599                struct atalk_addr at_hint;
1600
1601                at_hint.s_node = 0;
1602                at_hint.s_net  = at->src_net;
1603
1604                rt = atrtr_find(&at_hint);
1605        }
1606        if (!rt)
1607                return -ENETUNREACH;
1608
1609        dev = rt->dev;
1610
1611        SOCK_DEBUG(sk, "SK %p: Size needed %d, device %s\n",
1612                        sk, size, dev->name);
1613
1614        size += dev->hard_header_len;
1615        skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err);
1616        if (!skb)
1617                return err;
1618
1619        skb->sk = sk;
1620        skb_reserve(skb, ddp_dl->header_length);
1621        skb_reserve(skb, dev->hard_header_len);
1622        skb->dev = dev;
1623
1624        SOCK_DEBUG(sk, "SK %p: Begin build.\n", sk);
1625
1626        ddp = (struct ddpehdr *)skb_put(skb, sizeof(struct ddpehdr));
1627        ddp->deh_len_hops  = htons(len + sizeof(*ddp));
1628        ddp->deh_dnet  = usat->sat_addr.s_net;
1629        ddp->deh_snet  = at->src_net;
1630        ddp->deh_dnode = usat->sat_addr.s_node;
1631        ddp->deh_snode = at->src_node;
1632        ddp->deh_dport = usat->sat_port;
1633        ddp->deh_sport = at->src_port;
1634
1635        SOCK_DEBUG(sk, "SK %p: Copy user data (%Zd bytes).\n", sk, len);
1636
1637        err = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
1638        if (err) {
1639                kfree_skb(skb);
1640                return -EFAULT;
1641        }
1642
1643        if (sk->sk_no_check == 1)
1644                ddp->deh_sum = 0;
1645        else
1646                ddp->deh_sum = atalk_checksum(skb, len + sizeof(*ddp));
1647
1648        /*
1649         * Loopback broadcast packets to non gateway targets (ie routes
1650         * to group we are in)
1651         */
1652        if (ddp->deh_dnode == ATADDR_BCAST &&
1653            !(rt->flags & RTF_GATEWAY) && !(dev->flags & IFF_LOOPBACK)) {
1654                struct sk_buff *skb2 = skb_copy(skb, GFP_KERNEL);
1655
1656                if (skb2) {
1657                        loopback = 1;
1658                        SOCK_DEBUG(sk, "SK %p: send out(copy).\n", sk);
1659                        /*
1660                         * If it fails it is queued/sent above in the aarp queue
1661                         */
1662                        aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL);
1663                }
1664        }
1665
1666        if (dev->flags & IFF_LOOPBACK || loopback) {
1667                SOCK_DEBUG(sk, "SK %p: Loop back.\n", sk);
1668                /* loop back */
1669                skb_orphan(skb);
1670                if (ddp->deh_dnode == ATADDR_BCAST) {
1671                        struct atalk_addr at_lo;
1672
1673                        at_lo.s_node = 0;
1674                        at_lo.s_net  = 0;
1675
1676                        rt = atrtr_find(&at_lo);
1677                        if (!rt) {
1678                                kfree_skb(skb);
1679                                return -ENETUNREACH;
1680                        }
1681                        dev = rt->dev;
1682                        skb->dev = dev;
1683                }
1684                ddp_dl->request(ddp_dl, skb, dev->dev_addr);
1685        } else {
1686                SOCK_DEBUG(sk, "SK %p: send out.\n", sk);
1687                if (rt->flags & RTF_GATEWAY) {
1688                    gsat.sat_addr = rt->gateway;
1689                    usat = &gsat;
1690                }
1691
1692                /*
1693                 * If it fails it is queued/sent above in the aarp queue
1694                 */
1695                aarp_send_ddp(dev, skb, &usat->sat_addr, NULL);
1696        }
1697        SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len);
1698
1699        return len;
1700}
1701
1702static int atalk_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
1703                         size_t size, int flags)
1704{
1705        struct sock *sk = sock->sk;
1706        struct sockaddr_at *sat = (struct sockaddr_at *)msg->msg_name;
1707        struct ddpehdr *ddp;
1708        int copied = 0;
1709        int offset = 0;
1710        int err = 0;
1711        struct sk_buff *skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
1712                                                flags & MSG_DONTWAIT, &err);
1713        if (!skb)
1714                return err;
1715
1716        /* FIXME: use skb->cb to be able to use shared skbs */
1717        ddp = ddp_hdr(skb);
1718        copied = ntohs(ddp->deh_len_hops) & 1023;
1719
1720        if (sk->sk_type != SOCK_RAW) {
1721                offset = sizeof(*ddp);
1722                copied -= offset;
1723        }
1724
1725        if (copied > size) {
1726                copied = size;
1727                msg->msg_flags |= MSG_TRUNC;
1728        }
1729        err = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copied);
1730
1731        if (!err) {
1732                if (sat) {
1733                        sat->sat_family      = AF_APPLETALK;
1734                        sat->sat_port        = ddp->deh_sport;
1735                        sat->sat_addr.s_node = ddp->deh_snode;
1736                        sat->sat_addr.s_net  = ddp->deh_snet;
1737                }
1738                msg->msg_namelen = sizeof(*sat);
1739        }
1740
1741        skb_free_datagram(sk, skb);     /* Free the datagram. */
1742        return err ? : copied;
1743}
1744
1745
1746/*
1747 * AppleTalk ioctl calls.
1748 */
1749static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1750{
1751        int rc = -ENOIOCTLCMD;
1752        struct sock *sk = sock->sk;
1753        void __user *argp = (void __user *)arg;
1754
1755        switch (cmd) {
1756                /* Protocol layer */
1757                case TIOCOUTQ: {
1758                        long amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1759
1760                        if (amount < 0)
1761                                amount = 0;
1762                        rc = put_user(amount, (int __user *)argp);
1763                        break;
1764                }
1765                case TIOCINQ: {
1766                        /*
1767                         * These two are safe on a single CPU system as only
1768                         * user tasks fiddle here
1769                         */
1770                        struct sk_buff *skb = skb_peek(&sk->sk_receive_queue);
1771                        long amount = 0;
1772
1773                        if (skb)
1774                                amount = skb->len - sizeof(struct ddpehdr);
1775                        rc = put_user(amount, (int __user *)argp);
1776                        break;
1777                }
1778                case SIOCGSTAMP:
1779                        rc = sock_get_timestamp(sk, argp);
1780                        break;
1781                case SIOCGSTAMPNS:
1782                        rc = sock_get_timestampns(sk, argp);
1783                        break;
1784                /* Routing */
1785                case SIOCADDRT:
1786                case SIOCDELRT:
1787                        rc = -EPERM;
1788                        if (capable(CAP_NET_ADMIN))
1789                                rc = atrtr_ioctl(cmd, argp);
1790                        break;
1791                /* Interface */
1792                case SIOCGIFADDR:
1793                case SIOCSIFADDR:
1794                case SIOCGIFBRDADDR:
1795                case SIOCATALKDIFADDR:
1796                case SIOCDIFADDR:
1797                case SIOCSARP:          /* proxy AARP */
1798                case SIOCDARP:          /* proxy AARP */
1799                        rtnl_lock();
1800                        rc = atif_ioctl(cmd, argp);
1801                        rtnl_unlock();
1802                        break;
1803        }
1804
1805        return rc;
1806}
1807
1808
1809#ifdef CONFIG_COMPAT
1810static int atalk_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1811{
1812        /*
1813         * All Appletalk ioctls except SIOCATALKDIFADDR are standard.  And
1814         * SIOCATALKDIFADDR is handled by upper layer as well, so there is
1815         * nothing to do.  Eventually SIOCATALKDIFADDR should be moved
1816         * here so there is no generic SIOCPROTOPRIVATE translation in the
1817         * system.
1818         */
1819        return -ENOIOCTLCMD;
1820}
1821#endif
1822
1823
1824static struct net_proto_family atalk_family_ops = {
1825        .family         = PF_APPLETALK,
1826        .create         = atalk_create,
1827        .owner          = THIS_MODULE,
1828};
1829
1830static const struct proto_ops SOCKOPS_WRAPPED(atalk_dgram_ops) = {
1831        .family         = PF_APPLETALK,
1832        .owner          = THIS_MODULE,
1833        .release        = atalk_release,
1834        .bind           = atalk_bind,
1835        .connect        = atalk_connect,
1836        .socketpair     = sock_no_socketpair,
1837        .accept         = sock_no_accept,
1838        .getname        = atalk_getname,
1839        .poll           = datagram_poll,
1840        .ioctl          = atalk_ioctl,
1841#ifdef CONFIG_COMPAT
1842        .compat_ioctl   = atalk_compat_ioctl,
1843#endif
1844        .listen         = sock_no_listen,
1845        .shutdown       = sock_no_shutdown,
1846        .setsockopt     = sock_no_setsockopt,
1847        .getsockopt     = sock_no_getsockopt,
1848        .sendmsg        = atalk_sendmsg,
1849        .recvmsg        = atalk_recvmsg,
1850        .mmap           = sock_no_mmap,
1851        .sendpage       = sock_no_sendpage,
1852};
1853
1854SOCKOPS_WRAP(atalk_dgram, PF_APPLETALK);
1855
1856static struct notifier_block ddp_notifier = {
1857        .notifier_call  = ddp_device_event,
1858};
1859
1860static struct packet_type ltalk_packet_type __read_mostly = {
1861        .type           = cpu_to_be16(ETH_P_LOCALTALK),
1862        .func           = ltalk_rcv,
1863};
1864
1865static struct packet_type ppptalk_packet_type __read_mostly = {
1866        .type           = cpu_to_be16(ETH_P_PPPTALK),
1867        .func           = atalk_rcv,
1868};
1869
1870static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B };
1871
1872/* Export symbols for use by drivers when AppleTalk is a module */
1873EXPORT_SYMBOL(atrtr_get_dev);
1874EXPORT_SYMBOL(atalk_find_dev_addr);
1875
1876static const char atalk_err_snap[] __initconst =
1877        KERN_CRIT "Unable to register DDP with SNAP.\n";
1878
1879/* Called by proto.c on kernel start up */
1880static int __init atalk_init(void)
1881{
1882        int rc = proto_register(&ddp_proto, 0);
1883
1884        if (rc != 0)
1885                goto out;
1886
1887        (void)sock_register(&atalk_family_ops);
1888        ddp_dl = register_snap_client(ddp_snap_id, atalk_rcv);
1889        if (!ddp_dl)
1890                printk(atalk_err_snap);
1891
1892        dev_add_pack(&ltalk_packet_type);
1893        dev_add_pack(&ppptalk_packet_type);
1894
1895        register_netdevice_notifier(&ddp_notifier);
1896        aarp_proto_init();
1897        atalk_proc_init();
1898        atalk_register_sysctl();
1899out:
1900        return rc;
1901}
1902module_init(atalk_init);
1903
1904/*
1905 * No explicit module reference count manipulation is needed in the
1906 * protocol. Socket layer sets module reference count for us
1907 * and interfaces reference counting is done
1908 * by the network device layer.
1909 *
1910 * Ergo, before the AppleTalk module can be removed, all AppleTalk
1911 * sockets be closed from user space.
1912 */
1913static void __exit atalk_exit(void)
1914{
1915#ifdef CONFIG_SYSCTL
1916        atalk_unregister_sysctl();
1917#endif /* CONFIG_SYSCTL */
1918        atalk_proc_exit();
1919        aarp_cleanup_module();  /* General aarp clean-up. */
1920        unregister_netdevice_notifier(&ddp_notifier);
1921        dev_remove_pack(&ltalk_packet_type);
1922        dev_remove_pack(&ppptalk_packet_type);
1923        unregister_snap_client(ddp_dl);
1924        sock_unregister(PF_APPLETALK);
1925        proto_unregister(&ddp_proto);
1926}
1927module_exit(atalk_exit);
1928
1929MODULE_LICENSE("GPL");
1930MODULE_AUTHOR("Alan Cox <alan@lxorguk.ukuu.org.uk>");
1931MODULE_DESCRIPTION("AppleTalk 0.20\n");
1932MODULE_ALIAS_NETPROTO(PF_APPLETALK);
1933