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);
610 struct channel *pch; in ppp_ioctl() local
614 pch = PF_TO_CHANNEL(pf); in ppp_ioctl()
620 err = ppp_connect_channel(pch, unit); in ppp_ioctl()
624 err = ppp_disconnect_channel(pch); in ppp_ioctl()
628 down_read(&pch->chan_sem); in ppp_ioctl()
629 chan = pch->chan; in ppp_ioctl()
633 up_read(&pch->chan_sem); in ppp_ioctl()
1315 struct channel *pch; in ppp_push() local
1332 pch = list_entry(list, struct channel, clist); in ppp_push()
1334 spin_lock_bh(&pch->downl); in ppp_push()
1335 if (pch->chan) { in ppp_push()
1336 if (pch->chan->ops->start_xmit(pch->chan, skb)) in ppp_push()
1343 spin_unlock_bh(&pch->downl); in ppp_push()
1379 struct channel *pch; in ppp_mp_explode() local
1393 list_for_each_entry(pch, &ppp->channels, clist) { in ppp_mp_explode()
1394 if (pch->chan) { in ppp_mp_explode()
1395 pch->avail = 1; in ppp_mp_explode()
1397 pch->speed = pch->chan->speed; in ppp_mp_explode()
1399 pch->avail = 0; in ppp_mp_explode()
1401 if (pch->avail) { in ppp_mp_explode()
1402 if (skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1403 !pch->had_frag) { in ppp_mp_explode()
1404 if (pch->speed == 0) in ppp_mp_explode()
1407 totspeed += pch->speed; in ppp_mp_explode()
1409 pch->avail = 2; in ppp_mp_explode()
1413 if (!pch->had_frag && i < ppp->nxchan) in ppp_mp_explode()
1456 pch = list_entry(list, struct channel, clist); in ppp_mp_explode()
1458 if (!pch->avail) in ppp_mp_explode()
1465 if (pch->avail == 1) { in ppp_mp_explode()
1469 pch->avail = 1; in ppp_mp_explode()
1473 spin_lock_bh(&pch->downl); in ppp_mp_explode()
1474 if (pch->chan == NULL) { in ppp_mp_explode()
1476 if (pch->speed == 0) in ppp_mp_explode()
1479 totspeed -= pch->speed; in ppp_mp_explode()
1481 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1482 pch->avail = 0; in ppp_mp_explode()
1499 if (pch->speed == 0) { in ppp_mp_explode()
1507 ((totspeed*totfree)/pch->speed)) - hdrlen; in ppp_mp_explode()
1509 flen += ((totfree - nzero)*pch->speed)/totspeed; in ppp_mp_explode()
1510 nbigger -= ((totfree - nzero)*pch->speed)/ in ppp_mp_explode()
1531 pch->avail = 2; in ppp_mp_explode()
1532 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1541 mtu = pch->chan->mtu - (hdrlen - 2); in ppp_mp_explode()
1568 chan = pch->chan; in ppp_mp_explode()
1569 if (!skb_queue_empty(&pch->file.xq) || in ppp_mp_explode()
1571 skb_queue_tail(&pch->file.xq, frag); in ppp_mp_explode()
1572 pch->had_frag = 1; in ppp_mp_explode()
1577 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1584 spin_unlock_bh(&pch->downl); in ppp_mp_explode()
1597 ppp_channel_push(struct channel *pch) in ppp_channel_push() argument
1602 spin_lock_bh(&pch->downl); in ppp_channel_push()
1603 if (pch->chan) { in ppp_channel_push()
1604 while (!skb_queue_empty(&pch->file.xq)) { in ppp_channel_push()
1605 skb = skb_dequeue(&pch->file.xq); in ppp_channel_push()
1606 if (!pch->chan->ops->start_xmit(pch->chan, skb)) { in ppp_channel_push()
1608 skb_queue_head(&pch->file.xq, skb); in ppp_channel_push()
1614 skb_queue_purge(&pch->file.xq); in ppp_channel_push()
1616 spin_unlock_bh(&pch->downl); in ppp_channel_push()
1618 if (skb_queue_empty(&pch->file.xq)) { in ppp_channel_push()
1619 read_lock_bh(&pch->upl); in ppp_channel_push()
1620 ppp = pch->ppp; in ppp_channel_push()
1623 read_unlock_bh(&pch->upl); in ppp_channel_push()
1638 ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_do_recv() argument
1642 ppp_receive_frame(ppp, skb, pch); in ppp_do_recv()
1651 struct channel *pch = chan->ppp; in ppp_input() local
1654 if (!pch) { in ppp_input()
1659 read_lock_bh(&pch->upl); in ppp_input()
1662 if (pch->ppp) { in ppp_input()
1663 ++pch->ppp->dev->stats.rx_length_errors; in ppp_input()
1664 ppp_receive_error(pch->ppp); in ppp_input()
1670 if (!pch->ppp || proto >= 0xc000 || proto == PPP_CCPFRAG) { in ppp_input()
1672 skb_queue_tail(&pch->file.rq, skb); in ppp_input()
1674 while (pch->file.rq.qlen > PPP_MAX_RQLEN && in ppp_input()
1675 (skb = skb_dequeue(&pch->file.rq))) in ppp_input()
1677 wake_up_interruptible(&pch->file.rwait); in ppp_input()
1679 ppp_do_recv(pch->ppp, skb, pch); in ppp_input()
1683 read_unlock_bh(&pch->upl); in ppp_input()
1690 struct channel *pch = chan->ppp; in ppp_input_error() local
1693 if (!pch) in ppp_input_error()
1696 read_lock_bh(&pch->upl); in ppp_input_error()
1697 if (pch->ppp) { in ppp_input_error()
1702 ppp_do_recv(pch->ppp, skb, pch); in ppp_input_error()
1705 read_unlock_bh(&pch->upl); in ppp_input_error()
1713 ppp_receive_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_frame() argument
1721 ppp_receive_mp_frame(ppp, skb, pch); in ppp_receive_frame()
1949 ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) in ppp_receive_mp_frame() argument
1985 pch->lastseq = seq; in ppp_receive_mp_frame()
2236 struct channel *pch; in ppp_register_net_channel() local
2239 pch = kzalloc(sizeof(struct channel), GFP_KERNEL); in ppp_register_net_channel()
2240 if (!pch) in ppp_register_net_channel()
2245 pch->ppp = NULL; in ppp_register_net_channel()
2246 pch->chan = chan; in ppp_register_net_channel()
2247 pch->chan_net = net; in ppp_register_net_channel()
2248 chan->ppp = pch; in ppp_register_net_channel()
2249 init_ppp_file(&pch->file, CHANNEL); in ppp_register_net_channel()
2250 pch->file.hdrlen = chan->hdrlen; in ppp_register_net_channel()
2252 pch->lastseq = -1; in ppp_register_net_channel()
2254 init_rwsem(&pch->chan_sem); in ppp_register_net_channel()
2255 spin_lock_init(&pch->downl); in ppp_register_net_channel()
2256 rwlock_init(&pch->upl); in ppp_register_net_channel()
2259 pch->file.index = ++pn->last_channel_index; in ppp_register_net_channel()
2260 list_add(&pch->list, &pn->new_channels); in ppp_register_net_channel()
2272 struct channel *pch = chan->ppp; in ppp_channel_index() local
2274 if (pch) in ppp_channel_index()
2275 return pch->file.index; in ppp_channel_index()
2284 struct channel *pch = chan->ppp; in ppp_unit_number() local
2287 if (pch) { in ppp_unit_number()
2288 read_lock_bh(&pch->upl); in ppp_unit_number()
2289 if (pch->ppp) in ppp_unit_number()
2290 unit = pch->ppp->file.index; in ppp_unit_number()
2291 read_unlock_bh(&pch->upl); in ppp_unit_number()
2301 struct channel *pch = chan->ppp; in ppp_dev_name() local
2304 if (pch) { in ppp_dev_name()
2305 read_lock_bh(&pch->upl); in ppp_dev_name()
2306 if (pch->ppp && pch->ppp->dev) in ppp_dev_name()
2307 name = pch->ppp->dev->name; in ppp_dev_name()
2308 read_unlock_bh(&pch->upl); in ppp_dev_name()
2321 struct channel *pch = chan->ppp; in ppp_unregister_channel() local
2324 if (!pch) in ppp_unregister_channel()
2333 down_write(&pch->chan_sem); in ppp_unregister_channel()
2334 spin_lock_bh(&pch->downl); in ppp_unregister_channel()
2335 pch->chan = NULL; in ppp_unregister_channel()
2336 spin_unlock_bh(&pch->downl); in ppp_unregister_channel()
2337 up_write(&pch->chan_sem); in ppp_unregister_channel()
2338 ppp_disconnect_channel(pch); in ppp_unregister_channel()
2340 pn = ppp_pernet(pch->chan_net); in ppp_unregister_channel()
2342 list_del(&pch->list); in ppp_unregister_channel()
2345 pch->file.dead = 1; in ppp_unregister_channel()
2346 wake_up_interruptible(&pch->file.rwait); in ppp_unregister_channel()
2347 if (atomic_dec_and_test(&pch->file.refcnt)) in ppp_unregister_channel()
2348 ppp_destroy_channel(pch); in ppp_unregister_channel()
2358 struct channel *pch = chan->ppp; in ppp_output_wakeup() local
2360 if (!pch) in ppp_output_wakeup()
2362 ppp_channel_push(pch); in ppp_output_wakeup()
2869 struct channel *pch; in ppp_find_channel() local
2871 list_for_each_entry(pch, &pn->new_channels, list) { in ppp_find_channel()
2872 if (pch->file.index == unit) { in ppp_find_channel()
2873 list_move(&pch->list, &pn->all_channels); in ppp_find_channel()
2874 return pch; in ppp_find_channel()
2878 list_for_each_entry(pch, &pn->all_channels, list) { in ppp_find_channel()
2879 if (pch->file.index == unit) in ppp_find_channel()
2880 return pch; in ppp_find_channel()
2890 ppp_connect_channel(struct channel *pch, int unit) in ppp_connect_channel() argument
2897 pn = ppp_pernet(pch->chan_net); in ppp_connect_channel()
2903 write_lock_bh(&pch->upl); in ppp_connect_channel()
2905 if (pch->ppp) in ppp_connect_channel()
2909 if (pch->file.hdrlen > ppp->file.hdrlen) in ppp_connect_channel()
2910 ppp->file.hdrlen = pch->file.hdrlen; in ppp_connect_channel()
2911 hdrlen = pch->file.hdrlen + 2; /* for protocol bytes */ in ppp_connect_channel()
2914 list_add_tail(&pch->clist, &ppp->channels); in ppp_connect_channel()
2916 pch->ppp = ppp; in ppp_connect_channel()
2922 write_unlock_bh(&pch->upl); in ppp_connect_channel()
2932 ppp_disconnect_channel(struct channel *pch) in ppp_disconnect_channel() argument
2937 write_lock_bh(&pch->upl); in ppp_disconnect_channel()
2938 ppp = pch->ppp; in ppp_disconnect_channel()
2939 pch->ppp = NULL; in ppp_disconnect_channel()
2940 write_unlock_bh(&pch->upl); in ppp_disconnect_channel()
2944 list_del(&pch->clist); in ppp_disconnect_channel()
2958 static void ppp_destroy_channel(struct channel *pch) in ppp_destroy_channel() argument
2962 if (!pch->file.dead) { in ppp_destroy_channel()
2964 pr_err("ppp: destroying undead channel %p !\n", pch); in ppp_destroy_channel()
2967 skb_queue_purge(&pch->file.xq); in ppp_destroy_channel()
2968 skb_queue_purge(&pch->file.rq); in ppp_destroy_channel()
2969 kfree(pch); in ppp_destroy_channel()