Lines Matching refs: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);
615 struct channel *pch; in ppp_ioctl() local
618 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
624 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
628 err = ppp_disconnect_channel(pch); in ppp_ioctl()
632 down_read(&pch->chan_sem); in ppp_ioctl()
633 chan = pch->chan; in ppp_ioctl()
637 up_read(&pch->chan_sem); in ppp_ioctl()
1623 struct channel *pch; in ppp_push() local
1640 pch = list_entry(list, struct channel, clist); in ppp_push()
1642 spin_lock(&pch->downl); in ppp_push()
1643 if (pch->chan) { in ppp_push()
1644 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1651 spin_unlock(&pch->downl); in ppp_push()
1687 struct channel *pch; in ppp_mp_explode() local
1701 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1702 if (pch->chan) { in ppp_mp_explode()
1703 pch->avail = 1; in ppp_mp_explode()
1705 pch->speed = pch->chan->speed; in ppp_mp_explode()
1707 pch->avail = 0; in ppp_mp_explode()
1709 if (pch->avail) { in ppp_mp_explode()
1710 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1711 !pch->had_frag) { in ppp_mp_explode()
1712 if (pch->speed == 0) in ppp_mp_explode()
1715 totspeed += pch->speed; in ppp_mp_explode()
1717 pch->avail = 2; in ppp_mp_explode()
1721 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1764 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1766 if (!pch->avail) in ppp_mp_explode()
1773 if (pch->avail == 1) { in ppp_mp_explode()
1777 pch->avail = 1; in ppp_mp_explode()
1781 spin_lock(&pch->downl); in ppp_mp_explode()
1782 if (pch->chan == NULL) { in ppp_mp_explode()
1784 if (pch->speed == 0) in ppp_mp_explode()
1787 totspeed -= pch->speed; in ppp_mp_explode()
1789 spin_unlock(&pch->downl); in ppp_mp_explode()
1790 pch->avail = 0; in ppp_mp_explode()
1807 if (pch->speed == 0) { in ppp_mp_explode()
1815 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
1817 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
1818 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
1839 pch->avail = 2; in ppp_mp_explode()
1840 spin_unlock(&pch->downl); in ppp_mp_explode()
1849 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
1876 chan = pch->chan; in ppp_mp_explode()
1877 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1879 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
1880 pch->had_frag = 1; in ppp_mp_explode()
1885 spin_unlock(&pch->downl); in ppp_mp_explode()
1892 spin_unlock(&pch->downl); in ppp_mp_explode()
1902 static void __ppp_channel_push(struct channel *pch) in __ppp_channel_push() argument
1907 spin_lock(&pch->downl); in __ppp_channel_push()
1908 if (pch->chan) { in __ppp_channel_push()
1909 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
1910 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
1911 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
1913 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
1919 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
1921 spin_unlock(&pch->downl); in __ppp_channel_push()
1923 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
1924 ppp = pch->ppp; in __ppp_channel_push()
1930 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
1932 read_lock_bh(&pch->upl); in ppp_channel_push()
1933 if (pch->ppp) { in ppp_channel_push()
1934 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
1935 __ppp_channel_push(pch); in ppp_channel_push()
1936 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
1938 __ppp_channel_push(pch); in ppp_channel_push()
1940 read_unlock_bh(&pch->upl); in ppp_channel_push()
1954 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1958 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2007 struct channel *pch = chan->ppp; in ppp_input() local
2010 if (!pch) { in ppp_input()
2015 read_lock_bh(&pch->upl); in ppp_input()
2018 if (pch->ppp) { in ppp_input()
2019 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2020 ppp_receive_error(pch->ppp); in ppp_input()
2026 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2028 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2030 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2031 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2033 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2035 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2039 read_unlock_bh(&pch->upl); in ppp_input()
2046 struct channel *pch = chan->ppp; in ppp_input_error() local
2049 if (!pch) in ppp_input_error()
2052 read_lock_bh(&pch->upl); in ppp_input_error()
2053 if (pch->ppp) { in ppp_input_error()
2058 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2061 read_unlock_bh(&pch->upl); in ppp_input_error()
2069 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2077 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2313 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2351 pch->lastseq = seq; in ppp_receive_mp_frame()
2602 struct channel *pch; in ppp_register_net_channel() local
2605 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2606 if (!pch) in ppp_register_net_channel()
2611 pch->ppp = NULL; in ppp_register_net_channel()
2612 pch->chan = chan; in ppp_register_net_channel()
2613 pch->chan_net = get_net(net); in ppp_register_net_channel()
2614 chan->ppp = pch; in ppp_register_net_channel()
2615 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2616 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2618 pch->lastseq = -1; in ppp_register_net_channel()
2620 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2621 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2622 rwlock_init(&pch->upl); in ppp_register_net_channel()
2625 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2626 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2638 struct channel *pch = chan->ppp; in ppp_channel_index() local
2640 if (pch) in ppp_channel_index()
2641 return pch->file.index; in ppp_channel_index()
2650 struct channel *pch = chan->ppp; in ppp_unit_number() local
2653 if (pch) { in ppp_unit_number()
2654 read_lock_bh(&pch->upl); in ppp_unit_number()
2655 if (pch->ppp) in ppp_unit_number()
2656 unit = pch->ppp->file.index; in ppp_unit_number()
2657 read_unlock_bh(&pch->upl); in ppp_unit_number()
2667 struct channel *pch = chan->ppp; in ppp_dev_name() local
2670 if (pch) { in ppp_dev_name()
2671 read_lock_bh(&pch->upl); in ppp_dev_name()
2672 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2673 name = pch->ppp->dev->name; in ppp_dev_name()
2674 read_unlock_bh(&pch->upl); in ppp_dev_name()
2687 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2690 if (!pch) in ppp_unregister_channel()
2699 down_write(&pch->chan_sem); in ppp_unregister_channel()
2700 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2701 pch->chan = NULL; in ppp_unregister_channel()
2702 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2703 up_write(&pch->chan_sem); in ppp_unregister_channel()
2704 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2706 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2708 list_del(&pch->list); in ppp_unregister_channel()
2711 pch->file.dead = 1; in ppp_unregister_channel()
2712 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2713 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2714 ppp_destroy_channel(pch); in ppp_unregister_channel()
2724 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2726 if (!pch) in ppp_output_wakeup()
2728 ppp_channel_push(pch); in ppp_output_wakeup()
3153 struct channel *pch; in ppp_find_channel() local
3155 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3156 if (pch->file.index == unit) { in ppp_find_channel()
3157 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3158 return pch; in ppp_find_channel()
3162 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3163 if (pch->file.index == unit) in ppp_find_channel()
3164 return pch; in ppp_find_channel()
3174 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3181 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3187 write_lock_bh(&pch->upl); in ppp_connect_channel()
3189 if (pch->ppp) in ppp_connect_channel()
3193 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3194 if (!pch->chan) { in ppp_connect_channel()
3196 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3201 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3202 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3203 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3204 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3207 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3209 pch->ppp = ppp; in ppp_connect_channel()
3215 write_unlock_bh(&pch->upl); in ppp_connect_channel()
3225 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3230 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
3231 ppp = pch->ppp; in ppp_disconnect_channel()
3232 pch->ppp = NULL; in ppp_disconnect_channel()
3233 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
3237 list_del(&pch->clist); in ppp_disconnect_channel()
3251 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3253 put_net(pch->chan_net); in ppp_destroy_channel()
3254 pch->chan_net = NULL; in ppp_destroy_channel()
3258 if (!pch->file.dead) { in ppp_destroy_channel()
3260 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3263 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3264 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3265 kfree(pch); in ppp_destroy_channel()