linux/net/llc/af_llc.c
<<
>>
Prefs
   1/*
   2 * af_llc.c - LLC User Interface SAPs
   3 * Description:
   4 *   Functions in this module are implementation of socket based llc
   5 *   communications for the Linux operating system. Support of llc class
   6 *   one and class two is provided via SOCK_DGRAM and SOCK_STREAM
   7 *   respectively.
   8 *
   9 *   An llc2 connection is (mac + sap), only one llc2 sap connection
  10 *   is allowed per mac. Though one sap may have multiple mac + sap
  11 *   connections.
  12 *
  13 * Copyright (c) 2001 by Jay Schulist <jschlst@samba.org>
  14 *               2002-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  15 *
  16 * This program can be redistributed or modified under the terms of the
  17 * GNU General Public License as published by the Free Software Foundation.
  18 * This program is distributed without any warranty or implied warranty
  19 * of merchantability or fitness for a particular purpose.
  20 *
  21 * See the GNU General Public License for more details.
  22 */
  23#include <linux/compiler.h>
  24#include <linux/kernel.h>
  25#include <linux/module.h>
  26#include <linux/rtnetlink.h>
  27#include <linux/init.h>
  28#include <linux/slab.h>
  29#include <linux/sched/signal.h>
  30
  31#include <net/llc.h>
  32#include <net/llc_sap.h>
  33#include <net/llc_pdu.h>
  34#include <net/llc_conn.h>
  35#include <net/tcp_states.h>
  36
  37/* remember: uninitialized global data is zeroed because its in .bss */
  38static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
  39static u16 llc_ui_sap_link_no_max[256];
  40static struct sockaddr_llc llc_ui_addrnull;
  41static const struct proto_ops llc_ui_ops;
  42
  43static bool llc_ui_wait_for_conn(struct sock *sk, long timeout);
  44static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
  45static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout);
  46
  47#if 0
  48#define dprintk(args...) printk(KERN_DEBUG args)
  49#else
  50#define dprintk(args...)
  51#endif
  52
  53/* Maybe we'll add some more in the future. */
  54#define LLC_CMSG_PKTINFO        1
  55
  56
  57/**
  58 *      llc_ui_next_link_no - return the next unused link number for a sap
  59 *      @sap: Address of sap to get link number from.
  60 *
  61 *      Return the next unused link number for a given sap.
  62 */
  63static inline u16 llc_ui_next_link_no(int sap)
  64{
  65        return llc_ui_sap_link_no_max[sap]++;
  66}
  67
  68/**
  69 *      llc_proto_type - return eth protocol for ARP header type
  70 *      @arphrd: ARP header type.
  71 *
  72 *      Given an ARP header type return the corresponding ethernet protocol.
  73 */
  74static inline __be16 llc_proto_type(u16 arphrd)
  75{
  76        return htons(ETH_P_802_2);
  77}
  78
  79/**
  80 *      llc_ui_addr_null - determines if a address structure is null
  81 *      @addr: Address to test if null.
  82 */
  83static inline u8 llc_ui_addr_null(struct sockaddr_llc *addr)
  84{
  85        return !memcmp(addr, &llc_ui_addrnull, sizeof(*addr));
  86}
  87
  88/**
  89 *      llc_ui_header_len - return length of llc header based on operation
  90 *      @sk: Socket which contains a valid llc socket type.
  91 *      @addr: Complete sockaddr_llc structure received from the user.
  92 *
  93 *      Provide the length of the llc header depending on what kind of
  94 *      operation the user would like to perform and the type of socket.
  95 *      Returns the correct llc header length.
  96 */
  97static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr)
  98{
  99        u8 rc = LLC_PDU_LEN_U;
 100
 101        if (addr->sllc_test || addr->sllc_xid)
 102                rc = LLC_PDU_LEN_U;
 103        else if (sk->sk_type == SOCK_STREAM)
 104                rc = LLC_PDU_LEN_I;
 105        return rc;
 106}
 107
 108/**
 109 *      llc_ui_send_data - send data via reliable llc2 connection
 110 *      @sk: Connection the socket is using.
 111 *      @skb: Data the user wishes to send.
 112 *      @noblock: can we block waiting for data?
 113 *
 114 *      Send data via reliable llc2 connection.
 115 *      Returns 0 upon success, non-zero if action did not succeed.
 116 */
 117static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
 118{
 119        struct llc_sock* llc = llc_sk(sk);
 120        int rc = 0;
 121
 122        if (unlikely(llc_data_accept_state(llc->state) ||
 123                     llc->remote_busy_flag ||
 124                     llc->p_flag)) {
 125                long timeout = sock_sndtimeo(sk, noblock);
 126
 127                rc = llc_ui_wait_for_busy_core(sk, timeout);
 128        }
 129        if (unlikely(!rc))
 130                rc = llc_build_and_send_pkt(sk, skb);
 131        return rc;
 132}
 133
 134static void llc_ui_sk_init(struct socket *sock, struct sock *sk)
 135{
 136        sock_graft(sk, sock);
 137        sk->sk_type     = sock->type;
 138        sock->ops       = &llc_ui_ops;
 139}
 140
 141static struct proto llc_proto = {
 142        .name     = "LLC",
 143        .owner    = THIS_MODULE,
 144        .obj_size = sizeof(struct llc_sock),
 145        .slab_flags = SLAB_TYPESAFE_BY_RCU,
 146};
 147
 148/**
 149 *      llc_ui_create - alloc and init a new llc_ui socket
 150 *      @net: network namespace (must be default network)
 151 *      @sock: Socket to initialize and attach allocated sk to.
 152 *      @protocol: Unused.
 153 *      @kern: on behalf of kernel or userspace
 154 *
 155 *      Allocate and initialize a new llc_ui socket, validate the user wants a
 156 *      socket type we have available.
 157 *      Returns 0 upon success, negative upon failure.
 158 */
 159static int llc_ui_create(struct net *net, struct socket *sock, int protocol,
 160                         int kern)
 161{
 162        struct sock *sk;
 163        int rc = -ESOCKTNOSUPPORT;
 164
 165        if (!ns_capable(net->user_ns, CAP_NET_RAW))
 166                return -EPERM;
 167
 168        if (!net_eq(net, &init_net))
 169                return -EAFNOSUPPORT;
 170
 171        if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) {
 172                rc = -ENOMEM;
 173                sk = llc_sk_alloc(net, PF_LLC, GFP_KERNEL, &llc_proto, kern);
 174                if (sk) {
 175                        rc = 0;
 176                        llc_ui_sk_init(sock, sk);
 177                }
 178        }
 179        return rc;
 180}
 181
 182/**
 183 *      llc_ui_release - shutdown socket
 184 *      @sock: Socket to release.
 185 *
 186 *      Shutdown and deallocate an existing socket.
 187 */
 188static int llc_ui_release(struct socket *sock)
 189{
 190        struct sock *sk = sock->sk;
 191        struct llc_sock *llc;
 192
 193        if (unlikely(sk == NULL))
 194                goto out;
 195        sock_hold(sk);
 196        lock_sock(sk);
 197        llc = llc_sk(sk);
 198        dprintk("%s: closing local(%02X) remote(%02X)\n", __func__,
 199                llc->laddr.lsap, llc->daddr.lsap);
 200        if (!llc_send_disc(sk))
 201                llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
 202        if (!sock_flag(sk, SOCK_ZAPPED))
 203                llc_sap_remove_socket(llc->sap, sk);
 204        release_sock(sk);
 205        if (llc->dev)
 206                dev_put(llc->dev);
 207        sock_put(sk);
 208        llc_sk_free(sk);
 209out:
 210        return 0;
 211}
 212
 213/**
 214 *      llc_ui_autoport - provide dynamically allocate SAP number
 215 *
 216 *      Provide the caller with a dynamically allocated SAP number according
 217 *      to the rules that are set in this function. Returns: 0, upon failure,
 218 *      SAP number otherwise.
 219 */
 220static int llc_ui_autoport(void)
 221{
 222        struct llc_sap *sap;
 223        int i, tries = 0;
 224
 225        while (tries < LLC_SAP_DYN_TRIES) {
 226                for (i = llc_ui_sap_last_autoport;
 227                     i < LLC_SAP_DYN_STOP; i += 2) {
 228                        sap = llc_sap_find(i);
 229                        if (!sap) {
 230                                llc_ui_sap_last_autoport = i + 2;
 231                                goto out;
 232                        }
 233                        llc_sap_put(sap);
 234                }
 235                llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
 236                tries++;
 237        }
 238        i = 0;
 239out:
 240        return i;
 241}
 242
 243/**
 244 *      llc_ui_autobind - automatically bind a socket to a sap
 245 *      @sock: socket to bind
 246 *      @addr: address to connect to
 247 *
 248 *      Used by llc_ui_connect and llc_ui_sendmsg when the user hasn't
 249 *      specifically used llc_ui_bind to bind to an specific address/sap
 250 *
 251 *      Returns: 0 upon success, negative otherwise.
 252 */
 253static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
 254{
 255        struct sock *sk = sock->sk;
 256        struct llc_sock *llc = llc_sk(sk);
 257        struct llc_sap *sap;
 258        int rc = -EINVAL;
 259
 260        if (!sock_flag(sk, SOCK_ZAPPED))
 261                goto out;
 262        rc = -ENODEV;
 263        if (sk->sk_bound_dev_if) {
 264                llc->dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if);
 265                if (llc->dev && addr->sllc_arphrd != llc->dev->type) {
 266                        dev_put(llc->dev);
 267                        llc->dev = NULL;
 268                }
 269        } else
 270                llc->dev = dev_getfirstbyhwtype(&init_net, addr->sllc_arphrd);
 271        if (!llc->dev)
 272                goto out;
 273        rc = -EUSERS;
 274        llc->laddr.lsap = llc_ui_autoport();
 275        if (!llc->laddr.lsap)
 276                goto out;
 277        rc = -EBUSY; /* some other network layer is using the sap */
 278        sap = llc_sap_open(llc->laddr.lsap, NULL);
 279        if (!sap)
 280                goto out;
 281        memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
 282        memcpy(&llc->addr, addr, sizeof(llc->addr));
 283        /* assign new connection to its SAP */
 284        llc_sap_add_socket(sap, sk);
 285        sock_reset_flag(sk, SOCK_ZAPPED);
 286        rc = 0;
 287out:
 288        return rc;
 289}
 290
 291/**
 292 *      llc_ui_bind - bind a socket to a specific address.
 293 *      @sock: Socket to bind an address to.
 294 *      @uaddr: Address the user wants the socket bound to.
 295 *      @addrlen: Length of the uaddr structure.
 296 *
 297 *      Bind a socket to a specific address. For llc a user is able to bind to
 298 *      a specific sap only or mac + sap.
 299 *      If the user desires to bind to a specific mac + sap, it is possible to
 300 *      have multiple sap connections via multiple macs.
 301 *      Bind and autobind for that matter must enforce the correct sap usage
 302 *      otherwise all hell will break loose.
 303 *      Returns: 0 upon success, negative otherwise.
 304 */
 305static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
 306{
 307        struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
 308        struct sock *sk = sock->sk;
 309        struct llc_sock *llc = llc_sk(sk);
 310        struct llc_sap *sap;
 311        int rc = -EINVAL;
 312
 313        dprintk("%s: binding %02X\n", __func__, addr->sllc_sap);
 314
 315        lock_sock(sk);
 316        if (unlikely(!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr)))
 317                goto out;
 318        rc = -EAFNOSUPPORT;
 319        if (unlikely(addr->sllc_family != AF_LLC))
 320                goto out;
 321        rc = -ENODEV;
 322        rcu_read_lock();
 323        if (sk->sk_bound_dev_if) {
 324                llc->dev = dev_get_by_index_rcu(&init_net, sk->sk_bound_dev_if);
 325                if (llc->dev) {
 326                        if (!addr->sllc_arphrd)
 327                                addr->sllc_arphrd = llc->dev->type;
 328                        if (is_zero_ether_addr(addr->sllc_mac))
 329                                memcpy(addr->sllc_mac, llc->dev->dev_addr,
 330                                       IFHWADDRLEN);
 331                        if (addr->sllc_arphrd != llc->dev->type ||
 332                            !ether_addr_equal(addr->sllc_mac,
 333                                              llc->dev->dev_addr)) {
 334                                rc = -EINVAL;
 335                                llc->dev = NULL;
 336                        }
 337                }
 338        } else
 339                llc->dev = dev_getbyhwaddr_rcu(&init_net, addr->sllc_arphrd,
 340                                           addr->sllc_mac);
 341        if (llc->dev)
 342                dev_hold(llc->dev);
 343        rcu_read_unlock();
 344        if (!llc->dev)
 345                goto out;
 346        if (!addr->sllc_sap) {
 347                rc = -EUSERS;
 348                addr->sllc_sap = llc_ui_autoport();
 349                if (!addr->sllc_sap)
 350                        goto out;
 351        }
 352        sap = llc_sap_find(addr->sllc_sap);
 353        if (!sap) {
 354                sap = llc_sap_open(addr->sllc_sap, NULL);
 355                rc = -EBUSY; /* some other network layer is using the sap */
 356                if (!sap)
 357                        goto out;
 358        } else {
 359                struct llc_addr laddr, daddr;
 360                struct sock *ask;
 361
 362                memset(&laddr, 0, sizeof(laddr));
 363                memset(&daddr, 0, sizeof(daddr));
 364                /*
 365                 * FIXME: check if the address is multicast,
 366                 *        only SOCK_DGRAM can do this.
 367                 */
 368                memcpy(laddr.mac, addr->sllc_mac, IFHWADDRLEN);
 369                laddr.lsap = addr->sllc_sap;
 370                rc = -EADDRINUSE; /* mac + sap clash. */
 371                ask = llc_lookup_established(sap, &daddr, &laddr);
 372                if (ask) {
 373                        sock_put(ask);
 374                        goto out_put;
 375                }
 376        }
 377        llc->laddr.lsap = addr->sllc_sap;
 378        memcpy(llc->laddr.mac, addr->sllc_mac, IFHWADDRLEN);
 379        memcpy(&llc->addr, addr, sizeof(llc->addr));
 380        /* assign new connection to its SAP */
 381        llc_sap_add_socket(sap, sk);
 382        sock_reset_flag(sk, SOCK_ZAPPED);
 383        rc = 0;
 384out_put:
 385        llc_sap_put(sap);
 386out:
 387        release_sock(sk);
 388        return rc;
 389}
 390
 391/**
 392 *      llc_ui_shutdown - shutdown a connect llc2 socket.
 393 *      @sock: Socket to shutdown.
 394 *      @how: What part of the socket to shutdown.
 395 *
 396 *      Shutdown a connected llc2 socket. Currently this function only supports
 397 *      shutting down both sends and receives (2), we could probably make this
 398 *      function such that a user can shutdown only half the connection but not
 399 *      right now.
 400 *      Returns: 0 upon success, negative otherwise.
 401 */
 402static int llc_ui_shutdown(struct socket *sock, int how)
 403{
 404        struct sock *sk = sock->sk;
 405        int rc = -ENOTCONN;
 406
 407        lock_sock(sk);
 408        if (unlikely(sk->sk_state != TCP_ESTABLISHED))
 409                goto out;
 410        rc = -EINVAL;
 411        if (how != 2)
 412                goto out;
 413        rc = llc_send_disc(sk);
 414        if (!rc)
 415                rc = llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
 416        /* Wake up anyone sleeping in poll */
 417        sk->sk_state_change(sk);
 418out:
 419        release_sock(sk);
 420        return rc;
 421}
 422
 423/**
 424 *      llc_ui_connect - Connect to a remote llc2 mac + sap.
 425 *      @sock: Socket which will be connected to the remote destination.
 426 *      @uaddr: Remote and possibly the local address of the new connection.
 427 *      @addrlen: Size of uaddr structure.
 428 *      @flags: Operational flags specified by the user.
 429 *
 430 *      Connect to a remote llc2 mac + sap. The caller must specify the
 431 *      destination mac and address to connect to. If the user hasn't previously
 432 *      called bind(2) with a smac the address of the first interface of the
 433 *      specified arp type will be used.
 434 *      This function will autobind if user did not previously call bind.
 435 *      Returns: 0 upon success, negative otherwise.
 436 */
 437static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
 438                          int addrlen, int flags)
 439{
 440        struct sock *sk = sock->sk;
 441        struct llc_sock *llc = llc_sk(sk);
 442        struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
 443        int rc = -EINVAL;
 444
 445        lock_sock(sk);
 446        if (unlikely(addrlen != sizeof(*addr)))
 447                goto out;
 448        rc = -EAFNOSUPPORT;
 449        if (unlikely(addr->sllc_family != AF_LLC))
 450                goto out;
 451        if (unlikely(sk->sk_type != SOCK_STREAM))
 452                goto out;
 453        rc = -EALREADY;
 454        if (unlikely(sock->state == SS_CONNECTING))
 455                goto out;
 456        /* bind connection to sap if user hasn't done it. */
 457        if (sock_flag(sk, SOCK_ZAPPED)) {
 458                /* bind to sap with null dev, exclusive */
 459                rc = llc_ui_autobind(sock, addr);
 460                if (rc)
 461                        goto out;
 462        }
 463        llc->daddr.lsap = addr->sllc_sap;
 464        memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN);
 465        sock->state = SS_CONNECTING;
 466        sk->sk_state   = TCP_SYN_SENT;
 467        llc->link   = llc_ui_next_link_no(llc->sap->laddr.lsap);
 468        rc = llc_establish_connection(sk, llc->dev->dev_addr,
 469                                      addr->sllc_mac, addr->sllc_sap);
 470        if (rc) {
 471                dprintk("%s: llc_ui_send_conn failed :-(\n", __func__);
 472                sock->state  = SS_UNCONNECTED;
 473                sk->sk_state = TCP_CLOSE;
 474                goto out;
 475        }
 476
 477        if (sk->sk_state == TCP_SYN_SENT) {
 478                const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
 479
 480                if (!timeo || !llc_ui_wait_for_conn(sk, timeo))
 481                        goto out;
 482
 483                rc = sock_intr_errno(timeo);
 484                if (signal_pending(current))
 485                        goto out;
 486        }
 487
 488        if (sk->sk_state == TCP_CLOSE)
 489                goto sock_error;
 490
 491        sock->state = SS_CONNECTED;
 492        rc = 0;
 493out:
 494        release_sock(sk);
 495        return rc;
 496sock_error:
 497        rc = sock_error(sk) ? : -ECONNABORTED;
 498        sock->state = SS_UNCONNECTED;
 499        goto out;
 500}
 501
 502/**
 503 *      llc_ui_listen - allow a normal socket to accept incoming connections
 504 *      @sock: Socket to allow incoming connections on.
 505 *      @backlog: Number of connections to queue.
 506 *
 507 *      Allow a normal socket to accept incoming connections.
 508 *      Returns 0 upon success, negative otherwise.
 509 */
 510static int llc_ui_listen(struct socket *sock, int backlog)
 511{
 512        struct sock *sk = sock->sk;
 513        int rc = -EINVAL;
 514
 515        lock_sock(sk);
 516        if (unlikely(sock->state != SS_UNCONNECTED))
 517                goto out;
 518        rc = -EOPNOTSUPP;
 519        if (unlikely(sk->sk_type != SOCK_STREAM))
 520                goto out;
 521        rc = -EAGAIN;
 522        if (sock_flag(sk, SOCK_ZAPPED))
 523                goto out;
 524        rc = 0;
 525        if (!(unsigned int)backlog)     /* BSDism */
 526                backlog = 1;
 527        sk->sk_max_ack_backlog = backlog;
 528        if (sk->sk_state != TCP_LISTEN) {
 529                sk->sk_ack_backlog = 0;
 530                sk->sk_state       = TCP_LISTEN;
 531        }
 532        sk->sk_socket->flags |= __SO_ACCEPTCON;
 533out:
 534        release_sock(sk);
 535        return rc;
 536}
 537
 538static int llc_ui_wait_for_disc(struct sock *sk, long timeout)
 539{
 540        DEFINE_WAIT_FUNC(wait, woken_wake_function);
 541        int rc = 0;
 542
 543        add_wait_queue(sk_sleep(sk), &wait);
 544        while (1) {
 545                if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE, &wait))
 546                        break;
 547                rc = -ERESTARTSYS;
 548                if (signal_pending(current))
 549                        break;
 550                rc = -EAGAIN;
 551                if (!timeout)
 552                        break;
 553                rc = 0;
 554        }
 555        remove_wait_queue(sk_sleep(sk), &wait);
 556        return rc;
 557}
 558
 559static bool llc_ui_wait_for_conn(struct sock *sk, long timeout)
 560{
 561        DEFINE_WAIT_FUNC(wait, woken_wake_function);
 562
 563        add_wait_queue(sk_sleep(sk), &wait);
 564        while (1) {
 565                if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT, &wait))
 566                        break;
 567                if (signal_pending(current) || !timeout)
 568                        break;
 569        }
 570        remove_wait_queue(sk_sleep(sk), &wait);
 571        return timeout;
 572}
 573
 574static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
 575{
 576        DEFINE_WAIT_FUNC(wait, woken_wake_function);
 577        struct llc_sock *llc = llc_sk(sk);
 578        int rc;
 579
 580        add_wait_queue(sk_sleep(sk), &wait);
 581        while (1) {
 582                rc = 0;
 583                if (sk_wait_event(sk, &timeout,
 584                                  (sk->sk_shutdown & RCV_SHUTDOWN) ||
 585                                  (!llc_data_accept_state(llc->state) &&
 586                                   !llc->remote_busy_flag &&
 587                                   !llc->p_flag), &wait))
 588                        break;
 589                rc = -ERESTARTSYS;
 590                if (signal_pending(current))
 591                        break;
 592                rc = -EAGAIN;
 593                if (!timeout)
 594                        break;
 595        }
 596        remove_wait_queue(sk_sleep(sk), &wait);
 597        return rc;
 598}
 599
 600static int llc_wait_data(struct sock *sk, long timeo)
 601{
 602        int rc;
 603
 604        while (1) {
 605                /*
 606                 * POSIX 1003.1g mandates this order.
 607                 */
 608                rc = sock_error(sk);
 609                if (rc)
 610                        break;
 611                rc = 0;
 612                if (sk->sk_shutdown & RCV_SHUTDOWN)
 613                        break;
 614                rc = -EAGAIN;
 615                if (!timeo)
 616                        break;
 617                rc = sock_intr_errno(timeo);
 618                if (signal_pending(current))
 619                        break;
 620                rc = 0;
 621                if (sk_wait_data(sk, &timeo, NULL))
 622                        break;
 623        }
 624        return rc;
 625}
 626
 627static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb)
 628{
 629        struct llc_sock *llc = llc_sk(skb->sk);
 630
 631        if (llc->cmsg_flags & LLC_CMSG_PKTINFO) {
 632                struct llc_pktinfo info;
 633
 634                memset(&info, 0, sizeof(info));
 635                info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex;
 636                llc_pdu_decode_dsap(skb, &info.lpi_sap);
 637                llc_pdu_decode_da(skb, info.lpi_mac);
 638                put_cmsg(msg, SOL_LLC, LLC_OPT_PKTINFO, sizeof(info), &info);
 639        }
 640}
 641
 642/**
 643 *      llc_ui_accept - accept a new incoming connection.
 644 *      @sock: Socket which connections arrive on.
 645 *      @newsock: Socket to move incoming connection to.
 646 *      @flags: User specified operational flags.
 647 *      @kern: If the socket is kernel internal
 648 *
 649 *      Accept a new incoming connection.
 650 *      Returns 0 upon success, negative otherwise.
 651 */
 652static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags,
 653                         bool kern)
 654{
 655        struct sock *sk = sock->sk, *newsk;
 656        struct llc_sock *llc, *newllc;
 657        struct sk_buff *skb;
 658        int rc = -EOPNOTSUPP;
 659
 660        dprintk("%s: accepting on %02X\n", __func__,
 661                llc_sk(sk)->laddr.lsap);
 662        lock_sock(sk);
 663        if (unlikely(sk->sk_type != SOCK_STREAM))
 664                goto out;
 665        rc = -EINVAL;
 666        if (unlikely(sock->state != SS_UNCONNECTED ||
 667                     sk->sk_state != TCP_LISTEN))
 668                goto out;
 669        /* wait for a connection to arrive. */
 670        if (skb_queue_empty(&sk->sk_receive_queue)) {
 671                rc = llc_wait_data(sk, sk->sk_rcvtimeo);
 672                if (rc)
 673                        goto out;
 674        }
 675        dprintk("%s: got a new connection on %02X\n", __func__,
 676                llc_sk(sk)->laddr.lsap);
 677        skb = skb_dequeue(&sk->sk_receive_queue);
 678        rc = -EINVAL;
 679        if (!skb->sk)
 680                goto frees;
 681        rc = 0;
 682        newsk = skb->sk;
 683        /* attach connection to a new socket. */
 684        llc_ui_sk_init(newsock, newsk);
 685        sock_reset_flag(newsk, SOCK_ZAPPED);
 686        newsk->sk_state         = TCP_ESTABLISHED;
 687        newsock->state          = SS_CONNECTED;
 688        llc                     = llc_sk(sk);
 689        newllc                  = llc_sk(newsk);
 690        memcpy(&newllc->addr, &llc->addr, sizeof(newllc->addr));
 691        newllc->link = llc_ui_next_link_no(newllc->laddr.lsap);
 692
 693        /* put original socket back into a clean listen state. */
 694        sk->sk_state = TCP_LISTEN;
 695        sk->sk_ack_backlog--;
 696        dprintk("%s: ok success on %02X, client on %02X\n", __func__,
 697                llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
 698frees:
 699        kfree_skb(skb);
 700out:
 701        release_sock(sk);
 702        return rc;
 703}
 704
 705/**
 706 *      llc_ui_recvmsg - copy received data to the socket user.
 707 *      @sock: Socket to copy data from.
 708 *      @msg: Various user space related information.
 709 *      @len: Size of user buffer.
 710 *      @flags: User specified flags.
 711 *
 712 *      Copy received data to the socket user.
 713 *      Returns non-negative upon success, negative otherwise.
 714 */
 715static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 716                          int flags)
 717{
 718        DECLARE_SOCKADDR(struct sockaddr_llc *, uaddr, msg->msg_name);
 719        const int nonblock = flags & MSG_DONTWAIT;
 720        struct sk_buff *skb = NULL;
 721        struct sock *sk = sock->sk;
 722        struct llc_sock *llc = llc_sk(sk);
 723        unsigned long cpu_flags;
 724        size_t copied = 0;
 725        u32 peek_seq = 0;
 726        u32 *seq, skb_len;
 727        unsigned long used;
 728        int target;     /* Read at least this many bytes */
 729        long timeo;
 730
 731        lock_sock(sk);
 732        copied = -ENOTCONN;
 733        if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN))
 734                goto out;
 735
 736        timeo = sock_rcvtimeo(sk, nonblock);
 737
 738        seq = &llc->copied_seq;
 739        if (flags & MSG_PEEK) {
 740                peek_seq = llc->copied_seq;
 741                seq = &peek_seq;
 742        }
 743
 744        target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
 745        copied = 0;
 746
 747        do {
 748                u32 offset;
 749
 750                /*
 751                 * We need to check signals first, to get correct SIGURG
 752                 * handling. FIXME: Need to check this doesn't impact 1003.1g
 753                 * and move it down to the bottom of the loop
 754                 */
 755                if (signal_pending(current)) {
 756                        if (copied)
 757                                break;
 758                        copied = timeo ? sock_intr_errno(timeo) : -EAGAIN;
 759                        break;
 760                }
 761
 762                /* Next get a buffer. */
 763
 764                skb = skb_peek(&sk->sk_receive_queue);
 765                if (skb) {
 766                        offset = *seq;
 767                        goto found_ok_skb;
 768                }
 769                /* Well, if we have backlog, try to process it now yet. */
 770
 771                if (copied >= target && !sk->sk_backlog.tail)
 772                        break;
 773
 774                if (copied) {
 775                        if (sk->sk_err ||
 776                            sk->sk_state == TCP_CLOSE ||
 777                            (sk->sk_shutdown & RCV_SHUTDOWN) ||
 778                            !timeo ||
 779                            (flags & MSG_PEEK))
 780                                break;
 781                } else {
 782                        if (sock_flag(sk, SOCK_DONE))
 783                                break;
 784
 785                        if (sk->sk_err) {
 786                                copied = sock_error(sk);
 787                                break;
 788                        }
 789                        if (sk->sk_shutdown & RCV_SHUTDOWN)
 790                                break;
 791
 792                        if (sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_CLOSE) {
 793                                if (!sock_flag(sk, SOCK_DONE)) {
 794                                        /*
 795                                         * This occurs when user tries to read
 796                                         * from never connected socket.
 797                                         */
 798                                        copied = -ENOTCONN;
 799                                        break;
 800                                }
 801                                break;
 802                        }
 803                        if (!timeo) {
 804                                copied = -EAGAIN;
 805                                break;
 806                        }
 807                }
 808
 809                if (copied >= target) { /* Do not sleep, just process backlog. */
 810                        release_sock(sk);
 811                        lock_sock(sk);
 812                } else
 813                        sk_wait_data(sk, &timeo, NULL);
 814
 815                if ((flags & MSG_PEEK) && peek_seq != llc->copied_seq) {
 816                        net_dbg_ratelimited("LLC(%s:%d): Application bug, race in MSG_PEEK\n",
 817                                            current->comm,
 818                                            task_pid_nr(current));
 819                        peek_seq = llc->copied_seq;
 820                }
 821                continue;
 822        found_ok_skb:
 823                skb_len = skb->len;
 824                /* Ok so how much can we use? */
 825                used = skb->len - offset;
 826                if (len < used)
 827                        used = len;
 828
 829                if (!(flags & MSG_TRUNC)) {
 830                        int rc = skb_copy_datagram_msg(skb, offset, msg, used);
 831                        if (rc) {
 832                                /* Exception. Bailout! */
 833                                if (!copied)
 834                                        copied = -EFAULT;
 835                                break;
 836                        }
 837                }
 838
 839                *seq += used;
 840                copied += used;
 841                len -= used;
 842
 843                /* For non stream protcols we get one packet per recvmsg call */
 844                if (sk->sk_type != SOCK_STREAM)
 845                        goto copy_uaddr;
 846
 847                if (!(flags & MSG_PEEK)) {
 848                        spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags);
 849                        sk_eat_skb(sk, skb);
 850                        spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags);
 851                        *seq = 0;
 852                }
 853
 854                /* Partial read */
 855                if (used + offset < skb_len)
 856                        continue;
 857        } while (len > 0);
 858
 859out:
 860        release_sock(sk);
 861        return copied;
 862copy_uaddr:
 863        if (uaddr != NULL && skb != NULL) {
 864                memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr));
 865                msg->msg_namelen = sizeof(*uaddr);
 866        }
 867        if (llc_sk(sk)->cmsg_flags)
 868                llc_cmsg_rcv(msg, skb);
 869
 870        if (!(flags & MSG_PEEK)) {
 871                spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags);
 872                sk_eat_skb(sk, skb);
 873                spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags);
 874                *seq = 0;
 875        }
 876
 877        goto out;
 878}
 879
 880/**
 881 *      llc_ui_sendmsg - Transmit data provided by the socket user.
 882 *      @sock: Socket to transmit data from.
 883 *      @msg: Various user related information.
 884 *      @len: Length of data to transmit.
 885 *
 886 *      Transmit data provided by the socket user.
 887 *      Returns non-negative upon success, negative otherwise.
 888 */
 889static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
 890{
 891        struct sock *sk = sock->sk;
 892        struct llc_sock *llc = llc_sk(sk);
 893        DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name);
 894        int flags = msg->msg_flags;
 895        int noblock = flags & MSG_DONTWAIT;
 896        struct sk_buff *skb;
 897        size_t size = 0;
 898        int rc = -EINVAL, copied = 0, hdrlen;
 899
 900        dprintk("%s: sending from %02X to %02X\n", __func__,
 901                llc->laddr.lsap, llc->daddr.lsap);
 902        lock_sock(sk);
 903        if (addr) {
 904                if (msg->msg_namelen < sizeof(*addr))
 905                        goto release;
 906        } else {
 907                if (llc_ui_addr_null(&llc->addr))
 908                        goto release;
 909                addr = &llc->addr;
 910        }
 911        /* must bind connection to sap if user hasn't done it. */
 912        if (sock_flag(sk, SOCK_ZAPPED)) {
 913                /* bind to sap with null dev, exclusive. */
 914                rc = llc_ui_autobind(sock, addr);
 915                if (rc)
 916                        goto release;
 917        }
 918        hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr);
 919        size = hdrlen + len;
 920        if (size > llc->dev->mtu)
 921                size = llc->dev->mtu;
 922        copied = size - hdrlen;
 923        release_sock(sk);
 924        skb = sock_alloc_send_skb(sk, size, noblock, &rc);
 925        lock_sock(sk);
 926        if (!skb)
 927                goto release;
 928        skb->dev      = llc->dev;
 929        skb->protocol = llc_proto_type(addr->sllc_arphrd);
 930        skb_reserve(skb, hdrlen);
 931        rc = memcpy_from_msg(skb_put(skb, copied), msg, copied);
 932        if (rc)
 933                goto out;
 934        if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) {
 935                llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac,
 936                                          addr->sllc_sap);
 937                goto out;
 938        }
 939        if (addr->sllc_test) {
 940                llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac,
 941                                            addr->sllc_sap);
 942                goto out;
 943        }
 944        if (addr->sllc_xid) {
 945                llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac,
 946                                           addr->sllc_sap);
 947                goto out;
 948        }
 949        rc = -ENOPROTOOPT;
 950        if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua))
 951                goto out;
 952        rc = llc_ui_send_data(sk, skb, noblock);
 953out:
 954        if (rc) {
 955                kfree_skb(skb);
 956release:
 957                dprintk("%s: failed sending from %02X to %02X: %d\n",
 958                        __func__, llc->laddr.lsap, llc->daddr.lsap, rc);
 959        }
 960        release_sock(sk);
 961        return rc ? : copied;
 962}
 963
 964/**
 965 *      llc_ui_getname - return the address info of a socket
 966 *      @sock: Socket to get address of.
 967 *      @uaddr: Address structure to return information.
 968 *      @uaddrlen: Length of address structure.
 969 *      @peer: Does user want local or remote address information.
 970 *
 971 *      Return the address information of a socket.
 972 */
 973static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
 974                          int *uaddrlen, int peer)
 975{
 976        struct sockaddr_llc sllc;
 977        struct sock *sk = sock->sk;
 978        struct llc_sock *llc = llc_sk(sk);
 979        int rc = -EBADF;
 980
 981        memset(&sllc, 0, sizeof(sllc));
 982        lock_sock(sk);
 983        if (sock_flag(sk, SOCK_ZAPPED))
 984                goto out;
 985        *uaddrlen = sizeof(sllc);
 986        if (peer) {
 987                rc = -ENOTCONN;
 988                if (sk->sk_state != TCP_ESTABLISHED)
 989                        goto out;
 990                if(llc->dev)
 991                        sllc.sllc_arphrd = llc->dev->type;
 992                sllc.sllc_sap = llc->daddr.lsap;
 993                memcpy(&sllc.sllc_mac, &llc->daddr.mac, IFHWADDRLEN);
 994        } else {
 995                rc = -EINVAL;
 996                if (!llc->sap)
 997                        goto out;
 998                sllc.sllc_sap = llc->sap->laddr.lsap;
 999
1000                if (llc->dev) {
1001                        sllc.sllc_arphrd = llc->dev->type;
1002                        memcpy(&sllc.sllc_mac, llc->dev->dev_addr,
1003                               IFHWADDRLEN);
1004                }
1005        }
1006        rc = 0;
1007        sllc.sllc_family = AF_LLC;
1008        memcpy(uaddr, &sllc, sizeof(sllc));
1009out:
1010        release_sock(sk);
1011        return rc;
1012}
1013
1014/**
1015 *      llc_ui_ioctl - io controls for PF_LLC
1016 *      @sock: Socket to get/set info
1017 *      @cmd: command
1018 *      @arg: optional argument for cmd
1019 *
1020 *      get/set info on llc sockets
1021 */
1022static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
1023                        unsigned long arg)
1024{
1025        return -ENOIOCTLCMD;
1026}
1027
1028/**
1029 *      llc_ui_setsockopt - set various connection specific parameters.
1030 *      @sock: Socket to set options on.
1031 *      @level: Socket level user is requesting operations on.
1032 *      @optname: Operation name.
1033 *      @optval: User provided operation data.
1034 *      @optlen: Length of optval.
1035 *
1036 *      Set various connection specific parameters.
1037 */
1038static int llc_ui_setsockopt(struct socket *sock, int level, int optname,
1039                             char __user *optval, unsigned int optlen)
1040{
1041        struct sock *sk = sock->sk;
1042        struct llc_sock *llc = llc_sk(sk);
1043        unsigned int opt;
1044        int rc = -EINVAL;
1045
1046        lock_sock(sk);
1047        if (unlikely(level != SOL_LLC || optlen != sizeof(int)))
1048                goto out;
1049        rc = get_user(opt, (int __user *)optval);
1050        if (rc)
1051                goto out;
1052        rc = -EINVAL;
1053        switch (optname) {
1054        case LLC_OPT_RETRY:
1055                if (opt > LLC_OPT_MAX_RETRY)
1056                        goto out;
1057                llc->n2 = opt;
1058                break;
1059        case LLC_OPT_SIZE:
1060                if (opt > LLC_OPT_MAX_SIZE)
1061                        goto out;
1062                llc->n1 = opt;
1063                break;
1064        case LLC_OPT_ACK_TMR_EXP:
1065                if (opt > LLC_OPT_MAX_ACK_TMR_EXP)
1066                        goto out;
1067                llc->ack_timer.expire = opt * HZ;
1068                break;
1069        case LLC_OPT_P_TMR_EXP:
1070                if (opt > LLC_OPT_MAX_P_TMR_EXP)
1071                        goto out;
1072                llc->pf_cycle_timer.expire = opt * HZ;
1073                break;
1074        case LLC_OPT_REJ_TMR_EXP:
1075                if (opt > LLC_OPT_MAX_REJ_TMR_EXP)
1076                        goto out;
1077                llc->rej_sent_timer.expire = opt * HZ;
1078                break;
1079        case LLC_OPT_BUSY_TMR_EXP:
1080                if (opt > LLC_OPT_MAX_BUSY_TMR_EXP)
1081                        goto out;
1082                llc->busy_state_timer.expire = opt * HZ;
1083                break;
1084        case LLC_OPT_TX_WIN:
1085                if (opt > LLC_OPT_MAX_WIN)
1086                        goto out;
1087                llc->k = opt;
1088                break;
1089        case LLC_OPT_RX_WIN:
1090                if (opt > LLC_OPT_MAX_WIN)
1091                        goto out;
1092                llc->rw = opt;
1093                break;
1094        case LLC_OPT_PKTINFO:
1095                if (opt)
1096                        llc->cmsg_flags |= LLC_CMSG_PKTINFO;
1097                else
1098                        llc->cmsg_flags &= ~LLC_CMSG_PKTINFO;
1099                break;
1100        default:
1101                rc = -ENOPROTOOPT;
1102                goto out;
1103        }
1104        rc = 0;
1105out:
1106        release_sock(sk);
1107        return rc;
1108}
1109
1110/**
1111 *      llc_ui_getsockopt - get connection specific socket info
1112 *      @sock: Socket to get information from.
1113 *      @level: Socket level user is requesting operations on.
1114 *      @optname: Operation name.
1115 *      @optval: Variable to return operation data in.
1116 *      @optlen: Length of optval.
1117 *
1118 *      Get connection specific socket information.
1119 */
1120static int llc_ui_getsockopt(struct socket *sock, int level, int optname,
1121                             char __user *optval, int __user *optlen)
1122{
1123        struct sock *sk = sock->sk;
1124        struct llc_sock *llc = llc_sk(sk);
1125        int val = 0, len = 0, rc = -EINVAL;
1126
1127        lock_sock(sk);
1128        if (unlikely(level != SOL_LLC))
1129                goto out;
1130        rc = get_user(len, optlen);
1131        if (rc)
1132                goto out;
1133        rc = -EINVAL;
1134        if (len != sizeof(int))
1135                goto out;
1136        switch (optname) {
1137        case LLC_OPT_RETRY:
1138                val = llc->n2;                                  break;
1139        case LLC_OPT_SIZE:
1140                val = llc->n1;                                  break;
1141        case LLC_OPT_ACK_TMR_EXP:
1142                val = llc->ack_timer.expire / HZ;               break;
1143        case LLC_OPT_P_TMR_EXP:
1144                val = llc->pf_cycle_timer.expire / HZ;          break;
1145        case LLC_OPT_REJ_TMR_EXP:
1146                val = llc->rej_sent_timer.expire / HZ;          break;
1147        case LLC_OPT_BUSY_TMR_EXP:
1148                val = llc->busy_state_timer.expire / HZ;        break;
1149        case LLC_OPT_TX_WIN:
1150                val = llc->k;                           break;
1151        case LLC_OPT_RX_WIN:
1152                val = llc->rw;                          break;
1153        case LLC_OPT_PKTINFO:
1154                val = (llc->cmsg_flags & LLC_CMSG_PKTINFO) != 0;
1155                break;
1156        default:
1157                rc = -ENOPROTOOPT;
1158                goto out;
1159        }
1160        rc = 0;
1161        if (put_user(len, optlen) || copy_to_user(optval, &val, len))
1162                rc = -EFAULT;
1163out:
1164        release_sock(sk);
1165        return rc;
1166}
1167
1168static const struct net_proto_family llc_ui_family_ops = {
1169        .family = PF_LLC,
1170        .create = llc_ui_create,
1171        .owner  = THIS_MODULE,
1172};
1173
1174static const struct proto_ops llc_ui_ops = {
1175        .family      = PF_LLC,
1176        .owner       = THIS_MODULE,
1177        .release     = llc_ui_release,
1178        .bind        = llc_ui_bind,
1179        .connect     = llc_ui_connect,
1180        .socketpair  = sock_no_socketpair,
1181        .accept      = llc_ui_accept,
1182        .getname     = llc_ui_getname,
1183        .poll        = datagram_poll,
1184        .ioctl       = llc_ui_ioctl,
1185        .listen      = llc_ui_listen,
1186        .shutdown    = llc_ui_shutdown,
1187        .setsockopt  = llc_ui_setsockopt,
1188        .getsockopt  = llc_ui_getsockopt,
1189        .sendmsg     = llc_ui_sendmsg,
1190        .recvmsg     = llc_ui_recvmsg,
1191        .mmap        = sock_no_mmap,
1192        .sendpage    = sock_no_sendpage,
1193};
1194
1195static const char llc_proc_err_msg[] __initconst =
1196        KERN_CRIT "LLC: Unable to register the proc_fs entries\n";
1197static const char llc_sysctl_err_msg[] __initconst =
1198        KERN_CRIT "LLC: Unable to register the sysctl entries\n";
1199static const char llc_sock_err_msg[] __initconst =
1200        KERN_CRIT "LLC: Unable to register the network family\n";
1201
1202static int __init llc2_init(void)
1203{
1204        int rc = proto_register(&llc_proto, 0);
1205
1206        if (rc != 0)
1207                goto out;
1208
1209        llc_build_offset_table();
1210        llc_station_init();
1211        llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
1212        rc = llc_proc_init();
1213        if (rc != 0) {
1214                printk(llc_proc_err_msg);
1215                goto out_station;
1216        }
1217        rc = llc_sysctl_init();
1218        if (rc) {
1219                printk(llc_sysctl_err_msg);
1220                goto out_proc;
1221        }
1222        rc = sock_register(&llc_ui_family_ops);
1223        if (rc) {
1224                printk(llc_sock_err_msg);
1225                goto out_sysctl;
1226        }
1227        llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
1228        llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
1229out:
1230        return rc;
1231out_sysctl:
1232        llc_sysctl_exit();
1233out_proc:
1234        llc_proc_exit();
1235out_station:
1236        llc_station_exit();
1237        proto_unregister(&llc_proto);
1238        goto out;
1239}
1240
1241static void __exit llc2_exit(void)
1242{
1243        llc_station_exit();
1244        llc_remove_pack(LLC_DEST_SAP);
1245        llc_remove_pack(LLC_DEST_CONN);
1246        sock_unregister(PF_LLC);
1247        llc_proc_exit();
1248        llc_sysctl_exit();
1249        proto_unregister(&llc_proto);
1250}
1251
1252module_init(llc2_init);
1253module_exit(llc2_exit);
1254
1255MODULE_LICENSE("GPL");
1256MODULE_AUTHOR("Procom 1997, Jay Schullist 2001, Arnaldo C. Melo 2001-2003");
1257MODULE_DESCRIPTION("IEEE 802.2 PF_LLC support");
1258MODULE_ALIAS_NETPROTO(PF_LLC);
1259