Lines Matching refs:pch
269 static void ppp_channel_push(struct channel *pch);
271 struct channel *pch);
278 struct channel *pch);
293 static int ppp_connect_channel(struct channel *pch, int unit);
294 static int ppp_disconnect_channel(struct channel *pch);
295 static void ppp_destroy_channel(struct channel *pch);
646 static int ppp_bridge_channels(struct channel *pch, struct channel *pchb) in ppp_bridge_channels() argument
648 spin_lock(&pch->upl); in ppp_bridge_channels()
649 if (rcu_dereference_protected(pch->ppp, lockdep_is_held(&pch->upl)) || in ppp_bridge_channels()
650 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) { in ppp_bridge_channels()
651 spin_unlock(&pch->upl); in ppp_bridge_channels()
655 rcu_assign_pointer(pch->bridge, pchb); in ppp_bridge_channels()
656 spin_unlock(&pch->upl); in ppp_bridge_channels()
664 refcount_inc(&pch->file.refcnt); in ppp_bridge_channels()
665 rcu_assign_pointer(pchb->bridge, pch); in ppp_bridge_channels()
671 spin_lock(&pch->upl); in ppp_bridge_channels()
673 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_bridge_channels()
674 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_bridge_channels()
675 spin_unlock(&pch->upl); in ppp_bridge_channels()
685 static int ppp_unbridge_channels(struct channel *pch) in ppp_unbridge_channels() argument
689 spin_lock(&pch->upl); in ppp_unbridge_channels()
690 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_unbridge_channels()
692 spin_unlock(&pch->upl); in ppp_unbridge_channels()
695 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_unbridge_channels()
696 spin_unlock(&pch->upl); in ppp_unbridge_channels()
705 if (pchbb == pch) in ppp_unbridge_channels()
711 if (pchbb == pch) in ppp_unbridge_channels()
712 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unbridge_channels()
713 ppp_destroy_channel(pch); in ppp_unbridge_channels()
756 struct channel *pch, *pchb; in ppp_ioctl() local
760 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
766 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
770 err = ppp_disconnect_channel(pch); in ppp_ioctl()
788 err = ppp_bridge_channels(pch, pchb); in ppp_ioctl()
795 err = ppp_unbridge_channels(pch); in ppp_ioctl()
799 down_read(&pch->chan_sem); in ppp_ioctl()
800 chan = pch->chan; in ppp_ioctl()
804 up_read(&pch->chan_sem); in ppp_ioctl()
1597 struct channel *pch; in ppp_fill_forward_path() local
1602 pch = list_first_or_null_rcu(&ppp->channels, struct channel, clist); in ppp_fill_forward_path()
1603 if (!pch) in ppp_fill_forward_path()
1606 chan = READ_ONCE(pch->chan); in ppp_fill_forward_path()
1892 struct channel *pch; in ppp_push() local
1910 pch = list_entry(list, struct channel, clist); in ppp_push()
1912 spin_lock(&pch->downl); in ppp_push()
1913 chan = pch->chan; in ppp_push()
1927 spin_unlock(&pch->downl); in ppp_push()
1963 struct channel *pch; in ppp_mp_explode() local
1977 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1978 if (pch->chan) { in ppp_mp_explode()
1979 pch->avail = 1; in ppp_mp_explode()
1981 pch->speed = pch->chan->speed; in ppp_mp_explode()
1983 pch->avail = 0; in ppp_mp_explode()
1985 if (pch->avail) { in ppp_mp_explode()
1986 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1987 !pch->had_frag) { in ppp_mp_explode()
1988 if (pch->speed == 0) in ppp_mp_explode()
1991 totspeed += pch->speed; in ppp_mp_explode()
1993 pch->avail = 2; in ppp_mp_explode()
1997 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
2042 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
2044 if (!pch->avail) in ppp_mp_explode()
2051 if (pch->avail == 1) { in ppp_mp_explode()
2055 pch->avail = 1; in ppp_mp_explode()
2059 spin_lock(&pch->downl); in ppp_mp_explode()
2060 if (pch->chan == NULL) { in ppp_mp_explode()
2062 if (pch->speed == 0) in ppp_mp_explode()
2065 totspeed -= pch->speed; in ppp_mp_explode()
2067 spin_unlock(&pch->downl); in ppp_mp_explode()
2068 pch->avail = 0; in ppp_mp_explode()
2085 if (pch->speed == 0) { in ppp_mp_explode()
2093 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
2095 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
2096 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
2117 pch->avail = 2; in ppp_mp_explode()
2118 spin_unlock(&pch->downl); in ppp_mp_explode()
2127 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
2154 chan = pch->chan; in ppp_mp_explode()
2155 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
2157 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
2158 pch->had_frag = 1; in ppp_mp_explode()
2163 spin_unlock(&pch->downl); in ppp_mp_explode()
2170 spin_unlock(&pch->downl); in ppp_mp_explode()
2181 static void __ppp_channel_push(struct channel *pch, struct ppp *ppp) in __ppp_channel_push() argument
2185 spin_lock(&pch->downl); in __ppp_channel_push()
2186 if (pch->chan) { in __ppp_channel_push()
2187 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2188 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
2189 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
2191 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
2197 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
2199 spin_unlock(&pch->downl); in __ppp_channel_push()
2201 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2207 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
2213 ppp = rcu_dereference_bh(pch->ppp); in ppp_channel_push()
2218 __ppp_channel_push(pch, ppp); in ppp_channel_push()
2222 __ppp_channel_push(pch, NULL); in ppp_channel_push()
2238 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2242 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2293 static bool ppp_channel_bridge_input(struct channel *pch, struct sk_buff *skb) in ppp_channel_bridge_input() argument
2298 pchb = rcu_dereference(pch->bridge); in ppp_channel_bridge_input()
2309 skb_scrub_packet(skb, !net_eq(pch->chan_net, pchb->chan_net)); in ppp_channel_bridge_input()
2325 struct channel *pch = chan->ppp; in ppp_input() local
2329 if (!pch) { in ppp_input()
2335 if (ppp_channel_bridge_input(pch, skb)) in ppp_input()
2339 ppp = rcu_dereference_bh(pch->ppp); in ppp_input()
2352 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2354 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2355 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2357 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2359 ppp_do_recv(ppp, skb, pch); in ppp_input()
2370 struct channel *pch = chan->ppp; in ppp_input_error() local
2374 if (!pch) in ppp_input_error()
2378 ppp = rcu_dereference_bh(pch->ppp); in ppp_input_error()
2384 ppp_do_recv(ppp, skb, pch); in ppp_input_error()
2395 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2403 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2637 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2675 pch->lastseq = seq; in ppp_receive_mp_frame()
2926 struct channel *pch; in ppp_register_net_channel() local
2929 pch = kzalloc_obj(struct channel); in ppp_register_net_channel()
2930 if (!pch) in ppp_register_net_channel()
2935 pch->chan = chan; in ppp_register_net_channel()
2936 pch->chan_net = get_net_track(net, &pch->ns_tracker, GFP_KERNEL); in ppp_register_net_channel()
2937 chan->ppp = pch; in ppp_register_net_channel()
2938 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2939 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2941 pch->lastseq = -1; in ppp_register_net_channel()
2943 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2944 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2945 spin_lock_init(&pch->upl); in ppp_register_net_channel()
2948 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2949 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2961 struct channel *pch = chan->ppp; in ppp_channel_index() local
2963 if (pch) in ppp_channel_index()
2964 return pch->file.index; in ppp_channel_index()
2973 struct channel *pch = chan->ppp; in ppp_unit_number() local
2977 if (pch) { in ppp_unit_number()
2979 ppp = rcu_dereference(pch->ppp); in ppp_unit_number()
2992 struct channel *pch = chan->ppp; in ppp_dev_name() local
2996 if (pch) { in ppp_dev_name()
2998 ppp = rcu_dereference(pch->ppp); in ppp_dev_name()
3014 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
3017 if (!pch) in ppp_unregister_channel()
3026 down_write(&pch->chan_sem); in ppp_unregister_channel()
3027 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
3028 WRITE_ONCE(pch->chan, NULL); in ppp_unregister_channel()
3029 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
3030 up_write(&pch->chan_sem); in ppp_unregister_channel()
3031 ppp_disconnect_channel(pch); in ppp_unregister_channel()
3033 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
3035 list_del(&pch->list); in ppp_unregister_channel()
3038 ppp_unbridge_channels(pch); in ppp_unregister_channel()
3040 pch->file.dead = 1; in ppp_unregister_channel()
3041 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
3043 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
3044 ppp_destroy_channel(pch); in ppp_unregister_channel()
3054 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
3056 if (!pch) in ppp_output_wakeup()
3058 ppp_channel_push(pch); in ppp_output_wakeup()
3490 struct channel *pch; in ppp_find_channel() local
3492 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3493 if (pch->file.index == unit) { in ppp_find_channel()
3494 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3495 return pch; in ppp_find_channel()
3499 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3500 if (pch->file.index == unit) in ppp_find_channel()
3501 return pch; in ppp_find_channel()
3511 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3518 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3524 spin_lock(&pch->upl); in ppp_connect_channel()
3526 if (rcu_dereference_protected(pch->ppp, lockdep_is_held(&pch->upl)) || in ppp_connect_channel()
3527 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) in ppp_connect_channel()
3531 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3532 if (!pch->chan) { in ppp_connect_channel()
3534 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3539 if (pch->chan->direct_xmit) in ppp_connect_channel()
3543 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3544 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3545 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3546 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3549 list_add_tail_rcu(&pch->clist, &ppp->channels); in ppp_connect_channel()
3551 rcu_assign_pointer(pch->ppp, ppp); in ppp_connect_channel()
3557 spin_unlock(&pch->upl); in ppp_connect_channel()
3567 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3572 spin_lock(&pch->upl); in ppp_disconnect_channel()
3573 ppp = rcu_replace_pointer(pch->ppp, NULL, lockdep_is_held(&pch->upl)); in ppp_disconnect_channel()
3574 spin_unlock(&pch->upl); in ppp_disconnect_channel()
3578 list_del_rcu(&pch->clist); in ppp_disconnect_channel()
3593 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3595 put_net_track(pch->chan_net, &pch->ns_tracker); in ppp_destroy_channel()
3596 pch->chan_net = NULL; in ppp_destroy_channel()
3600 if (!pch->file.dead) { in ppp_destroy_channel()
3602 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3605 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3606 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3607 kfree(pch); in ppp_destroy_channel()