Lines Matching refs:ppp

92 #define PF_TO_PPP(pf)		PF_TO_X(pf, struct ppp)
113 struct ppp { struct
174 struct ppp *ppp; /* ppp unit we're connected to */ member
256 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb);
257 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
258 static void ppp_push(struct ppp *ppp);
260 static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
262 static void ppp_receive_error(struct ppp *ppp);
263 static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
264 static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
267 static void ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb,
269 static void ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb);
270 static struct sk_buff *ppp_mp_reconstruct(struct ppp *ppp);
271 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb);
273 static int ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data);
274 static void ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound);
275 static void ppp_ccp_closed(struct ppp *ppp);
277 static void ppp_get_stats(struct ppp *ppp, struct ppp_stats *st);
280 static void ppp_destroy_interface(struct ppp *ppp);
281 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
366 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
367 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
368 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
369 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
370 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
371 ppp_recv_lock(ppp); } while (0)
372 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
373 ppp_xmit_unlock(ppp); } while (0)
395 struct ppp *ppp; in ppp_release() local
400 ppp = PF_TO_PPP(pf); in ppp_release()
402 if (file == ppp->owner) in ppp_release()
403 unregister_netdevice(ppp->dev); in ppp_release()
449 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
451 ppp_recv_lock(ppp); in ppp_read()
452 if (ppp->n_channels == 0 && in ppp_read()
453 (ppp->flags & SC_LOOP_TRAFFIC) == 0) { in ppp_read()
454 ppp_recv_unlock(ppp); in ppp_read()
457 ppp_recv_unlock(ppp); in ppp_read()
542 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
544 ppp_recv_lock(ppp); in ppp_poll()
545 if (ppp->n_channels == 0 && in ppp_poll()
546 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
548 ppp_recv_unlock(ppp); in ppp_poll()
612 struct ppp *ppp; in ppp_ioctl() local
678 ppp = PF_TO_PPP(pf); in ppp_ioctl()
683 ppp->mru = val; in ppp_ioctl()
690 ppp_lock(ppp); in ppp_ioctl()
691 cflags = ppp->flags & ~val; in ppp_ioctl()
693 if (!(ppp->flags & SC_MULTILINK) && (val & SC_MULTILINK)) in ppp_ioctl()
694 ppp->nextseq = 0; in ppp_ioctl()
696 ppp->flags = val & SC_FLAG_BITS; in ppp_ioctl()
697 ppp_unlock(ppp); in ppp_ioctl()
699 ppp_ccp_closed(ppp); in ppp_ioctl()
704 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
716 err = ppp_set_compress(ppp, &data); in ppp_ioctl()
720 if (put_user(ppp->file.index, p)) in ppp_ioctl()
728 ppp->debug = val; in ppp_ioctl()
733 if (put_user(ppp->debug, p)) in ppp_ioctl()
739 idle32.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
740 idle32.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
747 idle64.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
748 idle64.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
767 ppp_lock(ppp); in ppp_ioctl()
768 if (ppp->vj) in ppp_ioctl()
769 slhc_free(ppp->vj); in ppp_ioctl()
770 ppp->vj = vj; in ppp_ioctl()
771 ppp_unlock(ppp); in ppp_ioctl()
785 npi.mode = ppp->npmode[i]; in ppp_ioctl()
789 ppp->npmode[i] = npi.mode; in ppp_ioctl()
791 netif_wake_queue(ppp->dev); in ppp_ioctl()
808 which = &ppp->pass_filter; in ppp_ioctl()
810 which = &ppp->active_filter; in ppp_ioctl()
811 ppp_lock(ppp); in ppp_ioctl()
815 ppp_unlock(ppp); in ppp_ioctl()
825 ppp_recv_lock(ppp); in ppp_ioctl()
826 ppp->mrru = val; in ppp_ioctl()
827 ppp_recv_unlock(ppp); in ppp_ioctl()
860 struct ppp *ppp = PF_TO_PPP(pf); in ppp_compat_ioctl() local
874 which = &ppp->pass_filter; in ppp_compat_ioctl()
876 which = &ppp->active_filter; in ppp_compat_ioctl()
877 ppp_lock(ppp); in ppp_compat_ioctl()
881 ppp_unlock(ppp); in ppp_compat_ioctl()
897 err = ppp_set_compress(ppp, &data); in ppp_compat_ioctl()
917 struct ppp *ppp; in ppp_unattached_ioctl() local
944 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
945 if (ppp) { in ppp_unattached_ioctl()
946 refcount_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
947 file->private_data = &ppp->file; in ppp_unattached_ioctl()
1009 struct ppp *ppp; in ppp_exit_net() local
1019 idr_for_each_entry(&pn->units_idr, ppp, id) in ppp_exit_net()
1021 if (!net_eq(dev_net(ppp->dev), net)) in ppp_exit_net()
1022 unregister_netdevice_queue(ppp->dev, &list); in ppp_exit_net()
1040 static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set) in ppp_unit_register() argument
1042 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_unit_register()
1048 ret = unit_get(&pn->units_idr, ppp); in ppp_unit_register()
1061 ret = unit_set(&pn->units_idr, ppp, unit); in ppp_unit_register()
1068 ppp->file.index = ret; in ppp_unit_register()
1071 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ppp->file.index); in ppp_unit_register()
1075 ret = register_netdevice(ppp->dev); in ppp_unit_register()
1085 unit_put(&pn->units_idr, ppp->file.index); in ppp_unit_register()
1095 struct ppp *ppp = netdev_priv(dev); in ppp_dev_configure() local
1100 ppp->dev = dev; in ppp_dev_configure()
1101 ppp->ppp_net = src_net; in ppp_dev_configure()
1102 ppp->mru = PPP_MRU; in ppp_dev_configure()
1103 ppp->owner = conf->file; in ppp_dev_configure()
1105 init_ppp_file(&ppp->file, INTERFACE); in ppp_dev_configure()
1106 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_dev_configure()
1109 ppp->npmode[indx] = NPMODE_PASS; in ppp_dev_configure()
1110 INIT_LIST_HEAD(&ppp->channels); in ppp_dev_configure()
1111 spin_lock_init(&ppp->rlock); in ppp_dev_configure()
1112 spin_lock_init(&ppp->wlock); in ppp_dev_configure()
1114 ppp->xmit_recursion = alloc_percpu(int); in ppp_dev_configure()
1115 if (!ppp->xmit_recursion) { in ppp_dev_configure()
1120 (*per_cpu_ptr(ppp->xmit_recursion, cpu)) = 0; in ppp_dev_configure()
1123 ppp->minseq = -1; in ppp_dev_configure()
1124 skb_queue_head_init(&ppp->mrq); in ppp_dev_configure()
1127 ppp->pass_filter = NULL; in ppp_dev_configure()
1128 ppp->active_filter = NULL; in ppp_dev_configure()
1131 err = ppp_unit_register(ppp, conf->unit, conf->ifname_is_set); in ppp_dev_configure()
1135 conf->file->private_data = &ppp->file; in ppp_dev_configure()
1139 free_percpu(ppp->xmit_recursion); in ppp_dev_configure()
1229 struct ppp *ppp = netdev_priv(dev); in ppp_nl_get_link_net() local
1231 return ppp->ppp_net; in ppp_nl_get_link_net()
1238 .priv_size = sizeof(struct ppp),
1303 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
1312 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1333 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1334 ppp_xmit_process(ppp, skb); in ppp_start_xmit()
1347 struct ppp *ppp = netdev_priv(dev); in ppp_net_ioctl() local
1356 ppp_get_stats(ppp, &stats); in ppp_net_ioctl()
1364 if (ppp->xc_state) in ppp_net_ioctl()
1365 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_ioctl()
1366 if (ppp->rc_state) in ppp_net_ioctl()
1367 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_ioctl()
1390 struct ppp *ppp = netdev_priv(dev); in ppp_get_stats64() local
1392 ppp_recv_lock(ppp); in ppp_get_stats64()
1393 stats64->rx_packets = ppp->stats64.rx_packets; in ppp_get_stats64()
1394 stats64->rx_bytes = ppp->stats64.rx_bytes; in ppp_get_stats64()
1395 ppp_recv_unlock(ppp); in ppp_get_stats64()
1397 ppp_xmit_lock(ppp); in ppp_get_stats64()
1398 stats64->tx_packets = ppp->stats64.tx_packets; in ppp_get_stats64()
1399 stats64->tx_bytes = ppp->stats64.tx_bytes; in ppp_get_stats64()
1400 ppp_xmit_unlock(ppp); in ppp_get_stats64()
1411 struct ppp *ppp; in ppp_dev_init() local
1415 ppp = netdev_priv(dev); in ppp_dev_init()
1420 refcount_inc(&ppp->file.refcnt); in ppp_dev_init()
1427 struct ppp *ppp = netdev_priv(dev); in ppp_dev_uninit() local
1428 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit()
1430 ppp_lock(ppp); in ppp_dev_uninit()
1431 ppp->closing = 1; in ppp_dev_uninit()
1432 ppp_unlock(ppp); in ppp_dev_uninit()
1435 unit_put(&pn->units_idr, ppp->file.index); in ppp_dev_uninit()
1438 ppp->owner = NULL; in ppp_dev_uninit()
1440 ppp->file.dead = 1; in ppp_dev_uninit()
1441 wake_up_interruptible(&ppp->file.rwait); in ppp_dev_uninit()
1446 struct ppp *ppp; in ppp_dev_priv_destructor() local
1448 ppp = netdev_priv(dev); in ppp_dev_priv_destructor()
1449 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_dev_priv_destructor()
1450 ppp_destroy_interface(ppp); in ppp_dev_priv_destructor()
1487 static void __ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in __ppp_xmit_process() argument
1489 ppp_xmit_lock(ppp); in __ppp_xmit_process()
1490 if (!ppp->closing) { in __ppp_xmit_process()
1491 ppp_push(ppp); in __ppp_xmit_process()
1494 skb_queue_tail(&ppp->file.xq, skb); in __ppp_xmit_process()
1495 while (!ppp->xmit_pending && in __ppp_xmit_process()
1496 (skb = skb_dequeue(&ppp->file.xq))) in __ppp_xmit_process()
1497 ppp_send_frame(ppp, skb); in __ppp_xmit_process()
1500 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in __ppp_xmit_process()
1501 netif_wake_queue(ppp->dev); in __ppp_xmit_process()
1503 netif_stop_queue(ppp->dev); in __ppp_xmit_process()
1507 ppp_xmit_unlock(ppp); in __ppp_xmit_process()
1510 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in ppp_xmit_process() argument
1514 if (unlikely(*this_cpu_ptr(ppp->xmit_recursion))) in ppp_xmit_process()
1517 (*this_cpu_ptr(ppp->xmit_recursion))++; in ppp_xmit_process()
1518 __ppp_xmit_process(ppp, skb); in ppp_xmit_process()
1519 (*this_cpu_ptr(ppp->xmit_recursion))--; in ppp_xmit_process()
1531 netdev_err(ppp->dev, "recursion detected\n"); in ppp_xmit_process()
1535 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1539 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1540 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1541 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1542 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1546 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1549 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1551 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1554 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1557 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1576 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1590 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1603 if (ppp->pass_filter && in ppp_send_frame()
1604 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1605 if (ppp->debug & 1) in ppp_send_frame()
1606 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1613 if (!(ppp->active_filter && in ppp_send_frame()
1614 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1615 ppp->last_xmit = jiffies; in ppp_send_frame()
1619 ppp->last_xmit = jiffies; in ppp_send_frame()
1623 ++ppp->stats64.tx_packets; in ppp_send_frame()
1624 ppp->stats64.tx_bytes += skb->len - 2; in ppp_send_frame()
1628 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1631 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1634 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1637 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1639 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1641 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1663 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1668 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1670 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1672 netdev_err(ppp->dev, in ppp_send_frame()
1677 skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1686 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1687 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1689 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1690 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1694 ppp->xmit_pending = skb; in ppp_send_frame()
1695 ppp_push(ppp); in ppp_send_frame()
1700 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1708 ppp_push(struct ppp *ppp) in ppp_push() argument
1712 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1717 list = &ppp->channels; in ppp_push()
1720 ppp->xmit_pending = NULL; in ppp_push()
1725 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1733 ppp->xmit_pending = NULL; in ppp_push()
1737 ppp->xmit_pending = NULL; in ppp_push()
1746 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1750 ppp->xmit_pending = NULL; in ppp_push()
1764 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1787 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1789 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1809 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1810 ppp->nxchan = i; in ppp_mp_explode()
1835 list = &ppp->channels; in ppp_mp_explode()
1836 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
1838 if (list == &ppp->channels) { in ppp_mp_explode()
1848 if (list == &ppp->channels) { in ppp_mp_explode()
1951 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
1952 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
1953 q[3] = ppp->nxseq; in ppp_mp_explode()
1956 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
1957 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
1958 q[5] = ppp->nxseq; in ppp_mp_explode()
1971 ++ppp->nxseq; in ppp_mp_explode()
1975 ppp->nxchan = i; in ppp_mp_explode()
1981 if (ppp->debug & 1) in ppp_mp_explode()
1982 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
1983 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
1984 ++ppp->nxseq; in ppp_mp_explode()
1993 struct ppp *ppp; in __ppp_channel_push() local
2012 ppp = pch->ppp; in __ppp_channel_push()
2013 if (ppp) in __ppp_channel_push()
2014 __ppp_xmit_process(ppp, NULL); in __ppp_channel_push()
2021 if (pch->ppp) { in ppp_channel_push()
2022 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
2024 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
2042 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2044 ppp_recv_lock(ppp); in ppp_do_recv()
2045 if (!ppp->closing) in ppp_do_recv()
2046 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2049 ppp_recv_unlock(ppp); in ppp_do_recv()
2095 struct channel *pch = chan->ppp; in ppp_input()
2106 if (pch->ppp) { in ppp_input()
2107 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2108 ppp_receive_error(pch->ppp); in ppp_input()
2114 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2123 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2134 struct channel *pch = chan->ppp; in ppp_input_error()
2141 if (pch->ppp) { in ppp_input_error()
2146 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2157 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2165 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2168 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
2171 ppp_receive_error(ppp); in ppp_receive_frame()
2176 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
2178 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
2179 if (ppp->vj) in ppp_receive_error()
2180 slhc_toss(ppp->vj); in ppp_receive_error()
2184 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
2194 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
2195 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
2196 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
2198 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
2208 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2215 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
2227 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
2229 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2242 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2251 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
2252 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
2259 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
2263 ++ppp->stats64.rx_packets; in ppp_receive_nonmp_frame()
2264 ppp->stats64.rx_bytes += skb->len - 2; in ppp_receive_nonmp_frame()
2269 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
2271 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
2272 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
2275 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
2284 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
2289 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
2290 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
2291 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
2292 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2298 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
2299 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
2300 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2304 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2306 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
2307 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
2312 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
2315 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
2316 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
2324 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
2328 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
2343 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
2345 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
2348 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
2354 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
2359 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2365 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
2381 if (ppp->rcomp->incomp) in ppp_decompress_frame()
2382 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2389 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
2390 ppp_receive_error(ppp); in ppp_decompress_frame()
2401 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2405 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2407 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2411 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2433 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2434 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2436 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2445 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2447 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2448 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2460 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2464 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2465 ppp->minseq = seq; in ppp_receive_mp_frame()
2468 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2472 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2473 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2474 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2475 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2479 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2481 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2483 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2485 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2493 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2501 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2504 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2523 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2525 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2526 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2527 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2533 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2541 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2560 if (ppp->debug & 1) in ppp_mp_reconstruct()
2561 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2588 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2589 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2590 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2597 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2609 if (ppp->debug & 1) in ppp_mp_reconstruct()
2610 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2627 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2631 if (ppp->debug & 1) in ppp_mp_reconstruct()
2632 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2639 if (ppp->debug & 1) in ppp_mp_reconstruct()
2640 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2642 ppp->nextseq, in ppp_mp_reconstruct()
2644 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2645 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2670 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2699 pch->ppp = NULL; in ppp_register_net_channel()
2702 chan->ppp = pch; in ppp_register_net_channel()
2726 struct channel *pch = chan->ppp; in ppp_channel_index()
2738 struct channel *pch = chan->ppp; in ppp_unit_number()
2743 if (pch->ppp) in ppp_unit_number()
2744 unit = pch->ppp->file.index; in ppp_unit_number()
2755 struct channel *pch = chan->ppp; in ppp_dev_name()
2760 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2761 name = pch->ppp->dev->name; in ppp_dev_name()
2775 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2781 chan->ppp = NULL; in ppp_unregister_channel()
2812 struct channel *pch = chan->ppp; in ppp_output_wakeup()
2825 ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data) in ppp_set_compress() argument
2851 ppp_xmit_lock(ppp); in ppp_set_compress()
2852 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
2853 ocomp = ppp->xcomp; in ppp_set_compress()
2854 ostate = ppp->xc_state; in ppp_set_compress()
2855 ppp->xcomp = cp; in ppp_set_compress()
2856 ppp->xc_state = state; in ppp_set_compress()
2857 ppp_xmit_unlock(ppp); in ppp_set_compress()
2869 ppp_recv_lock(ppp); in ppp_set_compress()
2870 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
2871 ocomp = ppp->rcomp; in ppp_set_compress()
2872 ostate = ppp->rc_state; in ppp_set_compress()
2873 ppp->rcomp = cp; in ppp_set_compress()
2874 ppp->rc_state = state; in ppp_set_compress()
2875 ppp_recv_unlock(ppp); in ppp_set_compress()
2894 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
2915 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2918 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2927 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2928 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2932 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
2943 if (!ppp->rc_state) in ppp_ccp_peek()
2945 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
2946 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
2947 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
2948 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
2952 if (!ppp->xc_state) in ppp_ccp_peek()
2954 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
2955 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
2956 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
2962 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
2965 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
2966 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
2967 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
2970 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
2971 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
2979 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
2984 ppp_lock(ppp); in ppp_ccp_closed()
2985 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
2986 ppp->xstate = 0; in ppp_ccp_closed()
2987 xcomp = ppp->xcomp; in ppp_ccp_closed()
2988 xstate = ppp->xc_state; in ppp_ccp_closed()
2989 ppp->xc_state = NULL; in ppp_ccp_closed()
2990 ppp->rstate = 0; in ppp_ccp_closed()
2991 rcomp = ppp->rcomp; in ppp_ccp_closed()
2992 rstate = ppp->rc_state; in ppp_ccp_closed()
2993 ppp->rc_state = NULL; in ppp_ccp_closed()
2994 ppp_unlock(ppp); in ppp_ccp_closed()
3087 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
3089 struct slcompress *vj = ppp->vj; in ppp_get_stats()
3092 st->p.ppp_ipackets = ppp->stats64.rx_packets; in ppp_get_stats()
3093 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
3094 st->p.ppp_ibytes = ppp->stats64.rx_bytes; in ppp_get_stats()
3095 st->p.ppp_opackets = ppp->stats64.tx_packets; in ppp_get_stats()
3096 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
3097 st->p.ppp_obytes = ppp->stats64.tx_bytes; in ppp_get_stats()
3128 struct ppp *ppp; in ppp_create_interface() local
3131 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_ENUM, ppp_setup); in ppp_create_interface()
3144 ppp = netdev_priv(dev); in ppp_create_interface()
3145 *unit = ppp->file.index; in ppp_create_interface()
3176 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
3180 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
3182 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
3184 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
3188 ppp_ccp_closed(ppp); in ppp_destroy_interface()
3189 if (ppp->vj) { in ppp_destroy_interface()
3190 slhc_free(ppp->vj); in ppp_destroy_interface()
3191 ppp->vj = NULL; in ppp_destroy_interface()
3193 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
3194 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
3196 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
3199 if (ppp->pass_filter) { in ppp_destroy_interface()
3200 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
3201 ppp->pass_filter = NULL; in ppp_destroy_interface()
3204 if (ppp->active_filter) { in ppp_destroy_interface()
3205 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
3206 ppp->active_filter = NULL; in ppp_destroy_interface()
3210 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
3211 free_percpu(ppp->xmit_recursion); in ppp_destroy_interface()
3213 free_netdev(ppp->dev); in ppp_destroy_interface()
3220 static struct ppp *
3260 struct ppp *ppp; in ppp_connect_channel() local
3268 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
3269 if (!ppp) in ppp_connect_channel()
3273 if (pch->ppp) in ppp_connect_channel()
3276 ppp_lock(ppp); in ppp_connect_channel()
3281 ppp_unlock(ppp); in ppp_connect_channel()
3286 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3287 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3289 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
3290 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
3291 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3292 ++ppp->n_channels; in ppp_connect_channel()
3293 pch->ppp = ppp; in ppp_connect_channel()
3294 refcount_inc(&ppp->file.refcnt); in ppp_connect_channel()
3295 ppp_unlock(ppp); in ppp_connect_channel()
3311 struct ppp *ppp; in ppp_disconnect_channel() local
3315 ppp = pch->ppp; in ppp_disconnect_channel()
3316 pch->ppp = NULL; in ppp_disconnect_channel()
3318 if (ppp) { in ppp_disconnect_channel()
3320 ppp_lock(ppp); in ppp_disconnect_channel()
3322 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
3323 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
3324 ppp_unlock(ppp); in ppp_disconnect_channel()
3325 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
3326 ppp_destroy_interface(ppp); in ppp_disconnect_channel()