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