Lines Matching refs:ppp

94 #define PF_TO_PPP(pf)		PF_TO_X(pf, struct ppp)
115 struct ppp { struct
176 struct ppp *ppp; /* ppp unit we're connected to */ member
258 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb);
259 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb);
260 static void ppp_push(struct ppp *ppp);
262 static void ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb,
264 static void ppp_receive_error(struct ppp *ppp);
265 static void ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb);
266 static struct sk_buff *ppp_decompress_frame(struct ppp *ppp,
269 static void ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb,
271 static void ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb);
272 static struct sk_buff *ppp_mp_reconstruct(struct ppp *ppp);
273 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb);
275 static int ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data);
276 static void ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound);
277 static void ppp_ccp_closed(struct ppp *ppp);
279 static void ppp_get_stats(struct ppp *ppp, struct ppp_stats *st);
282 static void ppp_destroy_interface(struct ppp *ppp);
283 static struct ppp *ppp_find_unit(struct ppp_net *pn, int unit);
368 #define ppp_xmit_lock(ppp) spin_lock_bh(&(ppp)->wlock) argument
369 #define ppp_xmit_unlock(ppp) spin_unlock_bh(&(ppp)->wlock) argument
370 #define ppp_recv_lock(ppp) spin_lock_bh(&(ppp)->rlock) argument
371 #define ppp_recv_unlock(ppp) spin_unlock_bh(&(ppp)->rlock) argument
372 #define ppp_lock(ppp) do { ppp_xmit_lock(ppp); \ argument
373 ppp_recv_lock(ppp); } while (0)
374 #define ppp_unlock(ppp) do { ppp_recv_unlock(ppp); \ argument
375 ppp_xmit_unlock(ppp); } while (0)
397 struct ppp *ppp; in ppp_release() local
402 ppp = PF_TO_PPP(pf); in ppp_release()
404 if (file == ppp->owner) in ppp_release()
405 unregister_netdevice(ppp->dev); in ppp_release()
451 struct ppp *ppp = PF_TO_PPP(pf); in ppp_read() local
453 ppp_recv_lock(ppp); in ppp_read()
454 if (ppp->n_channels == 0 && in ppp_read()
455 (ppp->flags & SC_LOOP_TRAFFIC) == 0) { in ppp_read()
456 ppp_recv_unlock(ppp); in ppp_read()
459 ppp_recv_unlock(ppp); in ppp_read()
547 struct ppp *ppp = PF_TO_PPP(pf); in ppp_poll() local
549 ppp_recv_lock(ppp); in ppp_poll()
550 if (ppp->n_channels == 0 && in ppp_poll()
551 (ppp->flags & SC_LOOP_TRAFFIC) == 0) in ppp_poll()
553 ppp_recv_unlock(ppp); in ppp_poll()
617 struct ppp *ppp; in ppp_ioctl() local
683 ppp = PF_TO_PPP(pf); in ppp_ioctl()
688 ppp->mru = val; in ppp_ioctl()
695 ppp_lock(ppp); in ppp_ioctl()
696 cflags = ppp->flags & ~val; in ppp_ioctl()
698 if (!(ppp->flags & SC_MULTILINK) && (val & SC_MULTILINK)) in ppp_ioctl()
699 ppp->nextseq = 0; in ppp_ioctl()
701 ppp->flags = val & SC_FLAG_BITS; in ppp_ioctl()
702 ppp_unlock(ppp); in ppp_ioctl()
704 ppp_ccp_closed(ppp); in ppp_ioctl()
709 val = ppp->flags | ppp->xstate | ppp->rstate; in ppp_ioctl()
721 err = ppp_set_compress(ppp, &data); in ppp_ioctl()
725 if (put_user(ppp->file.index, p)) in ppp_ioctl()
733 ppp->debug = val; in ppp_ioctl()
738 if (put_user(ppp->debug, p)) in ppp_ioctl()
744 idle32.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
745 idle32.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
752 idle64.xmit_idle = (jiffies - ppp->last_xmit) / HZ; in ppp_ioctl()
753 idle64.recv_idle = (jiffies - ppp->last_recv) / HZ; in ppp_ioctl()
772 ppp_lock(ppp); in ppp_ioctl()
773 if (ppp->vj) in ppp_ioctl()
774 slhc_free(ppp->vj); in ppp_ioctl()
775 ppp->vj = vj; in ppp_ioctl()
776 ppp_unlock(ppp); in ppp_ioctl()
790 npi.mode = ppp->npmode[i]; in ppp_ioctl()
794 ppp->npmode[i] = npi.mode; in ppp_ioctl()
796 netif_wake_queue(ppp->dev); in ppp_ioctl()
813 which = &ppp->pass_filter; in ppp_ioctl()
815 which = &ppp->active_filter; in ppp_ioctl()
816 ppp_lock(ppp); in ppp_ioctl()
820 ppp_unlock(ppp); in ppp_ioctl()
830 ppp_recv_lock(ppp); in ppp_ioctl()
831 ppp->mrru = val; in ppp_ioctl()
832 ppp_recv_unlock(ppp); in ppp_ioctl()
865 struct ppp *ppp = PF_TO_PPP(pf); in ppp_compat_ioctl() local
879 which = &ppp->pass_filter; in ppp_compat_ioctl()
881 which = &ppp->active_filter; in ppp_compat_ioctl()
882 ppp_lock(ppp); in ppp_compat_ioctl()
886 ppp_unlock(ppp); in ppp_compat_ioctl()
902 err = ppp_set_compress(ppp, &data); in ppp_compat_ioctl()
922 struct ppp *ppp; in ppp_unattached_ioctl() local
949 ppp = ppp_find_unit(pn, unit); in ppp_unattached_ioctl()
950 if (ppp) { in ppp_unattached_ioctl()
951 refcount_inc(&ppp->file.refcnt); in ppp_unattached_ioctl()
952 file->private_data = &ppp->file; in ppp_unattached_ioctl()
1014 struct ppp *ppp; in ppp_exit_net() local
1024 idr_for_each_entry(&pn->units_idr, ppp, id) in ppp_exit_net()
1026 if (!net_eq(dev_net(ppp->dev), net)) in ppp_exit_net()
1027 unregister_netdevice_queue(ppp->dev, &list); in ppp_exit_net()
1045 static int ppp_unit_register(struct ppp *ppp, int unit, bool ifname_is_set) in ppp_unit_register() argument
1047 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_unit_register()
1053 ret = unit_get(&pn->units_idr, ppp, 0); in ppp_unit_register()
1058 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ret); in ppp_unit_register()
1059 if (!__dev_get_by_name(ppp->ppp_net, ppp->dev->name)) in ppp_unit_register()
1062 ret = unit_get(&pn->units_idr, ppp, ret + 1); in ppp_unit_register()
1077 ret = unit_set(&pn->units_idr, ppp, unit); in ppp_unit_register()
1084 ppp->file.index = ret; in ppp_unit_register()
1087 snprintf(ppp->dev->name, IFNAMSIZ, "ppp%i", ppp->file.index); in ppp_unit_register()
1091 ret = register_netdevice(ppp->dev); in ppp_unit_register()
1101 unit_put(&pn->units_idr, ppp->file.index); in ppp_unit_register()
1111 struct ppp *ppp = netdev_priv(dev); in ppp_dev_configure() local
1116 ppp->dev = dev; in ppp_dev_configure()
1117 ppp->ppp_net = src_net; in ppp_dev_configure()
1118 ppp->mru = PPP_MRU; in ppp_dev_configure()
1119 ppp->owner = conf->file; in ppp_dev_configure()
1121 init_ppp_file(&ppp->file, INTERFACE); in ppp_dev_configure()
1122 ppp->file.hdrlen = PPP_HDRLEN - 2; /* don't count proto bytes */ in ppp_dev_configure()
1125 ppp->npmode[indx] = NPMODE_PASS; in ppp_dev_configure()
1126 INIT_LIST_HEAD(&ppp->channels); in ppp_dev_configure()
1127 spin_lock_init(&ppp->rlock); in ppp_dev_configure()
1128 spin_lock_init(&ppp->wlock); in ppp_dev_configure()
1130 ppp->xmit_recursion = alloc_percpu(int); in ppp_dev_configure()
1131 if (!ppp->xmit_recursion) { in ppp_dev_configure()
1136 (*per_cpu_ptr(ppp->xmit_recursion, cpu)) = 0; in ppp_dev_configure()
1139 ppp->minseq = -1; in ppp_dev_configure()
1140 skb_queue_head_init(&ppp->mrq); in ppp_dev_configure()
1143 ppp->pass_filter = NULL; in ppp_dev_configure()
1144 ppp->active_filter = NULL; in ppp_dev_configure()
1147 err = ppp_unit_register(ppp, conf->unit, conf->ifname_is_set); in ppp_dev_configure()
1151 conf->file->private_data = &ppp->file; in ppp_dev_configure()
1155 free_percpu(ppp->xmit_recursion); in ppp_dev_configure()
1245 struct ppp *ppp = netdev_priv(dev); in ppp_nl_get_link_net() local
1247 return ppp->ppp_net; in ppp_nl_get_link_net()
1254 .priv_size = sizeof(struct ppp),
1319 struct ppp *ppp = netdev_priv(dev); in ppp_start_xmit() local
1328 switch (ppp->npmode[npi]) { in ppp_start_xmit()
1349 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, dev_net(dev))); in ppp_start_xmit()
1350 ppp_xmit_process(ppp, skb); in ppp_start_xmit()
1363 struct ppp *ppp = netdev_priv(dev); in ppp_net_ioctl() local
1372 ppp_get_stats(ppp, &stats); in ppp_net_ioctl()
1380 if (ppp->xc_state) in ppp_net_ioctl()
1381 ppp->xcomp->comp_stat(ppp->xc_state, &cstats.c); in ppp_net_ioctl()
1382 if (ppp->rc_state) in ppp_net_ioctl()
1383 ppp->rcomp->decomp_stat(ppp->rc_state, &cstats.d); in ppp_net_ioctl()
1406 struct ppp *ppp = netdev_priv(dev); in ppp_get_stats64() local
1408 ppp_recv_lock(ppp); in ppp_get_stats64()
1409 stats64->rx_packets = ppp->stats64.rx_packets; in ppp_get_stats64()
1410 stats64->rx_bytes = ppp->stats64.rx_bytes; in ppp_get_stats64()
1411 ppp_recv_unlock(ppp); in ppp_get_stats64()
1413 ppp_xmit_lock(ppp); in ppp_get_stats64()
1414 stats64->tx_packets = ppp->stats64.tx_packets; in ppp_get_stats64()
1415 stats64->tx_bytes = ppp->stats64.tx_bytes; in ppp_get_stats64()
1416 ppp_xmit_unlock(ppp); in ppp_get_stats64()
1427 struct ppp *ppp; in ppp_dev_init() local
1431 ppp = netdev_priv(dev); in ppp_dev_init()
1436 refcount_inc(&ppp->file.refcnt); in ppp_dev_init()
1443 struct ppp *ppp = netdev_priv(dev); in ppp_dev_uninit() local
1444 struct ppp_net *pn = ppp_pernet(ppp->ppp_net); in ppp_dev_uninit()
1446 ppp_lock(ppp); in ppp_dev_uninit()
1447 ppp->closing = 1; in ppp_dev_uninit()
1448 ppp_unlock(ppp); in ppp_dev_uninit()
1451 unit_put(&pn->units_idr, ppp->file.index); in ppp_dev_uninit()
1454 ppp->owner = NULL; in ppp_dev_uninit()
1456 ppp->file.dead = 1; in ppp_dev_uninit()
1457 wake_up_interruptible(&ppp->file.rwait); in ppp_dev_uninit()
1462 struct ppp *ppp; in ppp_dev_priv_destructor() local
1464 ppp = netdev_priv(dev); in ppp_dev_priv_destructor()
1465 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_dev_priv_destructor()
1466 ppp_destroy_interface(ppp); in ppp_dev_priv_destructor()
1503 static void __ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in __ppp_xmit_process() argument
1505 ppp_xmit_lock(ppp); in __ppp_xmit_process()
1506 if (!ppp->closing) { in __ppp_xmit_process()
1507 ppp_push(ppp); in __ppp_xmit_process()
1510 skb_queue_tail(&ppp->file.xq, skb); in __ppp_xmit_process()
1511 while (!ppp->xmit_pending && in __ppp_xmit_process()
1512 (skb = skb_dequeue(&ppp->file.xq))) in __ppp_xmit_process()
1513 ppp_send_frame(ppp, skb); in __ppp_xmit_process()
1516 if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) in __ppp_xmit_process()
1517 netif_wake_queue(ppp->dev); in __ppp_xmit_process()
1519 netif_stop_queue(ppp->dev); in __ppp_xmit_process()
1523 ppp_xmit_unlock(ppp); in __ppp_xmit_process()
1526 static void ppp_xmit_process(struct ppp *ppp, struct sk_buff *skb) in ppp_xmit_process() argument
1530 if (unlikely(*this_cpu_ptr(ppp->xmit_recursion))) in ppp_xmit_process()
1533 (*this_cpu_ptr(ppp->xmit_recursion))++; in ppp_xmit_process()
1534 __ppp_xmit_process(ppp, skb); in ppp_xmit_process()
1535 (*this_cpu_ptr(ppp->xmit_recursion))--; in ppp_xmit_process()
1547 netdev_err(ppp->dev, "recursion detected\n"); in ppp_xmit_process()
1551 pad_compress_skb(struct ppp *ppp, struct sk_buff *skb) in pad_compress_skb() argument
1555 int new_skb_size = ppp->dev->mtu + in pad_compress_skb()
1556 ppp->xcomp->comp_extra + ppp->dev->hard_header_len; in pad_compress_skb()
1557 int compressor_skb_size = ppp->dev->mtu + in pad_compress_skb()
1558 ppp->xcomp->comp_extra + PPP_HDRLEN; in pad_compress_skb()
1562 netdev_err(ppp->dev, "PPP: no memory (comp pkt)\n"); in pad_compress_skb()
1565 if (ppp->dev->hard_header_len > PPP_HDRLEN) in pad_compress_skb()
1567 ppp->dev->hard_header_len - PPP_HDRLEN); in pad_compress_skb()
1570 len = ppp->xcomp->compress(ppp->xc_state, skb->data - 2, in pad_compress_skb()
1573 if (len > 0 && (ppp->flags & SC_CCP_UP)) { in pad_compress_skb()
1592 netdev_err(ppp->dev, "ppp: compressor dropped pkt\n"); in pad_compress_skb()
1606 ppp_send_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_send_frame() argument
1619 if (ppp->pass_filter && in ppp_send_frame()
1620 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_send_frame()
1621 if (ppp->debug & 1) in ppp_send_frame()
1622 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_send_frame()
1629 if (!(ppp->active_filter && in ppp_send_frame()
1630 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_send_frame()
1631 ppp->last_xmit = jiffies; in ppp_send_frame()
1635 ppp->last_xmit = jiffies; in ppp_send_frame()
1639 ++ppp->stats64.tx_packets; in ppp_send_frame()
1640 ppp->stats64.tx_bytes += skb->len - PPP_PROTO_LEN; in ppp_send_frame()
1644 if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0) in ppp_send_frame()
1647 new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2, in ppp_send_frame()
1650 netdev_err(ppp->dev, "PPP: no memory (VJ comp pkt)\n"); in ppp_send_frame()
1653 skb_reserve(new_skb, ppp->dev->hard_header_len - 2); in ppp_send_frame()
1655 len = slhc_compress(ppp->vj, cp, skb->len - 2, in ppp_send_frame()
1657 !(ppp->flags & SC_NO_TCP_CCID)); in ppp_send_frame()
1679 ppp_ccp_peek(ppp, skb, 0); in ppp_send_frame()
1684 if ((ppp->xstate & SC_COMP_RUN) && ppp->xc_state && in ppp_send_frame()
1686 if (!(ppp->flags & SC_CCP_UP) && (ppp->flags & SC_MUST_COMP)) { in ppp_send_frame()
1688 netdev_err(ppp->dev, in ppp_send_frame()
1693 skb = pad_compress_skb(ppp, skb); in ppp_send_frame()
1702 if (ppp->flags & SC_LOOP_TRAFFIC) { in ppp_send_frame()
1703 if (ppp->file.rq.qlen > PPP_MAX_RQLEN) in ppp_send_frame()
1705 skb_queue_tail(&ppp->file.rq, skb); in ppp_send_frame()
1706 wake_up_interruptible(&ppp->file.rwait); in ppp_send_frame()
1710 ppp->xmit_pending = skb; in ppp_send_frame()
1711 ppp_push(ppp); in ppp_send_frame()
1716 ++ppp->dev->stats.tx_errors; in ppp_send_frame()
1724 ppp_push(struct ppp *ppp) in ppp_push() argument
1728 struct sk_buff *skb = ppp->xmit_pending; in ppp_push()
1733 list = &ppp->channels; in ppp_push()
1736 ppp->xmit_pending = NULL; in ppp_push()
1741 if ((ppp->flags & SC_MULTILINK) == 0) { in ppp_push()
1749 ppp->xmit_pending = NULL; in ppp_push()
1753 ppp->xmit_pending = NULL; in ppp_push()
1762 if (!ppp_mp_explode(ppp, skb)) in ppp_push()
1766 ppp->xmit_pending = NULL; in ppp_push()
1780 static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_explode() argument
1803 hdrlen = (ppp->flags & SC_MP_XSHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_mp_explode()
1805 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1825 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1826 ppp->nxchan = i; in ppp_mp_explode()
1851 list = &ppp->channels; in ppp_mp_explode()
1852 for (i = 0; i < ppp->nxchan; ++i) { in ppp_mp_explode()
1854 if (list == &ppp->channels) { in ppp_mp_explode()
1864 if (list == &ppp->channels) { in ppp_mp_explode()
1967 if (ppp->flags & SC_MP_XSHORTSEQ) { in ppp_mp_explode()
1968 q[2] = bits + ((ppp->nxseq >> 8) & 0xf); in ppp_mp_explode()
1969 q[3] = ppp->nxseq; in ppp_mp_explode()
1972 q[3] = ppp->nxseq >> 16; in ppp_mp_explode()
1973 q[4] = ppp->nxseq >> 8; in ppp_mp_explode()
1974 q[5] = ppp->nxseq; in ppp_mp_explode()
1987 ++ppp->nxseq; in ppp_mp_explode()
1991 ppp->nxchan = i; in ppp_mp_explode()
1997 if (ppp->debug & 1) in ppp_mp_explode()
1998 netdev_err(ppp->dev, "PPP: no memory (fragment)\n"); in ppp_mp_explode()
1999 ++ppp->dev->stats.tx_errors; in ppp_mp_explode()
2000 ++ppp->nxseq; in ppp_mp_explode()
2009 struct ppp *ppp; in __ppp_channel_push() local
2028 ppp = pch->ppp; in __ppp_channel_push()
2029 if (ppp) in __ppp_channel_push()
2030 __ppp_xmit_process(ppp, NULL); in __ppp_channel_push()
2037 if (pch->ppp) { in ppp_channel_push()
2038 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
2040 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
2058 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2060 ppp_recv_lock(ppp); in ppp_do_recv()
2061 if (!ppp->closing) in ppp_do_recv()
2062 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2065 ppp_recv_unlock(ppp); in ppp_do_recv()
2111 struct channel *pch = chan->ppp; in ppp_input()
2122 if (pch->ppp) { in ppp_input()
2123 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2124 ppp_receive_error(pch->ppp); in ppp_input()
2130 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2139 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2150 struct channel *pch = chan->ppp; in ppp_input_error()
2157 if (pch->ppp) { in ppp_input_error()
2162 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2173 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2181 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2184 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_frame()
2187 ppp_receive_error(ppp); in ppp_receive_frame()
2192 ppp_receive_error(struct ppp *ppp) in ppp_receive_error() argument
2194 ++ppp->dev->stats.rx_errors; in ppp_receive_error()
2195 if (ppp->vj) in ppp_receive_error()
2196 slhc_toss(ppp->vj); in ppp_receive_error()
2200 ppp_receive_nonmp_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_receive_nonmp_frame() argument
2210 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN) && in ppp_receive_nonmp_frame()
2211 (ppp->rstate & (SC_DC_FERROR | SC_DC_ERROR)) == 0) in ppp_receive_nonmp_frame()
2212 skb = ppp_decompress_frame(ppp, skb); in ppp_receive_nonmp_frame()
2214 if (ppp->flags & SC_MUST_COMP && ppp->rstate & SC_DC_FERROR) in ppp_receive_nonmp_frame()
2224 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2231 netdev_err(ppp->dev, "PPP: no memory " in ppp_receive_nonmp_frame()
2243 len = slhc_uncompress(ppp->vj, skb->data + 2, skb->len - 2); in ppp_receive_nonmp_frame()
2245 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2258 if (!ppp->vj || (ppp->flags & SC_REJ_COMP_TCP)) in ppp_receive_nonmp_frame()
2267 if (slhc_remember(ppp->vj, skb->data + 2, skb->len - 2) <= 0) { in ppp_receive_nonmp_frame()
2268 netdev_err(ppp->dev, "PPP: VJ uncompressed error\n"); in ppp_receive_nonmp_frame()
2275 ppp_ccp_peek(ppp, skb, 1); in ppp_receive_nonmp_frame()
2279 ++ppp->stats64.rx_packets; in ppp_receive_nonmp_frame()
2280 ppp->stats64.rx_bytes += skb->len - 2; in ppp_receive_nonmp_frame()
2285 skb_queue_tail(&ppp->file.rq, skb); in ppp_receive_nonmp_frame()
2287 while (ppp->file.rq.qlen > PPP_MAX_RQLEN && in ppp_receive_nonmp_frame()
2288 (skb = skb_dequeue(&ppp->file.rq))) in ppp_receive_nonmp_frame()
2291 wake_up_interruptible(&ppp->file.rwait); in ppp_receive_nonmp_frame()
2300 if (ppp->pass_filter || ppp->active_filter) { in ppp_receive_nonmp_frame()
2305 if (ppp->pass_filter && in ppp_receive_nonmp_frame()
2306 BPF_PROG_RUN(ppp->pass_filter, skb) == 0) { in ppp_receive_nonmp_frame()
2307 if (ppp->debug & 1) in ppp_receive_nonmp_frame()
2308 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_receive_nonmp_frame()
2314 if (!(ppp->active_filter && in ppp_receive_nonmp_frame()
2315 BPF_PROG_RUN(ppp->active_filter, skb) == 0)) in ppp_receive_nonmp_frame()
2316 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2320 ppp->last_recv = jiffies; in ppp_receive_nonmp_frame()
2322 if ((ppp->dev->flags & IFF_UP) == 0 || in ppp_receive_nonmp_frame()
2323 ppp->npmode[npi] != NPMODE_PASS) { in ppp_receive_nonmp_frame()
2328 skb->dev = ppp->dev; in ppp_receive_nonmp_frame()
2331 skb_scrub_packet(skb, !net_eq(ppp->ppp_net, in ppp_receive_nonmp_frame()
2332 dev_net(ppp->dev))); in ppp_receive_nonmp_frame()
2340 ppp_receive_error(ppp); in ppp_receive_nonmp_frame()
2344 ppp_decompress_frame(struct ppp *ppp, struct sk_buff *skb) in ppp_decompress_frame() argument
2359 switch(ppp->rcomp->compress_proto) { in ppp_decompress_frame()
2361 obuff_size = ppp->mru + PPP_HDRLEN + 1; in ppp_decompress_frame()
2364 obuff_size = ppp->mru + PPP_HDRLEN; in ppp_decompress_frame()
2370 netdev_err(ppp->dev, "ppp_decompress_frame: " in ppp_decompress_frame()
2375 len = ppp->rcomp->decompress(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2381 ppp->rstate |= SC_DC_FERROR; in ppp_decompress_frame()
2397 if (ppp->rcomp->incomp) in ppp_decompress_frame()
2398 ppp->rcomp->incomp(ppp->rc_state, skb->data - 2, in ppp_decompress_frame()
2405 ppp->rstate |= SC_DC_ERROR; in ppp_decompress_frame()
2406 ppp_receive_error(ppp); in ppp_decompress_frame()
2417 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2421 int mphdrlen = (ppp->flags & SC_MP_SHORTSEQ)? MPHDRLEN_SSN: MPHDRLEN; in ppp_receive_mp_frame()
2423 if (!pskb_may_pull(skb, mphdrlen + 1) || ppp->mrru == 0) in ppp_receive_mp_frame()
2427 if (ppp->flags & SC_MP_SHORTSEQ) { in ppp_receive_mp_frame()
2449 seq |= ppp->minseq & ~mask; in ppp_receive_mp_frame()
2450 if ((int)(ppp->minseq - seq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2452 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) in ppp_receive_mp_frame()
2461 if (seq_before(seq, ppp->nextseq)) { in ppp_receive_mp_frame()
2463 ++ppp->dev->stats.rx_dropped; in ppp_receive_mp_frame()
2464 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2476 list_for_each_entry(ch, &ppp->channels, clist) { in ppp_receive_mp_frame()
2480 if (seq_before(ppp->minseq, seq)) in ppp_receive_mp_frame()
2481 ppp->minseq = seq; in ppp_receive_mp_frame()
2484 ppp_mp_insert(ppp, skb); in ppp_receive_mp_frame()
2488 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { in ppp_receive_mp_frame()
2489 struct sk_buff *mskb = skb_peek(&ppp->mrq); in ppp_receive_mp_frame()
2490 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence)) in ppp_receive_mp_frame()
2491 ppp->minseq = PPP_MP_CB(mskb)->sequence; in ppp_receive_mp_frame()
2495 while ((skb = ppp_mp_reconstruct(ppp))) { in ppp_receive_mp_frame()
2497 ppp_receive_nonmp_frame(ppp, skb); in ppp_receive_mp_frame()
2499 ++ppp->dev->stats.rx_length_errors; in ppp_receive_mp_frame()
2501 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2509 ppp_receive_error(ppp); in ppp_receive_mp_frame()
2517 ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb) in ppp_mp_insert() argument
2520 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_insert()
2539 ppp_mp_reconstruct(struct ppp *ppp) in ppp_mp_reconstruct() argument
2541 u32 seq = ppp->nextseq; in ppp_mp_reconstruct()
2542 u32 minseq = ppp->minseq; in ppp_mp_reconstruct()
2543 struct sk_buff_head *list = &ppp->mrq; in ppp_mp_reconstruct()
2549 if (ppp->mrru == 0) /* do nothing until mrru is set */ in ppp_mp_reconstruct()
2557 netdev_err(ppp->dev, "ppp_mp_reconstruct bad " in ppp_mp_reconstruct()
2576 if (ppp->debug & 1) in ppp_mp_reconstruct()
2577 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2604 if (len > ppp->mrru + 2) { in ppp_mp_reconstruct()
2605 ++ppp->dev->stats.rx_length_errors; in ppp_mp_reconstruct()
2606 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2613 ppp->nextseq = seq + 1; in ppp_mp_reconstruct()
2625 if (ppp->debug & 1) in ppp_mp_reconstruct()
2626 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2643 if (PPP_MP_CB(head)->sequence != ppp->nextseq) { in ppp_mp_reconstruct()
2647 if (ppp->debug & 1) in ppp_mp_reconstruct()
2648 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2655 if (ppp->debug & 1) in ppp_mp_reconstruct()
2656 netdev_printk(KERN_DEBUG, ppp->dev, in ppp_mp_reconstruct()
2658 ppp->nextseq, in ppp_mp_reconstruct()
2660 ++ppp->dev->stats.rx_dropped; in ppp_mp_reconstruct()
2661 ppp_receive_error(ppp); in ppp_mp_reconstruct()
2686 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1; in ppp_mp_reconstruct()
2715 pch->ppp = NULL; in ppp_register_net_channel()
2718 chan->ppp = pch; in ppp_register_net_channel()
2742 struct channel *pch = chan->ppp; in ppp_channel_index()
2754 struct channel *pch = chan->ppp; in ppp_unit_number()
2759 if (pch->ppp) in ppp_unit_number()
2760 unit = pch->ppp->file.index; in ppp_unit_number()
2771 struct channel *pch = chan->ppp; in ppp_dev_name()
2776 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2777 name = pch->ppp->dev->name; in ppp_dev_name()
2791 struct channel *pch = chan->ppp; in ppp_unregister_channel()
2797 chan->ppp = NULL; in ppp_unregister_channel()
2828 struct channel *pch = chan->ppp; in ppp_output_wakeup()
2841 ppp_set_compress(struct ppp *ppp, struct ppp_option_data *data) in ppp_set_compress() argument
2867 ppp_xmit_lock(ppp); in ppp_set_compress()
2868 ppp->xstate &= ~SC_COMP_RUN; in ppp_set_compress()
2869 ocomp = ppp->xcomp; in ppp_set_compress()
2870 ostate = ppp->xc_state; in ppp_set_compress()
2871 ppp->xcomp = cp; in ppp_set_compress()
2872 ppp->xc_state = state; in ppp_set_compress()
2873 ppp_xmit_unlock(ppp); in ppp_set_compress()
2885 ppp_recv_lock(ppp); in ppp_set_compress()
2886 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_set_compress()
2887 ocomp = ppp->rcomp; in ppp_set_compress()
2888 ostate = ppp->rc_state; in ppp_set_compress()
2889 ppp->rcomp = cp; in ppp_set_compress()
2890 ppp->rc_state = state; in ppp_set_compress()
2891 ppp_recv_unlock(ppp); in ppp_set_compress()
2910 ppp_ccp_peek(struct ppp *ppp, struct sk_buff *skb, int inbound) in ppp_ccp_peek() argument
2931 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2934 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2943 ppp->rstate &= ~SC_DECOMP_RUN; in ppp_ccp_peek()
2944 ppp->xstate &= ~SC_COMP_RUN; in ppp_ccp_peek()
2948 if ((ppp->flags & (SC_CCP_OPEN | SC_CCP_UP)) != SC_CCP_OPEN) in ppp_ccp_peek()
2959 if (!ppp->rc_state) in ppp_ccp_peek()
2961 if (ppp->rcomp->decomp_init(ppp->rc_state, dp, len, in ppp_ccp_peek()
2962 ppp->file.index, 0, ppp->mru, ppp->debug)) { in ppp_ccp_peek()
2963 ppp->rstate |= SC_DECOMP_RUN; in ppp_ccp_peek()
2964 ppp->rstate &= ~(SC_DC_ERROR | SC_DC_FERROR); in ppp_ccp_peek()
2968 if (!ppp->xc_state) in ppp_ccp_peek()
2970 if (ppp->xcomp->comp_init(ppp->xc_state, dp, len, in ppp_ccp_peek()
2971 ppp->file.index, 0, ppp->debug)) in ppp_ccp_peek()
2972 ppp->xstate |= SC_COMP_RUN; in ppp_ccp_peek()
2978 if ((ppp->flags & SC_CCP_UP) == 0) in ppp_ccp_peek()
2981 if (ppp->rc_state && (ppp->rstate & SC_DECOMP_RUN)) { in ppp_ccp_peek()
2982 ppp->rcomp->decomp_reset(ppp->rc_state); in ppp_ccp_peek()
2983 ppp->rstate &= ~SC_DC_ERROR; in ppp_ccp_peek()
2986 if (ppp->xc_state && (ppp->xstate & SC_COMP_RUN)) in ppp_ccp_peek()
2987 ppp->xcomp->comp_reset(ppp->xc_state); in ppp_ccp_peek()
2995 ppp_ccp_closed(struct ppp *ppp) in ppp_ccp_closed() argument
3000 ppp_lock(ppp); in ppp_ccp_closed()
3001 ppp->flags &= ~(SC_CCP_OPEN | SC_CCP_UP); in ppp_ccp_closed()
3002 ppp->xstate = 0; in ppp_ccp_closed()
3003 xcomp = ppp->xcomp; in ppp_ccp_closed()
3004 xstate = ppp->xc_state; in ppp_ccp_closed()
3005 ppp->xc_state = NULL; in ppp_ccp_closed()
3006 ppp->rstate = 0; in ppp_ccp_closed()
3007 rcomp = ppp->rcomp; in ppp_ccp_closed()
3008 rstate = ppp->rc_state; in ppp_ccp_closed()
3009 ppp->rc_state = NULL; in ppp_ccp_closed()
3010 ppp_unlock(ppp); in ppp_ccp_closed()
3103 ppp_get_stats(struct ppp *ppp, struct ppp_stats *st) in ppp_get_stats() argument
3105 struct slcompress *vj = ppp->vj; in ppp_get_stats()
3108 st->p.ppp_ipackets = ppp->stats64.rx_packets; in ppp_get_stats()
3109 st->p.ppp_ierrors = ppp->dev->stats.rx_errors; in ppp_get_stats()
3110 st->p.ppp_ibytes = ppp->stats64.rx_bytes; in ppp_get_stats()
3111 st->p.ppp_opackets = ppp->stats64.tx_packets; in ppp_get_stats()
3112 st->p.ppp_oerrors = ppp->dev->stats.tx_errors; in ppp_get_stats()
3113 st->p.ppp_obytes = ppp->stats64.tx_bytes; in ppp_get_stats()
3144 struct ppp *ppp; in ppp_create_interface() local
3147 dev = alloc_netdev(sizeof(struct ppp), "", NET_NAME_ENUM, ppp_setup); in ppp_create_interface()
3160 ppp = netdev_priv(dev); in ppp_create_interface()
3161 *unit = ppp->file.index; in ppp_create_interface()
3192 static void ppp_destroy_interface(struct ppp *ppp) in ppp_destroy_interface() argument
3196 if (!ppp->file.dead || ppp->n_channels) { in ppp_destroy_interface()
3198 netdev_err(ppp->dev, "ppp: destroying ppp struct %p " in ppp_destroy_interface()
3200 ppp, ppp->file.dead, ppp->n_channels); in ppp_destroy_interface()
3204 ppp_ccp_closed(ppp); in ppp_destroy_interface()
3205 if (ppp->vj) { in ppp_destroy_interface()
3206 slhc_free(ppp->vj); in ppp_destroy_interface()
3207 ppp->vj = NULL; in ppp_destroy_interface()
3209 skb_queue_purge(&ppp->file.xq); in ppp_destroy_interface()
3210 skb_queue_purge(&ppp->file.rq); in ppp_destroy_interface()
3212 skb_queue_purge(&ppp->mrq); in ppp_destroy_interface()
3215 if (ppp->pass_filter) { in ppp_destroy_interface()
3216 bpf_prog_destroy(ppp->pass_filter); in ppp_destroy_interface()
3217 ppp->pass_filter = NULL; in ppp_destroy_interface()
3220 if (ppp->active_filter) { in ppp_destroy_interface()
3221 bpf_prog_destroy(ppp->active_filter); in ppp_destroy_interface()
3222 ppp->active_filter = NULL; in ppp_destroy_interface()
3226 kfree_skb(ppp->xmit_pending); in ppp_destroy_interface()
3227 free_percpu(ppp->xmit_recursion); in ppp_destroy_interface()
3229 free_netdev(ppp->dev); in ppp_destroy_interface()
3236 static struct ppp *
3276 struct ppp *ppp; in ppp_connect_channel() local
3284 ppp = ppp_find_unit(pn, unit); in ppp_connect_channel()
3285 if (!ppp) in ppp_connect_channel()
3289 if (pch->ppp) in ppp_connect_channel()
3292 ppp_lock(ppp); in ppp_connect_channel()
3297 ppp_unlock(ppp); in ppp_connect_channel()
3302 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3303 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3305 if (hdrlen > ppp->dev->hard_header_len) in ppp_connect_channel()
3306 ppp->dev->hard_header_len = hdrlen; in ppp_connect_channel()
3307 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3308 ++ppp->n_channels; in ppp_connect_channel()
3309 pch->ppp = ppp; in ppp_connect_channel()
3310 refcount_inc(&ppp->file.refcnt); in ppp_connect_channel()
3311 ppp_unlock(ppp); in ppp_connect_channel()
3327 struct ppp *ppp; in ppp_disconnect_channel() local
3331 ppp = pch->ppp; in ppp_disconnect_channel()
3332 pch->ppp = NULL; in ppp_disconnect_channel()
3334 if (ppp) { in ppp_disconnect_channel()
3336 ppp_lock(ppp); in ppp_disconnect_channel()
3338 if (--ppp->n_channels == 0) in ppp_disconnect_channel()
3339 wake_up_interruptible(&ppp->file.rwait); in ppp_disconnect_channel()
3340 ppp_unlock(ppp); in ppp_disconnect_channel()
3341 if (refcount_dec_and_test(&ppp->file.refcnt)) in ppp_disconnect_channel()
3342 ppp_destroy_interface(ppp); in ppp_disconnect_channel()