Lines Matching refs:pch

253 static void ppp_channel_push(struct channel *pch);
255 struct channel *pch);
262 struct channel *pch);
278 static int ppp_connect_channel(struct channel *pch, int unit);
279 static int ppp_disconnect_channel(struct channel *pch);
280 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()
1362 struct channel *pch; in ppp_push() local
1379 pch = list_entry(list, struct channel, clist); in ppp_push()
1381 spin_lock_bh(&pch->downl); in ppp_push()
1382 if (pch->chan) { in ppp_push()
1383 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1390 spin_unlock_bh(&pch->downl); in ppp_push()
1426 struct channel *pch; in ppp_mp_explode() local
1440 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1441 if (pch->chan) { in ppp_mp_explode()
1442 pch->avail = 1; in ppp_mp_explode()
1444 pch->speed = pch->chan->speed; in ppp_mp_explode()
1446 pch->avail = 0; in ppp_mp_explode()
1448 if (pch->avail) { in ppp_mp_explode()
1449 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1450 !pch->had_frag) { in ppp_mp_explode()
1451 if (pch->speed == 0) in ppp_mp_explode()
1454 totspeed += pch->speed; in ppp_mp_explode()
1456 pch->avail = 2; in ppp_mp_explode()
1460 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1503 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1505 if (!pch->avail) in ppp_mp_explode()
1512 if (pch->avail == 1) { in ppp_mp_explode()
1516 pch->avail = 1; in ppp_mp_explode()
1520 spin_lock_bh(&pch->downl); in ppp_mp_explode()
1521 if (pch->chan == NULL) { in ppp_mp_explode()
1523 if (pch->speed == 0) in ppp_mp_explode()
1526 totspeed -= pch->speed; in ppp_mp_explode()
1528 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1529 pch->avail = 0; in ppp_mp_explode()
1546 if (pch->speed == 0) { in ppp_mp_explode()
1554 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
1556 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
1557 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
1578 pch->avail = 2; in ppp_mp_explode()
1579 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1588 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
1615 chan = pch->chan; in ppp_mp_explode()
1616 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1618 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
1619 pch->had_frag = 1; in ppp_mp_explode()
1624 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1631 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1644 ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
1649 spin_lock_bh(&pch->downl); in ppp_channel_push()
1650 if (pch->chan) { in ppp_channel_push()
1651 while (!skb_queue_empty(&pch->file.xq)) { in ppp_channel_push()
1652 skb = skb_dequeue(&pch->file.xq); in ppp_channel_push()
1653 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in ppp_channel_push()
1655 skb_queue_head(&pch->file.xq, skb); in ppp_channel_push()
1661 skb_queue_purge(&pch->file.xq); in ppp_channel_push()
1663 spin_unlock_bh(&pch->downl); in ppp_channel_push()
1665 if (skb_queue_empty(&pch->file.xq)) { in ppp_channel_push()
1666 read_lock_bh(&pch->upl); in ppp_channel_push()
1667 ppp = pch->ppp; in ppp_channel_push()
1670 read_unlock_bh(&pch->upl); in ppp_channel_push()
1685 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1689 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
1698 struct channel *pch = chan->ppp; in ppp_input() local
1701 if (!pch) { in ppp_input()
1706 read_lock_bh(&pch->upl); in ppp_input()
1709 if (pch->ppp) { in ppp_input()
1710 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
1711 ppp_receive_error(pch->ppp); in ppp_input()
1717 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
1719 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
1721 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
1722 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
1724 wake_up_interruptible(&pch->file.rwait); in ppp_input()
1726 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
1730 read_unlock_bh(&pch->upl); in ppp_input()
1737 struct channel *pch = chan->ppp; in ppp_input_error() local
1740 if (!pch) in ppp_input_error()
1743 read_lock_bh(&pch->upl); in ppp_input_error()
1744 if (pch->ppp) { in ppp_input_error()
1749 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
1752 read_unlock_bh(&pch->upl); in ppp_input_error()
1760 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
1768 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
1998 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
2034 pch->lastseq = seq; in ppp_receive_mp_frame()
2285 struct channel *pch; in ppp_register_net_channel() local
2288 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2289 if (!pch) in ppp_register_net_channel()
2294 pch->ppp = NULL; in ppp_register_net_channel()
2295 pch->chan = chan; in ppp_register_net_channel()
2296 pch->chan_net = get_net(net); in ppp_register_net_channel()
2297 chan->ppp = pch; in ppp_register_net_channel()
2298 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2299 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2301 pch->lastseq = -1; in ppp_register_net_channel()
2303 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2304 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2305 rwlock_init(&pch->upl); in ppp_register_net_channel()
2308 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2309 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2321 struct channel *pch = chan->ppp; in ppp_channel_index() local
2323 if (pch) in ppp_channel_index()
2324 return pch->file.index; in ppp_channel_index()
2333 struct channel *pch = chan->ppp; in ppp_unit_number() local
2336 if (pch) { in ppp_unit_number()
2337 read_lock_bh(&pch->upl); in ppp_unit_number()
2338 if (pch->ppp) in ppp_unit_number()
2339 unit = pch->ppp->file.index; in ppp_unit_number()
2340 read_unlock_bh(&pch->upl); in ppp_unit_number()
2350 struct channel *pch = chan->ppp; in ppp_dev_name() local
2353 if (pch) { in ppp_dev_name()
2354 read_lock_bh(&pch->upl); in ppp_dev_name()
2355 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2356 name = pch->ppp->dev->name; in ppp_dev_name()
2357 read_unlock_bh(&pch->upl); in ppp_dev_name()
2370 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2373 if (!pch) in ppp_unregister_channel()
2382 down_write(&pch->chan_sem); in ppp_unregister_channel()
2383 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2384 pch->chan = NULL; in ppp_unregister_channel()
2385 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2386 up_write(&pch->chan_sem); in ppp_unregister_channel()
2387 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2389 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2391 list_del(&pch->list); in ppp_unregister_channel()
2393 put_net(pch->chan_net); in ppp_unregister_channel()
2394 pch->chan_net = NULL; in ppp_unregister_channel()
2396 pch->file.dead = 1; in ppp_unregister_channel()
2397 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2398 if (atomic_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2399 ppp_destroy_channel(pch); in ppp_unregister_channel()
2409 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2411 if (!pch) in ppp_output_wakeup()
2413 ppp_channel_push(pch); in ppp_output_wakeup()
2896 struct channel *pch; in ppp_find_channel() local
2898 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
2899 if (pch->file.index == unit) { in ppp_find_channel()
2900 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
2901 return pch; in ppp_find_channel()
2905 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
2906 if (pch->file.index == unit) in ppp_find_channel()
2907 return pch; in ppp_find_channel()
2917 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
2924 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
2930 write_lock_bh(&pch->upl); in ppp_connect_channel()
2932 if (pch->ppp) in ppp_connect_channel()
2936 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
2937 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
2938 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
2941 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
2943 pch->ppp = ppp; in ppp_connect_channel()
2949 write_unlock_bh(&pch->upl); in ppp_connect_channel()
2959 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
2964 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
2965 ppp = pch->ppp; in ppp_disconnect_channel()
2966 pch->ppp = NULL; in ppp_disconnect_channel()
2967 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
2971 list_del(&pch->clist); in ppp_disconnect_channel()
2985 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
2989 if (!pch->file.dead) { in ppp_destroy_channel()
2991 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
2994 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
2995 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
2996 kfree(pch); in ppp_destroy_channel()