Lines Matching refs:pch

260 static void ppp_channel_push(struct channel *pch);
262 struct channel *pch);
269 struct channel *pch);
284 static int ppp_connect_channel(struct channel *pch, int unit);
285 static int ppp_disconnect_channel(struct channel *pch);
286 static void ppp_destroy_channel(struct channel *pch);
618 static int ppp_bridge_channels(struct channel *pch, struct channel *pchb) in ppp_bridge_channels() argument
620 write_lock_bh(&pch->upl); in ppp_bridge_channels()
621 if (pch->ppp || in ppp_bridge_channels()
622 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) { in ppp_bridge_channels()
623 write_unlock_bh(&pch->upl); in ppp_bridge_channels()
627 rcu_assign_pointer(pch->bridge, pchb); in ppp_bridge_channels()
628 write_unlock_bh(&pch->upl); in ppp_bridge_channels()
636 refcount_inc(&pch->file.refcnt); in ppp_bridge_channels()
637 rcu_assign_pointer(pchb->bridge, pch); in ppp_bridge_channels()
643 write_lock_bh(&pch->upl); in ppp_bridge_channels()
645 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_bridge_channels()
646 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_bridge_channels()
647 write_unlock_bh(&pch->upl); in ppp_bridge_channels()
657 static int ppp_unbridge_channels(struct channel *pch) in ppp_unbridge_channels() argument
661 write_lock_bh(&pch->upl); in ppp_unbridge_channels()
662 pchb = rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl)); in ppp_unbridge_channels()
664 write_unlock_bh(&pch->upl); in ppp_unbridge_channels()
667 RCU_INIT_POINTER(pch->bridge, NULL); in ppp_unbridge_channels()
668 write_unlock_bh(&pch->upl); in ppp_unbridge_channels()
677 if (pchbb == pch) in ppp_unbridge_channels()
683 if (pchbb == pch) in ppp_unbridge_channels()
684 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unbridge_channels()
685 ppp_destroy_channel(pch); in ppp_unbridge_channels()
728 struct channel *pch, *pchb; in ppp_ioctl() local
732 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
738 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
742 err = ppp_disconnect_channel(pch); in ppp_ioctl()
760 err = ppp_bridge_channels(pch, pchb); in ppp_ioctl()
767 err = ppp_unbridge_channels(pch); in ppp_ioctl()
771 down_read(&pch->chan_sem); in ppp_ioctl()
772 chan = pch->chan; in ppp_ioctl()
776 up_read(&pch->chan_sem); in ppp_ioctl()
1579 struct channel *pch; in ppp_fill_forward_path() local
1587 pch = list_first_entry(&ppp->channels, struct channel, clist); in ppp_fill_forward_path()
1588 chan = pch->chan; in ppp_fill_forward_path()
1854 struct channel *pch; in ppp_push() local
1871 pch = list_entry(list, struct channel, clist); in ppp_push()
1873 spin_lock(&pch->downl); in ppp_push()
1874 if (pch->chan) { in ppp_push()
1875 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1882 spin_unlock(&pch->downl); in ppp_push()
1918 struct channel *pch; in ppp_mp_explode() local
1932 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1933 if (pch->chan) { in ppp_mp_explode()
1934 pch->avail = 1; in ppp_mp_explode()
1936 pch->speed = pch->chan->speed; in ppp_mp_explode()
1938 pch->avail = 0; in ppp_mp_explode()
1940 if (pch->avail) { in ppp_mp_explode()
1941 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1942 !pch->had_frag) { in ppp_mp_explode()
1943 if (pch->speed == 0) in ppp_mp_explode()
1946 totspeed += pch->speed; in ppp_mp_explode()
1948 pch->avail = 2; in ppp_mp_explode()
1952 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1995 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1997 if (!pch->avail) in ppp_mp_explode()
2004 if (pch->avail == 1) { in ppp_mp_explode()
2008 pch->avail = 1; in ppp_mp_explode()
2012 spin_lock(&pch->downl); in ppp_mp_explode()
2013 if (pch->chan == NULL) { in ppp_mp_explode()
2015 if (pch->speed == 0) in ppp_mp_explode()
2018 totspeed -= pch->speed; in ppp_mp_explode()
2020 spin_unlock(&pch->downl); in ppp_mp_explode()
2021 pch->avail = 0; in ppp_mp_explode()
2038 if (pch->speed == 0) { in ppp_mp_explode()
2046 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
2048 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
2049 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
2070 pch->avail = 2; in ppp_mp_explode()
2071 spin_unlock(&pch->downl); in ppp_mp_explode()
2080 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
2107 chan = pch->chan; in ppp_mp_explode()
2108 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
2110 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
2111 pch->had_frag = 1; in ppp_mp_explode()
2116 spin_unlock(&pch->downl); in ppp_mp_explode()
2123 spin_unlock(&pch->downl); in ppp_mp_explode()
2133 static void __ppp_channel_push(struct channel *pch) in __ppp_channel_push() argument
2138 spin_lock(&pch->downl); in __ppp_channel_push()
2139 if (pch->chan) { in __ppp_channel_push()
2140 while (!skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2141 skb = skb_dequeue(&pch->file.xq); in __ppp_channel_push()
2142 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in __ppp_channel_push()
2144 skb_queue_head(&pch->file.xq, skb); in __ppp_channel_push()
2150 skb_queue_purge(&pch->file.xq); in __ppp_channel_push()
2152 spin_unlock(&pch->downl); in __ppp_channel_push()
2154 if (skb_queue_empty(&pch->file.xq)) { in __ppp_channel_push()
2155 ppp = pch->ppp; in __ppp_channel_push()
2161 static void ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
2163 read_lock_bh(&pch->upl); in ppp_channel_push()
2164 if (pch->ppp) { in ppp_channel_push()
2165 (*this_cpu_ptr(pch->ppp->xmit_recursion))++; in ppp_channel_push()
2166 __ppp_channel_push(pch); in ppp_channel_push()
2167 (*this_cpu_ptr(pch->ppp->xmit_recursion))--; in ppp_channel_push()
2169 __ppp_channel_push(pch); in ppp_channel_push()
2171 read_unlock_bh(&pch->upl); in ppp_channel_push()
2185 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
2189 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
2240 static bool ppp_channel_bridge_input(struct channel *pch, struct sk_buff *skb) in ppp_channel_bridge_input() argument
2245 pchb = rcu_dereference(pch->bridge); in ppp_channel_bridge_input()
2256 skb_scrub_packet(skb, !net_eq(pch->chan_net, pchb->chan_net)); in ppp_channel_bridge_input()
2272 struct channel *pch = chan->ppp; in ppp_input() local
2275 if (!pch) { in ppp_input()
2281 if (ppp_channel_bridge_input(pch, skb)) in ppp_input()
2284 read_lock_bh(&pch->upl); in ppp_input()
2287 if (pch->ppp) { in ppp_input()
2288 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
2289 ppp_receive_error(pch->ppp); in ppp_input()
2295 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
2297 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
2299 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
2300 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
2302 wake_up_interruptible(&pch->file.rwait); in ppp_input()
2304 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
2308 read_unlock_bh(&pch->upl); in ppp_input()
2315 struct channel *pch = chan->ppp; in ppp_input_error() local
2318 if (!pch) in ppp_input_error()
2321 read_lock_bh(&pch->upl); in ppp_input_error()
2322 if (pch->ppp) { in ppp_input_error()
2327 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
2330 read_unlock_bh(&pch->upl); in ppp_input_error()
2338 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
2346 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
2582 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2620 pch->lastseq = seq; in ppp_receive_mp_frame()
2871 struct channel *pch; in ppp_register_net_channel() local
2874 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2875 if (!pch) in ppp_register_net_channel()
2880 pch->ppp = NULL; in ppp_register_net_channel()
2881 pch->chan = chan; in ppp_register_net_channel()
2882 pch->chan_net = get_net(net); in ppp_register_net_channel()
2883 chan->ppp = pch; in ppp_register_net_channel()
2884 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2885 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2887 pch->lastseq = -1; in ppp_register_net_channel()
2889 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2890 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2891 rwlock_init(&pch->upl); in ppp_register_net_channel()
2894 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2895 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2907 struct channel *pch = chan->ppp; in ppp_channel_index() local
2909 if (pch) in ppp_channel_index()
2910 return pch->file.index; in ppp_channel_index()
2919 struct channel *pch = chan->ppp; in ppp_unit_number() local
2922 if (pch) { in ppp_unit_number()
2923 read_lock_bh(&pch->upl); in ppp_unit_number()
2924 if (pch->ppp) in ppp_unit_number()
2925 unit = pch->ppp->file.index; in ppp_unit_number()
2926 read_unlock_bh(&pch->upl); in ppp_unit_number()
2936 struct channel *pch = chan->ppp; in ppp_dev_name() local
2939 if (pch) { in ppp_dev_name()
2940 read_lock_bh(&pch->upl); in ppp_dev_name()
2941 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2942 name = pch->ppp->dev->name; in ppp_dev_name()
2943 read_unlock_bh(&pch->upl); in ppp_dev_name()
2956 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2959 if (!pch) in ppp_unregister_channel()
2968 down_write(&pch->chan_sem); in ppp_unregister_channel()
2969 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2970 pch->chan = NULL; in ppp_unregister_channel()
2971 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2972 up_write(&pch->chan_sem); in ppp_unregister_channel()
2973 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2975 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2977 list_del(&pch->list); in ppp_unregister_channel()
2980 ppp_unbridge_channels(pch); in ppp_unregister_channel()
2982 pch->file.dead = 1; in ppp_unregister_channel()
2983 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2985 if (refcount_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2986 ppp_destroy_channel(pch); in ppp_unregister_channel()
2996 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2998 if (!pch) in ppp_output_wakeup()
3000 ppp_channel_push(pch); in ppp_output_wakeup()
3421 struct channel *pch; in ppp_find_channel() local
3423 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
3424 if (pch->file.index == unit) { in ppp_find_channel()
3425 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
3426 return pch; in ppp_find_channel()
3430 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
3431 if (pch->file.index == unit) in ppp_find_channel()
3432 return pch; in ppp_find_channel()
3442 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
3449 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
3455 write_lock_bh(&pch->upl); in ppp_connect_channel()
3457 if (pch->ppp || in ppp_connect_channel()
3458 rcu_dereference_protected(pch->bridge, lockdep_is_held(&pch->upl))) in ppp_connect_channel()
3462 spin_lock_bh(&pch->downl); in ppp_connect_channel()
3463 if (!pch->chan) { in ppp_connect_channel()
3465 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3470 spin_unlock_bh(&pch->downl); in ppp_connect_channel()
3471 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
3472 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
3473 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
3476 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
3478 pch->ppp = ppp; in ppp_connect_channel()
3484 write_unlock_bh(&pch->upl); in ppp_connect_channel()
3494 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
3499 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
3500 ppp = pch->ppp; in ppp_disconnect_channel()
3501 pch->ppp = NULL; in ppp_disconnect_channel()
3502 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
3506 list_del(&pch->clist); in ppp_disconnect_channel()
3520 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
3522 put_net(pch->chan_net); in ppp_destroy_channel()
3523 pch->chan_net = NULL; in ppp_destroy_channel()
3527 if (!pch->file.dead) { in ppp_destroy_channel()
3529 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
3532 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
3533 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
3534 kfree(pch); in ppp_destroy_channel()