Lines Matching full:pch
261 static void ppp_channel_push(struct channel *pch);
263 struct channel *pch);
270 struct channel *pch);
285 static int ppp_connect_channel(struct channel *pch, int unit);
286 static int ppp_disconnect_channel(struct channel *pch);
287 static void ppp_destroy_channel(struct channel *pch);
649 struct channel *pch; in ppp_ioctl() local
652 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
658 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
662 err = ppp_disconnect_channel(pch); in ppp_ioctl()
666 down_read(&pch->chan_sem); in ppp_ioctl()
667 chan = pch->chan; in ppp_ioctl()
671 up_read(&pch->chan_sem); in ppp_ioctl()
1727 struct channel *pch; in ppp_push() local
1744 pch = list_entry(list, struct channel, clist); in ppp_push()
1746 spin_lock(&pch->downl); in ppp_push()
1747 if (pch->chan) { in ppp_push()
1748 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1755 spin_unlock(&pch->downl); in ppp_push()
1791 struct channel *pch; in ppp_mp_explode() local
1805 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1806 if (pch->chan) { in ppp_mp_explode()
1807 pch->avail = 1; in ppp_mp_explode()
1809 pch->speed = pch->chan->speed; in ppp_mp_explode()
1811 pch->avail = 0; in ppp_mp_explode()
1813 if (pch->avail) { in ppp_mp_explode()
1814 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1815 !pch->had_frag) { in ppp_mp_explode()
1816 if (pch->speed == 0) in ppp_mp_explode()
1819 totspeed += pch->speed; in ppp_mp_explode()
1821 pch->avail = 2; in ppp_mp_explode()
1825 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1868 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1870 if (!pch->avail) in ppp_mp_explode()
1877 if (pch->avail == 1) { in ppp_mp_explode()
1881 pch->avail = 1; in ppp_mp_explode()
1885 spin_lock(&pch->downl); in ppp_mp_explode()
1886 if (pch->chan == NULL) { in ppp_mp_explode()
1888 if (pch->speed == 0) in ppp_mp_explode()
1891 totspeed -= pch->speed; in ppp_mp_explode()
1893 spin_unlock(&pch->downl); in ppp_mp_explode()
1894 pch->avail = 0; in ppp_mp_explode()
1911 if (pch->speed == 0) { in ppp_mp_explode()
1919 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
1921 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
1922 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
1943 pch->avail = 2; in ppp_mp_explode()
1944 spin_unlock(&pch->downl); in ppp_mp_explode()
1953 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
1980 chan = pch->chan; in ppp_mp_explode()
1981 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1983 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
1984 pch->had_frag = 1; in ppp_mp_explode()
1989 spin_unlock(&pch->downl); in ppp_mp_explode()
1996 spin_unlock(&pch->downl); in ppp_mp_explode()
2006 static void __ppp_channel_push(struct channel *pch) in __ppp_channel_push() argument
2011 spin_lock(&pch->downl); in __ppp_channel_push()
2012 if (pch->chan) { in __ppp_channel_push()
2013 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2014 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
2015 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
2017 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
2023 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
2025 spin_unlock(&pch->downl); in __ppp_channel_push()
2027 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2028 ppp = pch->ppp; in __ppp_channel_push()
2034 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
2036 read_lock_bh(&pch->upl); in ppp_channel_push()
2037 if (pch->ppp) { in ppp_channel_push()
2038 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
2039 __ppp_channel_push(pch); in ppp_channel_push()
2040 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
2042 __ppp_channel_push(pch); in ppp_channel_push()
2044 read_unlock_bh(&pch->upl); in ppp_channel_push()
2058 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2062 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2111 struct channel *pch = chan->ppp; in ppp_input() local
2114 if (!pch) { in ppp_input()
2119 read_lock_bh(&pch->upl); 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()
2132 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2134 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2135 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2137 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2139 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2143 read_unlock_bh(&pch->upl); in ppp_input()
2150 struct channel *pch = chan->ppp; in ppp_input_error() local
2153 if (!pch) in ppp_input_error()
2156 read_lock_bh(&pch->upl); in ppp_input_error()
2157 if (pch->ppp) { in ppp_input_error()
2162 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2165 read_unlock_bh(&pch->upl); 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()
2417 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2455 pch->lastseq = seq; in ppp_receive_mp_frame()
2706 struct channel *pch; in ppp_register_net_channel() local
2709 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2710 if (!pch) in ppp_register_net_channel()
2715 pch->ppp = NULL; in ppp_register_net_channel()
2716 pch->chan = chan; in ppp_register_net_channel()
2717 pch->chan_net = get_net(net); in ppp_register_net_channel()
2718 chan->ppp = pch; in ppp_register_net_channel()
2719 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2720 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2722 pch->lastseq = -1; in ppp_register_net_channel()
2724 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2725 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2726 rwlock_init(&pch->upl); in ppp_register_net_channel()
2729 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2730 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2742 struct channel *pch = chan->ppp; in ppp_channel_index() local
2744 if (pch) in ppp_channel_index()
2745 return pch->file.index; in ppp_channel_index()
2754 struct channel *pch = chan->ppp; in ppp_unit_number() local
2757 if (pch) { in ppp_unit_number()
2758 read_lock_bh(&pch->upl); in ppp_unit_number()
2759 if (pch->ppp) in ppp_unit_number()
2760 unit = pch->ppp->file.index; in ppp_unit_number()
2761 read_unlock_bh(&pch->upl); in ppp_unit_number()
2771 struct channel *pch = chan->ppp; in ppp_dev_name() local
2774 if (pch) { in ppp_dev_name()
2775 read_lock_bh(&pch->upl); 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()
2778 read_unlock_bh(&pch->upl); in ppp_dev_name()
2791 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2794 if (!pch) in ppp_unregister_channel()
2803 down_write(&pch->chan_sem); in ppp_unregister_channel()
2804 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2805 pch->chan = NULL; in ppp_unregister_channel()
2806 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2807 up_write(&pch->chan_sem); in ppp_unregister_channel()
2808 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2810 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2812 list_del(&pch->list); in ppp_unregister_channel()
2815 pch->file.dead = 1; in ppp_unregister_channel()
2816 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2817 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2818 ppp_destroy_channel(pch); in ppp_unregister_channel()
2828 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2830 if (!pch) in ppp_output_wakeup()
2832 ppp_channel_push(pch); in ppp_output_wakeup()
3253 struct channel *pch; in ppp_find_channel() local
3255 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3256 if (pch->file.index == unit) { in ppp_find_channel()
3257 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3258 return pch; in ppp_find_channel()
3262 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3263 if (pch->file.index == unit) in ppp_find_channel()
3264 return pch; in ppp_find_channel()
3274 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3281 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3287 write_lock_bh(&pch->upl); in ppp_connect_channel()
3289 if (pch->ppp) in ppp_connect_channel()
3293 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3294 if (!pch->chan) { in ppp_connect_channel()
3296 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3301 spin_unlock_bh(&pch->downl); 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()
3304 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3307 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3309 pch->ppp = ppp; in ppp_connect_channel()
3315 write_unlock_bh(&pch->upl); in ppp_connect_channel()
3325 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3330 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
3331 ppp = pch->ppp; in ppp_disconnect_channel()
3332 pch->ppp = NULL; in ppp_disconnect_channel()
3333 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
3337 list_del(&pch->clist); in ppp_disconnect_channel()
3351 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3353 put_net(pch->chan_net); in ppp_destroy_channel()
3354 pch->chan_net = NULL; in ppp_destroy_channel()
3358 if (!pch->file.dead) { in ppp_destroy_channel()
3360 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3363 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3364 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3365 kfree(pch); in ppp_destroy_channel()