Lines Matching refs:ppp
93 #define PF_TO_PPP(pf) PF_TO_X(pf, struct ppp)
114 struct ppp { struct
174 struct ppp *ppp; /* ppp unit we're connected to */ member
250 static void ppp_xmit_process(struct ppp *ppp);
251 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
252 static void ppp_push(struct ppp *ppp);
254 static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
256 static void ppp_receive_error(struct ppp *ppp);
257 static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
258 static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
261 static void ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb,
263 static void ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb);
264 static struct sk_buff *ppp_mp_reconstruct(struct ppp *ppp);
265 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb);
267 static int ppp_set_compress(struct ppp *ppp, unsigned long arg);
268 static void ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound);
269 static void ppp_ccp_closed(struct ppp *ppp);
271 static void ppp_get_stats(struct ppp *ppp, struct ppp_stats *st);
272 static struct ppp *ppp_create_interface(struct net *net, int unit, int *retp);
274 static void ppp_shutdown_interface(struct ppp *ppp);
275 static void ppp_destroy_interface(struct ppp *ppp);
276 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
360 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
361 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
362 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
363 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
364 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
365 ppp_recv_lock(ppp); } while (0)
366 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
367 ppp_xmit_unlock(ppp); } while (0)
389 struct ppp *ppp; in ppp_release() local
394 ppp = PF_TO_PPP(pf); in ppp_release()
395 if (file == ppp->owner) in ppp_release()
396 ppp_shutdown_interface(ppp); in ppp_release()
441 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
442 if (ppp->n_channels == 0 && in ppp_read()
443 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_read()
530 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
531 if (ppp->n_channels == 0 && in ppp_poll()
532 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
567 struct ppp *ppp; in ppp_ioctl() local
595 ppp = PF_TO_PPP(pf); in ppp_ioctl()
596 if (file == ppp->owner) in ppp_ioctl()
597 ppp_shutdown_interface(ppp); in ppp_ioctl()
646 ppp = PF_TO_PPP(pf); in ppp_ioctl()
651 ppp->mru = val; in ppp_ioctl()
658 ppp_lock(ppp); in ppp_ioctl()
659 cflags = ppp->flags & ~val; in ppp_ioctl()
661 if (!(ppp->flags & SC_MULTILINK) && (val & SC_MULTILINK)) in ppp_ioctl()
662 ppp->nextseq = 0; in ppp_ioctl()
664 ppp->flags = val & SC_FLAG_BITS; in ppp_ioctl()
665 ppp_unlock(ppp); in ppp_ioctl()
667 ppp_ccp_closed(ppp); in ppp_ioctl()
672 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
679 err = ppp_set_compress(ppp, arg); in ppp_ioctl()
683 if (put_user(ppp->file.index, p)) in ppp_ioctl()
691 ppp->debug = val; in ppp_ioctl()
696 if (put_user(ppp->debug, p)) in ppp_ioctl()
702 idle.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
703 idle.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
722 ppp_lock(ppp); in ppp_ioctl()
723 if (ppp->vj) in ppp_ioctl()
724 slhc_free(ppp->vj); in ppp_ioctl()
725 ppp->vj = vj; in ppp_ioctl()
726 ppp_unlock(ppp); in ppp_ioctl()
740 npi.mode = ppp->npmode[i]; in ppp_ioctl()
744 ppp->npmode[i] = npi.mode; in ppp_ioctl()
746 netif_wake_queue(ppp->dev); in ppp_ioctl()
768 ppp_lock(ppp); in ppp_ioctl()
769 if (ppp->pass_filter) in ppp_ioctl()
770 bpf_prog_destroy(ppp->pass_filter); in ppp_ioctl()
771 ppp->pass_filter = pass_filter; in ppp_ioctl()
772 ppp_unlock(ppp); in ppp_ioctl()
794 ppp_lock(ppp); in ppp_ioctl()
795 if (ppp->active_filter) in ppp_ioctl()
796 bpf_prog_destroy(ppp->active_filter); in ppp_ioctl()
797 ppp->active_filter = active_filter; in ppp_ioctl()
798 ppp_unlock(ppp); in ppp_ioctl()
810 ppp_recv_lock(ppp); in ppp_ioctl()
811 ppp->mrru = val; in ppp_ioctl()
812 ppp_recv_unlock(ppp); in ppp_ioctl()
828 struct ppp *ppp; in ppp_unattached_ioctl() local
839 ppp = ppp_create_interface(net, unit, &err); in ppp_unattached_ioctl()
840 if (!ppp) in ppp_unattached_ioctl()
842 file->private_data = &ppp->file; in ppp_unattached_ioctl()
843 ppp->owner = file; in ppp_unattached_ioctl()
845 if (put_user(ppp->file.index, p)) in ppp_unattached_ioctl()
857 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
858 if (ppp) { in ppp_unattached_ioctl()
859 atomic_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
860 file->private_data = &ppp->file; in ppp_unattached_ioctl()
975 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
984 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1005 skb_queue_tail(&ppp->file.xq, skb); in ppp_start_xmit()
1006 ppp_xmit_process(ppp); in ppp_start_xmit()
1018 struct ppp *ppp = netdev_priv(dev); in ppp_net_ioctl() local
1027 ppp_get_stats(ppp, &stats); in ppp_net_ioctl()
1035 if (ppp->xc_state) in ppp_net_ioctl()
1036 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_ioctl()
1037 if (ppp->rc_state) in ppp_net_ioctl()
1038 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_ioctl()
1061 struct ppp *ppp = netdev_priv(dev); in ppp_get_stats64() local
1063 ppp_recv_lock(ppp); in ppp_get_stats64()
1064 stats64->rx_packets = ppp->stats64.rx_packets; in ppp_get_stats64()
1065 stats64->rx_bytes = ppp->stats64.rx_bytes; in ppp_get_stats64()
1066 ppp_recv_unlock(ppp); in ppp_get_stats64()
1068 ppp_xmit_lock(ppp); in ppp_get_stats64()
1069 stats64->tx_packets = ppp->stats64.tx_packets; in ppp_get_stats64()
1070 stats64->tx_bytes = ppp->stats64.tx_bytes; in ppp_get_stats64()
1071 ppp_xmit_unlock(ppp); in ppp_get_stats64()
1118 ppp_xmit_process(struct ppp *ppp) in ppp_xmit_process() argument
1122 ppp_xmit_lock(ppp); in ppp_xmit_process()
1123 if (!ppp->closing) { in ppp_xmit_process()
1124 ppp_push(ppp); in ppp_xmit_process()
1125 while (!ppp->xmit_pending && in ppp_xmit_process()
1126 (skb = skb_dequeue(&ppp->file.xq))) in ppp_xmit_process()
1127 ppp_send_frame(ppp, skb); in ppp_xmit_process()
1130 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in ppp_xmit_process()
1131 netif_wake_queue(ppp->dev); in ppp_xmit_process()
1133 netif_stop_queue(ppp->dev); in ppp_xmit_process()
1135 ppp_xmit_unlock(ppp); in ppp_xmit_process()
1139 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1143 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1144 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1145 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1146 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1150 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1153 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1155 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1158 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1161 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1180 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1194 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1207 if (ppp->pass_filter && in ppp_send_frame()
1208 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1209 if (ppp->debug & 1) in ppp_send_frame()
1210 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1217 if (!(ppp->active_filter && in ppp_send_frame()
1218 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1219 ppp->last_xmit = jiffies; in ppp_send_frame()
1223 ppp->last_xmit = jiffies; in ppp_send_frame()
1227 ++ppp->stats64.tx_packets; in ppp_send_frame()
1228 ppp->stats64.tx_bytes += skb->len - 2; in ppp_send_frame()
1232 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1235 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1238 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1241 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1243 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1245 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1267 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1272 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1274 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1276 netdev_err(ppp->dev, in ppp_send_frame()
1281 skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1290 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1291 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1293 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1294 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1298 ppp->xmit_pending = skb; in ppp_send_frame()
1299 ppp_push(ppp); in ppp_send_frame()
1304 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1312 ppp_push(struct ppp *ppp) in ppp_push() argument
1316 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1321 list = &ppp->channels; in ppp_push()
1324 ppp->xmit_pending = NULL; in ppp_push()
1329 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1337 ppp->xmit_pending = NULL; in ppp_push()
1341 ppp->xmit_pending = NULL; in ppp_push()
1350 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1354 ppp->xmit_pending = NULL; in ppp_push()
1368 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1391 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1393 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1413 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1414 ppp->nxchan = i; in ppp_mp_explode()
1439 list = &ppp->channels; in ppp_mp_explode()
1440 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
1442 if (list == &ppp->channels) { in ppp_mp_explode()
1452 if (list == &ppp->channels) { in ppp_mp_explode()
1555 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
1556 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
1557 q[3] = ppp->nxseq; in ppp_mp_explode()
1560 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
1561 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
1562 q[5] = ppp->nxseq; in ppp_mp_explode()
1575 ++ppp->nxseq; in ppp_mp_explode()
1579 ppp->nxchan = i; in ppp_mp_explode()
1585 if (ppp->debug & 1) in ppp_mp_explode()
1586 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
1587 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
1588 ++ppp->nxseq; in ppp_mp_explode()
1600 struct ppp *ppp; in ppp_channel_push() local
1620 ppp = pch->ppp; in ppp_channel_push()
1621 if (ppp) in ppp_channel_push()
1622 ppp_xmit_process(ppp); in ppp_channel_push()
1638 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1640 ppp_recv_lock(ppp); in ppp_do_recv()
1641 if (!ppp->closing) in ppp_do_recv()
1642 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
1645 ppp_recv_unlock(ppp); in ppp_do_recv()
1651 struct channel *pch = chan->ppp; in ppp_input()
1662 if (pch->ppp) { in ppp_input()
1663 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
1664 ppp_receive_error(pch->ppp); in ppp_input()
1670 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
1679 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
1690 struct channel *pch = chan->ppp; in ppp_input_error()
1697 if (pch->ppp) { in ppp_input_error()
1702 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
1713 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
1721 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
1724 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
1727 ppp_receive_error(ppp); in ppp_receive_frame()
1732 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
1734 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
1735 if (ppp->vj) in ppp_receive_error()
1736 slhc_toss(ppp->vj); in ppp_receive_error()
1740 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
1750 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
1751 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
1752 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
1754 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
1761 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
1768 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
1780 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
1782 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
1795 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
1804 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
1805 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
1812 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
1816 ++ppp->stats64.rx_packets; in ppp_receive_nonmp_frame()
1817 ppp->stats64.rx_bytes += skb->len - 2; in ppp_receive_nonmp_frame()
1822 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
1824 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
1825 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
1828 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
1837 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
1842 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
1843 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
1844 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
1845 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
1851 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
1852 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
1853 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
1857 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
1859 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
1860 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
1865 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
1875 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
1879 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
1894 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
1896 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
1899 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
1905 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
1910 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
1916 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
1929 if (ppp->rcomp->incomp) in ppp_decompress_frame()
1930 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
1937 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
1938 ppp_receive_error(ppp); in ppp_decompress_frame()
1949 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
1953 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
1955 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
1959 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
1979 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
1980 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
1982 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
1991 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
1993 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
1994 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2006 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2010 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2011 ppp->minseq = seq; in ppp_receive_mp_frame()
2014 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2018 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2019 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2020 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2021 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2025 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2027 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2029 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2031 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2039 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2047 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2050 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2069 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2071 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2072 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2073 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2079 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2087 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2106 if (ppp->debug & 1) in ppp_mp_reconstruct()
2107 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2134 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2135 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2136 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2143 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2155 if (ppp->debug & 1) in ppp_mp_reconstruct()
2156 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2173 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2177 if (ppp->debug & 1) in ppp_mp_reconstruct()
2178 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2185 if (ppp->debug & 1) in ppp_mp_reconstruct()
2186 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2188 ppp->nextseq, in ppp_mp_reconstruct()
2190 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2191 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2216 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2245 pch->ppp = NULL; in ppp_register_net_channel()
2248 chan->ppp = pch; in ppp_register_net_channel()
2272 struct channel *pch = chan->ppp; in ppp_channel_index()
2284 struct channel *pch = chan->ppp; in ppp_unit_number()
2289 if (pch->ppp) in ppp_unit_number()
2290 unit = pch->ppp->file.index; in ppp_unit_number()
2301 struct channel *pch = chan->ppp; in ppp_dev_name()
2306 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2307 name = pch->ppp->dev->name; in ppp_dev_name()
2321 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2327 chan->ppp = NULL; in ppp_unregister_channel()
2358 struct channel *pch = chan->ppp; in ppp_output_wakeup()
2371 ppp_set_compress(struct ppp *ppp, unsigned long arg) in ppp_set_compress() argument
2399 ppp_xmit_lock(ppp); in ppp_set_compress()
2400 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
2401 ocomp = ppp->xcomp; in ppp_set_compress()
2402 ostate = ppp->xc_state; in ppp_set_compress()
2403 ppp->xcomp = cp; in ppp_set_compress()
2404 ppp->xc_state = state; in ppp_set_compress()
2405 ppp_xmit_unlock(ppp); in ppp_set_compress()
2417 ppp_recv_lock(ppp); in ppp_set_compress()
2418 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
2419 ocomp = ppp->rcomp; in ppp_set_compress()
2420 ostate = ppp->rc_state; in ppp_set_compress()
2421 ppp->rcomp = cp; in ppp_set_compress()
2422 ppp->rc_state = state; in ppp_set_compress()
2423 ppp_recv_unlock(ppp); in ppp_set_compress()
2442 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
2463 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2466 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2475 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2476 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2480 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
2491 if (!ppp->rc_state) in ppp_ccp_peek()
2493 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
2494 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
2495 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
2496 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
2500 if (!ppp->xc_state) in ppp_ccp_peek()
2502 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
2503 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
2504 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
2510 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
2513 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
2514 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
2515 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
2518 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
2519 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
2527 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
2532 ppp_lock(ppp); in ppp_ccp_closed()
2533 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
2534 ppp->xstate = 0; in ppp_ccp_closed()
2535 xcomp = ppp->xcomp; in ppp_ccp_closed()
2536 xstate = ppp->xc_state; in ppp_ccp_closed()
2537 ppp->xc_state = NULL; in ppp_ccp_closed()
2538 ppp->rstate = 0; in ppp_ccp_closed()
2539 rcomp = ppp->rcomp; in ppp_ccp_closed()
2540 rstate = ppp->rc_state; in ppp_ccp_closed()
2541 ppp->rc_state = NULL; in ppp_ccp_closed()
2542 ppp_unlock(ppp); in ppp_ccp_closed()
2635 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
2637 struct slcompress *vj = ppp->vj; in ppp_get_stats()
2640 st->p.ppp_ipackets = ppp->stats64.rx_packets; in ppp_get_stats()
2641 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
2642 st->p.ppp_ibytes = ppp->stats64.rx_bytes; in ppp_get_stats()
2643 st->p.ppp_opackets = ppp->stats64.tx_packets; in ppp_get_stats()
2644 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
2645 st->p.ppp_obytes = ppp->stats64.tx_bytes; in ppp_get_stats()
2668 static struct ppp *
2671 struct ppp *ppp; in ppp_create_interface() local
2677 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_UNKNOWN, in ppp_create_interface()
2684 ppp = netdev_priv(dev); in ppp_create_interface()
2685 ppp->dev = dev; in ppp_create_interface()
2686 ppp->mru = PPP_MRU; in ppp_create_interface()
2687 init_ppp_file(&ppp->file, INTERFACE); in ppp_create_interface()
2688 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_create_interface()
2690 ppp->npmode[i] = NPMODE_PASS; in ppp_create_interface()
2691 INIT_LIST_HEAD(&ppp->channels); in ppp_create_interface()
2692 spin_lock_init(&ppp->rlock); in ppp_create_interface()
2693 spin_lock_init(&ppp->wlock); in ppp_create_interface()
2695 ppp->minseq = -1; in ppp_create_interface()
2696 skb_queue_head_init(&ppp->mrq); in ppp_create_interface()
2699 ppp->pass_filter = NULL; in ppp_create_interface()
2700 ppp->active_filter = NULL; in ppp_create_interface()
2712 unit = unit_get(&pn->units_idr, ppp); in ppp_create_interface()
2730 unit = unit_set(&pn->units_idr, ppp, unit); in ppp_create_interface()
2736 ppp->file.index = unit; in ppp_create_interface()
2742 netdev_err(ppp->dev, "PPP: couldn't register device %s (%d)\n", in ppp_create_interface()
2747 ppp->ppp_net = net; in ppp_create_interface()
2753 return ppp; in ppp_create_interface()
2780 static void ppp_shutdown_interface(struct ppp *ppp) in ppp_shutdown_interface() argument
2784 pn = ppp_pernet(ppp->ppp_net); in ppp_shutdown_interface()
2788 ppp_lock(ppp); in ppp_shutdown_interface()
2789 if (!ppp->closing) { in ppp_shutdown_interface()
2790 ppp->closing = 1; in ppp_shutdown_interface()
2791 ppp_unlock(ppp); in ppp_shutdown_interface()
2792 unregister_netdev(ppp->dev); in ppp_shutdown_interface()
2793 unit_put(&pn->units_idr, ppp->file.index); in ppp_shutdown_interface()
2795 ppp_unlock(ppp); in ppp_shutdown_interface()
2797 ppp->file.dead = 1; in ppp_shutdown_interface()
2798 ppp->owner = NULL; in ppp_shutdown_interface()
2799 wake_up_interruptible(&ppp->file.rwait); in ppp_shutdown_interface()
2809 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
2813 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
2815 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
2817 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
2821 ppp_ccp_closed(ppp); in ppp_destroy_interface()
2822 if (ppp->vj) { in ppp_destroy_interface()
2823 slhc_free(ppp->vj); in ppp_destroy_interface()
2824 ppp->vj = NULL; in ppp_destroy_interface()
2826 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
2827 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
2829 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
2832 if (ppp->pass_filter) { in ppp_destroy_interface()
2833 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
2834 ppp->pass_filter = NULL; in ppp_destroy_interface()
2837 if (ppp->active_filter) { in ppp_destroy_interface()
2838 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
2839 ppp->active_filter = NULL; in ppp_destroy_interface()
2843 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
2845 free_netdev(ppp->dev); in ppp_destroy_interface()
2852 static struct ppp *
2892 struct ppp *ppp; in ppp_connect_channel() local
2900 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
2901 if (!ppp) in ppp_connect_channel()
2905 if (pch->ppp) in ppp_connect_channel()
2908 ppp_lock(ppp); in ppp_connect_channel()
2909 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
2910 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
2912 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
2913 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
2914 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
2915 ++ppp->n_channels; in ppp_connect_channel()
2916 pch->ppp = ppp; in ppp_connect_channel()
2917 atomic_inc(&ppp->file.refcnt); in ppp_connect_channel()
2918 ppp_unlock(ppp); in ppp_connect_channel()
2934 struct ppp *ppp; in ppp_disconnect_channel() local
2938 ppp = pch->ppp; in ppp_disconnect_channel()
2939 pch->ppp = NULL; in ppp_disconnect_channel()
2941 if (ppp) { in ppp_disconnect_channel()
2943 ppp_lock(ppp); in ppp_disconnect_channel()
2945 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
2946 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
2947 ppp_unlock(ppp); in ppp_disconnect_channel()
2948 if (atomic_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
2949 ppp_destroy_interface(ppp); in ppp_disconnect_channel()