Lines Matching refs:pch

268 static void ppp_channel_push(struct channel *pch);
270 struct channel *pch);
277 struct channel *pch);
292 static int ppp_connect_channel(struct channel *pch, int unit);
293 static int ppp_disconnect_channel(struct channel *pch);
294 static void ppp_destroy_channel(struct channel *pch);
645 static int ppp_bridge_channels(struct channel *pch, struct channel *pchb) in ppp_bridge_channels() argument
647 write_lock_bh(&pch->upl); in ppp_bridge_channels()
648 if (pch->ppp || in ppp_bridge_channels()
649 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) { in ppp_bridge_channels()
650 write_unlock_bh(&pch->upl); in ppp_bridge_channels()
654 rcu_assign_pointer(pch->bridge, pchb); in ppp_bridge_channels()
655 write_unlock_bh(&pch->upl); in ppp_bridge_channels()
663 refcount_inc(&pch->file.refcnt); in ppp_bridge_channels()
664 rcu_assign_pointer(pchb->bridge, pch); in ppp_bridge_channels()
670 write_lock_bh(&pch->upl); in ppp_bridge_channels()
672 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_bridge_channels()
673 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_bridge_channels()
674 write_unlock_bh(&pch->upl); in ppp_bridge_channels()
684 static int ppp_unbridge_channels(struct channel *pch) in ppp_unbridge_channels() argument
688 write_lock_bh(&pch->upl); in ppp_unbridge_channels()
689 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_unbridge_channels()
691 write_unlock_bh(&pch->upl); in ppp_unbridge_channels()
694 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_unbridge_channels()
695 write_unlock_bh(&pch->upl); in ppp_unbridge_channels()
704 if (pchbb == pch) in ppp_unbridge_channels()
710 if (pchbb == pch) in ppp_unbridge_channels()
711 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unbridge_channels()
712 ppp_destroy_channel(pch); in ppp_unbridge_channels()
755 struct channel *pch, *pchb; in ppp_ioctl() local
759 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
765 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
769 err = ppp_disconnect_channel(pch); in ppp_ioctl()
787 err = ppp_bridge_channels(pch, pchb); in ppp_ioctl()
794 err = ppp_unbridge_channels(pch); in ppp_ioctl()
798 down_read(&pch->chan_sem); in ppp_ioctl()
799 chan = pch->chan; in ppp_ioctl()
803 up_read(&pch->chan_sem); in ppp_ioctl()
1596 struct channel *pch; in ppp_fill_forward_path() local
1604 pch = list_first_entry(&ppp->channels, struct channel, clist); in ppp_fill_forward_path()
1605 chan = pch->chan; in ppp_fill_forward_path()
1878 struct channel *pch; in ppp_push() local
1895 pch = list_entry(list, struct channel, clist); in ppp_push()
1897 spin_lock(&pch->downl); in ppp_push()
1898 if (pch->chan) { in ppp_push()
1899 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1906 spin_unlock(&pch->downl); in ppp_push()
1942 struct channel *pch; in ppp_mp_explode() local
1956 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1957 if (pch->chan) { in ppp_mp_explode()
1958 pch->avail = 1; in ppp_mp_explode()
1960 pch->speed = pch->chan->speed; in ppp_mp_explode()
1962 pch->avail = 0; in ppp_mp_explode()
1964 if (pch->avail) { in ppp_mp_explode()
1965 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1966 !pch->had_frag) { in ppp_mp_explode()
1967 if (pch->speed == 0) in ppp_mp_explode()
1970 totspeed += pch->speed; in ppp_mp_explode()
1972 pch->avail = 2; in ppp_mp_explode()
1976 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
2019 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
2021 if (!pch->avail) in ppp_mp_explode()
2028 if (pch->avail == 1) { in ppp_mp_explode()
2032 pch->avail = 1; in ppp_mp_explode()
2036 spin_lock(&pch->downl); in ppp_mp_explode()
2037 if (pch->chan == NULL) { in ppp_mp_explode()
2039 if (pch->speed == 0) in ppp_mp_explode()
2042 totspeed -= pch->speed; in ppp_mp_explode()
2044 spin_unlock(&pch->downl); in ppp_mp_explode()
2045 pch->avail = 0; in ppp_mp_explode()
2062 if (pch->speed == 0) { in ppp_mp_explode()
2070 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
2072 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
2073 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
2094 pch->avail = 2; in ppp_mp_explode()
2095 spin_unlock(&pch->downl); in ppp_mp_explode()
2104 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
2131 chan = pch->chan; in ppp_mp_explode()
2132 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
2134 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
2135 pch->had_frag = 1; in ppp_mp_explode()
2140 spin_unlock(&pch->downl); in ppp_mp_explode()
2147 spin_unlock(&pch->downl); in ppp_mp_explode()
2157 static void __ppp_channel_push(struct channel *pch) in __ppp_channel_push() argument
2162 spin_lock(&pch->downl); in __ppp_channel_push()
2163 if (pch->chan) { in __ppp_channel_push()
2164 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2165 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
2166 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
2168 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
2174 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
2176 spin_unlock(&pch->downl); in __ppp_channel_push()
2178 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2179 ppp = pch->ppp; in __ppp_channel_push()
2185 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
2189 read_lock_bh(&pch->upl); in ppp_channel_push()
2190 if (pch->ppp) { in ppp_channel_push()
2191 xmit_recursion = this_cpu_ptr(pch->ppp->xmit_recursion); in ppp_channel_push()
2192 local_lock_nested_bh(&pch->ppp->xmit_recursion->bh_lock); in ppp_channel_push()
2194 __ppp_channel_push(pch); in ppp_channel_push()
2196 local_unlock_nested_bh(&pch->ppp->xmit_recursion->bh_lock); in ppp_channel_push()
2198 __ppp_channel_push(pch); in ppp_channel_push()
2200 read_unlock_bh(&pch->upl); in ppp_channel_push()
2214 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2218 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2269 static bool ppp_channel_bridge_input(struct channel *pch, struct sk_buff *skb) in ppp_channel_bridge_input() argument
2274 pchb = rcu_dereference(pch->bridge); in ppp_channel_bridge_input()
2285 skb_scrub_packet(skb, !net_eq(pch->chan_net, pchb->chan_net)); in ppp_channel_bridge_input()
2301 struct channel *pch = chan->ppp; in ppp_input() local
2304 if (!pch) { in ppp_input()
2310 if (ppp_channel_bridge_input(pch, skb)) in ppp_input()
2313 read_lock_bh(&pch->upl); in ppp_input()
2316 if (pch->ppp) { in ppp_input()
2317 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2318 ppp_receive_error(pch->ppp); in ppp_input()
2324 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2326 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2328 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2329 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2331 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2333 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2337 read_unlock_bh(&pch->upl); in ppp_input()
2344 struct channel *pch = chan->ppp; in ppp_input_error() local
2347 if (!pch) in ppp_input_error()
2350 read_lock_bh(&pch->upl); in ppp_input_error()
2351 if (pch->ppp) { in ppp_input_error()
2356 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2359 read_unlock_bh(&pch->upl); in ppp_input_error()
2367 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2375 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2609 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2647 pch->lastseq = seq; in ppp_receive_mp_frame()
2898 struct channel *pch; in ppp_register_net_channel() local
2901 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2902 if (!pch) in ppp_register_net_channel()
2907 pch->ppp = NULL; in ppp_register_net_channel()
2908 pch->chan = chan; in ppp_register_net_channel()
2909 pch->chan_net = get_net_track(net, &pch->ns_tracker, GFP_KERNEL); in ppp_register_net_channel()
2910 chan->ppp = pch; in ppp_register_net_channel()
2911 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2912 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2914 pch->lastseq = -1; in ppp_register_net_channel()
2916 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2917 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2918 rwlock_init(&pch->upl); in ppp_register_net_channel()
2921 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2922 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2934 struct channel *pch = chan->ppp; in ppp_channel_index() local
2936 if (pch) in ppp_channel_index()
2937 return pch->file.index; in ppp_channel_index()
2946 struct channel *pch = chan->ppp; in ppp_unit_number() local
2949 if (pch) { in ppp_unit_number()
2950 read_lock_bh(&pch->upl); in ppp_unit_number()
2951 if (pch->ppp) in ppp_unit_number()
2952 unit = pch->ppp->file.index; in ppp_unit_number()
2953 read_unlock_bh(&pch->upl); in ppp_unit_number()
2963 struct channel *pch = chan->ppp; in ppp_dev_name() local
2966 if (pch) { in ppp_dev_name()
2967 read_lock_bh(&pch->upl); in ppp_dev_name()
2968 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2969 name = pch->ppp->dev->name; in ppp_dev_name()
2970 read_unlock_bh(&pch->upl); in ppp_dev_name()
2983 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2986 if (!pch) in ppp_unregister_channel()
2995 down_write(&pch->chan_sem); in ppp_unregister_channel()
2996 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2997 pch->chan = NULL; in ppp_unregister_channel()
2998 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2999 up_write(&pch->chan_sem); in ppp_unregister_channel()
3000 ppp_disconnect_channel(pch); in ppp_unregister_channel()
3002 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
3004 list_del(&pch->list); in ppp_unregister_channel()
3007 ppp_unbridge_channels(pch); in ppp_unregister_channel()
3009 pch->file.dead = 1; in ppp_unregister_channel()
3010 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
3012 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
3013 ppp_destroy_channel(pch); in ppp_unregister_channel()
3023 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
3025 if (!pch) in ppp_output_wakeup()
3027 ppp_channel_push(pch); in ppp_output_wakeup()
3459 struct channel *pch; in ppp_find_channel() local
3461 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3462 if (pch->file.index == unit) { in ppp_find_channel()
3463 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3464 return pch; in ppp_find_channel()
3468 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3469 if (pch->file.index == unit) in ppp_find_channel()
3470 return pch; in ppp_find_channel()
3480 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3487 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3493 write_lock_bh(&pch->upl); in ppp_connect_channel()
3495 if (pch->ppp || in ppp_connect_channel()
3496 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) in ppp_connect_channel()
3500 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3501 if (!pch->chan) { in ppp_connect_channel()
3503 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3508 if (pch->chan->direct_xmit) in ppp_connect_channel()
3512 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3513 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3514 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3515 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3518 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3520 pch->ppp = ppp; in ppp_connect_channel()
3526 write_unlock_bh(&pch->upl); in ppp_connect_channel()
3536 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3541 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
3542 ppp = pch->ppp; in ppp_disconnect_channel()
3543 pch->ppp = NULL; in ppp_disconnect_channel()
3544 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
3548 list_del(&pch->clist); in ppp_disconnect_channel()
3562 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3564 put_net_track(pch->chan_net, &pch->ns_tracker); in ppp_destroy_channel()
3565 pch->chan_net = NULL; in ppp_destroy_channel()
3569 if (!pch->file.dead) { in ppp_destroy_channel()
3571 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3574 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3575 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3576 kfree(pch); in ppp_destroy_channel()