Lines Matching +full:protocol +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
26 printk(KERN_DEBUG "%s prim(%x) id(%x) %p\n", in _queue_message()
27 __func__, hh->prim, hh->id, skb); in _queue_message()
28 skb_queue_tail(&st->msgq, skb); in _queue_message()
29 if (likely(!test_bit(mISDN_STACK_STOPPED, &st->status))) { in _queue_message()
30 test_and_set_bit(mISDN_STACK_WORK, &st->status); in _queue_message()
31 wake_up_interruptible(&st->workq); in _queue_message()
38 _queue_message(ch->st, skb); in mISDN_queue_message()
43 get_channel4id(struct mISDNstack *st, u_int id) in get_channel4id() argument
47 mutex_lock(&st->lmutex); in get_channel4id()
48 list_for_each_entry(ch, &st->layer2, list) { in get_channel4id()
49 if (id == ch->nr) in get_channel4id()
54 mutex_unlock(&st->lmutex); in get_channel4id()
64 read_lock(&sl->lock); in send_socklist()
65 sk_for_each(sk, &sl->head) { in send_socklist()
66 if (sk->sk_state != MISDN_BOUND) in send_socklist()
77 read_unlock(&sl->lock); in send_socklist()
91 mutex_lock(&st->lmutex); in send_layer2()
92 if ((hh->id & MISDN_ID_ADDR_MASK) == MISDN_ID_ANY) { /* L2 for all */ in send_layer2()
93 list_for_each_entry(ch, &st->layer2, list) { in send_layer2()
94 if (list_is_last(&ch->list, &st->layer2)) { in send_layer2()
101 ret = ch->send(ch, cskb); in send_layer2()
107 __func__, ch->nr, in send_layer2()
108 hh->prim, ch->addr, ret); in send_layer2()
113 __func__, ch->nr, ch->addr); in send_layer2()
118 list_for_each_entry(ch, &st->layer2, list) { in send_layer2()
119 if ((hh->id & MISDN_ID_ADDR_MASK) == ch->addr) { in send_layer2()
120 ret = ch->send(ch, skb); in send_layer2()
126 ret = st->dev->teimgr->ctrl(st->dev->teimgr, CHECK_DATA, skb); in send_layer2()
132 __func__, hh->prim, ret); in send_layer2()
135 mutex_unlock(&st->lmutex); in send_layer2()
146 lm = hh->prim & MISDN_LAYERMASK; in send_msg_to_layer()
148 printk(KERN_DEBUG "%s prim(%x) id(%x) %p\n", in send_msg_to_layer()
149 __func__, hh->prim, hh->id, skb); in send_msg_to_layer()
151 if (!hlist_empty(&st->l1sock.head)) { in send_msg_to_layer()
153 send_socklist(&st->l1sock, skb); in send_msg_to_layer()
155 return st->layer1->send(st->layer1, skb); in send_msg_to_layer()
157 if (!hlist_empty(&st->l1sock.head)) in send_msg_to_layer()
158 send_socklist(&st->l1sock, skb); in send_msg_to_layer()
162 ch = get_channel4id(st, hh->id); in send_msg_to_layer()
164 return ch->send(ch, skb); in send_msg_to_layer()
167 "%s: dev(%s) prim(%x) id(%x) no channel\n", in send_msg_to_layer()
168 __func__, dev_name(&st->dev->dev), hh->prim, in send_msg_to_layer()
169 hh->id); in send_msg_to_layer()
172 ch = get_channel4id(st, hh->id); in send_msg_to_layer()
174 return ch->send(ch, skb); in send_msg_to_layer()
177 "%s: dev(%s) prim(%x) id(%x) no channel\n", in send_msg_to_layer()
178 __func__, dev_name(&st->dev->dev), hh->prim, in send_msg_to_layer()
179 hh->id); in send_msg_to_layer()
183 __func__, dev_name(&st->dev->dev), hh->prim); in send_msg_to_layer()
185 return -ESRCH; in send_msg_to_layer()
202 sigfillset(¤t->blocked); in mISDNStackd()
205 dev_name(&st->dev->dev)); in mISDNStackd()
207 if (st->notify != NULL) { in mISDNStackd()
208 complete(st->notify); in mISDNStackd()
209 st->notify = NULL; in mISDNStackd()
215 if (unlikely(test_bit(mISDN_STACK_STOPPED, &st->status))) { in mISDNStackd()
216 test_and_clear_bit(mISDN_STACK_WORK, &st->status); in mISDNStackd()
217 test_and_clear_bit(mISDN_STACK_RUNNING, &st->status); in mISDNStackd()
219 test_and_set_bit(mISDN_STACK_RUNNING, &st->status); in mISDNStackd()
220 while (test_bit(mISDN_STACK_WORK, &st->status)) { in mISDNStackd()
221 skb = skb_dequeue(&st->msgq); in mISDNStackd()
224 &st->status); in mISDNStackd()
226 skb = skb_dequeue(&st->msgq); in mISDNStackd()
230 &st->status); in mISDNStackd()
233 st->msg_cnt++; in mISDNStackd()
239 "%s: %s prim(%x) id(%x) " in mISDNStackd()
241 __func__, dev_name(&st->dev->dev), in mISDNStackd()
248 &st->status))) { in mISDNStackd()
250 &st->status); in mISDNStackd()
252 &st->status); in mISDNStackd()
256 if (test_bit(mISDN_STACK_CLEARING, &st->status)) { in mISDNStackd()
257 test_and_set_bit(mISDN_STACK_STOPPED, &st->status); in mISDNStackd()
258 test_and_clear_bit(mISDN_STACK_RUNNING, &st->status); in mISDNStackd()
260 test_and_clear_bit(mISDN_STACK_CLEARING, &st->status); in mISDNStackd()
261 test_and_set_bit(mISDN_STACK_RESTART, &st->status); in mISDNStackd()
263 if (test_and_clear_bit(mISDN_STACK_RESTART, &st->status)) { in mISDNStackd()
264 test_and_clear_bit(mISDN_STACK_STOPPED, &st->status); in mISDNStackd()
265 test_and_set_bit(mISDN_STACK_RUNNING, &st->status); in mISDNStackd()
266 if (!skb_queue_empty(&st->msgq)) in mISDNStackd()
268 &st->status); in mISDNStackd()
270 if (test_bit(mISDN_STACK_ABORT, &st->status)) in mISDNStackd()
272 if (st->notify != NULL) { in mISDNStackd()
273 complete(st->notify); in mISDNStackd()
274 st->notify = NULL; in mISDNStackd()
277 st->sleep_cnt++; in mISDNStackd()
279 test_and_clear_bit(mISDN_STACK_ACTIVE, &st->status); in mISDNStackd()
280 wait_event_interruptible(st->workq, (st->status & in mISDNStackd()
284 __func__, dev_name(&st->dev->dev), st->status); in mISDNStackd()
285 test_and_set_bit(mISDN_STACK_ACTIVE, &st->status); in mISDNStackd()
287 test_and_clear_bit(mISDN_STACK_WAKEUP, &st->status); in mISDNStackd()
289 if (test_bit(mISDN_STACK_STOPPED, &st->status)) { in mISDNStackd()
290 test_and_clear_bit(mISDN_STACK_RUNNING, &st->status); in mISDNStackd()
292 st->stopped_cnt++; in mISDNStackd()
299 dev_name(&st->dev->dev), st->msg_cnt, st->sleep_cnt, in mISDNStackd()
300 st->stopped_cnt); in mISDNStackd()
301 task_cputime(st->thread, &utime, &stime); in mISDNStackd()
304 dev_name(&st->dev->dev), utime, stime); in mISDNStackd()
307 dev_name(&st->dev->dev), st->thread->nvcsw, st->thread->nivcsw); in mISDNStackd()
309 dev_name(&st->dev->dev)); in mISDNStackd()
311 test_and_set_bit(mISDN_STACK_KILLED, &st->status); in mISDNStackd()
312 test_and_clear_bit(mISDN_STACK_RUNNING, &st->status); in mISDNStackd()
313 test_and_clear_bit(mISDN_STACK_ACTIVE, &st->status); in mISDNStackd()
314 test_and_clear_bit(mISDN_STACK_ABORT, &st->status); in mISDNStackd()
315 skb_queue_purge(&st->msgq); in mISDNStackd()
316 st->thread = NULL; in mISDNStackd()
317 if (st->notify != NULL) { in mISDNStackd()
318 complete(st->notify); in mISDNStackd()
319 st->notify = NULL; in mISDNStackd()
327 if (!ch->st) in l1_receive()
328 return -ENODEV; in l1_receive()
330 _queue_message(ch->st, skb); in l1_receive()
337 ch->addr = sapi | (tei << 8); in set_channel_address()
343 list_add_tail(&ch->list, &st->layer2); in __add_layer2()
349 mutex_lock(&st->lmutex); in add_layer2()
351 mutex_unlock(&st->lmutex); in add_layer2()
357 if (!ch->st || !ch->st->layer1) in st_own_ctrl()
358 return -EINVAL; in st_own_ctrl()
359 return ch->st->layer1->ctrl(ch->st->layer1, cmd, arg); in st_own_ctrl()
372 return -ENOMEM; in create_stack()
374 newst->dev = dev; in create_stack()
375 INIT_LIST_HEAD(&newst->layer2); in create_stack()
376 INIT_HLIST_HEAD(&newst->l1sock.head); in create_stack()
377 rwlock_init(&newst->l1sock.lock); in create_stack()
378 init_waitqueue_head(&newst->workq); in create_stack()
379 skb_queue_head_init(&newst->msgq); in create_stack()
380 mutex_init(&newst->lmutex); in create_stack()
381 dev->D.st = newst; in create_stack()
388 dev->teimgr->peer = &newst->own; in create_stack()
389 dev->teimgr->recv = mISDN_queue_message; in create_stack()
390 dev->teimgr->st = newst; in create_stack()
391 newst->layer1 = &dev->D; in create_stack()
392 dev->D.recv = l1_receive; in create_stack()
393 dev->D.peer = &newst->own; in create_stack()
394 newst->own.st = newst; in create_stack()
395 newst->own.ctrl = st_own_ctrl; in create_stack()
396 newst->own.send = mISDN_queue_message; in create_stack()
397 newst->own.recv = mISDN_queue_message; in create_stack()
400 dev_name(&newst->dev->dev)); in create_stack()
401 newst->notify = &done; in create_stack()
402 newst->thread = kthread_run(mISDNStackd, (void *)newst, "mISDN_%s", in create_stack()
403 dev_name(&newst->dev->dev)); in create_stack()
404 if (IS_ERR(newst->thread)) { in create_stack()
405 err = PTR_ERR(newst->thread); in create_stack()
408 dev_name(&newst->dev->dev), err); in create_stack()
409 delete_teimanager(dev->teimgr); in create_stack()
418 u_int protocol, struct sockaddr_mISDN *adr) in connect_layer1() argument
427 __func__, dev_name(&dev->dev), protocol, adr->dev, in connect_layer1()
428 adr->channel, adr->sapi, adr->tei); in connect_layer1()
429 switch (protocol) { in connect_layer1()
434 ch->recv = mISDN_queue_message; in connect_layer1()
435 ch->peer = &dev->D.st->own; in connect_layer1()
436 ch->st = dev->D.st; in connect_layer1()
437 rq.protocol = protocol; in connect_layer1()
438 rq.adr.channel = adr->channel; in connect_layer1()
439 err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq); in connect_layer1()
441 dev->id); in connect_layer1()
444 write_lock_bh(&dev->D.st->l1sock.lock); in connect_layer1()
445 sk_add_node(&msk->sk, &dev->D.st->l1sock.head); in connect_layer1()
446 write_unlock_bh(&dev->D.st->l1sock.lock); in connect_layer1()
449 return -ENOPROTOOPT; in connect_layer1()
456 u_int protocol, struct sockaddr_mISDN *adr) in connect_Bstack() argument
464 __func__, dev_name(&dev->dev), protocol, in connect_Bstack()
465 adr->dev, adr->channel, adr->sapi, in connect_Bstack()
466 adr->tei); in connect_Bstack()
467 ch->st = dev->D.st; in connect_Bstack()
468 pmask = 1 << (protocol & ISDN_P_B_MASK); in connect_Bstack()
469 if (pmask & dev->Bprotocols) { in connect_Bstack()
470 rq.protocol = protocol; in connect_Bstack()
472 err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq); in connect_Bstack()
475 ch->recv = rq.ch->send; in connect_Bstack()
476 ch->peer = rq.ch; in connect_Bstack()
477 rq.ch->recv = ch->send; in connect_Bstack()
478 rq.ch->peer = ch; in connect_Bstack()
479 rq.ch->st = dev->D.st; in connect_Bstack()
483 return -ENOPROTOOPT; in connect_Bstack()
484 rq2.protocol = protocol; in connect_Bstack()
487 err = bp->create(&rq2); in connect_Bstack()
490 ch->recv = rq2.ch->send; in connect_Bstack()
491 ch->peer = rq2.ch; in connect_Bstack()
492 rq2.ch->st = dev->D.st; in connect_Bstack()
493 rq.protocol = rq2.protocol; in connect_Bstack()
495 err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq); in connect_Bstack()
497 rq2.ch->ctrl(rq2.ch, CLOSE_CHANNEL, NULL); in connect_Bstack()
500 rq2.ch->recv = rq.ch->send; in connect_Bstack()
501 rq2.ch->peer = rq.ch; in connect_Bstack()
502 rq.ch->recv = rq2.ch->send; in connect_Bstack()
503 rq.ch->peer = rq2.ch; in connect_Bstack()
504 rq.ch->st = dev->D.st; in connect_Bstack()
506 ch->protocol = protocol; in connect_Bstack()
507 ch->nr = rq.ch->nr; in connect_Bstack()
513 u_int protocol, struct sockaddr_mISDN *adr) in create_l2entity() argument
520 __func__, dev_name(&dev->dev), protocol, in create_l2entity()
521 adr->dev, adr->channel, adr->sapi, in create_l2entity()
522 adr->tei); in create_l2entity()
523 rq.protocol = ISDN_P_TE_S0; in create_l2entity()
524 if (dev->Dprotocols & (1 << ISDN_P_TE_E1)) in create_l2entity()
525 rq.protocol = ISDN_P_TE_E1; in create_l2entity()
526 switch (protocol) { in create_l2entity()
528 rq.protocol = ISDN_P_NT_S0; in create_l2entity()
529 if (dev->Dprotocols & (1 << ISDN_P_NT_E1)) in create_l2entity()
530 rq.protocol = ISDN_P_NT_E1; in create_l2entity()
533 ch->recv = mISDN_queue_message; in create_l2entity()
534 ch->peer = &dev->D.st->own; in create_l2entity()
535 ch->st = dev->D.st; in create_l2entity()
537 err = dev->D.ctrl(&dev->D, OPEN_CHANNEL, &rq); in create_l2entity()
541 rq.protocol = protocol; in create_l2entity()
544 err = dev->teimgr->ctrl(dev->teimgr, OPEN_CHANNEL, &rq); in create_l2entity()
547 if ((protocol == ISDN_P_LAPD_NT) && !rq.ch) in create_l2entity()
549 add_layer2(rq.ch, dev->D.st); in create_l2entity()
550 rq.ch->recv = mISDN_queue_message; in create_l2entity()
551 rq.ch->peer = &dev->D.st->own; in create_l2entity()
552 rq.ch->ctrl(rq.ch, OPEN_CHANNEL, NULL); /* can't fail */ in create_l2entity()
556 err = -EPROTONOSUPPORT; in create_l2entity()
567 if (!ch->st) { in delete_channel()
572 printk(KERN_DEBUG "%s: st(%s) protocol(%x)\n", __func__, in delete_channel()
573 dev_name(&ch->st->dev->dev), ch->protocol); in delete_channel()
574 if (ch->protocol >= ISDN_P_B_START) { in delete_channel()
575 if (ch->peer) { in delete_channel()
576 ch->peer->ctrl(ch->peer, CLOSE_CHANNEL, NULL); in delete_channel()
577 ch->peer = NULL; in delete_channel()
581 switch (ch->protocol) { in delete_channel()
586 write_lock_bh(&ch->st->l1sock.lock); in delete_channel()
587 sk_del_node_init(&msk->sk); in delete_channel()
588 write_unlock_bh(&ch->st->l1sock.lock); in delete_channel()
589 ch->st->dev->D.ctrl(&ch->st->dev->D, CLOSE_CHANNEL, NULL); in delete_channel()
592 pch = get_channel4id(ch->st, ch->nr); in delete_channel()
594 mutex_lock(&ch->st->lmutex); in delete_channel()
595 list_del(&pch->list); in delete_channel()
596 mutex_unlock(&ch->st->lmutex); in delete_channel()
597 pch->ctrl(pch, CLOSE_CHANNEL, NULL); in delete_channel()
598 pch = ch->st->dev->teimgr; in delete_channel()
599 pch->ctrl(pch, CLOSE_CHANNEL, NULL); in delete_channel()
605 pch = ch->st->dev->teimgr; in delete_channel()
607 pch->ctrl(pch, CLOSE_CHANNEL, NULL); in delete_channel()
621 struct mISDNstack *st = dev->D.st; in delete_stack()
626 dev_name(&st->dev->dev)); in delete_stack()
627 if (dev->teimgr) in delete_stack()
628 delete_teimanager(dev->teimgr); in delete_stack()
629 if (st->thread) { in delete_stack()
630 if (st->notify) { in delete_stack()
633 complete(st->notify); in delete_stack()
635 st->notify = &done; in delete_stack()
636 test_and_set_bit(mISDN_STACK_ABORT, &st->status); in delete_stack()
637 test_and_set_bit(mISDN_STACK_WAKEUP, &st->status); in delete_stack()
638 wake_up_interruptible(&st->workq); in delete_stack()
641 if (!list_empty(&st->layer2)) in delete_stack()
644 if (!hlist_empty(&st->l1sock.head)) in delete_stack()