Lines Matching refs:pch

263 static void ppp_channel_push(struct channel *pch);
265 struct channel *pch);
272 struct channel *pch);
287 static int ppp_connect_channel(struct channel *pch, int unit);
288 static int ppp_disconnect_channel(struct channel *pch);
289 static void ppp_destroy_channel(struct channel *pch);
619 struct channel *pch; in ppp_ioctl() local
622 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
628 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
632 err = ppp_disconnect_channel(pch); in ppp_ioctl()
636 down_read(&pch->chan_sem); in ppp_ioctl()
637 chan = pch->chan; in ppp_ioctl()
641 up_read(&pch->chan_sem); in ppp_ioctl()
1627 struct channel *pch; in ppp_push() local
1644 pch = list_entry(list, struct channel, clist); in ppp_push()
1646 spin_lock(&pch->downl); in ppp_push()
1647 if (pch->chan) { in ppp_push()
1648 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1655 spin_unlock(&pch->downl); in ppp_push()
1691 struct channel *pch; in ppp_mp_explode() local
1705 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1706 if (pch->chan) { in ppp_mp_explode()
1707 pch->avail = 1; in ppp_mp_explode()
1709 pch->speed = pch->chan->speed; in ppp_mp_explode()
1711 pch->avail = 0; in ppp_mp_explode()
1713 if (pch->avail) { in ppp_mp_explode()
1714 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1715 !pch->had_frag) { in ppp_mp_explode()
1716 if (pch->speed == 0) in ppp_mp_explode()
1719 totspeed += pch->speed; in ppp_mp_explode()
1721 pch->avail = 2; in ppp_mp_explode()
1725 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1768 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1770 if (!pch->avail) in ppp_mp_explode()
1777 if (pch->avail == 1) { in ppp_mp_explode()
1781 pch->avail = 1; in ppp_mp_explode()
1785 spin_lock(&pch->downl); in ppp_mp_explode()
1786 if (pch->chan == NULL) { in ppp_mp_explode()
1788 if (pch->speed == 0) in ppp_mp_explode()
1791 totspeed -= pch->speed; in ppp_mp_explode()
1793 spin_unlock(&pch->downl); in ppp_mp_explode()
1794 pch->avail = 0; in ppp_mp_explode()
1811 if (pch->speed == 0) { in ppp_mp_explode()
1819 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
1821 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
1822 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
1843 pch->avail = 2; in ppp_mp_explode()
1844 spin_unlock(&pch->downl); in ppp_mp_explode()
1853 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
1880 chan = pch->chan; in ppp_mp_explode()
1881 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1883 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
1884 pch->had_frag = 1; in ppp_mp_explode()
1889 spin_unlock(&pch->downl); in ppp_mp_explode()
1896 spin_unlock(&pch->downl); in ppp_mp_explode()
1906 static void __ppp_channel_push(struct channel *pch) in __ppp_channel_push() argument
1911 spin_lock(&pch->downl); in __ppp_channel_push()
1912 if (pch->chan) { in __ppp_channel_push()
1913 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
1914 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
1915 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
1917 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
1923 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
1925 spin_unlock(&pch->downl); in __ppp_channel_push()
1927 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
1928 ppp = pch->ppp; in __ppp_channel_push()
1934 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
1936 read_lock_bh(&pch->upl); in ppp_channel_push()
1937 if (pch->ppp) { in ppp_channel_push()
1938 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
1939 __ppp_channel_push(pch); in ppp_channel_push()
1940 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
1942 __ppp_channel_push(pch); in ppp_channel_push()
1944 read_unlock_bh(&pch->upl); in ppp_channel_push()
1958 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1962 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
1971 struct channel *pch = chan->ppp; in ppp_input() local
1974 if (!pch) { in ppp_input()
1979 read_lock_bh(&pch->upl); 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()
1992 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
1994 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
1995 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
1997 wake_up_interruptible(&pch->file.rwait); in ppp_input()
1999 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2003 read_unlock_bh(&pch->upl); in ppp_input()
2010 struct channel *pch = chan->ppp; in ppp_input_error() local
2013 if (!pch) in ppp_input_error()
2016 read_lock_bh(&pch->upl); in ppp_input_error()
2017 if (pch->ppp) { in ppp_input_error()
2022 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2025 read_unlock_bh(&pch->upl); 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()
2271 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2307 pch->lastseq = seq; in ppp_receive_mp_frame()
2558 struct channel *pch; in ppp_register_net_channel() local
2561 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2562 if (!pch) in ppp_register_net_channel()
2567 pch->ppp = NULL; in ppp_register_net_channel()
2568 pch->chan = chan; in ppp_register_net_channel()
2569 pch->chan_net = get_net(net); in ppp_register_net_channel()
2570 chan->ppp = pch; in ppp_register_net_channel()
2571 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2572 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2574 pch->lastseq = -1; in ppp_register_net_channel()
2576 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2577 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2578 rwlock_init(&pch->upl); in ppp_register_net_channel()
2581 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2582 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2594 struct channel *pch = chan->ppp; in ppp_channel_index() local
2596 if (pch) in ppp_channel_index()
2597 return pch->file.index; in ppp_channel_index()
2606 struct channel *pch = chan->ppp; in ppp_unit_number() local
2609 if (pch) { in ppp_unit_number()
2610 read_lock_bh(&pch->upl); in ppp_unit_number()
2611 if (pch->ppp) in ppp_unit_number()
2612 unit = pch->ppp->file.index; in ppp_unit_number()
2613 read_unlock_bh(&pch->upl); in ppp_unit_number()
2623 struct channel *pch = chan->ppp; in ppp_dev_name() local
2626 if (pch) { in ppp_dev_name()
2627 read_lock_bh(&pch->upl); 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()
2630 read_unlock_bh(&pch->upl); in ppp_dev_name()
2643 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2646 if (!pch) in ppp_unregister_channel()
2655 down_write(&pch->chan_sem); in ppp_unregister_channel()
2656 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2657 pch->chan = NULL; in ppp_unregister_channel()
2658 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2659 up_write(&pch->chan_sem); in ppp_unregister_channel()
2660 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2662 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2664 list_del(&pch->list); in ppp_unregister_channel()
2667 pch->file.dead = 1; in ppp_unregister_channel()
2668 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2669 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2670 ppp_destroy_channel(pch); in ppp_unregister_channel()
2680 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2682 if (!pch) in ppp_output_wakeup()
2684 ppp_channel_push(pch); in ppp_output_wakeup()
3109 struct channel *pch; in ppp_find_channel() local
3111 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3112 if (pch->file.index == unit) { in ppp_find_channel()
3113 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3114 return pch; in ppp_find_channel()
3118 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3119 if (pch->file.index == unit) in ppp_find_channel()
3120 return pch; in ppp_find_channel()
3130 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3137 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3143 write_lock_bh(&pch->upl); in ppp_connect_channel()
3145 if (pch->ppp) in ppp_connect_channel()
3149 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3150 if (!pch->chan) { in ppp_connect_channel()
3152 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3157 spin_unlock_bh(&pch->downl); 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()
3160 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3163 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3165 pch->ppp = ppp; in ppp_connect_channel()
3171 write_unlock_bh(&pch->upl); in ppp_connect_channel()
3181 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3186 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
3187 ppp = pch->ppp; in ppp_disconnect_channel()
3188 pch->ppp = NULL; in ppp_disconnect_channel()
3189 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
3193 list_del(&pch->clist); in ppp_disconnect_channel()
3207 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3209 put_net(pch->chan_net); in ppp_destroy_channel()
3210 pch->chan_net = NULL; in ppp_destroy_channel()
3214 if (!pch->file.dead) { in ppp_destroy_channel()
3216 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3219 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3220 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3221 kfree(pch); in ppp_destroy_channel()