Lines Matching refs:ppp

108 #define PF_TO_PPP(pf)		PF_TO_X(pf, struct ppp)
122 struct ppp { struct
182 struct ppp __rcu *ppp; /* ppp unit we're connected to */ member
266 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb);
267 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
268 static void ppp_push(struct ppp *ppp);
270 static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
272 static void ppp_receive_error(struct ppp *ppp);
273 static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
274 static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
277 static void ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb,
279 static void ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb);
280 static struct sk_buff *ppp_mp_reconstruct(struct ppp *ppp);
281 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb);
283 static int ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data);
284 static void ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound);
285 static void ppp_ccp_closed(struct ppp *ppp);
287 static void ppp_get_stats(struct ppp *ppp, struct ppp_stats *st);
290 static void ppp_destroy_interface(struct ppp *ppp);
291 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
378 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
379 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
380 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
381 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
382 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
383 ppp_recv_lock(ppp); } while (0)
384 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
385 ppp_xmit_unlock(ppp); } while (0)
407 struct ppp *ppp; in ppp_release() local
412 ppp = PF_TO_PPP(pf); in ppp_release()
414 if (file == ppp->owner) in ppp_release()
415 unregister_netdevice(ppp->dev); in ppp_release()
461 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
463 ppp_recv_lock(ppp); in ppp_read()
464 if (ppp->n_channels == 0 && in ppp_read()
465 (ppp->flags & SC_LOOP_TRAFFIC) == 0) { in ppp_read()
466 ppp_recv_unlock(ppp); in ppp_read()
469 ppp_recv_unlock(ppp); in ppp_read()
571 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
573 ppp_recv_lock(ppp); in ppp_poll()
574 if (ppp->n_channels == 0 && in ppp_poll()
575 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
577 ppp_recv_unlock(ppp); in ppp_poll()
649 if (rcu_dereference_protected(pch->ppp, lockdep_is_held(&pch->upl)) || in ppp_bridge_channels()
659 if (rcu_dereference_protected(pchb->ppp, lockdep_is_held(&pchb->upl)) || in ppp_bridge_channels()
724 struct ppp *ppp; in ppp_ioctl() local
816 ppp = PF_TO_PPP(pf); in ppp_ioctl()
821 ppp->mru = val; in ppp_ioctl()
828 ppp_lock(ppp); 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()
835 ppp_unlock(ppp); in ppp_ioctl()
837 ppp_ccp_closed(ppp); in ppp_ioctl()
842 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
854 err = ppp_set_compress(ppp, &data); 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()
905 ppp_lock(ppp); 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()
909 ppp_unlock(ppp); 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()
949 ppp_lock(ppp); in ppp_ioctl()
953 ppp_unlock(ppp); in ppp_ioctl()
963 ppp_recv_lock(ppp); in ppp_ioctl()
964 ppp->mrru = val; in ppp_ioctl()
965 ppp_recv_unlock(ppp); in ppp_ioctl()
998 struct ppp *ppp = PF_TO_PPP(pf); in ppp_compat_ioctl() local
1012 which = &ppp->pass_filter; in ppp_compat_ioctl()
1014 which = &ppp->active_filter; in ppp_compat_ioctl()
1015 ppp_lock(ppp); in ppp_compat_ioctl()
1019 ppp_unlock(ppp); in ppp_compat_ioctl()
1035 err = ppp_set_compress(ppp, &data); in ppp_compat_ioctl()
1055 struct ppp *ppp; in ppp_unattached_ioctl() local
1082 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
1083 if (ppp) { in ppp_unattached_ioctl()
1084 refcount_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
1085 file->private_data = &ppp->file; in ppp_unattached_ioctl()
1148 struct ppp *ppp; 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()
1173 static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set) in ppp_unit_register() argument
1175 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); 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()
1190 ret = unit_get(&pn->units_idr, ppp, ret + 1); in ppp_unit_register()
1205 ret = unit_set(&pn->units_idr, ppp, unit); 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()
1219 ret = register_netdevice(ppp->dev); in ppp_unit_register()
1229 unit_put(&pn->units_idr, ppp->file.index); in ppp_unit_register()
1239 struct ppp *ppp = netdev_priv(dev); in ppp_dev_configure() local
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()
1266 xmit_recursion = per_cpu_ptr(ppp->xmit_recursion, cpu); 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()
1381 struct ppp *ppp = netdev_priv(dev); in ppp_nl_get_link_net() local
1383 return READ_ONCE(ppp->ppp_net); in ppp_nl_get_link_net()
1390 .priv_size = sizeof(struct ppp),
1453 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
1462 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1483 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1484 ppp_xmit_process(ppp, skb); in ppp_start_xmit()
1498 struct ppp *ppp = netdev_priv(dev); in ppp_net_siocdevprivate() local
1506 ppp_get_stats(ppp, &stats); 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()
1550 struct ppp *ppp; in ppp_dev_init() local
1554 ppp = netdev_priv(dev); in ppp_dev_init()
1559 refcount_inc(&ppp->file.refcnt); in ppp_dev_init()
1566 struct ppp *ppp = netdev_priv(dev); in ppp_dev_uninit() local
1567 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit()
1569 ppp_lock(ppp); in ppp_dev_uninit()
1570 ppp->closing = 1; in ppp_dev_uninit()
1571 ppp_unlock(ppp); in ppp_dev_uninit()
1574 unit_put(&pn->units_idr, ppp->file.index); 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()
1585 struct ppp *ppp; in ppp_dev_priv_destructor() local
1587 ppp = netdev_priv(dev); in ppp_dev_priv_destructor()
1588 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_dev_priv_destructor()
1589 ppp_destroy_interface(ppp); in ppp_dev_priv_destructor()
1595 struct ppp *ppp = netdev_priv(ctx->dev); in ppp_fill_forward_path() local
1599 if (ppp->flags & SC_MULTILINK) in ppp_fill_forward_path()
1602 pch = list_first_or_null_rcu(&ppp->channels, struct channel, clist); in ppp_fill_forward_path()
1654 static void __ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in __ppp_xmit_process() argument
1656 ppp_xmit_lock(ppp); in __ppp_xmit_process()
1657 if (!ppp->closing) { in __ppp_xmit_process()
1658 ppp_push(ppp); in __ppp_xmit_process()
1661 skb_queue_tail(&ppp->file.xq, skb); in __ppp_xmit_process()
1662 while (!ppp->xmit_pending && in __ppp_xmit_process()
1663 (skb = skb_dequeue(&ppp->file.xq))) in __ppp_xmit_process()
1664 ppp_send_frame(ppp, skb); in __ppp_xmit_process()
1667 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in __ppp_xmit_process()
1668 netif_wake_queue(ppp->dev); in __ppp_xmit_process()
1670 netif_stop_queue(ppp->dev); in __ppp_xmit_process()
1674 ppp_xmit_unlock(ppp); in __ppp_xmit_process()
1677 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in ppp_xmit_process() argument
1683 xmit_recursion = this_cpu_ptr(ppp->xmit_recursion); in ppp_xmit_process()
1686 local_lock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_xmit_process()
1689 __ppp_xmit_process(ppp, skb); in ppp_xmit_process()
1692 local_unlock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_xmit_process()
1703 netdev_err(ppp->dev, "recursion detected\n"); in ppp_xmit_process()
1707 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1711 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1712 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1713 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1714 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1722 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1725 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1727 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1730 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1733 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1752 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1765 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1772 skb->dev = ppp->dev; in ppp_send_frame()
1780 if (ppp->pass_filter && in ppp_send_frame()
1781 bpf_prog_run(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1782 if (ppp->debug & 1) in ppp_send_frame()
1783 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1790 if (!(ppp->active_filter && in ppp_send_frame()
1791 bpf_prog_run(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1792 ppp->last_xmit = jiffies; in ppp_send_frame()
1796 ppp->last_xmit = jiffies; in ppp_send_frame()
1800 dev_sw_netstats_tx_add(ppp->dev, 1, skb->len - PPP_PROTO_LEN); in ppp_send_frame()
1804 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1811 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1814 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1817 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1819 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1821 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1843 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1848 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1850 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1852 netdev_err(ppp->dev, in ppp_send_frame()
1857 new_skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1867 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1868 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1870 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1871 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1875 ppp->xmit_pending = skb; in ppp_send_frame()
1876 ppp_push(ppp); in ppp_send_frame()
1881 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1889 ppp_push(struct ppp *ppp) in ppp_push() argument
1893 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1898 list = &ppp->channels; in ppp_push()
1901 ppp->xmit_pending = NULL; in ppp_push()
1906 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1919 ppp->xmit_pending = NULL; in ppp_push()
1924 ppp->xmit_pending = NULL; in ppp_push()
1934 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1938 ppp->xmit_pending = NULL; in ppp_push()
1952 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1975 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1977 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1997 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1998 ppp->nxchan = i; in ppp_mp_explode()
2025 list = &ppp->channels; in ppp_mp_explode()
2026 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
2028 if (list == &ppp->channels) { in ppp_mp_explode()
2038 if (list == &ppp->channels) { in ppp_mp_explode()
2141 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
2142 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
2143 q[3] = ppp->nxseq; in ppp_mp_explode()
2146 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
2147 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
2148 q[5] = ppp->nxseq; in ppp_mp_explode()
2161 ++ppp->nxseq; in ppp_mp_explode()
2165 ppp->nxchan = i; in ppp_mp_explode()
2172 if (ppp->debug & 1) in ppp_mp_explode()
2173 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
2174 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
2175 ++ppp->nxseq; in ppp_mp_explode()
2181 static void __ppp_channel_push(struct channel *pch, struct ppp *ppp) in __ppp_channel_push() argument
2202 if (ppp) in __ppp_channel_push()
2203 __ppp_xmit_process(ppp, NULL); in __ppp_channel_push()
2210 struct ppp *ppp; in ppp_channel_push() local
2213 ppp = rcu_dereference_bh(pch->ppp); in ppp_channel_push()
2214 if (ppp) { in ppp_channel_push()
2215 xmit_recursion = this_cpu_ptr(ppp->xmit_recursion); in ppp_channel_push()
2216 local_lock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_channel_push()
2218 __ppp_channel_push(pch, ppp); in ppp_channel_push()
2220 local_unlock_nested_bh(&ppp->xmit_recursion->bh_lock); in ppp_channel_push()
2238 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2240 ppp_recv_lock(ppp); in ppp_do_recv()
2241 if (!ppp->closing) in ppp_do_recv()
2242 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2245 ppp_recv_unlock(ppp); in ppp_do_recv()
2325 struct channel *pch = chan->ppp; in ppp_input()
2326 struct ppp *ppp; in ppp_input() local
2339 ppp = rcu_dereference_bh(pch->ppp); in ppp_input()
2342 if (ppp) { in ppp_input()
2343 ++ppp->dev->stats.rx_length_errors; in ppp_input()
2344 ppp_receive_error(ppp); in ppp_input()
2350 if (!ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2359 ppp_do_recv(ppp, skb, pch); in ppp_input()
2370 struct channel *pch = chan->ppp; in ppp_input_error()
2372 struct ppp *ppp; in ppp_input_error() local
2378 ppp = rcu_dereference_bh(pch->ppp); in ppp_input_error()
2379 if (ppp) { in ppp_input_error()
2384 ppp_do_recv(ppp, skb, pch); in ppp_input_error()
2395 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2403 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2406 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
2409 ppp_receive_error(ppp); in ppp_receive_frame()
2414 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
2416 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
2417 if (ppp->vj) in ppp_receive_error()
2418 slhc_toss(ppp->vj); in ppp_receive_error()
2422 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
2432 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
2433 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
2434 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
2436 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
2446 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2453 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
2465 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
2467 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2480 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2489 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
2490 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
2497 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
2501 dev_sw_netstats_rx_add(ppp->dev, skb->len - PPP_PROTO_LEN); in ppp_receive_nonmp_frame()
2506 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
2508 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
2509 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
2512 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
2518 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
2525 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
2526 bpf_prog_run(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
2527 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
2528 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2534 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
2535 bpf_prog_run(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
2536 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2540 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2542 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
2543 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
2548 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
2551 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
2552 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
2560 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
2564 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
2579 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
2581 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
2584 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
2590 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
2595 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2601 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
2617 if (ppp->rcomp->incomp) in ppp_decompress_frame()
2618 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2625 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
2626 ppp_receive_error(ppp); in ppp_decompress_frame()
2637 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2641 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2643 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2647 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2669 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2670 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2672 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2681 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2683 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2684 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2696 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2700 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2701 ppp->minseq = seq; in ppp_receive_mp_frame()
2704 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2708 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2709 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2710 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2711 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2715 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2717 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2719 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2721 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2729 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2737 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2740 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2759 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2761 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2762 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2763 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2769 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2777 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2796 if (ppp->debug & 1) in ppp_mp_reconstruct()
2797 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2824 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2825 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2826 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2833 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2845 if (ppp->debug & 1) in ppp_mp_reconstruct()
2846 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2863 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2867 if (ppp->debug & 1) in ppp_mp_reconstruct()
2868 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2875 if (ppp->debug & 1) in ppp_mp_reconstruct()
2876 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2878 ppp->nextseq, in ppp_mp_reconstruct()
2880 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2881 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2906 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2937 chan->ppp = pch; in ppp_register_net_channel()
2961 struct channel *pch = chan->ppp; in ppp_channel_index()
2973 struct channel *pch = chan->ppp; in ppp_unit_number()
2974 struct ppp *ppp; in ppp_unit_number() local
2979 ppp = rcu_dereference(pch->ppp); in ppp_unit_number()
2980 if (ppp) in ppp_unit_number()
2981 unit = ppp->file.index; in ppp_unit_number()
2992 struct channel *pch = chan->ppp; in ppp_dev_name()
2994 struct ppp *ppp; in ppp_dev_name() local
2998 ppp = rcu_dereference(pch->ppp); in ppp_dev_name()
2999 if (ppp && ppp->dev) in ppp_dev_name()
3000 name = ppp->dev->name; in ppp_dev_name()
3014 struct channel *pch = chan->ppp; in ppp_unregister_channel()
3020 chan->ppp = NULL; in ppp_unregister_channel()
3054 struct channel *pch = chan->ppp; in ppp_output_wakeup()
3067 ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data) in ppp_set_compress() argument
3093 ppp_xmit_lock(ppp); in ppp_set_compress()
3094 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
3095 ocomp = ppp->xcomp; in ppp_set_compress()
3096 ostate = ppp->xc_state; in ppp_set_compress()
3097 ppp->xcomp = cp; in ppp_set_compress()
3098 ppp->xc_state = state; in ppp_set_compress()
3099 ppp_xmit_unlock(ppp); in ppp_set_compress()
3111 ppp_recv_lock(ppp); in ppp_set_compress()
3112 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
3113 ocomp = ppp->rcomp; in ppp_set_compress()
3114 ostate = ppp->rc_state; in ppp_set_compress()
3115 ppp->rcomp = cp; in ppp_set_compress()
3116 ppp->rc_state = state; in ppp_set_compress()
3117 ppp_recv_unlock(ppp); in ppp_set_compress()
3136 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
3157 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
3160 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
3169 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
3170 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
3174 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
3185 if (!ppp->rc_state) in ppp_ccp_peek()
3187 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
3188 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
3189 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
3190 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
3194 if (!ppp->xc_state) in ppp_ccp_peek()
3196 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
3197 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
3198 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
3204 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
3207 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
3208 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
3209 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
3212 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
3213 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
3221 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
3226 ppp_lock(ppp); in ppp_ccp_closed()
3227 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
3228 ppp->xstate = 0; in ppp_ccp_closed()
3229 xcomp = ppp->xcomp; in ppp_ccp_closed()
3230 xstate = ppp->xc_state; in ppp_ccp_closed()
3231 ppp->xc_state = NULL; in ppp_ccp_closed()
3232 ppp->rstate = 0; in ppp_ccp_closed()
3233 rcomp = ppp->rcomp; in ppp_ccp_closed()
3234 rstate = ppp->rc_state; in ppp_ccp_closed()
3235 ppp->rc_state = NULL; in ppp_ccp_closed()
3236 ppp_unlock(ppp); in ppp_ccp_closed()
3329 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
3331 struct slcompress *vj = ppp->vj; in ppp_get_stats()
3336 struct pcpu_sw_netstats *p = per_cpu_ptr(ppp->dev->tstats, cpu); in ppp_get_stats()
3349 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
3350 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
3381 struct ppp *ppp; in ppp_create_interface() local
3384 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_ENUM, ppp_setup); in ppp_create_interface()
3397 ppp = netdev_priv(dev); in ppp_create_interface()
3398 *unit = ppp->file.index; in ppp_create_interface()
3429 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
3433 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
3435 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
3437 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
3441 ppp_ccp_closed(ppp); in ppp_destroy_interface()
3442 if (ppp->vj) { in ppp_destroy_interface()
3443 slhc_free(ppp->vj); in ppp_destroy_interface()
3444 ppp->vj = NULL; in ppp_destroy_interface()
3446 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
3447 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
3449 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
3452 if (ppp->pass_filter) { in ppp_destroy_interface()
3453 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
3454 ppp->pass_filter = NULL; in ppp_destroy_interface()
3457 if (ppp->active_filter) { in ppp_destroy_interface()
3458 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
3459 ppp->active_filter = NULL; in ppp_destroy_interface()
3463 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
3464 free_percpu(ppp->xmit_recursion); in ppp_destroy_interface()
3466 free_netdev(ppp->dev); in ppp_destroy_interface()
3473 static struct ppp *
3513 struct ppp *ppp; in ppp_connect_channel() local
3521 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
3522 if (!ppp) in ppp_connect_channel()
3526 if (rcu_dereference_protected(pch->ppp, lockdep_is_held(&pch->upl)) || in ppp_connect_channel()
3530 ppp_lock(ppp); in ppp_connect_channel()
3535 ppp_unlock(ppp); in ppp_connect_channel()
3540 ppp->dev->priv_flags |= IFF_NO_QUEUE; in ppp_connect_channel()
3542 ppp->dev->priv_flags &= ~IFF_NO_QUEUE; in ppp_connect_channel()
3544 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3545 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3547 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
3548 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
3549 list_add_tail_rcu(&pch->clist, &ppp->channels); in ppp_connect_channel()
3550 ++ppp->n_channels; in ppp_connect_channel()
3551 rcu_assign_pointer(pch->ppp, ppp); in ppp_connect_channel()
3552 refcount_inc(&ppp->file.refcnt); in ppp_connect_channel()
3553 ppp_unlock(ppp); in ppp_connect_channel()
3569 struct ppp *ppp; in ppp_disconnect_channel() local
3573 ppp = rcu_replace_pointer(pch->ppp, NULL, lockdep_is_held(&pch->upl)); in ppp_disconnect_channel()
3575 if (ppp) { in ppp_disconnect_channel()
3577 ppp_lock(ppp); in ppp_disconnect_channel()
3579 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
3580 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
3581 ppp_unlock(ppp); in ppp_disconnect_channel()
3583 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
3584 ppp_destroy_interface(ppp); in ppp_disconnect_channel()