Lines Matching refs:ppp
96 #define PF_TO_PPP(pf) PF_TO_X(pf, struct ppp)
117 struct ppp { struct
178 struct ppp *ppp; /* ppp unit we're connected to */ member
260 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb);
261 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
262 static void ppp_push(struct ppp *ppp);
264 static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
266 static void ppp_receive_error(struct ppp *ppp);
267 static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
268 static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
271 static void ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb,
273 static void ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb);
274 static struct sk_buff *ppp_mp_reconstruct(struct ppp *ppp);
275 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb);
277 static int ppp_set_compress(struct ppp *ppp, unsigned long arg);
278 static void ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound);
279 static void ppp_ccp_closed(struct ppp *ppp);
281 static void ppp_get_stats(struct ppp *ppp, struct ppp_stats *st);
284 static void ppp_destroy_interface(struct ppp *ppp);
285 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
372 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
373 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
374 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
375 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
376 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
377 ppp_recv_lock(ppp); } while (0)
378 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
379 ppp_xmit_unlock(ppp); } while (0)
401 struct ppp *ppp; in ppp_release() local
406 ppp = PF_TO_PPP(pf); in ppp_release()
408 if (file == ppp->owner) in ppp_release()
409 unregister_netdevice(ppp->dev); in ppp_release()
455 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
457 ppp_recv_lock(ppp); in ppp_read()
458 if (ppp->n_channels == 0 && in ppp_read()
459 (ppp->flags & SC_LOOP_TRAFFIC) == 0) { in ppp_read()
460 ppp_recv_unlock(ppp); in ppp_read()
463 ppp_recv_unlock(ppp); in ppp_read()
548 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
550 ppp_recv_lock(ppp); in ppp_poll()
551 if (ppp->n_channels == 0 && in ppp_poll()
552 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
554 ppp_recv_unlock(ppp); in ppp_poll()
588 struct ppp *ppp; in ppp_ioctl() local
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
865 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
866 if (ppp) { in ppp_unattached_ioctl()
867 refcount_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()
958 static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set) in ppp_unit_register() argument
960 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_unit_register()
966 ret = unit_get(&pn->units_idr, ppp); in ppp_unit_register()
979 ret = unit_set(&pn->units_idr, ppp, unit); in ppp_unit_register()
986 ppp->file.index = ret; in ppp_unit_register()
989 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ppp->file.index); in ppp_unit_register()
993 ret = register_netdevice(ppp->dev); in ppp_unit_register()
1003 unit_put(&pn->units_idr, ppp->file.index); in ppp_unit_register()
1013 struct ppp *ppp = netdev_priv(dev); in ppp_dev_configure() local
1018 ppp->dev = dev; in ppp_dev_configure()
1019 ppp->ppp_net = src_net; in ppp_dev_configure()
1020 ppp->mru = PPP_MRU; in ppp_dev_configure()
1021 ppp->owner = conf->file; in ppp_dev_configure()
1023 init_ppp_file(&ppp->file, INTERFACE); in ppp_dev_configure()
1024 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_dev_configure()
1027 ppp->npmode[indx] = NPMODE_PASS; in ppp_dev_configure()
1028 INIT_LIST_HEAD(&ppp->channels); in ppp_dev_configure()
1029 spin_lock_init(&ppp->rlock); in ppp_dev_configure()
1030 spin_lock_init(&ppp->wlock); in ppp_dev_configure()
1032 ppp->xmit_recursion = alloc_percpu(int); in ppp_dev_configure()
1033 if (!ppp->xmit_recursion) { in ppp_dev_configure()
1038 (*per_cpu_ptr(ppp->xmit_recursion, cpu)) = 0; in ppp_dev_configure()
1041 ppp->minseq = -1; in ppp_dev_configure()
1042 skb_queue_head_init(&ppp->mrq); in ppp_dev_configure()
1045 ppp->pass_filter = NULL; in ppp_dev_configure()
1046 ppp->active_filter = NULL; in ppp_dev_configure()
1049 err = ppp_unit_register(ppp, conf->unit, conf->ifname_is_set); in ppp_dev_configure()
1053 conf->file->private_data = &ppp->file; in ppp_dev_configure()
1057 free_percpu(ppp->xmit_recursion); in ppp_dev_configure()
1147 struct ppp *ppp = netdev_priv(dev); in ppp_nl_get_link_net() local
1149 return ppp->ppp_net; in ppp_nl_get_link_net()
1156 .priv_size = sizeof(struct ppp),
1221 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
1230 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1251 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1252 ppp_xmit_process(ppp, skb); in ppp_start_xmit()
1265 struct ppp *ppp = netdev_priv(dev); in ppp_net_ioctl() local
1274 ppp_get_stats(ppp, &stats); in ppp_net_ioctl()
1282 if (ppp->xc_state) in ppp_net_ioctl()
1283 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_ioctl()
1284 if (ppp->rc_state) in ppp_net_ioctl()
1285 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_ioctl()
1308 struct ppp *ppp = netdev_priv(dev); in ppp_get_stats64() local
1310 ppp_recv_lock(ppp); in ppp_get_stats64()
1311 stats64->rx_packets = ppp->stats64.rx_packets; in ppp_get_stats64()
1312 stats64->rx_bytes = ppp->stats64.rx_bytes; in ppp_get_stats64()
1313 ppp_recv_unlock(ppp); in ppp_get_stats64()
1315 ppp_xmit_lock(ppp); in ppp_get_stats64()
1316 stats64->tx_packets = ppp->stats64.tx_packets; in ppp_get_stats64()
1317 stats64->tx_bytes = ppp->stats64.tx_bytes; in ppp_get_stats64()
1318 ppp_xmit_unlock(ppp); in ppp_get_stats64()
1329 struct ppp *ppp; in ppp_dev_init() local
1333 ppp = netdev_priv(dev); in ppp_dev_init()
1338 refcount_inc(&ppp->file.refcnt); in ppp_dev_init()
1345 struct ppp *ppp = netdev_priv(dev); in ppp_dev_uninit() local
1346 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit()
1348 ppp_lock(ppp); in ppp_dev_uninit()
1349 ppp->closing = 1; in ppp_dev_uninit()
1350 ppp_unlock(ppp); in ppp_dev_uninit()
1353 unit_put(&pn->units_idr, ppp->file.index); in ppp_dev_uninit()
1356 ppp->owner = NULL; in ppp_dev_uninit()
1358 ppp->file.dead = 1; in ppp_dev_uninit()
1359 wake_up_interruptible(&ppp->file.rwait); in ppp_dev_uninit()
1364 struct ppp *ppp; in ppp_dev_priv_destructor() local
1366 ppp = netdev_priv(dev); in ppp_dev_priv_destructor()
1367 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_dev_priv_destructor()
1368 ppp_destroy_interface(ppp); in ppp_dev_priv_destructor()
1405 static void __ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in __ppp_xmit_process() argument
1407 ppp_xmit_lock(ppp); in __ppp_xmit_process()
1408 if (!ppp->closing) { in __ppp_xmit_process()
1409 ppp_push(ppp); in __ppp_xmit_process()
1412 skb_queue_tail(&ppp->file.xq, skb); in __ppp_xmit_process()
1413 while (!ppp->xmit_pending && in __ppp_xmit_process()
1414 (skb = skb_dequeue(&ppp->file.xq))) in __ppp_xmit_process()
1415 ppp_send_frame(ppp, skb); in __ppp_xmit_process()
1418 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in __ppp_xmit_process()
1419 netif_wake_queue(ppp->dev); in __ppp_xmit_process()
1421 netif_stop_queue(ppp->dev); in __ppp_xmit_process()
1423 ppp_xmit_unlock(ppp); in __ppp_xmit_process()
1426 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in ppp_xmit_process() argument
1430 if (unlikely(*this_cpu_ptr(ppp->xmit_recursion))) in ppp_xmit_process()
1433 (*this_cpu_ptr(ppp->xmit_recursion))++; in ppp_xmit_process()
1434 __ppp_xmit_process(ppp, skb); in ppp_xmit_process()
1435 (*this_cpu_ptr(ppp->xmit_recursion))--; in ppp_xmit_process()
1447 netdev_err(ppp->dev, "recursion detected\n"); in ppp_xmit_process()
1451 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1455 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1456 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1457 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1458 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1462 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1465 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1467 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1470 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1473 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1492 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1506 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1519 if (ppp->pass_filter && in ppp_send_frame()
1520 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1521 if (ppp->debug & 1) in ppp_send_frame()
1522 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1529 if (!(ppp->active_filter && in ppp_send_frame()
1530 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1531 ppp->last_xmit = jiffies; in ppp_send_frame()
1535 ppp->last_xmit = jiffies; in ppp_send_frame()
1539 ++ppp->stats64.tx_packets; in ppp_send_frame()
1540 ppp->stats64.tx_bytes += skb->len - 2; in ppp_send_frame()
1544 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1547 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1550 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1553 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1555 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1557 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1579 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1584 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1586 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1588 netdev_err(ppp->dev, in ppp_send_frame()
1593 skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1602 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1603 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1605 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1606 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1610 ppp->xmit_pending = skb; in ppp_send_frame()
1611 ppp_push(ppp); in ppp_send_frame()
1616 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1624 ppp_push(struct ppp *ppp) in ppp_push() argument
1628 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1633 list = &ppp->channels; in ppp_push()
1636 ppp->xmit_pending = NULL; in ppp_push()
1641 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1649 ppp->xmit_pending = NULL; in ppp_push()
1653 ppp->xmit_pending = NULL; in ppp_push()
1662 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1666 ppp->xmit_pending = NULL; in ppp_push()
1680 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1703 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1705 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1725 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1726 ppp->nxchan = i; in ppp_mp_explode()
1751 list = &ppp->channels; in ppp_mp_explode()
1752 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
1754 if (list == &ppp->channels) { in ppp_mp_explode()
1764 if (list == &ppp->channels) { in ppp_mp_explode()
1867 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
1868 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
1869 q[3] = ppp->nxseq; in ppp_mp_explode()
1872 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
1873 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
1874 q[5] = ppp->nxseq; in ppp_mp_explode()
1887 ++ppp->nxseq; in ppp_mp_explode()
1891 ppp->nxchan = i; in ppp_mp_explode()
1897 if (ppp->debug & 1) in ppp_mp_explode()
1898 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
1899 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
1900 ++ppp->nxseq; in ppp_mp_explode()
1909 struct ppp *ppp; in __ppp_channel_push() local
1928 ppp = pch->ppp; in __ppp_channel_push()
1929 if (ppp) in __ppp_channel_push()
1930 __ppp_xmit_process(ppp, NULL); in __ppp_channel_push()
1937 if (pch->ppp) { in ppp_channel_push()
1938 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
1940 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
1958 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1960 ppp_recv_lock(ppp); in ppp_do_recv()
1961 if (!ppp->closing) in ppp_do_recv()
1962 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
1965 ppp_recv_unlock(ppp); in ppp_do_recv()
1971 struct channel *pch = chan->ppp; in ppp_input()
1982 if (pch->ppp) { in ppp_input()
1983 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
1984 ppp_receive_error(pch->ppp); in ppp_input()
1990 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
1999 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2010 struct channel *pch = chan->ppp; in ppp_input_error()
2017 if (pch->ppp) { in ppp_input_error()
2022 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2033 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2041 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2044 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
2047 ppp_receive_error(ppp); in ppp_receive_frame()
2052 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
2054 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
2055 if (ppp->vj) in ppp_receive_error()
2056 slhc_toss(ppp->vj); in ppp_receive_error()
2060 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
2070 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
2071 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
2072 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
2074 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
2081 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2088 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
2100 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
2102 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2115 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2124 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
2125 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
2132 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
2136 ++ppp->stats64.rx_packets; in ppp_receive_nonmp_frame()
2137 ppp->stats64.rx_bytes += skb->len - 2; in ppp_receive_nonmp_frame()
2142 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
2144 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
2145 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
2148 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
2157 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
2162 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
2163 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
2164 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
2165 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2171 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
2172 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
2173 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2177 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2179 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
2180 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
2185 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
2188 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
2189 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
2197 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
2201 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
2216 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
2218 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
2221 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
2227 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
2232 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2238 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
2251 if (ppp->rcomp->incomp) in ppp_decompress_frame()
2252 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2259 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
2260 ppp_receive_error(ppp); in ppp_decompress_frame()
2271 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2275 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2277 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2281 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2301 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2302 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2304 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2313 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2315 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2316 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2328 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2332 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2333 ppp->minseq = seq; in ppp_receive_mp_frame()
2336 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2340 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2341 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2342 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2343 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2347 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2349 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2351 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2353 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2361 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2369 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2372 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2391 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2393 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2394 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2395 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2401 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2409 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2428 if (ppp->debug & 1) in ppp_mp_reconstruct()
2429 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2456 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2457 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2458 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2465 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2477 if (ppp->debug & 1) in ppp_mp_reconstruct()
2478 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2495 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2499 if (ppp->debug & 1) in ppp_mp_reconstruct()
2500 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2507 if (ppp->debug & 1) in ppp_mp_reconstruct()
2508 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2510 ppp->nextseq, in ppp_mp_reconstruct()
2512 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2513 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2538 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2567 pch->ppp = NULL; in ppp_register_net_channel()
2570 chan->ppp = pch; in ppp_register_net_channel()
2594 struct channel *pch = chan->ppp; in ppp_channel_index()
2606 struct channel *pch = chan->ppp; in ppp_unit_number()
2611 if (pch->ppp) in ppp_unit_number()
2612 unit = pch->ppp->file.index; in ppp_unit_number()
2623 struct channel *pch = chan->ppp; in ppp_dev_name()
2628 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2629 name = pch->ppp->dev->name; in ppp_dev_name()
2643 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2649 chan->ppp = NULL; in ppp_unregister_channel()
2680 struct channel *pch = chan->ppp; in ppp_output_wakeup()
2693 ppp_set_compress(struct ppp *ppp, unsigned long arg) in ppp_set_compress() argument
2723 ppp_xmit_lock(ppp); in ppp_set_compress()
2724 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
2725 ocomp = ppp->xcomp; in ppp_set_compress()
2726 ostate = ppp->xc_state; in ppp_set_compress()
2727 ppp->xcomp = cp; in ppp_set_compress()
2728 ppp->xc_state = state; in ppp_set_compress()
2729 ppp_xmit_unlock(ppp); in ppp_set_compress()
2741 ppp_recv_lock(ppp); in ppp_set_compress()
2742 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
2743 ocomp = ppp->rcomp; in ppp_set_compress()
2744 ostate = ppp->rc_state; in ppp_set_compress()
2745 ppp->rcomp = cp; in ppp_set_compress()
2746 ppp->rc_state = state; in ppp_set_compress()
2747 ppp_recv_unlock(ppp); in ppp_set_compress()
2766 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
2787 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2790 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2799 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2800 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2804 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
2815 if (!ppp->rc_state) in ppp_ccp_peek()
2817 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
2818 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
2819 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
2820 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
2824 if (!ppp->xc_state) in ppp_ccp_peek()
2826 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
2827 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
2828 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
2834 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
2837 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
2838 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
2839 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
2842 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
2843 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
2851 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
2856 ppp_lock(ppp); in ppp_ccp_closed()
2857 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
2858 ppp->xstate = 0; in ppp_ccp_closed()
2859 xcomp = ppp->xcomp; in ppp_ccp_closed()
2860 xstate = ppp->xc_state; in ppp_ccp_closed()
2861 ppp->xc_state = NULL; in ppp_ccp_closed()
2862 ppp->rstate = 0; in ppp_ccp_closed()
2863 rcomp = ppp->rcomp; in ppp_ccp_closed()
2864 rstate = ppp->rc_state; in ppp_ccp_closed()
2865 ppp->rc_state = NULL; in ppp_ccp_closed()
2866 ppp_unlock(ppp); in ppp_ccp_closed()
2959 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
2961 struct slcompress *vj = ppp->vj; in ppp_get_stats()
2964 st->p.ppp_ipackets = ppp->stats64.rx_packets; in ppp_get_stats()
2965 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
2966 st->p.ppp_ibytes = ppp->stats64.rx_bytes; in ppp_get_stats()
2967 st->p.ppp_opackets = ppp->stats64.tx_packets; in ppp_get_stats()
2968 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
2969 st->p.ppp_obytes = ppp->stats64.tx_bytes; in ppp_get_stats()
3000 struct ppp *ppp; in ppp_create_interface() local
3003 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_ENUM, ppp_setup); in ppp_create_interface()
3016 ppp = netdev_priv(dev); in ppp_create_interface()
3017 *unit = ppp->file.index; in ppp_create_interface()
3048 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
3052 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
3054 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
3056 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
3060 ppp_ccp_closed(ppp); in ppp_destroy_interface()
3061 if (ppp->vj) { in ppp_destroy_interface()
3062 slhc_free(ppp->vj); in ppp_destroy_interface()
3063 ppp->vj = NULL; in ppp_destroy_interface()
3065 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
3066 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
3068 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
3071 if (ppp->pass_filter) { in ppp_destroy_interface()
3072 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
3073 ppp->pass_filter = NULL; in ppp_destroy_interface()
3076 if (ppp->active_filter) { in ppp_destroy_interface()
3077 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
3078 ppp->active_filter = NULL; in ppp_destroy_interface()
3082 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
3083 free_percpu(ppp->xmit_recursion); in ppp_destroy_interface()
3085 free_netdev(ppp->dev); in ppp_destroy_interface()
3092 static struct ppp *
3132 struct ppp *ppp; in ppp_connect_channel() local
3140 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
3141 if (!ppp) in ppp_connect_channel()
3145 if (pch->ppp) in ppp_connect_channel()
3148 ppp_lock(ppp); in ppp_connect_channel()
3153 ppp_unlock(ppp); in ppp_connect_channel()
3158 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3159 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3161 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
3162 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
3163 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3164 ++ppp->n_channels; in ppp_connect_channel()
3165 pch->ppp = ppp; in ppp_connect_channel()
3166 refcount_inc(&ppp->file.refcnt); in ppp_connect_channel()
3167 ppp_unlock(ppp); in ppp_connect_channel()
3183 struct ppp *ppp; in ppp_disconnect_channel() local
3187 ppp = pch->ppp; in ppp_disconnect_channel()
3188 pch->ppp = NULL; in ppp_disconnect_channel()
3190 if (ppp) { in ppp_disconnect_channel()
3192 ppp_lock(ppp); in ppp_disconnect_channel()
3194 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
3195 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
3196 ppp_unlock(ppp); in ppp_disconnect_channel()
3197 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
3198 ppp_destroy_interface(ppp); in ppp_disconnect_channel()