Lines Matching full:pch
259 static void ppp_channel_push(struct channel *pch);
261 struct channel *pch);
268 struct channel *pch);
283 static int ppp_connect_channel(struct channel *pch, int unit);
284 static int ppp_disconnect_channel(struct channel *pch);
285 static void ppp_destroy_channel(struct channel *pch);
644 struct channel *pch; in ppp_ioctl() local
647 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
653 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
657 err = ppp_disconnect_channel(pch); in ppp_ioctl()
661 down_read(&pch->chan_sem); in ppp_ioctl()
662 chan = pch->chan; in ppp_ioctl()
666 up_read(&pch->chan_sem); in ppp_ioctl()
1711 struct channel *pch; in ppp_push() local
1728 pch = list_entry(list, struct channel, clist); in ppp_push()
1730 spin_lock(&pch->downl); in ppp_push()
1731 if (pch->chan) { in ppp_push()
1732 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1739 spin_unlock(&pch->downl); in ppp_push()
1775 struct channel *pch; in ppp_mp_explode() local
1789 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1790 if (pch->chan) { in ppp_mp_explode()
1791 pch->avail = 1; in ppp_mp_explode()
1793 pch->speed = pch->chan->speed; in ppp_mp_explode()
1795 pch->avail = 0; in ppp_mp_explode()
1797 if (pch->avail) { in ppp_mp_explode()
1798 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1799 !pch->had_frag) { in ppp_mp_explode()
1800 if (pch->speed == 0) in ppp_mp_explode()
1803 totspeed += pch->speed; in ppp_mp_explode()
1805 pch->avail = 2; in ppp_mp_explode()
1809 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1852 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1854 if (!pch->avail) in ppp_mp_explode()
1861 if (pch->avail == 1) { in ppp_mp_explode()
1865 pch->avail = 1; in ppp_mp_explode()
1869 spin_lock(&pch->downl); in ppp_mp_explode()
1870 if (pch->chan == NULL) { in ppp_mp_explode()
1872 if (pch->speed == 0) in ppp_mp_explode()
1875 totspeed -= pch->speed; in ppp_mp_explode()
1877 spin_unlock(&pch->downl); in ppp_mp_explode()
1878 pch->avail = 0; in ppp_mp_explode()
1895 if (pch->speed == 0) { in ppp_mp_explode()
1903 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
1905 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
1906 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
1927 pch->avail = 2; in ppp_mp_explode()
1928 spin_unlock(&pch->downl); in ppp_mp_explode()
1937 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
1964 chan = pch->chan; in ppp_mp_explode()
1965 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1967 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
1968 pch->had_frag = 1; in ppp_mp_explode()
1973 spin_unlock(&pch->downl); in ppp_mp_explode()
1980 spin_unlock(&pch->downl); in ppp_mp_explode()
1990 static void __ppp_channel_push(struct channel *pch) in __ppp_channel_push() argument
1995 spin_lock(&pch->downl); in __ppp_channel_push()
1996 if (pch->chan) { in __ppp_channel_push()
1997 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
1998 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
1999 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
2001 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
2007 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
2009 spin_unlock(&pch->downl); in __ppp_channel_push()
2011 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2012 ppp = pch->ppp; in __ppp_channel_push()
2018 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
2020 read_lock_bh(&pch->upl); in ppp_channel_push()
2021 if (pch->ppp) { in ppp_channel_push()
2022 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
2023 __ppp_channel_push(pch); in ppp_channel_push()
2024 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
2026 __ppp_channel_push(pch); in ppp_channel_push()
2028 read_unlock_bh(&pch->upl); in ppp_channel_push()
2042 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2046 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2095 struct channel *pch = chan->ppp; in ppp_input() local
2098 if (!pch) { in ppp_input()
2103 read_lock_bh(&pch->upl); in ppp_input()
2106 if (pch->ppp) { in ppp_input()
2107 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2108 ppp_receive_error(pch->ppp); in ppp_input()
2114 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2116 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2118 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2119 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2121 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2123 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2127 read_unlock_bh(&pch->upl); in ppp_input()
2134 struct channel *pch = chan->ppp; in ppp_input_error() local
2137 if (!pch) in ppp_input_error()
2140 read_lock_bh(&pch->upl); in ppp_input_error()
2141 if (pch->ppp) { in ppp_input_error()
2146 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2149 read_unlock_bh(&pch->upl); in ppp_input_error()
2157 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2165 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2401 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2439 pch->lastseq = seq; in ppp_receive_mp_frame()
2690 struct channel *pch; in ppp_register_net_channel() local
2693 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2694 if (!pch) in ppp_register_net_channel()
2699 pch->ppp = NULL; in ppp_register_net_channel()
2700 pch->chan = chan; in ppp_register_net_channel()
2701 pch->chan_net = get_net(net); in ppp_register_net_channel()
2702 chan->ppp = pch; in ppp_register_net_channel()
2703 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2704 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2706 pch->lastseq = -1; in ppp_register_net_channel()
2708 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2709 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2710 rwlock_init(&pch->upl); in ppp_register_net_channel()
2713 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2714 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2726 struct channel *pch = chan->ppp; in ppp_channel_index() local
2728 if (pch) in ppp_channel_index()
2729 return pch->file.index; in ppp_channel_index()
2738 struct channel *pch = chan->ppp; in ppp_unit_number() local
2741 if (pch) { in ppp_unit_number()
2742 read_lock_bh(&pch->upl); in ppp_unit_number()
2743 if (pch->ppp) in ppp_unit_number()
2744 unit = pch->ppp->file.index; in ppp_unit_number()
2745 read_unlock_bh(&pch->upl); in ppp_unit_number()
2755 struct channel *pch = chan->ppp; in ppp_dev_name() local
2758 if (pch) { in ppp_dev_name()
2759 read_lock_bh(&pch->upl); in ppp_dev_name()
2760 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2761 name = pch->ppp->dev->name; in ppp_dev_name()
2762 read_unlock_bh(&pch->upl); in ppp_dev_name()
2775 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2778 if (!pch) in ppp_unregister_channel()
2787 down_write(&pch->chan_sem); in ppp_unregister_channel()
2788 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2789 pch->chan = NULL; in ppp_unregister_channel()
2790 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2791 up_write(&pch->chan_sem); in ppp_unregister_channel()
2792 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2794 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2796 list_del(&pch->list); in ppp_unregister_channel()
2799 pch->file.dead = 1; in ppp_unregister_channel()
2800 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2801 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2802 ppp_destroy_channel(pch); in ppp_unregister_channel()
2812 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2814 if (!pch) in ppp_output_wakeup()
2816 ppp_channel_push(pch); in ppp_output_wakeup()
3237 struct channel *pch; in ppp_find_channel() local
3239 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3240 if (pch->file.index == unit) { in ppp_find_channel()
3241 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3242 return pch; in ppp_find_channel()
3246 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3247 if (pch->file.index == unit) in ppp_find_channel()
3248 return pch; in ppp_find_channel()
3258 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3265 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3271 write_lock_bh(&pch->upl); in ppp_connect_channel()
3273 if (pch->ppp) in ppp_connect_channel()
3277 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3278 if (!pch->chan) { in ppp_connect_channel()
3280 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3285 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3286 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3287 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3288 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3291 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3293 pch->ppp = ppp; in ppp_connect_channel()
3299 write_unlock_bh(&pch->upl); in ppp_connect_channel()
3309 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3314 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
3315 ppp = pch->ppp; in ppp_disconnect_channel()
3316 pch->ppp = NULL; in ppp_disconnect_channel()
3317 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
3321 list_del(&pch->clist); in ppp_disconnect_channel()
3335 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3337 put_net(pch->chan_net); in ppp_destroy_channel()
3338 pch->chan_net = NULL; in ppp_destroy_channel()
3342 if (!pch->file.dead) { in ppp_destroy_channel()
3344 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3347 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3348 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3349 kfree(pch); in ppp_destroy_channel()