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
257 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb);
258 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
259 static void ppp_push(struct ppp *ppp);
261 static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
263 static void ppp_receive_error(struct ppp *ppp);
264 static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
265 static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
268 static void ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb,
270 static void ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb);
271 static struct sk_buff *ppp_mp_reconstruct(struct ppp *ppp);
272 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb);
274 static int ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data);
275 static void ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound);
276 static void ppp_ccp_closed(struct ppp *ppp);
278 static void ppp_get_stats(struct ppp *ppp, struct ppp_stats *st);
281 static void ppp_destroy_interface(struct ppp *ppp);
282 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
367 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
368 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
369 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
370 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
371 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
372 ppp_recv_lock(ppp); } while (0)
373 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
374 ppp_xmit_unlock(ppp); } while (0)
396 struct ppp *ppp; in ppp_release() local
401 ppp = PF_TO_PPP(pf); in ppp_release()
403 if (file == ppp->owner) in ppp_release()
404 unregister_netdevice(ppp->dev); in ppp_release()
450 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
452 ppp_recv_lock(ppp); in ppp_read()
453 if (ppp->n_channels == 0 && in ppp_read()
454 (ppp->flags & SC_LOOP_TRAFFIC) == 0) { in ppp_read()
455 ppp_recv_unlock(ppp); in ppp_read()
458 ppp_recv_unlock(ppp); in ppp_read()
543 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
545 ppp_recv_lock(ppp); in ppp_poll()
546 if (ppp->n_channels == 0 && in ppp_poll()
547 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
549 ppp_recv_unlock(ppp); in ppp_poll()
621 if (pch->ppp || in ppp_bridge_channels()
631 if (pchb->ppp || in ppp_bridge_channels()
696 struct ppp *ppp; in ppp_ioctl() local
788 ppp = PF_TO_PPP(pf); in ppp_ioctl()
793 ppp->mru = val; in ppp_ioctl()
800 ppp_lock(ppp); in ppp_ioctl()
801 cflags = ppp->flags & ~val; in ppp_ioctl()
803 if (!(ppp->flags & SC_MULTILINK) && (val & SC_MULTILINK)) in ppp_ioctl()
804 ppp->nextseq = 0; in ppp_ioctl()
806 ppp->flags = val & SC_FLAG_BITS; in ppp_ioctl()
807 ppp_unlock(ppp); in ppp_ioctl()
809 ppp_ccp_closed(ppp); in ppp_ioctl()
814 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
826 err = ppp_set_compress(ppp, &data); in ppp_ioctl()
830 if (put_user(ppp->file.index, p)) in ppp_ioctl()
838 ppp->debug = val; in ppp_ioctl()
843 if (put_user(ppp->debug, p)) in ppp_ioctl()
849 idle32.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
850 idle32.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
857 idle64.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
858 idle64.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
877 ppp_lock(ppp); in ppp_ioctl()
878 if (ppp->vj) in ppp_ioctl()
879 slhc_free(ppp->vj); in ppp_ioctl()
880 ppp->vj = vj; in ppp_ioctl()
881 ppp_unlock(ppp); in ppp_ioctl()
895 npi.mode = ppp->npmode[i]; in ppp_ioctl()
899 ppp->npmode[i] = npi.mode; in ppp_ioctl()
901 netif_wake_queue(ppp->dev); in ppp_ioctl()
918 which = &ppp->pass_filter; in ppp_ioctl()
920 which = &ppp->active_filter; in ppp_ioctl()
921 ppp_lock(ppp); in ppp_ioctl()
925 ppp_unlock(ppp); in ppp_ioctl()
935 ppp_recv_lock(ppp); in ppp_ioctl()
936 ppp->mrru = val; in ppp_ioctl()
937 ppp_recv_unlock(ppp); in ppp_ioctl()
970 struct ppp *ppp = PF_TO_PPP(pf); in ppp_compat_ioctl() local
984 which = &ppp->pass_filter; in ppp_compat_ioctl()
986 which = &ppp->active_filter; in ppp_compat_ioctl()
987 ppp_lock(ppp); in ppp_compat_ioctl()
991 ppp_unlock(ppp); in ppp_compat_ioctl()
1007 err = ppp_set_compress(ppp, &data); in ppp_compat_ioctl()
1027 struct ppp *ppp; in ppp_unattached_ioctl() local
1054 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
1055 if (ppp) { in ppp_unattached_ioctl()
1056 refcount_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
1057 file->private_data = &ppp->file; in ppp_unattached_ioctl()
1119 struct ppp *ppp; in ppp_exit_net() local
1129 idr_for_each_entry(&pn->units_idr, ppp, id) in ppp_exit_net()
1131 if (!net_eq(dev_net(ppp->dev), net)) in ppp_exit_net()
1132 unregister_netdevice_queue(ppp->dev, &list); in ppp_exit_net()
1150 static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set) in ppp_unit_register() argument
1152 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_unit_register()
1158 ret = unit_get(&pn->units_idr, ppp, 0); in ppp_unit_register()
1163 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ret); in ppp_unit_register()
1164 if (!__dev_get_by_name(ppp->ppp_net, ppp->dev->name)) in ppp_unit_register()
1167 ret = unit_get(&pn->units_idr, ppp, ret + 1); in ppp_unit_register()
1182 ret = unit_set(&pn->units_idr, ppp, unit); in ppp_unit_register()
1189 ppp->file.index = ret; in ppp_unit_register()
1192 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ppp->file.index); in ppp_unit_register()
1196 ret = register_netdevice(ppp->dev); in ppp_unit_register()
1206 unit_put(&pn->units_idr, ppp->file.index); in ppp_unit_register()
1216 struct ppp *ppp = netdev_priv(dev); in ppp_dev_configure() local
1221 ppp->dev = dev; in ppp_dev_configure()
1222 ppp->ppp_net = src_net; in ppp_dev_configure()
1223 ppp->mru = PPP_MRU; in ppp_dev_configure()
1224 ppp->owner = conf->file; in ppp_dev_configure()
1226 init_ppp_file(&ppp->file, INTERFACE); in ppp_dev_configure()
1227 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_dev_configure()
1230 ppp->npmode[indx] = NPMODE_PASS; in ppp_dev_configure()
1231 INIT_LIST_HEAD(&ppp->channels); in ppp_dev_configure()
1232 spin_lock_init(&ppp->rlock); in ppp_dev_configure()
1233 spin_lock_init(&ppp->wlock); in ppp_dev_configure()
1235 ppp->xmit_recursion = alloc_percpu(int); in ppp_dev_configure()
1236 if (!ppp->xmit_recursion) { in ppp_dev_configure()
1241 (*per_cpu_ptr(ppp->xmit_recursion, cpu)) = 0; in ppp_dev_configure()
1244 ppp->minseq = -1; in ppp_dev_configure()
1245 skb_queue_head_init(&ppp->mrq); in ppp_dev_configure()
1248 ppp->pass_filter = NULL; in ppp_dev_configure()
1249 ppp->active_filter = NULL; in ppp_dev_configure()
1252 err = ppp_unit_register(ppp, conf->unit, conf->ifname_is_set); in ppp_dev_configure()
1256 conf->file->private_data = &ppp->file; in ppp_dev_configure()
1260 free_percpu(ppp->xmit_recursion); in ppp_dev_configure()
1350 struct ppp *ppp = netdev_priv(dev); in ppp_nl_get_link_net() local
1352 return ppp->ppp_net; in ppp_nl_get_link_net()
1359 .priv_size = sizeof(struct ppp),
1424 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
1433 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1454 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1455 ppp_xmit_process(ppp, skb); in ppp_start_xmit()
1469 struct ppp *ppp = netdev_priv(dev); in ppp_net_siocdevprivate() local
1477 ppp_get_stats(ppp, &stats); in ppp_net_siocdevprivate()
1485 if (ppp->xc_state) in ppp_net_siocdevprivate()
1486 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_siocdevprivate()
1487 if (ppp->rc_state) in ppp_net_siocdevprivate()
1488 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_siocdevprivate()
1511 struct ppp *ppp = netdev_priv(dev); in ppp_get_stats64() local
1513 ppp_recv_lock(ppp); in ppp_get_stats64()
1514 stats64->rx_packets = ppp->stats64.rx_packets; in ppp_get_stats64()
1515 stats64->rx_bytes = ppp->stats64.rx_bytes; in ppp_get_stats64()
1516 ppp_recv_unlock(ppp); in ppp_get_stats64()
1518 ppp_xmit_lock(ppp); in ppp_get_stats64()
1519 stats64->tx_packets = ppp->stats64.tx_packets; in ppp_get_stats64()
1520 stats64->tx_bytes = ppp->stats64.tx_bytes; in ppp_get_stats64()
1521 ppp_xmit_unlock(ppp); in ppp_get_stats64()
1532 struct ppp *ppp; in ppp_dev_init() local
1536 ppp = netdev_priv(dev); in ppp_dev_init()
1541 refcount_inc(&ppp->file.refcnt); in ppp_dev_init()
1548 struct ppp *ppp = netdev_priv(dev); in ppp_dev_uninit() local
1549 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit()
1551 ppp_lock(ppp); in ppp_dev_uninit()
1552 ppp->closing = 1; in ppp_dev_uninit()
1553 ppp_unlock(ppp); in ppp_dev_uninit()
1556 unit_put(&pn->units_idr, ppp->file.index); in ppp_dev_uninit()
1559 ppp->owner = NULL; in ppp_dev_uninit()
1561 ppp->file.dead = 1; in ppp_dev_uninit()
1562 wake_up_interruptible(&ppp->file.rwait); in ppp_dev_uninit()
1567 struct ppp *ppp; in ppp_dev_priv_destructor() local
1569 ppp = netdev_priv(dev); in ppp_dev_priv_destructor()
1570 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_dev_priv_destructor()
1571 ppp_destroy_interface(ppp); in ppp_dev_priv_destructor()
1577 struct ppp *ppp = netdev_priv(ctx->dev); in ppp_fill_forward_path() local
1581 if (ppp->flags & SC_MULTILINK) in ppp_fill_forward_path()
1584 if (list_empty(&ppp->channels)) in ppp_fill_forward_path()
1587 pch = list_first_entry(&ppp->channels, struct channel, clist); in ppp_fill_forward_path()
1630 static void __ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in __ppp_xmit_process() argument
1632 ppp_xmit_lock(ppp); in __ppp_xmit_process()
1633 if (!ppp->closing) { in __ppp_xmit_process()
1634 ppp_push(ppp); in __ppp_xmit_process()
1637 skb_queue_tail(&ppp->file.xq, skb); in __ppp_xmit_process()
1638 while (!ppp->xmit_pending && in __ppp_xmit_process()
1639 (skb = skb_dequeue(&ppp->file.xq))) in __ppp_xmit_process()
1640 ppp_send_frame(ppp, skb); in __ppp_xmit_process()
1643 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in __ppp_xmit_process()
1644 netif_wake_queue(ppp->dev); in __ppp_xmit_process()
1646 netif_stop_queue(ppp->dev); in __ppp_xmit_process()
1650 ppp_xmit_unlock(ppp); in __ppp_xmit_process()
1653 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in ppp_xmit_process() argument
1657 if (unlikely(*this_cpu_ptr(ppp->xmit_recursion))) in ppp_xmit_process()
1660 (*this_cpu_ptr(ppp->xmit_recursion))++; in ppp_xmit_process()
1661 __ppp_xmit_process(ppp, skb); in ppp_xmit_process()
1662 (*this_cpu_ptr(ppp->xmit_recursion))--; in ppp_xmit_process()
1674 netdev_err(ppp->dev, "recursion detected\n"); in ppp_xmit_process()
1678 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1682 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1683 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1684 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1685 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1689 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1692 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1694 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1697 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1700 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1719 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1733 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1746 if (ppp->pass_filter && in ppp_send_frame()
1747 bpf_prog_run(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1748 if (ppp->debug & 1) in ppp_send_frame()
1749 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1756 if (!(ppp->active_filter && in ppp_send_frame()
1757 bpf_prog_run(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1758 ppp->last_xmit = jiffies; in ppp_send_frame()
1762 ppp->last_xmit = jiffies; in ppp_send_frame()
1766 ++ppp->stats64.tx_packets; in ppp_send_frame()
1767 ppp->stats64.tx_bytes += skb->len - 2; in ppp_send_frame()
1771 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1774 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1777 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1780 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1782 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1784 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1806 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1811 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1813 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1815 netdev_err(ppp->dev, in ppp_send_frame()
1820 skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1829 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1830 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1832 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1833 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1837 ppp->xmit_pending = skb; in ppp_send_frame()
1838 ppp_push(ppp); in ppp_send_frame()
1843 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1851 ppp_push(struct ppp *ppp) in ppp_push() argument
1855 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1860 list = &ppp->channels; in ppp_push()
1863 ppp->xmit_pending = NULL; in ppp_push()
1868 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1876 ppp->xmit_pending = NULL; in ppp_push()
1880 ppp->xmit_pending = NULL; in ppp_push()
1889 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1893 ppp->xmit_pending = NULL; in ppp_push()
1907 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1930 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1932 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1952 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1953 ppp->nxchan = i; in ppp_mp_explode()
1978 list = &ppp->channels; in ppp_mp_explode()
1979 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
1981 if (list == &ppp->channels) { in ppp_mp_explode()
1991 if (list == &ppp->channels) { in ppp_mp_explode()
2094 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
2095 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
2096 q[3] = ppp->nxseq; in ppp_mp_explode()
2099 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
2100 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
2101 q[5] = ppp->nxseq; in ppp_mp_explode()
2114 ++ppp->nxseq; in ppp_mp_explode()
2118 ppp->nxchan = i; in ppp_mp_explode()
2124 if (ppp->debug & 1) in ppp_mp_explode()
2125 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
2126 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
2127 ++ppp->nxseq; in ppp_mp_explode()
2136 struct ppp *ppp; in __ppp_channel_push() local
2155 ppp = pch->ppp; in __ppp_channel_push()
2156 if (ppp) in __ppp_channel_push()
2157 __ppp_xmit_process(ppp, NULL); in __ppp_channel_push()
2164 if (pch->ppp) { in ppp_channel_push()
2165 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
2167 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
2185 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2187 ppp_recv_lock(ppp); in ppp_do_recv()
2188 if (!ppp->closing) in ppp_do_recv()
2189 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2192 ppp_recv_unlock(ppp); in ppp_do_recv()
2272 struct channel *pch = chan->ppp; in ppp_input()
2287 if (pch->ppp) { in ppp_input()
2288 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2289 ppp_receive_error(pch->ppp); in ppp_input()
2295 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2304 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2315 struct channel *pch = chan->ppp; in ppp_input_error()
2322 if (pch->ppp) { in ppp_input_error()
2327 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2338 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2346 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2349 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
2352 ppp_receive_error(ppp); in ppp_receive_frame()
2357 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
2359 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
2360 if (ppp->vj) in ppp_receive_error()
2361 slhc_toss(ppp->vj); in ppp_receive_error()
2365 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
2375 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
2376 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
2377 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
2379 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
2389 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2396 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
2408 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
2410 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2423 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2432 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
2433 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
2440 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
2444 ++ppp->stats64.rx_packets; in ppp_receive_nonmp_frame()
2445 ppp->stats64.rx_bytes += skb->len - 2; in ppp_receive_nonmp_frame()
2450 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
2452 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
2453 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
2456 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
2465 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
2470 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
2471 bpf_prog_run(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
2472 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
2473 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2479 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
2480 bpf_prog_run(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
2481 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2485 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2487 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
2488 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
2493 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
2496 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
2497 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
2505 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
2509 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
2524 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
2526 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
2529 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
2535 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
2540 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2546 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
2562 if (ppp->rcomp->incomp) in ppp_decompress_frame()
2563 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2570 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
2571 ppp_receive_error(ppp); in ppp_decompress_frame()
2582 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2586 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2588 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2592 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2614 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2615 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2617 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2626 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2628 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2629 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2641 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2645 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2646 ppp->minseq = seq; in ppp_receive_mp_frame()
2649 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2653 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2654 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2655 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2656 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2660 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2662 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2664 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2666 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2674 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2682 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2685 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2704 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2706 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2707 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2708 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2714 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2722 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2741 if (ppp->debug & 1) in ppp_mp_reconstruct()
2742 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2769 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2770 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2771 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2778 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2790 if (ppp->debug & 1) in ppp_mp_reconstruct()
2791 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2808 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2812 if (ppp->debug & 1) in ppp_mp_reconstruct()
2813 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2820 if (ppp->debug & 1) in ppp_mp_reconstruct()
2821 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2823 ppp->nextseq, in ppp_mp_reconstruct()
2825 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2826 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2851 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2880 pch->ppp = NULL; in ppp_register_net_channel()
2883 chan->ppp = pch; in ppp_register_net_channel()
2907 struct channel *pch = chan->ppp; in ppp_channel_index()
2919 struct channel *pch = chan->ppp; in ppp_unit_number()
2924 if (pch->ppp) in ppp_unit_number()
2925 unit = pch->ppp->file.index; in ppp_unit_number()
2936 struct channel *pch = chan->ppp; in ppp_dev_name()
2941 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2942 name = pch->ppp->dev->name; in ppp_dev_name()
2956 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2962 chan->ppp = NULL; in ppp_unregister_channel()
2996 struct channel *pch = chan->ppp; in ppp_output_wakeup()
3009 ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data) in ppp_set_compress() argument
3035 ppp_xmit_lock(ppp); in ppp_set_compress()
3036 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
3037 ocomp = ppp->xcomp; in ppp_set_compress()
3038 ostate = ppp->xc_state; in ppp_set_compress()
3039 ppp->xcomp = cp; in ppp_set_compress()
3040 ppp->xc_state = state; in ppp_set_compress()
3041 ppp_xmit_unlock(ppp); in ppp_set_compress()
3053 ppp_recv_lock(ppp); in ppp_set_compress()
3054 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
3055 ocomp = ppp->rcomp; in ppp_set_compress()
3056 ostate = ppp->rc_state; in ppp_set_compress()
3057 ppp->rcomp = cp; in ppp_set_compress()
3058 ppp->rc_state = state; in ppp_set_compress()
3059 ppp_recv_unlock(ppp); in ppp_set_compress()
3078 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
3099 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
3102 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
3111 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
3112 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
3116 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
3127 if (!ppp->rc_state) in ppp_ccp_peek()
3129 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
3130 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
3131 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
3132 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
3136 if (!ppp->xc_state) in ppp_ccp_peek()
3138 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
3139 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
3140 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
3146 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
3149 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
3150 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
3151 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
3154 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
3155 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
3163 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
3168 ppp_lock(ppp); in ppp_ccp_closed()
3169 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
3170 ppp->xstate = 0; in ppp_ccp_closed()
3171 xcomp = ppp->xcomp; in ppp_ccp_closed()
3172 xstate = ppp->xc_state; in ppp_ccp_closed()
3173 ppp->xc_state = NULL; in ppp_ccp_closed()
3174 ppp->rstate = 0; in ppp_ccp_closed()
3175 rcomp = ppp->rcomp; in ppp_ccp_closed()
3176 rstate = ppp->rc_state; in ppp_ccp_closed()
3177 ppp->rc_state = NULL; in ppp_ccp_closed()
3178 ppp_unlock(ppp); in ppp_ccp_closed()
3271 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
3273 struct slcompress *vj = ppp->vj; in ppp_get_stats()
3276 st->p.ppp_ipackets = ppp->stats64.rx_packets; in ppp_get_stats()
3277 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
3278 st->p.ppp_ibytes = ppp->stats64.rx_bytes; in ppp_get_stats()
3279 st->p.ppp_opackets = ppp->stats64.tx_packets; in ppp_get_stats()
3280 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
3281 st->p.ppp_obytes = ppp->stats64.tx_bytes; in ppp_get_stats()
3312 struct ppp *ppp; in ppp_create_interface() local
3315 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_ENUM, ppp_setup); in ppp_create_interface()
3328 ppp = netdev_priv(dev); in ppp_create_interface()
3329 *unit = ppp->file.index; in ppp_create_interface()
3360 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
3364 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
3366 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
3368 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
3372 ppp_ccp_closed(ppp); in ppp_destroy_interface()
3373 if (ppp->vj) { in ppp_destroy_interface()
3374 slhc_free(ppp->vj); in ppp_destroy_interface()
3375 ppp->vj = NULL; in ppp_destroy_interface()
3377 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
3378 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
3380 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
3383 if (ppp->pass_filter) { in ppp_destroy_interface()
3384 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
3385 ppp->pass_filter = NULL; in ppp_destroy_interface()
3388 if (ppp->active_filter) { in ppp_destroy_interface()
3389 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
3390 ppp->active_filter = NULL; in ppp_destroy_interface()
3394 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
3395 free_percpu(ppp->xmit_recursion); in ppp_destroy_interface()
3397 free_netdev(ppp->dev); in ppp_destroy_interface()
3404 static struct ppp *
3444 struct ppp *ppp; in ppp_connect_channel() local
3452 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
3453 if (!ppp) in ppp_connect_channel()
3457 if (pch->ppp || in ppp_connect_channel()
3461 ppp_lock(ppp); in ppp_connect_channel()
3466 ppp_unlock(ppp); in ppp_connect_channel()
3471 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3472 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3474 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
3475 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
3476 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3477 ++ppp->n_channels; in ppp_connect_channel()
3478 pch->ppp = ppp; in ppp_connect_channel()
3479 refcount_inc(&ppp->file.refcnt); in ppp_connect_channel()
3480 ppp_unlock(ppp); in ppp_connect_channel()
3496 struct ppp *ppp; in ppp_disconnect_channel() local
3500 ppp = pch->ppp; in ppp_disconnect_channel()
3501 pch->ppp = NULL; in ppp_disconnect_channel()
3503 if (ppp) { in ppp_disconnect_channel()
3505 ppp_lock(ppp); in ppp_disconnect_channel()
3507 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
3508 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
3509 ppp_unlock(ppp); in ppp_disconnect_channel()
3510 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
3511 ppp_destroy_interface(ppp); in ppp_disconnect_channel()