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,
275 static void ppp_destroy_interface(struct ppp *ppp);
276 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
362 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
363 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
364 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
365 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
366 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
367 ppp_recv_lock(ppp); } while (0)
368 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
369 ppp_xmit_unlock(ppp); } while (0)
391 struct ppp *ppp; in ppp_release() local
396 ppp = PF_TO_PPP(pf); in ppp_release()
398 if (file == ppp->owner) in ppp_release()
399 unregister_netdevice(ppp->dev); in ppp_release()
445 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
446 if (ppp->n_channels == 0 && in ppp_read()
447 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_read()
534 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
535 if (ppp->n_channels == 0 && in ppp_poll()
536 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
571 struct ppp *ppp; in ppp_ioctl() local
603 ppp = PF_TO_PPP(pf); in ppp_ioctl()
605 if (file == ppp->owner) in ppp_ioctl()
606 unregister_netdevice(ppp->dev); in ppp_ioctl()
653 ppp = PF_TO_PPP(pf); in ppp_ioctl()
658 ppp->mru = val; in ppp_ioctl()
665 ppp_lock(ppp); in ppp_ioctl()
666 cflags = ppp->flags & ~val; in ppp_ioctl()
668 if (!(ppp->flags & SC_MULTILINK) && (val & SC_MULTILINK)) in ppp_ioctl()
669 ppp->nextseq = 0; in ppp_ioctl()
671 ppp->flags = val & SC_FLAG_BITS; in ppp_ioctl()
672 ppp_unlock(ppp); in ppp_ioctl()
674 ppp_ccp_closed(ppp); in ppp_ioctl()
679 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
686 err = ppp_set_compress(ppp, arg); in ppp_ioctl()
690 if (put_user(ppp->file.index, p)) in ppp_ioctl()
698 ppp->debug = val; in ppp_ioctl()
703 if (put_user(ppp->debug, p)) in ppp_ioctl()
709 idle.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
710 idle.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
729 ppp_lock(ppp); in ppp_ioctl()
730 if (ppp->vj) in ppp_ioctl()
731 slhc_free(ppp->vj); in ppp_ioctl()
732 ppp->vj = vj; in ppp_ioctl()
733 ppp_unlock(ppp); in ppp_ioctl()
747 npi.mode = ppp->npmode[i]; in ppp_ioctl()
751 ppp->npmode[i] = npi.mode; in ppp_ioctl()
753 netif_wake_queue(ppp->dev); in ppp_ioctl()
775 ppp_lock(ppp); in ppp_ioctl()
776 if (ppp->pass_filter) in ppp_ioctl()
777 bpf_prog_destroy(ppp->pass_filter); in ppp_ioctl()
778 ppp->pass_filter = pass_filter; in ppp_ioctl()
779 ppp_unlock(ppp); in ppp_ioctl()
801 ppp_lock(ppp); in ppp_ioctl()
802 if (ppp->active_filter) in ppp_ioctl()
803 bpf_prog_destroy(ppp->active_filter); in ppp_ioctl()
804 ppp->active_filter = active_filter; in ppp_ioctl()
805 ppp_unlock(ppp); in ppp_ioctl()
817 ppp_recv_lock(ppp); in ppp_ioctl()
818 ppp->mrru = val; in ppp_ioctl()
819 ppp_recv_unlock(ppp); in ppp_ioctl()
838 struct ppp *ppp; in ppp_unattached_ioctl() local
848 ppp = ppp_create_interface(net, unit, file, &err); in ppp_unattached_ioctl()
849 if (!ppp) in ppp_unattached_ioctl()
851 file->private_data = &ppp->file; in ppp_unattached_ioctl()
853 if (put_user(ppp->file.index, p)) in ppp_unattached_ioctl()
865 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
866 if (ppp) { in ppp_unattached_ioctl()
867 atomic_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
868 file->private_data = &ppp->file; in ppp_unattached_ioctl()
927 struct ppp *ppp; in ppp_exit_net() local
937 idr_for_each_entry(&pn->units_idr, ppp, id) in ppp_exit_net()
939 if (!net_eq(dev_net(ppp->dev), net)) in ppp_exit_net()
940 unregister_netdevice_queue(ppp->dev, &list); in ppp_exit_net()
1002 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
1011 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1032 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1033 skb_queue_tail(&ppp->file.xq, skb); in ppp_start_xmit()
1034 ppp_xmit_process(ppp); in ppp_start_xmit()
1046 struct ppp *ppp = netdev_priv(dev); in ppp_net_ioctl() local
1055 ppp_get_stats(ppp, &stats); in ppp_net_ioctl()
1063 if (ppp->xc_state) in ppp_net_ioctl()
1064 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_ioctl()
1065 if (ppp->rc_state) in ppp_net_ioctl()
1066 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_ioctl()
1089 struct ppp *ppp = netdev_priv(dev); in ppp_get_stats64() local
1091 ppp_recv_lock(ppp); in ppp_get_stats64()
1092 stats64->rx_packets = ppp->stats64.rx_packets; in ppp_get_stats64()
1093 stats64->rx_bytes = ppp->stats64.rx_bytes; in ppp_get_stats64()
1094 ppp_recv_unlock(ppp); in ppp_get_stats64()
1096 ppp_xmit_lock(ppp); in ppp_get_stats64()
1097 stats64->tx_packets = ppp->stats64.tx_packets; in ppp_get_stats64()
1098 stats64->tx_bytes = ppp->stats64.tx_bytes; in ppp_get_stats64()
1099 ppp_xmit_unlock(ppp); in ppp_get_stats64()
1119 struct ppp *ppp = netdev_priv(dev); in ppp_dev_uninit() local
1120 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit()
1122 ppp_lock(ppp); in ppp_dev_uninit()
1123 ppp->closing = 1; in ppp_dev_uninit()
1124 ppp_unlock(ppp); in ppp_dev_uninit()
1127 unit_put(&pn->units_idr, ppp->file.index); in ppp_dev_uninit()
1130 ppp->owner = NULL; in ppp_dev_uninit()
1132 ppp->file.dead = 1; in ppp_dev_uninit()
1133 wake_up_interruptible(&ppp->file.rwait); in ppp_dev_uninit()
1165 ppp_xmit_process(struct ppp *ppp) in ppp_xmit_process() argument
1169 ppp_xmit_lock(ppp); in ppp_xmit_process()
1170 if (!ppp->closing) { in ppp_xmit_process()
1171 ppp_push(ppp); in ppp_xmit_process()
1172 while (!ppp->xmit_pending && in ppp_xmit_process()
1173 (skb = skb_dequeue(&ppp->file.xq))) in ppp_xmit_process()
1174 ppp_send_frame(ppp, skb); in ppp_xmit_process()
1177 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in ppp_xmit_process()
1178 netif_wake_queue(ppp->dev); in ppp_xmit_process()
1180 netif_stop_queue(ppp->dev); in ppp_xmit_process()
1182 ppp_xmit_unlock(ppp); in ppp_xmit_process()
1186 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1190 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1191 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1192 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1193 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1197 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1200 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1202 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1205 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1208 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1227 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1241 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1254 if (ppp->pass_filter && in ppp_send_frame()
1255 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1256 if (ppp->debug & 1) in ppp_send_frame()
1257 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1264 if (!(ppp->active_filter && in ppp_send_frame()
1265 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1266 ppp->last_xmit = jiffies; in ppp_send_frame()
1270 ppp->last_xmit = jiffies; in ppp_send_frame()
1274 ++ppp->stats64.tx_packets; in ppp_send_frame()
1275 ppp->stats64.tx_bytes += skb->len - 2; in ppp_send_frame()
1279 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1282 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1285 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1288 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1290 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1292 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1314 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1319 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1321 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1323 netdev_err(ppp->dev, in ppp_send_frame()
1328 skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1337 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1338 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1340 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1341 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1345 ppp->xmit_pending = skb; in ppp_send_frame()
1346 ppp_push(ppp); in ppp_send_frame()
1351 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1359 ppp_push(struct ppp *ppp) in ppp_push() argument
1363 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1368 list = &ppp->channels; in ppp_push()
1371 ppp->xmit_pending = NULL; in ppp_push()
1376 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1384 ppp->xmit_pending = NULL; in ppp_push()
1388 ppp->xmit_pending = NULL; in ppp_push()
1397 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1401 ppp->xmit_pending = NULL; in ppp_push()
1415 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1438 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1440 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1460 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1461 ppp->nxchan = i; in ppp_mp_explode()
1486 list = &ppp->channels; in ppp_mp_explode()
1487 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
1489 if (list == &ppp->channels) { in ppp_mp_explode()
1499 if (list == &ppp->channels) { in ppp_mp_explode()
1602 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
1603 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
1604 q[3] = ppp->nxseq; in ppp_mp_explode()
1607 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
1608 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
1609 q[5] = ppp->nxseq; in ppp_mp_explode()
1622 ++ppp->nxseq; in ppp_mp_explode()
1626 ppp->nxchan = i; in ppp_mp_explode()
1632 if (ppp->debug & 1) in ppp_mp_explode()
1633 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
1634 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
1635 ++ppp->nxseq; in ppp_mp_explode()
1647 struct ppp *ppp; in ppp_channel_push() local
1667 ppp = pch->ppp; in ppp_channel_push()
1668 if (ppp) in ppp_channel_push()
1669 ppp_xmit_process(ppp); in ppp_channel_push()
1685 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1687 ppp_recv_lock(ppp); in ppp_do_recv()
1688 if (!ppp->closing) in ppp_do_recv()
1689 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
1692 ppp_recv_unlock(ppp); in ppp_do_recv()
1698 struct channel *pch = chan->ppp; in ppp_input()
1709 if (pch->ppp) { in ppp_input()
1710 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
1711 ppp_receive_error(pch->ppp); in ppp_input()
1717 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
1726 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
1737 struct channel *pch = chan->ppp; in ppp_input_error()
1744 if (pch->ppp) { in ppp_input_error()
1749 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
1760 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
1768 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
1771 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
1774 ppp_receive_error(ppp); in ppp_receive_frame()
1779 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
1781 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
1782 if (ppp->vj) in ppp_receive_error()
1783 slhc_toss(ppp->vj); in ppp_receive_error()
1787 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
1797 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
1798 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
1799 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
1801 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
1808 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
1815 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
1827 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
1829 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
1842 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
1851 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
1852 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
1859 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
1863 ++ppp->stats64.rx_packets; in ppp_receive_nonmp_frame()
1864 ppp->stats64.rx_bytes += skb->len - 2; in ppp_receive_nonmp_frame()
1869 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
1871 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
1872 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
1875 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
1884 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
1889 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
1890 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
1891 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
1892 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
1898 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
1899 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
1900 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
1904 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
1906 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
1907 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
1912 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
1915 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
1916 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
1924 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
1928 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
1943 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
1945 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
1948 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
1954 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
1959 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
1965 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
1978 if (ppp->rcomp->incomp) in ppp_decompress_frame()
1979 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
1986 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
1987 ppp_receive_error(ppp); in ppp_decompress_frame()
1998 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2002 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2004 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2008 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2028 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2029 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2031 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2040 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2042 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2043 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2055 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2059 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2060 ppp->minseq = seq; in ppp_receive_mp_frame()
2063 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2067 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2068 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2069 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2070 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2074 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2076 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2078 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2080 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2088 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2096 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2099 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2118 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2120 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2121 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2122 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2128 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2136 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2155 if (ppp->debug & 1) in ppp_mp_reconstruct()
2156 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2183 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2184 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2185 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2192 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2204 if (ppp->debug & 1) in ppp_mp_reconstruct()
2205 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2222 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2226 if (ppp->debug & 1) in ppp_mp_reconstruct()
2227 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2234 if (ppp->debug & 1) in ppp_mp_reconstruct()
2235 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2237 ppp->nextseq, in ppp_mp_reconstruct()
2239 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2240 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2265 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2294 pch->ppp = NULL; in ppp_register_net_channel()
2297 chan->ppp = pch; in ppp_register_net_channel()
2321 struct channel *pch = chan->ppp; in ppp_channel_index()
2333 struct channel *pch = chan->ppp; in ppp_unit_number()
2338 if (pch->ppp) in ppp_unit_number()
2339 unit = pch->ppp->file.index; in ppp_unit_number()
2350 struct channel *pch = chan->ppp; in ppp_dev_name()
2355 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2356 name = pch->ppp->dev->name; in ppp_dev_name()
2370 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2376 chan->ppp = NULL; in ppp_unregister_channel()
2409 struct channel *pch = chan->ppp; in ppp_output_wakeup()
2422 ppp_set_compress(struct ppp *ppp, unsigned long arg) in ppp_set_compress() argument
2450 ppp_xmit_lock(ppp); in ppp_set_compress()
2451 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
2452 ocomp = ppp->xcomp; in ppp_set_compress()
2453 ostate = ppp->xc_state; in ppp_set_compress()
2454 ppp->xcomp = cp; in ppp_set_compress()
2455 ppp->xc_state = state; in ppp_set_compress()
2456 ppp_xmit_unlock(ppp); in ppp_set_compress()
2468 ppp_recv_lock(ppp); in ppp_set_compress()
2469 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
2470 ocomp = ppp->rcomp; in ppp_set_compress()
2471 ostate = ppp->rc_state; in ppp_set_compress()
2472 ppp->rcomp = cp; in ppp_set_compress()
2473 ppp->rc_state = state; in ppp_set_compress()
2474 ppp_recv_unlock(ppp); in ppp_set_compress()
2493 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
2514 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2517 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2526 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2527 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2531 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
2542 if (!ppp->rc_state) in ppp_ccp_peek()
2544 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
2545 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
2546 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
2547 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
2551 if (!ppp->xc_state) in ppp_ccp_peek()
2553 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
2554 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
2555 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
2561 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
2564 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
2565 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
2566 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
2569 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
2570 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
2578 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
2583 ppp_lock(ppp); in ppp_ccp_closed()
2584 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
2585 ppp->xstate = 0; in ppp_ccp_closed()
2586 xcomp = ppp->xcomp; in ppp_ccp_closed()
2587 xstate = ppp->xc_state; in ppp_ccp_closed()
2588 ppp->xc_state = NULL; in ppp_ccp_closed()
2589 ppp->rstate = 0; in ppp_ccp_closed()
2590 rcomp = ppp->rcomp; in ppp_ccp_closed()
2591 rstate = ppp->rc_state; in ppp_ccp_closed()
2592 ppp->rc_state = NULL; in ppp_ccp_closed()
2593 ppp_unlock(ppp); in ppp_ccp_closed()
2686 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
2688 struct slcompress *vj = ppp->vj; in ppp_get_stats()
2691 st->p.ppp_ipackets = ppp->stats64.rx_packets; in ppp_get_stats()
2692 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
2693 st->p.ppp_ibytes = ppp->stats64.rx_bytes; in ppp_get_stats()
2694 st->p.ppp_opackets = ppp->stats64.tx_packets; in ppp_get_stats()
2695 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
2696 st->p.ppp_obytes = ppp->stats64.tx_bytes; in ppp_get_stats()
2719 static struct ppp *ppp_create_interface(struct net *net, int unit, in ppp_create_interface()
2722 struct ppp *ppp; in ppp_create_interface() local
2728 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_UNKNOWN, in ppp_create_interface()
2735 ppp = netdev_priv(dev); in ppp_create_interface()
2736 ppp->dev = dev; in ppp_create_interface()
2737 ppp->mru = PPP_MRU; in ppp_create_interface()
2738 init_ppp_file(&ppp->file, INTERFACE); in ppp_create_interface()
2739 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_create_interface()
2740 ppp->owner = file; in ppp_create_interface()
2742 ppp->npmode[i] = NPMODE_PASS; in ppp_create_interface()
2743 INIT_LIST_HEAD(&ppp->channels); in ppp_create_interface()
2744 spin_lock_init(&ppp->rlock); in ppp_create_interface()
2745 spin_lock_init(&ppp->wlock); in ppp_create_interface()
2747 ppp->minseq = -1; in ppp_create_interface()
2748 skb_queue_head_init(&ppp->mrq); in ppp_create_interface()
2751 ppp->pass_filter = NULL; in ppp_create_interface()
2752 ppp->active_filter = NULL; in ppp_create_interface()
2765 unit = unit_get(&pn->units_idr, ppp); in ppp_create_interface()
2783 unit = unit_set(&pn->units_idr, ppp, unit); in ppp_create_interface()
2789 ppp->file.index = unit; in ppp_create_interface()
2795 netdev_err(ppp->dev, "PPP: couldn't register device %s (%d)\n", in ppp_create_interface()
2800 ppp->ppp_net = net; in ppp_create_interface()
2807 return ppp; in ppp_create_interface()
2836 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
2840 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
2842 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
2844 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
2848 ppp_ccp_closed(ppp); in ppp_destroy_interface()
2849 if (ppp->vj) { in ppp_destroy_interface()
2850 slhc_free(ppp->vj); in ppp_destroy_interface()
2851 ppp->vj = NULL; in ppp_destroy_interface()
2853 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
2854 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
2856 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
2859 if (ppp->pass_filter) { in ppp_destroy_interface()
2860 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
2861 ppp->pass_filter = NULL; in ppp_destroy_interface()
2864 if (ppp->active_filter) { in ppp_destroy_interface()
2865 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
2866 ppp->active_filter = NULL; in ppp_destroy_interface()
2870 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
2872 free_netdev(ppp->dev); in ppp_destroy_interface()
2879 static struct ppp *
2919 struct ppp *ppp; in ppp_connect_channel() local
2927 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
2928 if (!ppp) in ppp_connect_channel()
2932 if (pch->ppp) in ppp_connect_channel()
2935 ppp_lock(ppp); in ppp_connect_channel()
2936 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
2937 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
2939 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
2940 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
2941 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
2942 ++ppp->n_channels; in ppp_connect_channel()
2943 pch->ppp = ppp; in ppp_connect_channel()
2944 atomic_inc(&ppp->file.refcnt); in ppp_connect_channel()
2945 ppp_unlock(ppp); in ppp_connect_channel()
2961 struct ppp *ppp; in ppp_disconnect_channel() local
2965 ppp = pch->ppp; in ppp_disconnect_channel()
2966 pch->ppp = NULL; in ppp_disconnect_channel()
2968 if (ppp) { in ppp_disconnect_channel()
2970 ppp_lock(ppp); in ppp_disconnect_channel()
2972 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
2973 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
2974 ppp_unlock(ppp); in ppp_disconnect_channel()
2975 if (atomic_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
2976 ppp_destroy_interface(ppp); in ppp_disconnect_channel()