0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include <linux/compiler.h>
0024 #include <linux/kernel.h>
0025 #include <linux/module.h>
0026 #include <linux/rtnetlink.h>
0027 #include <linux/init.h>
0028 #include <linux/slab.h>
0029 #include <linux/sched/signal.h>
0030
0031 #include <net/llc.h>
0032 #include <net/llc_sap.h>
0033 #include <net/llc_pdu.h>
0034 #include <net/llc_conn.h>
0035 #include <net/tcp_states.h>
0036
0037
0038 static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
0039 static u16 llc_ui_sap_link_no_max[256];
0040 static struct sockaddr_llc llc_ui_addrnull;
0041 static const struct proto_ops llc_ui_ops;
0042
0043 static bool llc_ui_wait_for_conn(struct sock *sk, long timeout);
0044 static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
0045 static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout);
0046
0047 #if 0
0048 #define dprintk(args...) printk(KERN_DEBUG args)
0049 #else
0050 #define dprintk(args...) do {} while (0)
0051 #endif
0052
0053
0054 #define LLC_CMSG_PKTINFO 1
0055
0056
0057
0058
0059
0060
0061
0062
0063 static inline u16 llc_ui_next_link_no(int sap)
0064 {
0065 return llc_ui_sap_link_no_max[sap]++;
0066 }
0067
0068
0069
0070
0071
0072
0073
0074 static inline __be16 llc_proto_type(u16 arphrd)
0075 {
0076 return htons(ETH_P_802_2);
0077 }
0078
0079
0080
0081
0082
0083 static inline u8 llc_ui_addr_null(struct sockaddr_llc *addr)
0084 {
0085 return !memcmp(addr, &llc_ui_addrnull, sizeof(*addr));
0086 }
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 static inline u8 llc_ui_header_len(struct sock *sk, struct sockaddr_llc *addr)
0098 {
0099 u8 rc = LLC_PDU_LEN_U;
0100
0101 if (addr->sllc_test)
0102 rc = LLC_PDU_LEN_U;
0103 else if (addr->sllc_xid)
0104
0105
0106
0107
0108
0109
0110 rc = LLC_PDU_LEN_U_XID;
0111 else if (sk->sk_type == SOCK_STREAM)
0112 rc = LLC_PDU_LEN_I;
0113 return rc;
0114 }
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
0128 {
0129 struct llc_sock* llc = llc_sk(sk);
0130
0131 if (unlikely(llc_data_accept_state(llc->state) ||
0132 llc->remote_busy_flag ||
0133 llc->p_flag)) {
0134 long timeout = sock_sndtimeo(sk, noblock);
0135 int rc;
0136
0137 rc = llc_ui_wait_for_busy_core(sk, timeout);
0138 if (rc) {
0139 kfree_skb(skb);
0140 return rc;
0141 }
0142 }
0143 return llc_build_and_send_pkt(sk, skb);
0144 }
0145
0146 static void llc_ui_sk_init(struct socket *sock, struct sock *sk)
0147 {
0148 sock_graft(sk, sock);
0149 sk->sk_type = sock->type;
0150 sock->ops = &llc_ui_ops;
0151 }
0152
0153 static struct proto llc_proto = {
0154 .name = "LLC",
0155 .owner = THIS_MODULE,
0156 .obj_size = sizeof(struct llc_sock),
0157 .slab_flags = SLAB_TYPESAFE_BY_RCU,
0158 };
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171 static int llc_ui_create(struct net *net, struct socket *sock, int protocol,
0172 int kern)
0173 {
0174 struct sock *sk;
0175 int rc = -ESOCKTNOSUPPORT;
0176
0177 if (!ns_capable(net->user_ns, CAP_NET_RAW))
0178 return -EPERM;
0179
0180 if (!net_eq(net, &init_net))
0181 return -EAFNOSUPPORT;
0182
0183 if (likely(sock->type == SOCK_DGRAM || sock->type == SOCK_STREAM)) {
0184 rc = -ENOMEM;
0185 sk = llc_sk_alloc(net, PF_LLC, GFP_KERNEL, &llc_proto, kern);
0186 if (sk) {
0187 rc = 0;
0188 llc_ui_sk_init(sock, sk);
0189 }
0190 }
0191 return rc;
0192 }
0193
0194
0195
0196
0197
0198
0199
0200 static int llc_ui_release(struct socket *sock)
0201 {
0202 struct sock *sk = sock->sk;
0203 struct llc_sock *llc;
0204
0205 if (unlikely(sk == NULL))
0206 goto out;
0207 sock_hold(sk);
0208 lock_sock(sk);
0209 llc = llc_sk(sk);
0210 dprintk("%s: closing local(%02X) remote(%02X)\n", __func__,
0211 llc->laddr.lsap, llc->daddr.lsap);
0212 if (!llc_send_disc(sk))
0213 llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
0214 if (!sock_flag(sk, SOCK_ZAPPED)) {
0215 struct llc_sap *sap = llc->sap;
0216
0217
0218
0219
0220 llc_sap_hold(sap);
0221 llc_sap_remove_socket(llc->sap, sk);
0222 release_sock(sk);
0223 llc_sap_put(sap);
0224 } else {
0225 release_sock(sk);
0226 }
0227 netdev_put(llc->dev, &llc->dev_tracker);
0228 sock_put(sk);
0229 llc_sk_free(sk);
0230 out:
0231 return 0;
0232 }
0233
0234
0235
0236
0237
0238
0239
0240
0241 static int llc_ui_autoport(void)
0242 {
0243 struct llc_sap *sap;
0244 int i, tries = 0;
0245
0246 while (tries < LLC_SAP_DYN_TRIES) {
0247 for (i = llc_ui_sap_last_autoport;
0248 i < LLC_SAP_DYN_STOP; i += 2) {
0249 sap = llc_sap_find(i);
0250 if (!sap) {
0251 llc_ui_sap_last_autoport = i + 2;
0252 goto out;
0253 }
0254 llc_sap_put(sap);
0255 }
0256 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
0257 tries++;
0258 }
0259 i = 0;
0260 out:
0261 return i;
0262 }
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274 static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
0275 {
0276 struct sock *sk = sock->sk;
0277 struct llc_sock *llc = llc_sk(sk);
0278 struct net_device *dev = NULL;
0279 struct llc_sap *sap;
0280 int rc = -EINVAL;
0281
0282 if (!sock_flag(sk, SOCK_ZAPPED))
0283 goto out;
0284 if (!addr->sllc_arphrd)
0285 addr->sllc_arphrd = ARPHRD_ETHER;
0286 if (addr->sllc_arphrd != ARPHRD_ETHER)
0287 goto out;
0288 rc = -ENODEV;
0289 if (sk->sk_bound_dev_if) {
0290 dev = dev_get_by_index(&init_net, sk->sk_bound_dev_if);
0291 if (dev && addr->sllc_arphrd != dev->type) {
0292 dev_put(dev);
0293 dev = NULL;
0294 }
0295 } else
0296 dev = dev_getfirstbyhwtype(&init_net, addr->sllc_arphrd);
0297 if (!dev)
0298 goto out;
0299 rc = -EUSERS;
0300 llc->laddr.lsap = llc_ui_autoport();
0301 if (!llc->laddr.lsap)
0302 goto out;
0303 rc = -EBUSY;
0304 sap = llc_sap_open(llc->laddr.lsap, NULL);
0305 if (!sap)
0306 goto out;
0307
0308
0309 llc->dev = dev;
0310 netdev_tracker_alloc(llc->dev, &llc->dev_tracker, GFP_KERNEL);
0311 dev = NULL;
0312
0313 memcpy(llc->laddr.mac, llc->dev->dev_addr, IFHWADDRLEN);
0314 memcpy(&llc->addr, addr, sizeof(llc->addr));
0315
0316 llc_sap_add_socket(sap, sk);
0317 sock_reset_flag(sk, SOCK_ZAPPED);
0318 rc = 0;
0319 out:
0320 dev_put(dev);
0321 return rc;
0322 }
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338 static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
0339 {
0340 struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
0341 struct sock *sk = sock->sk;
0342 struct llc_sock *llc = llc_sk(sk);
0343 struct net_device *dev = NULL;
0344 struct llc_sap *sap;
0345 int rc = -EINVAL;
0346
0347 lock_sock(sk);
0348 if (unlikely(!sock_flag(sk, SOCK_ZAPPED) || addrlen != sizeof(*addr)))
0349 goto out;
0350 rc = -EAFNOSUPPORT;
0351 if (!addr->sllc_arphrd)
0352 addr->sllc_arphrd = ARPHRD_ETHER;
0353 if (unlikely(addr->sllc_family != AF_LLC || addr->sllc_arphrd != ARPHRD_ETHER))
0354 goto out;
0355 dprintk("%s: binding %02X\n", __func__, addr->sllc_sap);
0356 rc = -ENODEV;
0357 rcu_read_lock();
0358 if (sk->sk_bound_dev_if) {
0359 dev = dev_get_by_index_rcu(&init_net, sk->sk_bound_dev_if);
0360 if (dev) {
0361 if (is_zero_ether_addr(addr->sllc_mac))
0362 memcpy(addr->sllc_mac, dev->dev_addr,
0363 IFHWADDRLEN);
0364 if (addr->sllc_arphrd != dev->type ||
0365 !ether_addr_equal(addr->sllc_mac,
0366 dev->dev_addr)) {
0367 rc = -EINVAL;
0368 dev = NULL;
0369 }
0370 }
0371 } else {
0372 dev = dev_getbyhwaddr_rcu(&init_net, addr->sllc_arphrd,
0373 addr->sllc_mac);
0374 }
0375 dev_hold(dev);
0376 rcu_read_unlock();
0377 if (!dev)
0378 goto out;
0379
0380 if (!addr->sllc_sap) {
0381 rc = -EUSERS;
0382 addr->sllc_sap = llc_ui_autoport();
0383 if (!addr->sllc_sap)
0384 goto out;
0385 }
0386 sap = llc_sap_find(addr->sllc_sap);
0387 if (!sap) {
0388 sap = llc_sap_open(addr->sllc_sap, NULL);
0389 rc = -EBUSY;
0390 if (!sap)
0391 goto out;
0392 } else {
0393 struct llc_addr laddr, daddr;
0394 struct sock *ask;
0395
0396 memset(&laddr, 0, sizeof(laddr));
0397 memset(&daddr, 0, sizeof(daddr));
0398
0399
0400
0401
0402 memcpy(laddr.mac, addr->sllc_mac, IFHWADDRLEN);
0403 laddr.lsap = addr->sllc_sap;
0404 rc = -EADDRINUSE;
0405 ask = llc_lookup_established(sap, &daddr, &laddr);
0406 if (ask) {
0407 sock_put(ask);
0408 goto out_put;
0409 }
0410 }
0411
0412
0413 llc->dev = dev;
0414 netdev_tracker_alloc(llc->dev, &llc->dev_tracker, GFP_KERNEL);
0415 dev = NULL;
0416
0417 llc->laddr.lsap = addr->sllc_sap;
0418 memcpy(llc->laddr.mac, addr->sllc_mac, IFHWADDRLEN);
0419 memcpy(&llc->addr, addr, sizeof(llc->addr));
0420
0421 llc_sap_add_socket(sap, sk);
0422 sock_reset_flag(sk, SOCK_ZAPPED);
0423 rc = 0;
0424 out_put:
0425 llc_sap_put(sap);
0426 out:
0427 dev_put(dev);
0428 release_sock(sk);
0429 return rc;
0430 }
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443 static int llc_ui_shutdown(struct socket *sock, int how)
0444 {
0445 struct sock *sk = sock->sk;
0446 int rc = -ENOTCONN;
0447
0448 lock_sock(sk);
0449 if (unlikely(sk->sk_state != TCP_ESTABLISHED))
0450 goto out;
0451 rc = -EINVAL;
0452 if (how != 2)
0453 goto out;
0454 rc = llc_send_disc(sk);
0455 if (!rc)
0456 rc = llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
0457
0458 sk->sk_state_change(sk);
0459 out:
0460 release_sock(sk);
0461 return rc;
0462 }
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478 static int llc_ui_connect(struct socket *sock, struct sockaddr *uaddr,
0479 int addrlen, int flags)
0480 {
0481 struct sock *sk = sock->sk;
0482 struct llc_sock *llc = llc_sk(sk);
0483 struct sockaddr_llc *addr = (struct sockaddr_llc *)uaddr;
0484 int rc = -EINVAL;
0485
0486 lock_sock(sk);
0487 if (unlikely(addrlen != sizeof(*addr)))
0488 goto out;
0489 rc = -EAFNOSUPPORT;
0490 if (unlikely(addr->sllc_family != AF_LLC))
0491 goto out;
0492 if (unlikely(sk->sk_type != SOCK_STREAM))
0493 goto out;
0494 rc = -EALREADY;
0495 if (unlikely(sock->state == SS_CONNECTING))
0496 goto out;
0497
0498 if (sock_flag(sk, SOCK_ZAPPED)) {
0499
0500 rc = llc_ui_autobind(sock, addr);
0501 if (rc)
0502 goto out;
0503 }
0504 llc->daddr.lsap = addr->sllc_sap;
0505 memcpy(llc->daddr.mac, addr->sllc_mac, IFHWADDRLEN);
0506 sock->state = SS_CONNECTING;
0507 sk->sk_state = TCP_SYN_SENT;
0508 llc->link = llc_ui_next_link_no(llc->sap->laddr.lsap);
0509 rc = llc_establish_connection(sk, llc->dev->dev_addr,
0510 addr->sllc_mac, addr->sllc_sap);
0511 if (rc) {
0512 dprintk("%s: llc_ui_send_conn failed :-(\n", __func__);
0513 sock->state = SS_UNCONNECTED;
0514 sk->sk_state = TCP_CLOSE;
0515 goto out;
0516 }
0517
0518 if (sk->sk_state == TCP_SYN_SENT) {
0519 const long timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
0520
0521 if (!timeo || !llc_ui_wait_for_conn(sk, timeo))
0522 goto out;
0523
0524 rc = sock_intr_errno(timeo);
0525 if (signal_pending(current))
0526 goto out;
0527 }
0528
0529 if (sk->sk_state == TCP_CLOSE)
0530 goto sock_error;
0531
0532 sock->state = SS_CONNECTED;
0533 rc = 0;
0534 out:
0535 release_sock(sk);
0536 return rc;
0537 sock_error:
0538 rc = sock_error(sk) ? : -ECONNABORTED;
0539 sock->state = SS_UNCONNECTED;
0540 goto out;
0541 }
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551 static int llc_ui_listen(struct socket *sock, int backlog)
0552 {
0553 struct sock *sk = sock->sk;
0554 int rc = -EINVAL;
0555
0556 lock_sock(sk);
0557 if (unlikely(sock->state != SS_UNCONNECTED))
0558 goto out;
0559 rc = -EOPNOTSUPP;
0560 if (unlikely(sk->sk_type != SOCK_STREAM))
0561 goto out;
0562 rc = -EAGAIN;
0563 if (sock_flag(sk, SOCK_ZAPPED))
0564 goto out;
0565 rc = 0;
0566 if (!(unsigned int)backlog)
0567 backlog = 1;
0568 sk->sk_max_ack_backlog = backlog;
0569 if (sk->sk_state != TCP_LISTEN) {
0570 sk->sk_ack_backlog = 0;
0571 sk->sk_state = TCP_LISTEN;
0572 }
0573 sk->sk_socket->flags |= __SO_ACCEPTCON;
0574 out:
0575 release_sock(sk);
0576 return rc;
0577 }
0578
0579 static int llc_ui_wait_for_disc(struct sock *sk, long timeout)
0580 {
0581 DEFINE_WAIT_FUNC(wait, woken_wake_function);
0582 int rc = 0;
0583
0584 add_wait_queue(sk_sleep(sk), &wait);
0585 while (1) {
0586 if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE, &wait))
0587 break;
0588 rc = -ERESTARTSYS;
0589 if (signal_pending(current))
0590 break;
0591 rc = -EAGAIN;
0592 if (!timeout)
0593 break;
0594 rc = 0;
0595 }
0596 remove_wait_queue(sk_sleep(sk), &wait);
0597 return rc;
0598 }
0599
0600 static bool llc_ui_wait_for_conn(struct sock *sk, long timeout)
0601 {
0602 DEFINE_WAIT_FUNC(wait, woken_wake_function);
0603
0604 add_wait_queue(sk_sleep(sk), &wait);
0605 while (1) {
0606 if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT, &wait))
0607 break;
0608 if (signal_pending(current) || !timeout)
0609 break;
0610 }
0611 remove_wait_queue(sk_sleep(sk), &wait);
0612 return timeout;
0613 }
0614
0615 static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
0616 {
0617 DEFINE_WAIT_FUNC(wait, woken_wake_function);
0618 struct llc_sock *llc = llc_sk(sk);
0619 int rc;
0620
0621 add_wait_queue(sk_sleep(sk), &wait);
0622 while (1) {
0623 rc = 0;
0624 if (sk_wait_event(sk, &timeout,
0625 (sk->sk_shutdown & RCV_SHUTDOWN) ||
0626 (!llc_data_accept_state(llc->state) &&
0627 !llc->remote_busy_flag &&
0628 !llc->p_flag), &wait))
0629 break;
0630 rc = -ERESTARTSYS;
0631 if (signal_pending(current))
0632 break;
0633 rc = -EAGAIN;
0634 if (!timeout)
0635 break;
0636 }
0637 remove_wait_queue(sk_sleep(sk), &wait);
0638 return rc;
0639 }
0640
0641 static int llc_wait_data(struct sock *sk, long timeo)
0642 {
0643 int rc;
0644
0645 while (1) {
0646
0647
0648
0649 rc = sock_error(sk);
0650 if (rc)
0651 break;
0652 rc = 0;
0653 if (sk->sk_shutdown & RCV_SHUTDOWN)
0654 break;
0655 rc = -EAGAIN;
0656 if (!timeo)
0657 break;
0658 rc = sock_intr_errno(timeo);
0659 if (signal_pending(current))
0660 break;
0661 rc = 0;
0662 if (sk_wait_data(sk, &timeo, NULL))
0663 break;
0664 }
0665 return rc;
0666 }
0667
0668 static void llc_cmsg_rcv(struct msghdr *msg, struct sk_buff *skb)
0669 {
0670 struct llc_sock *llc = llc_sk(skb->sk);
0671
0672 if (llc->cmsg_flags & LLC_CMSG_PKTINFO) {
0673 struct llc_pktinfo info;
0674
0675 memset(&info, 0, sizeof(info));
0676 info.lpi_ifindex = llc_sk(skb->sk)->dev->ifindex;
0677 llc_pdu_decode_dsap(skb, &info.lpi_sap);
0678 llc_pdu_decode_da(skb, info.lpi_mac);
0679 put_cmsg(msg, SOL_LLC, LLC_OPT_PKTINFO, sizeof(info), &info);
0680 }
0681 }
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693 static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags,
0694 bool kern)
0695 {
0696 struct sock *sk = sock->sk, *newsk;
0697 struct llc_sock *llc, *newllc;
0698 struct sk_buff *skb;
0699 int rc = -EOPNOTSUPP;
0700
0701 dprintk("%s: accepting on %02X\n", __func__,
0702 llc_sk(sk)->laddr.lsap);
0703 lock_sock(sk);
0704 if (unlikely(sk->sk_type != SOCK_STREAM))
0705 goto out;
0706 rc = -EINVAL;
0707 if (unlikely(sock->state != SS_UNCONNECTED ||
0708 sk->sk_state != TCP_LISTEN))
0709 goto out;
0710
0711 if (skb_queue_empty(&sk->sk_receive_queue)) {
0712 rc = llc_wait_data(sk, sk->sk_rcvtimeo);
0713 if (rc)
0714 goto out;
0715 }
0716 dprintk("%s: got a new connection on %02X\n", __func__,
0717 llc_sk(sk)->laddr.lsap);
0718 skb = skb_dequeue(&sk->sk_receive_queue);
0719 rc = -EINVAL;
0720 if (!skb->sk)
0721 goto frees;
0722 rc = 0;
0723 newsk = skb->sk;
0724
0725 llc_ui_sk_init(newsock, newsk);
0726 sock_reset_flag(newsk, SOCK_ZAPPED);
0727 newsk->sk_state = TCP_ESTABLISHED;
0728 newsock->state = SS_CONNECTED;
0729 llc = llc_sk(sk);
0730 newllc = llc_sk(newsk);
0731 memcpy(&newllc->addr, &llc->addr, sizeof(newllc->addr));
0732 newllc->link = llc_ui_next_link_no(newllc->laddr.lsap);
0733
0734
0735 sk->sk_state = TCP_LISTEN;
0736 sk_acceptq_removed(sk);
0737 dprintk("%s: ok success on %02X, client on %02X\n", __func__,
0738 llc_sk(sk)->addr.sllc_sap, newllc->daddr.lsap);
0739 frees:
0740 kfree_skb(skb);
0741 out:
0742 release_sock(sk);
0743 return rc;
0744 }
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756 static int llc_ui_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
0757 int flags)
0758 {
0759 DECLARE_SOCKADDR(struct sockaddr_llc *, uaddr, msg->msg_name);
0760 const int nonblock = flags & MSG_DONTWAIT;
0761 struct sk_buff *skb = NULL;
0762 struct sock *sk = sock->sk;
0763 struct llc_sock *llc = llc_sk(sk);
0764 size_t copied = 0;
0765 u32 peek_seq = 0;
0766 u32 *seq, skb_len;
0767 unsigned long used;
0768 int target;
0769 long timeo;
0770
0771 lock_sock(sk);
0772 copied = -ENOTCONN;
0773 if (unlikely(sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_LISTEN))
0774 goto out;
0775
0776 timeo = sock_rcvtimeo(sk, nonblock);
0777
0778 seq = &llc->copied_seq;
0779 if (flags & MSG_PEEK) {
0780 peek_seq = llc->copied_seq;
0781 seq = &peek_seq;
0782 }
0783
0784 target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
0785 copied = 0;
0786
0787 do {
0788 u32 offset;
0789
0790
0791
0792
0793
0794
0795 if (signal_pending(current)) {
0796 if (copied)
0797 break;
0798 copied = timeo ? sock_intr_errno(timeo) : -EAGAIN;
0799 break;
0800 }
0801
0802
0803
0804 skb = skb_peek(&sk->sk_receive_queue);
0805 if (skb) {
0806 offset = *seq;
0807 goto found_ok_skb;
0808 }
0809
0810
0811 if (copied >= target && !READ_ONCE(sk->sk_backlog.tail))
0812 break;
0813
0814 if (copied) {
0815 if (sk->sk_err ||
0816 sk->sk_state == TCP_CLOSE ||
0817 (sk->sk_shutdown & RCV_SHUTDOWN) ||
0818 !timeo ||
0819 (flags & MSG_PEEK))
0820 break;
0821 } else {
0822 if (sock_flag(sk, SOCK_DONE))
0823 break;
0824
0825 if (sk->sk_err) {
0826 copied = sock_error(sk);
0827 break;
0828 }
0829 if (sk->sk_shutdown & RCV_SHUTDOWN)
0830 break;
0831
0832 if (sk->sk_type == SOCK_STREAM && sk->sk_state == TCP_CLOSE) {
0833 if (!sock_flag(sk, SOCK_DONE)) {
0834
0835
0836
0837
0838 copied = -ENOTCONN;
0839 break;
0840 }
0841 break;
0842 }
0843 if (!timeo) {
0844 copied = -EAGAIN;
0845 break;
0846 }
0847 }
0848
0849 if (copied >= target) {
0850 release_sock(sk);
0851 lock_sock(sk);
0852 } else
0853 sk_wait_data(sk, &timeo, NULL);
0854
0855 if ((flags & MSG_PEEK) && peek_seq != llc->copied_seq) {
0856 net_dbg_ratelimited("LLC(%s:%d): Application bug, race in MSG_PEEK\n",
0857 current->comm,
0858 task_pid_nr(current));
0859 peek_seq = llc->copied_seq;
0860 }
0861 continue;
0862 found_ok_skb:
0863 skb_len = skb->len;
0864
0865 used = skb->len - offset;
0866 if (len < used)
0867 used = len;
0868
0869 if (!(flags & MSG_TRUNC)) {
0870 int rc = skb_copy_datagram_msg(skb, offset, msg, used);
0871 if (rc) {
0872
0873 if (!copied)
0874 copied = -EFAULT;
0875 break;
0876 }
0877 }
0878
0879 *seq += used;
0880 copied += used;
0881 len -= used;
0882
0883
0884 if (sk->sk_type != SOCK_STREAM)
0885 goto copy_uaddr;
0886
0887 if (!(flags & MSG_PEEK)) {
0888 skb_unlink(skb, &sk->sk_receive_queue);
0889 kfree_skb(skb);
0890 *seq = 0;
0891 }
0892
0893
0894 if (used + offset < skb_len)
0895 continue;
0896 } while (len > 0);
0897
0898 out:
0899 release_sock(sk);
0900 return copied;
0901 copy_uaddr:
0902 if (uaddr != NULL && skb != NULL) {
0903 memcpy(uaddr, llc_ui_skb_cb(skb), sizeof(*uaddr));
0904 msg->msg_namelen = sizeof(*uaddr);
0905 }
0906 if (llc_sk(sk)->cmsg_flags)
0907 llc_cmsg_rcv(msg, skb);
0908
0909 if (!(flags & MSG_PEEK)) {
0910 skb_unlink(skb, &sk->sk_receive_queue);
0911 kfree_skb(skb);
0912 *seq = 0;
0913 }
0914
0915 goto out;
0916 }
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927 static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
0928 {
0929 struct sock *sk = sock->sk;
0930 struct llc_sock *llc = llc_sk(sk);
0931 DECLARE_SOCKADDR(struct sockaddr_llc *, addr, msg->msg_name);
0932 int flags = msg->msg_flags;
0933 int noblock = flags & MSG_DONTWAIT;
0934 struct sk_buff *skb = NULL;
0935 size_t size = 0;
0936 int rc = -EINVAL, copied = 0, hdrlen;
0937
0938 dprintk("%s: sending from %02X to %02X\n", __func__,
0939 llc->laddr.lsap, llc->daddr.lsap);
0940 lock_sock(sk);
0941 if (addr) {
0942 if (msg->msg_namelen < sizeof(*addr))
0943 goto out;
0944 } else {
0945 if (llc_ui_addr_null(&llc->addr))
0946 goto out;
0947 addr = &llc->addr;
0948 }
0949
0950 if (sock_flag(sk, SOCK_ZAPPED)) {
0951
0952 rc = llc_ui_autobind(sock, addr);
0953 if (rc)
0954 goto out;
0955 }
0956 hdrlen = llc->dev->hard_header_len + llc_ui_header_len(sk, addr);
0957 size = hdrlen + len;
0958 if (size > llc->dev->mtu)
0959 size = llc->dev->mtu;
0960 copied = size - hdrlen;
0961 rc = -EINVAL;
0962 if (copied < 0)
0963 goto out;
0964 release_sock(sk);
0965 skb = sock_alloc_send_skb(sk, size, noblock, &rc);
0966 lock_sock(sk);
0967 if (!skb)
0968 goto out;
0969 skb->dev = llc->dev;
0970 skb->protocol = llc_proto_type(addr->sllc_arphrd);
0971 skb_reserve(skb, hdrlen);
0972 rc = memcpy_from_msg(skb_put(skb, copied), msg, copied);
0973 if (rc)
0974 goto out;
0975 if (sk->sk_type == SOCK_DGRAM || addr->sllc_ua) {
0976 llc_build_and_send_ui_pkt(llc->sap, skb, addr->sllc_mac,
0977 addr->sllc_sap);
0978 skb = NULL;
0979 goto out;
0980 }
0981 if (addr->sllc_test) {
0982 llc_build_and_send_test_pkt(llc->sap, skb, addr->sllc_mac,
0983 addr->sllc_sap);
0984 skb = NULL;
0985 goto out;
0986 }
0987 if (addr->sllc_xid) {
0988 llc_build_and_send_xid_pkt(llc->sap, skb, addr->sllc_mac,
0989 addr->sllc_sap);
0990 skb = NULL;
0991 goto out;
0992 }
0993 rc = -ENOPROTOOPT;
0994 if (!(sk->sk_type == SOCK_STREAM && !addr->sllc_ua))
0995 goto out;
0996 rc = llc_ui_send_data(sk, skb, noblock);
0997 skb = NULL;
0998 out:
0999 kfree_skb(skb);
1000 if (rc)
1001 dprintk("%s: failed sending from %02X to %02X: %d\n",
1002 __func__, llc->laddr.lsap, llc->daddr.lsap, rc);
1003 release_sock(sk);
1004 return rc ? : copied;
1005 }
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015 static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
1016 int peer)
1017 {
1018 struct sockaddr_llc sllc;
1019 struct sock *sk = sock->sk;
1020 struct llc_sock *llc = llc_sk(sk);
1021 int rc = -EBADF;
1022
1023 memset(&sllc, 0, sizeof(sllc));
1024 lock_sock(sk);
1025 if (sock_flag(sk, SOCK_ZAPPED))
1026 goto out;
1027 if (peer) {
1028 rc = -ENOTCONN;
1029 if (sk->sk_state != TCP_ESTABLISHED)
1030 goto out;
1031 if(llc->dev)
1032 sllc.sllc_arphrd = llc->dev->type;
1033 sllc.sllc_sap = llc->daddr.lsap;
1034 memcpy(&sllc.sllc_mac, &llc->daddr.mac, IFHWADDRLEN);
1035 } else {
1036 rc = -EINVAL;
1037 if (!llc->sap)
1038 goto out;
1039 sllc.sllc_sap = llc->sap->laddr.lsap;
1040
1041 if (llc->dev) {
1042 sllc.sllc_arphrd = llc->dev->type;
1043 memcpy(&sllc.sllc_mac, llc->dev->dev_addr,
1044 IFHWADDRLEN);
1045 }
1046 }
1047 sllc.sllc_family = AF_LLC;
1048 memcpy(uaddr, &sllc, sizeof(sllc));
1049 rc = sizeof(sllc);
1050 out:
1051 release_sock(sk);
1052 return rc;
1053 }
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063 static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
1064 unsigned long arg)
1065 {
1066 return -ENOIOCTLCMD;
1067 }
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079 static int llc_ui_setsockopt(struct socket *sock, int level, int optname,
1080 sockptr_t optval, unsigned int optlen)
1081 {
1082 struct sock *sk = sock->sk;
1083 struct llc_sock *llc = llc_sk(sk);
1084 unsigned int opt;
1085 int rc = -EINVAL;
1086
1087 lock_sock(sk);
1088 if (unlikely(level != SOL_LLC || optlen != sizeof(int)))
1089 goto out;
1090 rc = copy_from_sockptr(&opt, optval, sizeof(opt));
1091 if (rc)
1092 goto out;
1093 rc = -EINVAL;
1094 switch (optname) {
1095 case LLC_OPT_RETRY:
1096 if (opt > LLC_OPT_MAX_RETRY)
1097 goto out;
1098 llc->n2 = opt;
1099 break;
1100 case LLC_OPT_SIZE:
1101 if (opt > LLC_OPT_MAX_SIZE)
1102 goto out;
1103 llc->n1 = opt;
1104 break;
1105 case LLC_OPT_ACK_TMR_EXP:
1106 if (opt > LLC_OPT_MAX_ACK_TMR_EXP)
1107 goto out;
1108 llc->ack_timer.expire = opt * HZ;
1109 break;
1110 case LLC_OPT_P_TMR_EXP:
1111 if (opt > LLC_OPT_MAX_P_TMR_EXP)
1112 goto out;
1113 llc->pf_cycle_timer.expire = opt * HZ;
1114 break;
1115 case LLC_OPT_REJ_TMR_EXP:
1116 if (opt > LLC_OPT_MAX_REJ_TMR_EXP)
1117 goto out;
1118 llc->rej_sent_timer.expire = opt * HZ;
1119 break;
1120 case LLC_OPT_BUSY_TMR_EXP:
1121 if (opt > LLC_OPT_MAX_BUSY_TMR_EXP)
1122 goto out;
1123 llc->busy_state_timer.expire = opt * HZ;
1124 break;
1125 case LLC_OPT_TX_WIN:
1126 if (opt > LLC_OPT_MAX_WIN)
1127 goto out;
1128 llc->k = opt;
1129 break;
1130 case LLC_OPT_RX_WIN:
1131 if (opt > LLC_OPT_MAX_WIN)
1132 goto out;
1133 llc->rw = opt;
1134 break;
1135 case LLC_OPT_PKTINFO:
1136 if (opt)
1137 llc->cmsg_flags |= LLC_CMSG_PKTINFO;
1138 else
1139 llc->cmsg_flags &= ~LLC_CMSG_PKTINFO;
1140 break;
1141 default:
1142 rc = -ENOPROTOOPT;
1143 goto out;
1144 }
1145 rc = 0;
1146 out:
1147 release_sock(sk);
1148 return rc;
1149 }
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161 static int llc_ui_getsockopt(struct socket *sock, int level, int optname,
1162 char __user *optval, int __user *optlen)
1163 {
1164 struct sock *sk = sock->sk;
1165 struct llc_sock *llc = llc_sk(sk);
1166 int val = 0, len = 0, rc = -EINVAL;
1167
1168 lock_sock(sk);
1169 if (unlikely(level != SOL_LLC))
1170 goto out;
1171 rc = get_user(len, optlen);
1172 if (rc)
1173 goto out;
1174 rc = -EINVAL;
1175 if (len != sizeof(int))
1176 goto out;
1177 switch (optname) {
1178 case LLC_OPT_RETRY:
1179 val = llc->n2; break;
1180 case LLC_OPT_SIZE:
1181 val = llc->n1; break;
1182 case LLC_OPT_ACK_TMR_EXP:
1183 val = llc->ack_timer.expire / HZ; break;
1184 case LLC_OPT_P_TMR_EXP:
1185 val = llc->pf_cycle_timer.expire / HZ; break;
1186 case LLC_OPT_REJ_TMR_EXP:
1187 val = llc->rej_sent_timer.expire / HZ; break;
1188 case LLC_OPT_BUSY_TMR_EXP:
1189 val = llc->busy_state_timer.expire / HZ; break;
1190 case LLC_OPT_TX_WIN:
1191 val = llc->k; break;
1192 case LLC_OPT_RX_WIN:
1193 val = llc->rw; break;
1194 case LLC_OPT_PKTINFO:
1195 val = (llc->cmsg_flags & LLC_CMSG_PKTINFO) != 0;
1196 break;
1197 default:
1198 rc = -ENOPROTOOPT;
1199 goto out;
1200 }
1201 rc = 0;
1202 if (put_user(len, optlen) || copy_to_user(optval, &val, len))
1203 rc = -EFAULT;
1204 out:
1205 release_sock(sk);
1206 return rc;
1207 }
1208
1209 static const struct net_proto_family llc_ui_family_ops = {
1210 .family = PF_LLC,
1211 .create = llc_ui_create,
1212 .owner = THIS_MODULE,
1213 };
1214
1215 static const struct proto_ops llc_ui_ops = {
1216 .family = PF_LLC,
1217 .owner = THIS_MODULE,
1218 .release = llc_ui_release,
1219 .bind = llc_ui_bind,
1220 .connect = llc_ui_connect,
1221 .socketpair = sock_no_socketpair,
1222 .accept = llc_ui_accept,
1223 .getname = llc_ui_getname,
1224 .poll = datagram_poll,
1225 .ioctl = llc_ui_ioctl,
1226 .listen = llc_ui_listen,
1227 .shutdown = llc_ui_shutdown,
1228 .setsockopt = llc_ui_setsockopt,
1229 .getsockopt = llc_ui_getsockopt,
1230 .sendmsg = llc_ui_sendmsg,
1231 .recvmsg = llc_ui_recvmsg,
1232 .mmap = sock_no_mmap,
1233 .sendpage = sock_no_sendpage,
1234 };
1235
1236 static const char llc_proc_err_msg[] __initconst =
1237 KERN_CRIT "LLC: Unable to register the proc_fs entries\n";
1238 static const char llc_sysctl_err_msg[] __initconst =
1239 KERN_CRIT "LLC: Unable to register the sysctl entries\n";
1240 static const char llc_sock_err_msg[] __initconst =
1241 KERN_CRIT "LLC: Unable to register the network family\n";
1242
1243 static int __init llc2_init(void)
1244 {
1245 int rc = proto_register(&llc_proto, 0);
1246
1247 if (rc != 0)
1248 goto out;
1249
1250 llc_build_offset_table();
1251 llc_station_init();
1252 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
1253 rc = llc_proc_init();
1254 if (rc != 0) {
1255 printk(llc_proc_err_msg);
1256 goto out_station;
1257 }
1258 rc = llc_sysctl_init();
1259 if (rc) {
1260 printk(llc_sysctl_err_msg);
1261 goto out_proc;
1262 }
1263 rc = sock_register(&llc_ui_family_ops);
1264 if (rc) {
1265 printk(llc_sock_err_msg);
1266 goto out_sysctl;
1267 }
1268 llc_add_pack(LLC_DEST_SAP, llc_sap_handler);
1269 llc_add_pack(LLC_DEST_CONN, llc_conn_handler);
1270 out:
1271 return rc;
1272 out_sysctl:
1273 llc_sysctl_exit();
1274 out_proc:
1275 llc_proc_exit();
1276 out_station:
1277 llc_station_exit();
1278 proto_unregister(&llc_proto);
1279 goto out;
1280 }
1281
1282 static void __exit llc2_exit(void)
1283 {
1284 llc_station_exit();
1285 llc_remove_pack(LLC_DEST_SAP);
1286 llc_remove_pack(LLC_DEST_CONN);
1287 sock_unregister(PF_LLC);
1288 llc_proc_exit();
1289 llc_sysctl_exit();
1290 proto_unregister(&llc_proto);
1291 }
1292
1293 module_init(llc2_init);
1294 module_exit(llc2_exit);
1295
1296 MODULE_LICENSE("GPL");
1297 MODULE_AUTHOR("Procom 1997, Jay Schullist 2001, Arnaldo C. Melo 2001-2003");
1298 MODULE_DESCRIPTION("IEEE 802.2 PF_LLC support");
1299 MODULE_ALIAS_NETPROTO(PF_LLC);