Lines Matching +full:pn +full:- +full:retry +full:- +full:params
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright 1999-2002 Paul Mackerras.
14 * Part of the code in this driver was inspired by the old async-only
32 #include <linux/ppp-ioctl.h>
34 #include <linux/ppp-comp.h>
78 * assuming a four-byte PPP header on each packet, where the last
90 * interface unit or a ppp channel. In both cases, file->private_data
207 * The lock ordering is: channel.upl -> ppp.wlock -> ppp.rlock ->
215 /* per-net private data for this module */
242 #define PPP_PROTO(skb) get_unaligned_be16((skb)->data)
244 /* We limit the length of ppp->file.rq to this (arbitrary) value */
260 #define seq_before(a, b) ((s32)((a) - (b)) < 0)
261 #define seq_after(a, b) ((s32)((a) - (b)) > 0)
291 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
292 static struct channel *ppp_find_channel(struct ppp_net *pn, int unit);
308 /* per net-namespace data */
331 return -EINVAL; in proto_to_npindex()
362 return -1; in ethertype_to_npindex()
378 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock)
379 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock)
380 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock)
381 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock)
399 if (!ns_capable(file->f_cred->user_ns, CAP_NET_ADMIN)) in ppp_open()
400 return -EPERM; in ppp_open()
406 struct ppp_file *pf = file->private_data; in ppp_release()
410 file->private_data = NULL; in ppp_release()
411 if (pf->kind == INTERFACE) { in ppp_release()
414 if (file == ppp->owner) in ppp_release()
415 unregister_netdevice(ppp->dev); in ppp_release()
418 if (refcount_dec_and_test(&pf->refcnt)) { in ppp_release()
419 switch (pf->kind) { in ppp_release()
435 struct ppp_file *pf = file->private_data; in ppp_read()
445 return -ENXIO; in ppp_read()
446 add_wait_queue(&pf->rwait, &wait); in ppp_read()
449 skb = skb_dequeue(&pf->rq); in ppp_read()
453 if (pf->dead) in ppp_read()
455 if (pf->kind == INTERFACE) { in ppp_read()
464 if (ppp->n_channels == 0 && in ppp_read()
465 (ppp->flags & SC_LOOP_TRAFFIC) == 0) { in ppp_read()
471 ret = -EAGAIN; in ppp_read()
472 if (file->f_flags & O_NONBLOCK) in ppp_read()
474 ret = -ERESTARTSYS; in ppp_read()
480 remove_wait_queue(&pf->rwait, &wait); in ppp_read()
485 ret = -EOVERFLOW; in ppp_read()
486 if (skb->len > count) in ppp_read()
488 ret = -EFAULT; in ppp_read()
492 if (skb_copy_datagram_iter(skb, 0, &to, skb->len)) in ppp_read()
494 ret = skb->len; in ppp_read()
505 * 1-byte code, 1-byte identifier, and 2-byte length. in ppp_check_packet()
507 return get_unaligned_be16(skb->data) != PPP_LCP || in ppp_check_packet()
514 struct ppp_file *pf = file->private_data; in ppp_write()
519 return -ENXIO; in ppp_write()
520 /* All PPP packets should start with the 2-byte protocol */ in ppp_write()
522 return -EINVAL; in ppp_write()
523 ret = -ENOMEM; in ppp_write()
524 skb = alloc_skb(count + pf->hdrlen, GFP_KERNEL); in ppp_write()
527 skb_reserve(skb, pf->hdrlen); in ppp_write()
528 ret = -EFAULT; in ppp_write()
533 ret = -EINVAL; in ppp_write()
539 switch (pf->kind) { in ppp_write()
544 skb_queue_tail(&pf->xq, skb); in ppp_write()
555 /* No kernel lock - fine */
558 struct ppp_file *pf = file->private_data; in ppp_poll()
563 poll_wait(file, &pf->rwait, wait); in ppp_poll()
565 if (skb_peek(&pf->rq)) in ppp_poll()
567 if (pf->dead) in ppp_poll()
569 else if (pf->kind == INTERFACE) { in ppp_poll()
574 if (ppp->n_channels == 0 && in ppp_poll()
575 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
590 if (!uprog->len) in get_filter()
593 /* uprog->len is unsigned short, so no overflow here */ in get_filter()
594 fprog.len = uprog->len; in get_filter()
595 fprog.filter = memdup_array_user(uprog->filter, in get_filter()
596 uprog->len, sizeof(struct sock_filter)); in get_filter()
611 return ERR_PTR(-EFAULT); in ppp_get_filter()
630 return ERR_PTR(-EFAULT); in compat_ppp_get_filter()
640 * the other's ops->start_xmit handler.
648 spin_lock(&pch->upl); in ppp_bridge_channels()
649 if (rcu_dereference_protected(pch->ppp, lockdep_is_held(&pch->upl)) || in ppp_bridge_channels()
650 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) { in ppp_bridge_channels()
651 spin_unlock(&pch->upl); in ppp_bridge_channels()
652 return -EALREADY; in ppp_bridge_channels()
654 refcount_inc(&pchb->file.refcnt); in ppp_bridge_channels()
655 rcu_assign_pointer(pch->bridge, pchb); in ppp_bridge_channels()
656 spin_unlock(&pch->upl); in ppp_bridge_channels()
658 spin_lock(&pchb->upl); in ppp_bridge_channels()
659 if (rcu_dereference_protected(pchb->ppp, lockdep_is_held(&pchb->upl)) || in ppp_bridge_channels()
660 rcu_dereference_protected(pchb->bridge, lockdep_is_held(&pchb->upl))) { in ppp_bridge_channels()
661 spin_unlock(&pchb->upl); in ppp_bridge_channels()
664 refcount_inc(&pch->file.refcnt); in ppp_bridge_channels()
665 rcu_assign_pointer(pchb->bridge, pch); in ppp_bridge_channels()
666 spin_unlock(&pchb->upl); in ppp_bridge_channels()
671 spin_lock(&pch->upl); in ppp_bridge_channels()
672 /* Re-read pch->bridge with upl held in case it was modified concurrently */ in ppp_bridge_channels()
673 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_bridge_channels()
674 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_bridge_channels()
675 spin_unlock(&pch->upl); in ppp_bridge_channels()
679 if (refcount_dec_and_test(&pchb->file.refcnt)) in ppp_bridge_channels()
682 return -EALREADY; in ppp_bridge_channels()
689 spin_lock(&pch->upl); in ppp_unbridge_channels()
690 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_unbridge_channels()
692 spin_unlock(&pch->upl); in ppp_unbridge_channels()
693 return -EINVAL; in ppp_unbridge_channels()
695 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_unbridge_channels()
696 spin_unlock(&pch->upl); in ppp_unbridge_channels()
698 /* Only modify pchb if phcb->bridge points back to pch. in ppp_unbridge_channels()
703 spin_lock(&pchb->upl); in ppp_unbridge_channels()
704 pchbb = rcu_dereference_protected(pchb->bridge, lockdep_is_held(&pchb->upl)); in ppp_unbridge_channels()
706 RCU_INIT_POINTER(pchb->bridge, NULL); in ppp_unbridge_channels()
707 spin_unlock(&pchb->upl); in ppp_unbridge_channels()
712 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unbridge_channels()
715 if (refcount_dec_and_test(&pchb->file.refcnt)) in ppp_unbridge_channels()
725 int err = -EFAULT, val, val2, i; in ppp_ioctl()
736 pf = file->private_data; in ppp_ioctl()
738 err = ppp_unattached_ioctl(current->nsproxy->net_ns, in ppp_ioctl()
747 * ppp-2.4.2 (released November 2003). in ppp_ioctl()
750 current->comm, current->pid); in ppp_ioctl()
751 err = -EINVAL; in ppp_ioctl()
755 if (pf->kind == CHANNEL) { in ppp_ioctl()
758 struct ppp_net *pn; in ppp_ioctl() local
776 err = -ENXIO; in ppp_ioctl()
777 pn = ppp_pernet(current->nsproxy->net_ns); in ppp_ioctl()
778 spin_lock_bh(&pn->all_channels_lock); in ppp_ioctl()
779 pchb = ppp_find_channel(pn, unit); in ppp_ioctl()
784 refcount_inc(&pchb->file.refcnt); in ppp_ioctl()
785 spin_unlock_bh(&pn->all_channels_lock); in ppp_ioctl()
790 if (refcount_dec_and_test(&pchb->file.refcnt)) in ppp_ioctl()
799 down_read(&pch->chan_sem); in ppp_ioctl()
800 chan = pch->chan; in ppp_ioctl()
801 err = -ENOTTY; in ppp_ioctl()
802 if (chan && chan->ops->ioctl) in ppp_ioctl()
803 err = chan->ops->ioctl(chan, cmd, arg); in ppp_ioctl()
804 up_read(&pch->chan_sem); in ppp_ioctl()
809 if (pf->kind != INTERFACE) { in ppp_ioctl()
812 err = -EINVAL; in ppp_ioctl()
821 ppp->mru = val; in ppp_ioctl()
829 cflags = ppp->flags & ~val; in ppp_ioctl()
831 if (!(ppp->flags & SC_MULTILINK) && (val & SC_MULTILINK)) in ppp_ioctl()
832 ppp->nextseq = 0; in ppp_ioctl()
834 ppp->flags = val & SC_FLAG_BITS; in ppp_ioctl()
842 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
852 err = -EFAULT; in ppp_ioctl()
858 if (put_user(ppp->file.index, p)) in ppp_ioctl()
866 ppp->debug = val; in ppp_ioctl()
871 if (put_user(ppp->debug, p)) in ppp_ioctl()
877 idle32.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
878 idle32.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
885 idle64.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
886 idle64.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
906 if (ppp->vj) in ppp_ioctl()
907 slhc_free(ppp->vj); in ppp_ioctl()
908 ppp->vj = vj; in ppp_ioctl()
922 err = -EFAULT; in ppp_ioctl()
923 npi.mode = ppp->npmode[i]; in ppp_ioctl()
927 ppp->npmode[i] = npi.mode; in ppp_ioctl()
929 netif_wake_queue(ppp->dev); in ppp_ioctl()
946 which = &ppp->pass_filter; in ppp_ioctl()
948 which = &ppp->active_filter; in ppp_ioctl()
964 ppp->mrru = val; in ppp_ioctl()
971 err = -ENOTTY; in ppp_ioctl()
991 int err = -ENOIOCTLCMD; in ppp_compat_ioctl()
996 pf = file->private_data; in ppp_compat_ioctl()
997 if (pf && pf->kind == INTERFACE) { in ppp_compat_ioctl()
1012 which = &ppp->pass_filter; in ppp_compat_ioctl()
1014 which = &ppp->active_filter; in ppp_compat_ioctl()
1028 err = -EFAULT; in ppp_compat_ioctl()
1044 if (err == -ENOIOCTLCMD) in ppp_compat_ioctl()
1054 int unit, err = -EFAULT; in ppp_unattached_ioctl()
1057 struct ppp_net *pn; in ppp_unattached_ioctl() local
1069 err = -EFAULT; in ppp_unattached_ioctl()
1079 err = -ENXIO; in ppp_unattached_ioctl()
1080 pn = ppp_pernet(net); in ppp_unattached_ioctl()
1081 mutex_lock(&pn->all_ppp_mutex); in ppp_unattached_ioctl()
1082 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
1084 refcount_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
1085 file->private_data = &ppp->file; in ppp_unattached_ioctl()
1088 mutex_unlock(&pn->all_ppp_mutex); in ppp_unattached_ioctl()
1094 err = -ENXIO; in ppp_unattached_ioctl()
1095 pn = ppp_pernet(net); in ppp_unattached_ioctl()
1096 spin_lock_bh(&pn->all_channels_lock); in ppp_unattached_ioctl()
1097 chan = ppp_find_channel(pn, unit); in ppp_unattached_ioctl()
1099 refcount_inc(&chan->file.refcnt); in ppp_unattached_ioctl()
1100 file->private_data = &chan->file; in ppp_unattached_ioctl()
1103 spin_unlock_bh(&pn->all_channels_lock); in ppp_unattached_ioctl()
1107 err = -ENOTTY; in ppp_unattached_ioctl()
1131 struct ppp_net *pn = net_generic(net, ppp_net_id); in ppp_init_net() local
1133 idr_init(&pn->units_idr); in ppp_init_net()
1134 mutex_init(&pn->all_ppp_mutex); in ppp_init_net()
1136 INIT_LIST_HEAD(&pn->all_channels); in ppp_init_net()
1137 INIT_LIST_HEAD(&pn->new_channels); in ppp_init_net()
1139 spin_lock_init(&pn->all_channels_lock); in ppp_init_net()
1147 struct ppp_net *pn = net_generic(net, ppp_net_id); in ppp_exit_rtnl_net() local
1151 idr_for_each_entry(&pn->units_idr, ppp, id) in ppp_exit_rtnl_net()
1152 ppp_nl_dellink(ppp->dev, dev_to_kill); in ppp_exit_rtnl_net()
1157 struct ppp_net *pn = net_generic(net, ppp_net_id); in ppp_exit_net() local
1159 mutex_destroy(&pn->all_ppp_mutex); in ppp_exit_net()
1160 idr_destroy(&pn->units_idr); in ppp_exit_net()
1161 WARN_ON_ONCE(!list_empty(&pn->all_channels)); in ppp_exit_net()
1162 WARN_ON_ONCE(!list_empty(&pn->new_channels)); in ppp_exit_net()
1175 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_unit_register() local
1178 mutex_lock(&pn->all_ppp_mutex); in ppp_unit_register()
1181 ret = unit_get(&pn->units_idr, ppp, 0); in ppp_unit_register()
1186 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ret); in ppp_unit_register()
1187 if (!netdev_name_in_use(ppp->ppp_net, ppp->dev->name)) in ppp_unit_register()
1189 unit_put(&pn->units_idr, ret); in ppp_unit_register()
1190 ret = unit_get(&pn->units_idr, ppp, ret + 1); in ppp_unit_register()
1196 /* Caller asked for a specific unit number. Fail with -EEXIST in ppp_unit_register()
1197 * if unavailable. For backward compatibility, return -EEXIST in ppp_unit_register()
1198 * too if idr allocation fails; this makes pppd retry without in ppp_unit_register()
1201 if (unit_find(&pn->units_idr, unit)) { in ppp_unit_register()
1202 ret = -EEXIST; in ppp_unit_register()
1205 ret = unit_set(&pn->units_idr, ppp, unit); in ppp_unit_register()
1208 ret = -EEXIST; in ppp_unit_register()
1212 ppp->file.index = ret; in ppp_unit_register()
1215 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ppp->file.index); in ppp_unit_register()
1217 mutex_unlock(&pn->all_ppp_mutex); in ppp_unit_register()
1219 ret = register_netdevice(ppp->dev); in ppp_unit_register()
1228 mutex_lock(&pn->all_ppp_mutex); in ppp_unit_register()
1229 unit_put(&pn->units_idr, ppp->file.index); in ppp_unit_register()
1231 mutex_unlock(&pn->all_ppp_mutex); in ppp_unit_register()
1244 ppp->dev = dev; in ppp_dev_configure()
1245 ppp->ppp_net = src_net; in ppp_dev_configure()
1246 ppp->mru = PPP_MRU; in ppp_dev_configure()
1247 ppp->owner = conf->file; in ppp_dev_configure()
1249 init_ppp_file(&ppp->file, INTERFACE); in ppp_dev_configure()
1250 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_dev_configure()
1253 ppp->npmode[indx] = NPMODE_PASS; in ppp_dev_configure()
1254 INIT_LIST_HEAD(&ppp->channels); in ppp_dev_configure()
1255 spin_lock_init(&ppp->rlock); in ppp_dev_configure()
1256 spin_lock_init(&ppp->wlock); in ppp_dev_configure()
1258 ppp->xmit_recursion = alloc_percpu(struct ppp_xmit_recursion); in ppp_dev_configure()
1259 if (!ppp->xmit_recursion) { in ppp_dev_configure()
1260 err = -ENOMEM; in ppp_dev_configure()
1266 xmit_recursion = per_cpu_ptr(ppp->xmit_recursion, cpu); in ppp_dev_configure()
1267 xmit_recursion->owner = NULL; in ppp_dev_configure()
1268 local_lock_init(&xmit_recursion->bh_lock); in ppp_dev_configure()
1272 ppp->minseq = -1; in ppp_dev_configure()
1273 skb_queue_head_init(&ppp->mrq); in ppp_dev_configure()
1276 ppp->pass_filter = NULL; in ppp_dev_configure()
1277 ppp->active_filter = NULL; in ppp_dev_configure()
1280 err = ppp_unit_register(ppp, conf->unit, conf->ifname_is_set); in ppp_dev_configure()
1284 conf->file->private_data = &ppp->file; in ppp_dev_configure()
1288 free_percpu(ppp->xmit_recursion); in ppp_dev_configure()
1301 return -EINVAL; in ppp_nl_validate()
1304 return -EINVAL; in ppp_nl_validate()
1306 return -EBADF; in ppp_nl_validate()
1312 struct rtnl_newlink_params *params, in ppp_nl_newlink() argument
1315 struct net *link_net = rtnl_newlink_link_net(params); in ppp_nl_newlink()
1316 struct nlattr **data = params->data; in ppp_nl_newlink()
1317 struct nlattr **tb = params->tb; in ppp_nl_newlink()
1319 .unit = -1, in ppp_nl_newlink()
1327 return -EBADF; in ppp_nl_newlink()
1335 err = -EBUSY; in ppp_nl_newlink()
1339 if (file->f_op != &ppp_device_fops || file->private_data) { in ppp_nl_newlink()
1340 err = -EBADF; in ppp_nl_newlink()
1383 return READ_ONCE(ppp->ppp_net); in ppp_nl_get_link_net()
1432 /* not a big deal if we fail here :-) */ in ppp_init()
1457 npi = ethertype_to_npindex(ntohs(skb->protocol)); in ppp_start_xmit()
1462 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1474 /* Put the 2-byte PPP protocol number on the front, in ppp_start_xmit()
1483 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1490 ++dev->stats.tx_dropped; in ppp_start_xmit()
1499 int err = -EFAULT; in ppp_net_siocdevprivate()
1514 if (ppp->xc_state) in ppp_net_siocdevprivate()
1515 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_siocdevprivate()
1516 if (ppp->rc_state) in ppp_net_siocdevprivate()
1517 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_siocdevprivate()
1531 err = -EINVAL; in ppp_net_siocdevprivate()
1540 stats64->rx_errors = dev->stats.rx_errors; in ppp_get_stats64()
1541 stats64->tx_errors = dev->stats.tx_errors; in ppp_get_stats64()
1542 stats64->rx_dropped = dev->stats.rx_dropped; in ppp_get_stats64()
1543 stats64->tx_dropped = dev->stats.tx_dropped; in ppp_get_stats64()
1544 stats64->rx_length_errors = dev->stats.rx_length_errors; in ppp_get_stats64()
1545 dev_fetch_sw_netstats(stats64, dev->tstats); in ppp_get_stats64()
1559 refcount_inc(&ppp->file.refcnt); in ppp_dev_init()
1567 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit() local
1570 ppp->closing = 1; in ppp_dev_uninit()
1573 mutex_lock(&pn->all_ppp_mutex); in ppp_dev_uninit()
1574 unit_put(&pn->units_idr, ppp->file.index); in ppp_dev_uninit()
1575 mutex_unlock(&pn->all_ppp_mutex); in ppp_dev_uninit()
1577 ppp->owner = NULL; in ppp_dev_uninit()
1579 ppp->file.dead = 1; in ppp_dev_uninit()
1580 wake_up_interruptible(&ppp->file.rwait); in ppp_dev_uninit()
1588 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_dev_priv_destructor()
1595 struct ppp *ppp = netdev_priv(ctx->dev); in ppp_fill_forward_path()
1599 if (ppp->flags & SC_MULTILINK) in ppp_fill_forward_path()
1600 return -EOPNOTSUPP; in ppp_fill_forward_path()
1602 pch = list_first_or_null_rcu(&ppp->channels, struct channel, clist); in ppp_fill_forward_path()
1604 return -ENODEV; in ppp_fill_forward_path()
1606 chan = READ_ONCE(pch->chan); in ppp_fill_forward_path()
1608 return -ENODEV; in ppp_fill_forward_path()
1610 if (!chan->ops->fill_forward_path) in ppp_fill_forward_path()
1611 return -EOPNOTSUPP; in ppp_fill_forward_path()
1613 return chan->ops->fill_forward_path(ctx, path, chan); in ppp_fill_forward_path()
1631 dev->netdev_ops = &ppp_netdev_ops; in ppp_setup()
1634 dev->lltx = true; in ppp_setup()
1636 dev->hard_header_len = PPP_HDRLEN; in ppp_setup()
1637 dev->mtu = PPP_MRU; in ppp_setup()
1638 dev->addr_len = 0; in ppp_setup()
1639 dev->tx_queue_len = 3; in ppp_setup()
1640 dev->type = ARPHRD_PPP; in ppp_setup()
1641 dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; in ppp_setup()
1642 dev->priv_destructor = ppp_dev_priv_destructor; in ppp_setup()
1643 dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in ppp_setup()
1648 * Transmit-side routines.
1655 if (!ppp->closing) { in __ppp_xmit_process()
1659 skb_queue_tail(&ppp->file.xq, skb); in __ppp_xmit_process()
1660 while (!ppp->xmit_pending && in __ppp_xmit_process()
1661 (skb = skb_dequeue(&ppp->file.xq))) in __ppp_xmit_process()
1665 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in __ppp_xmit_process()
1666 netif_wake_queue(ppp->dev); in __ppp_xmit_process()
1668 netif_stop_queue(ppp->dev); in __ppp_xmit_process()
1681 xmit_recursion = this_cpu_ptr(ppp->xmit_recursion); in ppp_xmit_process()
1682 if (xmit_recursion->owner == current) in ppp_xmit_process()
1684 local_lock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_xmit_process()
1685 xmit_recursion->owner = current; in ppp_xmit_process()
1689 xmit_recursion->owner = NULL; in ppp_xmit_process()
1690 local_unlock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_xmit_process()
1701 netdev_err(ppp->dev, "recursion detected\n"); in ppp_xmit_process()
1709 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1710 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1711 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1712 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1716 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1719 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1721 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1724 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1725 new_skb->data, skb->len + 2, in pad_compress_skb()
1727 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1740 * frames. The compressor will return -1 if we in pad_compress_skb()
1746 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1766 skb->dev = ppp->dev; in ppp_send_frame()
1774 if (ppp->pass_filter && in ppp_send_frame()
1775 bpf_prog_run(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1776 if (ppp->debug & 1) in ppp_send_frame()
1777 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1784 if (!(ppp->active_filter && in ppp_send_frame()
1785 bpf_prog_run(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1786 ppp->last_xmit = jiffies; in ppp_send_frame()
1790 ppp->last_xmit = jiffies; in ppp_send_frame()
1794 dev_sw_netstats_tx_add(ppp->dev, 1, skb->len - PPP_PROTO_LEN); in ppp_send_frame()
1798 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1801 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1804 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1807 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1808 cp = skb->data + 2; in ppp_send_frame()
1809 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1810 new_skb->data + 2, &cp, in ppp_send_frame()
1811 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1812 if (cp == skb->data + 2) { in ppp_send_frame()
1821 cp[0] = skb->data[2]; in ppp_send_frame()
1838 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1840 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1842 netdev_err(ppp->dev, in ppp_send_frame()
1844 "down - pkt dropped.\n"); in ppp_send_frame()
1857 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1858 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1860 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1861 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1865 ppp->xmit_pending = skb; in ppp_send_frame()
1871 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1883 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1888 list = &ppp->channels; in ppp_push()
1891 ppp->xmit_pending = NULL; in ppp_push()
1896 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1898 list = list->next; in ppp_push()
1901 spin_lock(&pch->downl); in ppp_push()
1902 if (pch->chan) { in ppp_push()
1903 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1904 ppp->xmit_pending = NULL; in ppp_push()
1908 ppp->xmit_pending = NULL; in ppp_push()
1910 spin_unlock(&pch->downl); in ppp_push()
1921 ppp->xmit_pending = NULL; in ppp_push()
1958 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1960 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1961 if (pch->chan) { in ppp_mp_explode()
1962 pch->avail = 1; in ppp_mp_explode()
1964 pch->speed = pch->chan->speed; in ppp_mp_explode()
1966 pch->avail = 0; in ppp_mp_explode()
1968 if (pch->avail) { in ppp_mp_explode()
1969 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1970 !pch->had_frag) { in ppp_mp_explode()
1971 if (pch->speed == 0) in ppp_mp_explode()
1974 totspeed += pch->speed; in ppp_mp_explode()
1976 pch->avail = 2; in ppp_mp_explode()
1980 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1981 ppp->nxchan = i; in ppp_mp_explode()
1994 p = skb->data; in ppp_mp_explode()
1995 len = skb->len; in ppp_mp_explode()
1998 --len; in ppp_mp_explode()
2006 list = &ppp->channels; in ppp_mp_explode()
2007 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
2008 list = list->next; in ppp_mp_explode()
2009 if (list == &ppp->channels) { in ppp_mp_explode()
2018 list = list->next; in ppp_mp_explode()
2019 if (list == &ppp->channels) { in ppp_mp_explode()
2025 if (!pch->avail) in ppp_mp_explode()
2032 if (pch->avail == 1) { in ppp_mp_explode()
2036 pch->avail = 1; in ppp_mp_explode()
2040 spin_lock(&pch->downl); in ppp_mp_explode()
2041 if (pch->chan == NULL) { in ppp_mp_explode()
2043 if (pch->speed == 0) in ppp_mp_explode()
2044 nzero--; in ppp_mp_explode()
2046 totspeed -= pch->speed; in ppp_mp_explode()
2048 spin_unlock(&pch->downl); in ppp_mp_explode()
2049 pch->avail = 0; in ppp_mp_explode()
2051 totfree--; in ppp_mp_explode()
2052 nfree--; in ppp_mp_explode()
2053 if (--navail == 0) in ppp_mp_explode()
2066 if (pch->speed == 0) { in ppp_mp_explode()
2070 nbigger--; in ppp_mp_explode()
2073 flen = (((totfree - nzero)*(totlen + hdrlen*totfree)) / in ppp_mp_explode()
2074 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
2076 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
2077 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
2081 nfree--; in ppp_mp_explode()
2098 pch->avail = 2; in ppp_mp_explode()
2099 spin_unlock(&pch->downl); in ppp_mp_explode()
2104 * hdrlen includes the 2-byte PPP protocol field, but the in ppp_mp_explode()
2108 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
2122 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
2123 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
2124 q[3] = ppp->nxseq; in ppp_mp_explode()
2127 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
2128 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
2129 q[5] = ppp->nxseq; in ppp_mp_explode()
2135 chan = pch->chan; in ppp_mp_explode()
2136 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
2137 !chan->ops->start_xmit(chan, frag)) in ppp_mp_explode()
2138 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
2139 pch->had_frag = 1; in ppp_mp_explode()
2141 len -= flen; in ppp_mp_explode()
2142 ++ppp->nxseq; in ppp_mp_explode()
2144 spin_unlock(&pch->downl); in ppp_mp_explode()
2146 ppp->nxchan = i; in ppp_mp_explode()
2151 spin_unlock(&pch->downl); in ppp_mp_explode()
2152 if (ppp->debug & 1) in ppp_mp_explode()
2153 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
2154 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
2155 ++ppp->nxseq; in ppp_mp_explode()
2165 spin_lock(&pch->downl); in __ppp_channel_push()
2166 if (pch->chan) { in __ppp_channel_push()
2167 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2168 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
2169 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
2171 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
2177 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
2179 spin_unlock(&pch->downl); in __ppp_channel_push()
2181 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2193 ppp = rcu_dereference_bh(pch->ppp); in ppp_channel_push()
2195 xmit_recursion = this_cpu_ptr(ppp->xmit_recursion); in ppp_channel_push()
2196 local_lock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_channel_push()
2197 xmit_recursion->owner = current; in ppp_channel_push()
2199 xmit_recursion->owner = NULL; in ppp_channel_push()
2200 local_unlock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_channel_push()
2208 * Receive-side routines.
2215 #define PPP_MP_CB(skb) ((struct ppp_mp_skb_parm *)((skb)->cb))
2221 if (!ppp->closing) in ppp_do_recv()
2229 * __ppp_decompress_proto - Decompress protocol field, slim version.
2235 * Protocol-Field-Compression (PFC) was negotiated. No checks w.r.t. skb data
2240 if (skb->data[0] & 0x01) in __ppp_decompress_proto()
2245 * ppp_decompress_proto - Check skb data room and decompress protocol field.
2250 * Protocol-Field-Compression (PFC) was negotiated. This function also makes
2254 * Return: true - decompressed successfully, false - not enough room in skb.
2278 pchb = rcu_dereference(pch->bridge); in ppp_channel_bridge_input()
2282 spin_lock_bh(&pchb->downl); in ppp_channel_bridge_input()
2283 if (!pchb->chan) { in ppp_channel_bridge_input()
2289 skb_scrub_packet(skb, !net_eq(pch->chan_net, pchb->chan_net)); in ppp_channel_bridge_input()
2290 if (!pchb->chan->ops->start_xmit(pchb->chan, skb)) in ppp_channel_bridge_input()
2294 spin_unlock_bh(&pchb->downl); in ppp_channel_bridge_input()
2305 struct channel *pch = chan->ppp; in ppp_input()
2319 ppp = rcu_dereference_bh(pch->ppp); in ppp_input()
2323 ++ppp->dev->stats.rx_length_errors; in ppp_input()
2332 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2334 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2335 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2337 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2346 /* Put a 0-length skb in the receive queue as an error indication */
2350 struct channel *pch = chan->ppp; in ppp_input_error()
2358 ppp = rcu_dereference_bh(pch->ppp); in ppp_input_error()
2362 skb->len = 0; /* probably unnecessary */ in ppp_input_error()
2363 skb->cb[0] = code; in ppp_input_error()
2377 /* note: a 0-length skb is used as an error indication */ in ppp_receive_frame()
2378 if (skb->len > 0) { in ppp_receive_frame()
2381 /* XXX do channel-level decompression here */ in ppp_receive_frame()
2396 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
2397 if (ppp->vj) in ppp_receive_error()
2398 slhc_toss(ppp->vj); in ppp_receive_error()
2412 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
2413 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
2416 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
2426 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2431 ns = dev_alloc_skb(skb->len + 128); in ppp_receive_nonmp_frame()
2433 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
2438 skb_copy_bits(skb, 0, skb_put(ns, skb->len), skb->len); in ppp_receive_nonmp_frame()
2443 skb->ip_summed = CHECKSUM_NONE; in ppp_receive_nonmp_frame()
2445 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
2447 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2452 if (len > skb->len) in ppp_receive_nonmp_frame()
2453 skb_put(skb, len - skb->len); in ppp_receive_nonmp_frame()
2454 else if (len < skb->len) in ppp_receive_nonmp_frame()
2460 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2466 if (!pskb_may_pull(skb, skb->len)) in ppp_receive_nonmp_frame()
2469 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
2470 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
2481 dev_sw_netstats_rx_add(ppp->dev, skb->len - PPP_PROTO_LEN); in ppp_receive_nonmp_frame()
2485 /* control or unknown frame - pass it to pppd */ in ppp_receive_nonmp_frame()
2486 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
2488 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
2489 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
2492 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
2495 /* network protocol frame - give it to the kernel */ in ppp_receive_nonmp_frame()
2498 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
2505 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
2506 bpf_prog_run(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
2507 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
2508 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2514 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
2515 bpf_prog_run(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
2516 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2520 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2522 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
2523 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
2528 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
2529 skb->protocol = htons(npindex_to_ethertype[npi]); in ppp_receive_nonmp_frame()
2531 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
2532 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
2553 if (!pskb_may_pull(skb, skb->len)) in ppp_decompress_frame()
2559 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
2561 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
2564 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
2570 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
2575 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2576 skb->len + 2, ns->data, obuff_size); in ppp_decompress_frame()
2581 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
2595 /* Uncompressed frame - pass to decompressor so it in ppp_decompress_frame()
2597 if (ppp->rcomp->incomp) in ppp_decompress_frame()
2598 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2599 skb->len + 2); in ppp_decompress_frame()
2605 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
2621 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2623 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2627 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2628 seq = ((skb->data[2] & 0x0f) << 8) | skb->data[3]; in ppp_receive_mp_frame()
2631 seq = (skb->data[3] << 16) | (skb->data[4] << 8)| skb->data[5]; in ppp_receive_mp_frame()
2634 PPP_MP_CB(skb)->BEbits = skb->data[2]; in ppp_receive_mp_frame()
2642 if (PPP_MP_CB(skb)->BEbits & B) in ppp_receive_mp_frame()
2647 * as possible to ppp->minseq. in ppp_receive_mp_frame()
2649 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2650 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2652 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2653 seq -= mask + 1; /* should never happen */ in ppp_receive_mp_frame()
2654 PPP_MP_CB(skb)->sequence = seq; in ppp_receive_mp_frame()
2655 pch->lastseq = seq; in ppp_receive_mp_frame()
2661 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2663 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2676 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2677 if (seq_before(ch->lastseq, seq)) in ppp_receive_mp_frame()
2678 seq = ch->lastseq; in ppp_receive_mp_frame()
2680 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2681 ppp->minseq = seq; in ppp_receive_mp_frame()
2688 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2689 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2690 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2691 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2699 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2720 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2721 u32 seq = PPP_MP_CB(skb)->sequence; in ppp_mp_insert()
2724 ppp unit receive-side lock. */ in ppp_mp_insert()
2726 if (seq_before(seq, PPP_MP_CB(p)->sequence)) in ppp_mp_insert()
2741 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2742 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2743 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2749 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2755 if (seq_before(PPP_MP_CB(p)->sequence, seq)) { in ppp_mp_reconstruct()
2757 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2759 PPP_MP_CB(p)->sequence, seq); in ppp_mp_reconstruct()
2764 if (PPP_MP_CB(p)->sequence != seq) { in ppp_mp_reconstruct()
2773 seq = seq_before(minseq, PPP_MP_CB(p)->sequence)? in ppp_mp_reconstruct()
2774 minseq + 1: PPP_MP_CB(p)->sequence; in ppp_mp_reconstruct()
2776 if (ppp->debug & 1) in ppp_mp_reconstruct()
2777 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2779 oldseq, seq-1); in ppp_mp_reconstruct()
2786 * ppp->nextseq to seq are either present or lost. in ppp_mp_reconstruct()
2793 if (PPP_MP_CB(p)->BEbits & B) { in ppp_mp_reconstruct()
2799 len += p->len; in ppp_mp_reconstruct()
2802 if (lost == 0 && (PPP_MP_CB(p)->BEbits & E) && in ppp_mp_reconstruct()
2803 (PPP_MP_CB(head)->BEbits & B)) { in ppp_mp_reconstruct()
2804 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2805 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2806 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2813 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2821 if (PPP_MP_CB(p)->BEbits & E) { in ppp_mp_reconstruct()
2825 if (ppp->debug & 1) in ppp_mp_reconstruct()
2826 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2828 PPP_MP_CB(p)->sequence); in ppp_mp_reconstruct()
2843 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2847 if (ppp->debug & 1) in ppp_mp_reconstruct()
2848 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2850 PPP_MP_CB(p)->sequence); in ppp_mp_reconstruct()
2855 if (ppp->debug & 1) in ppp_mp_reconstruct()
2856 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2858 ppp->nextseq, in ppp_mp_reconstruct()
2859 PPP_MP_CB(head)->sequence-1); in ppp_mp_reconstruct()
2860 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2866 struct sk_buff **fragpp = &skb_shinfo(skb)->frag_list; in ppp_mp_reconstruct()
2872 p->next = NULL; in ppp_mp_reconstruct()
2873 fragpp = &p->next; in ppp_mp_reconstruct()
2875 skb->len += p->len; in ppp_mp_reconstruct()
2876 skb->data_len += p->len; in ppp_mp_reconstruct()
2877 skb->truesize += p->truesize; in ppp_mp_reconstruct()
2886 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2900 return ppp_register_net_channel(current->nsproxy->net_ns, chan); in ppp_register_channel()
2907 struct ppp_net *pn; in ppp_register_net_channel() local
2911 return -ENOMEM; in ppp_register_net_channel()
2913 pn = ppp_pernet(net); in ppp_register_net_channel()
2915 pch->chan = chan; in ppp_register_net_channel()
2916 pch->chan_net = get_net_track(net, &pch->ns_tracker, GFP_KERNEL); in ppp_register_net_channel()
2917 chan->ppp = pch; in ppp_register_net_channel()
2918 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2919 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2921 pch->lastseq = -1; in ppp_register_net_channel()
2923 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2924 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2925 spin_lock_init(&pch->upl); in ppp_register_net_channel()
2927 spin_lock_bh(&pn->all_channels_lock); in ppp_register_net_channel()
2928 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2929 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2931 spin_unlock_bh(&pn->all_channels_lock); in ppp_register_net_channel()
2941 struct channel *pch = chan->ppp; in ppp_channel_index()
2944 return pch->file.index; in ppp_channel_index()
2945 return -1; in ppp_channel_index()
2953 struct channel *pch = chan->ppp; in ppp_unit_number()
2955 int unit = -1; in ppp_unit_number()
2959 ppp = rcu_dereference(pch->ppp); in ppp_unit_number()
2961 unit = ppp->file.index; in ppp_unit_number()
2972 struct channel *pch = chan->ppp; in ppp_dev_name()
2978 ppp = rcu_dereference(pch->ppp); in ppp_dev_name()
2979 if (ppp && ppp->dev) in ppp_dev_name()
2980 name = ppp->dev->name; in ppp_dev_name()
2994 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2995 struct ppp_net *pn; in ppp_unregister_channel() local
3000 chan->ppp = NULL; in ppp_unregister_channel()
3006 down_write(&pch->chan_sem); in ppp_unregister_channel()
3007 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
3008 WRITE_ONCE(pch->chan, NULL); in ppp_unregister_channel()
3009 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
3010 up_write(&pch->chan_sem); in ppp_unregister_channel()
3013 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
3014 spin_lock_bh(&pn->all_channels_lock); in ppp_unregister_channel()
3015 list_del(&pch->list); in ppp_unregister_channel()
3016 spin_unlock_bh(&pn->all_channels_lock); in ppp_unregister_channel()
3020 pch->file.dead = 1; in ppp_unregister_channel()
3021 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
3023 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
3034 struct channel *pch = chan->ppp; in ppp_output_wakeup()
3049 int err = -EFAULT; in ppp_set_compress()
3054 if (data->length > CCP_MAX_OPTION_LENGTH) in ppp_set_compress()
3056 if (copy_from_user(ccp_option, data->ptr, data->length)) in ppp_set_compress()
3059 err = -EINVAL; in ppp_set_compress()
3060 if (data->length < 2 || ccp_option[1] < 2 || ccp_option[1] > data->length) in ppp_set_compress()
3065 "ppp-compress-%d", ccp_option[0]); in ppp_set_compress()
3069 err = -ENOBUFS; in ppp_set_compress()
3070 if (data->transmit) { in ppp_set_compress()
3071 state = cp->comp_alloc(ccp_option, data->length); in ppp_set_compress()
3074 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
3075 ocomp = ppp->xcomp; in ppp_set_compress()
3076 ostate = ppp->xc_state; in ppp_set_compress()
3077 ppp->xcomp = cp; in ppp_set_compress()
3078 ppp->xc_state = state; in ppp_set_compress()
3081 ocomp->comp_free(ostate); in ppp_set_compress()
3082 module_put(ocomp->owner); in ppp_set_compress()
3086 module_put(cp->owner); in ppp_set_compress()
3089 state = cp->decomp_alloc(ccp_option, data->length); in ppp_set_compress()
3092 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
3093 ocomp = ppp->rcomp; in ppp_set_compress()
3094 ostate = ppp->rc_state; in ppp_set_compress()
3095 ppp->rcomp = cp; in ppp_set_compress()
3096 ppp->rc_state = state; in ppp_set_compress()
3099 ocomp->decomp_free(ostate); in ppp_set_compress()
3100 module_put(ocomp->owner); in ppp_set_compress()
3104 module_put(cp->owner); in ppp_set_compress()
3123 dp = skb->data + 2; in ppp_ccp_peek()
3137 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
3140 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
3149 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
3150 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
3154 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
3160 len -= CCP_HDRLEN; in ppp_ccp_peek()
3165 if (!ppp->rc_state) in ppp_ccp_peek()
3167 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
3168 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
3169 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
3170 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
3174 if (!ppp->xc_state) in ppp_ccp_peek()
3176 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
3177 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
3178 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
3184 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
3187 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
3188 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
3189 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
3192 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
3193 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
3207 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
3208 ppp->xstate = 0; in ppp_ccp_closed()
3209 xcomp = ppp->xcomp; in ppp_ccp_closed()
3210 xstate = ppp->xc_state; in ppp_ccp_closed()
3211 ppp->xc_state = NULL; in ppp_ccp_closed()
3212 ppp->rstate = 0; in ppp_ccp_closed()
3213 rcomp = ppp->rcomp; in ppp_ccp_closed()
3214 rstate = ppp->rc_state; in ppp_ccp_closed()
3215 ppp->rc_state = NULL; in ppp_ccp_closed()
3219 xcomp->comp_free(xstate); in ppp_ccp_closed()
3220 module_put(xcomp->owner); in ppp_ccp_closed()
3223 rcomp->decomp_free(rstate); in ppp_ccp_closed()
3224 module_put(rcomp->owner); in ppp_ccp_closed()
3243 if (ce->comp->compress_proto == proto) in find_comp_entry()
3256 ret = -EEXIST; in ppp_register_compressor()
3257 if (find_comp_entry(cp->compress_proto)) in ppp_register_compressor()
3259 ret = -ENOMEM; in ppp_register_compressor()
3264 ce->comp = cp; in ppp_register_compressor()
3265 list_add(&ce->list, &compressor_list); in ppp_register_compressor()
3278 ce = find_comp_entry(cp->compress_proto); in ppp_unregister_compressor()
3279 if (ce && ce->comp == cp) { in ppp_unregister_compressor()
3280 list_del(&ce->list); in ppp_unregister_compressor()
3296 cp = ce->comp; in find_compressor()
3297 if (!try_module_get(cp->owner)) in find_compressor()
3311 struct slcompress *vj = ppp->vj; in ppp_get_stats()
3316 struct pcpu_sw_netstats *p = per_cpu_ptr(ppp->dev->tstats, cpu); in ppp_get_stats()
3319 rx_packets = u64_stats_read(&p->rx_packets); in ppp_get_stats()
3320 rx_bytes = u64_stats_read(&p->rx_bytes); in ppp_get_stats()
3321 tx_packets = u64_stats_read(&p->tx_packets); in ppp_get_stats()
3322 tx_bytes = u64_stats_read(&p->tx_bytes); in ppp_get_stats()
3324 st->p.ppp_ipackets += rx_packets; in ppp_get_stats()
3325 st->p.ppp_ibytes += rx_bytes; in ppp_get_stats()
3326 st->p.ppp_opackets += tx_packets; in ppp_get_stats()
3327 st->p.ppp_obytes += tx_bytes; in ppp_get_stats()
3329 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
3330 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
3333 st->vj.vjs_packets = vj->sls_o_compressed + vj->sls_o_uncompressed; in ppp_get_stats()
3334 st->vj.vjs_compressed = vj->sls_o_compressed; in ppp_get_stats()
3335 st->vj.vjs_searches = vj->sls_o_searches; in ppp_get_stats()
3336 st->vj.vjs_misses = vj->sls_o_misses; in ppp_get_stats()
3337 st->vj.vjs_errorin = vj->sls_i_error; in ppp_get_stats()
3338 st->vj.vjs_tossed = vj->sls_i_tossed; in ppp_get_stats()
3339 st->vj.vjs_uncompressedin = vj->sls_i_uncompressed; in ppp_get_stats()
3340 st->vj.vjs_compressedin = vj->sls_i_compressed; in ppp_get_stats()
3351 * unit == -1 means allocate a new number.
3366 err = -ENOMEM; in ppp_create_interface()
3370 dev->rtnl_link_ops = &ppp_link_ops; in ppp_create_interface()
3378 *unit = ppp->file.index; in ppp_create_interface()
3397 pf->kind = kind; in init_ppp_file()
3398 skb_queue_head_init(&pf->xq); in init_ppp_file()
3399 skb_queue_head_init(&pf->rq); in init_ppp_file()
3400 refcount_set(&pf->refcnt, 1); in init_ppp_file()
3401 init_waitqueue_head(&pf->rwait); in init_ppp_file()
3413 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
3415 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
3417 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
3422 if (ppp->vj) { in ppp_destroy_interface()
3423 slhc_free(ppp->vj); in ppp_destroy_interface()
3424 ppp->vj = NULL; in ppp_destroy_interface()
3426 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
3427 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
3429 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
3432 if (ppp->pass_filter) { in ppp_destroy_interface()
3433 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
3434 ppp->pass_filter = NULL; in ppp_destroy_interface()
3437 if (ppp->active_filter) { in ppp_destroy_interface()
3438 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
3439 ppp->active_filter = NULL; in ppp_destroy_interface()
3443 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
3444 free_percpu(ppp->xmit_recursion); in ppp_destroy_interface()
3446 free_netdev(ppp->dev); in ppp_destroy_interface()
3454 ppp_find_unit(struct ppp_net *pn, int unit) in ppp_find_unit() argument
3456 return unit_find(&pn->units_idr, unit); in ppp_find_unit()
3468 ppp_find_channel(struct ppp_net *pn, int unit) in ppp_find_channel() argument
3472 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3473 if (pch->file.index == unit) { in ppp_find_channel()
3474 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3479 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3480 if (pch->file.index == unit) in ppp_find_channel()
3494 struct ppp_net *pn; in ppp_connect_channel() local
3495 int ret = -ENXIO; in ppp_connect_channel()
3498 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3500 mutex_lock(&pn->all_ppp_mutex); in ppp_connect_channel()
3501 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
3504 spin_lock(&pch->upl); in ppp_connect_channel()
3505 ret = -EINVAL; in ppp_connect_channel()
3506 if (rcu_dereference_protected(pch->ppp, lockdep_is_held(&pch->upl)) || in ppp_connect_channel()
3507 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) in ppp_connect_channel()
3511 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3512 if (!pch->chan) { in ppp_connect_channel()
3514 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3516 ret = -ENOTCONN; in ppp_connect_channel()
3519 if (pch->chan->direct_xmit) in ppp_connect_channel()
3520 ppp->dev->priv_flags |= IFF_NO_QUEUE; in ppp_connect_channel()
3522 ppp->dev->priv_flags &= ~IFF_NO_QUEUE; in ppp_connect_channel()
3523 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3524 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3525 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3526 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3527 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
3528 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
3529 list_add_tail_rcu(&pch->clist, &ppp->channels); in ppp_connect_channel()
3530 ++ppp->n_channels; in ppp_connect_channel()
3531 rcu_assign_pointer(pch->ppp, ppp); in ppp_connect_channel()
3532 refcount_inc(&ppp->file.refcnt); in ppp_connect_channel()
3537 spin_unlock(&pch->upl); in ppp_connect_channel()
3539 mutex_unlock(&pn->all_ppp_mutex); in ppp_connect_channel()
3550 int err = -EINVAL; in ppp_disconnect_channel()
3552 spin_lock(&pch->upl); in ppp_disconnect_channel()
3553 ppp = rcu_replace_pointer(pch->ppp, NULL, lockdep_is_held(&pch->upl)); in ppp_disconnect_channel()
3554 spin_unlock(&pch->upl); in ppp_disconnect_channel()
3558 list_del_rcu(&pch->clist); in ppp_disconnect_channel()
3559 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
3560 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
3563 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
3575 put_net_track(pch->chan_net, &pch->ns_tracker); in ppp_destroy_channel()
3576 pch->chan_net = NULL; in ppp_destroy_channel()
3580 if (!pch->file.dead) { in ppp_destroy_channel()
3585 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3586 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3613 if (unit == -ENOSPC) in unit_set()
3614 unit = -EINVAL; in unit_set()