3 * Author Karsten Keil <kkeil@novell.com>
5 * Copyright 2008 by Karsten Keil <kkeil@novell.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
18 #include <linux/random.h>
19 #include <linux/slab.h>
30 #define TEI_ENTITY_ID 0xf
32 #define MGR_PH_ACTIVE 16
33 #define MGR_PH_NOTREADY 17
35 #define DATIMER_VAL 10000
39 static struct Fsm deactfsm
= {NULL
, 0, 0, NULL
, NULL
};
40 static struct Fsm teifsmu
= {NULL
, 0, 0, NULL
, NULL
};
41 static struct Fsm teifsmn
= {NULL
, 0, 0, NULL
, NULL
};
48 #define DEACT_STATE_COUNT (ST_L1_ACTIV+1)
50 static char *strDeactState
[] =
53 "ST_L1_DEACT_PENDING",
66 #define DEACT_EVENT_COUNT (EV_DATIMER+1)
68 static char *strDeactEvent
[] =
79 da_debug(struct FsmInst
*fi
, char *fmt
, ...)
81 struct manager
*mgr
= fi
->userdata
;
84 if (!(*debug
& DEBUG_L2_TEIFSM
))
87 printk(KERN_DEBUG
"mgr(%d): ", mgr
->ch
.st
->dev
->id
);
94 da_activate(struct FsmInst
*fi
, int event
, void *arg
)
96 struct manager
*mgr
= fi
->userdata
;
98 if (fi
->state
== ST_L1_DEACT_PENDING
)
99 mISDN_FsmDelTimer(&mgr
->datimer
, 1);
100 mISDN_FsmChangeState(fi
, ST_L1_ACTIV
);
104 da_deactivate_ind(struct FsmInst
*fi
, int event
, void *arg
)
106 mISDN_FsmChangeState(fi
, ST_L1_DEACT
);
110 da_deactivate(struct FsmInst
*fi
, int event
, void *arg
)
112 struct manager
*mgr
= fi
->userdata
;
116 read_lock_irqsave(&mgr
->lock
, flags
);
117 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
118 if (l2
->l2m
.state
> ST_L2_4
) {
119 /* have still activ TEI */
120 read_unlock_irqrestore(&mgr
->lock
, flags
);
124 read_unlock_irqrestore(&mgr
->lock
, flags
);
125 /* All TEI are inactiv */
126 if (!test_bit(OPTION_L1_HOLD
, &mgr
->options
)) {
127 mISDN_FsmAddTimer(&mgr
->datimer
, DATIMER_VAL
, EV_DATIMER
,
129 mISDN_FsmChangeState(fi
, ST_L1_DEACT_PENDING
);
134 da_ui(struct FsmInst
*fi
, int event
, void *arg
)
136 struct manager
*mgr
= fi
->userdata
;
138 /* restart da timer */
139 if (!test_bit(OPTION_L1_HOLD
, &mgr
->options
)) {
140 mISDN_FsmDelTimer(&mgr
->datimer
, 2);
141 mISDN_FsmAddTimer(&mgr
->datimer
, DATIMER_VAL
, EV_DATIMER
,
147 da_timer(struct FsmInst
*fi
, int event
, void *arg
)
149 struct manager
*mgr
= fi
->userdata
;
154 read_lock_irqsave(&mgr
->lock
, flags
);
155 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
156 if (l2
->l2m
.state
> ST_L2_4
) {
157 /* have still activ TEI */
158 read_unlock_irqrestore(&mgr
->lock
, flags
);
159 mISDN_FsmChangeState(fi
, ST_L1_ACTIV
);
163 read_unlock_irqrestore(&mgr
->lock
, flags
);
164 /* All TEI are inactiv */
165 mISDN_FsmChangeState(fi
, ST_L1_DEACT
);
166 _queue_data(&mgr
->ch
, PH_DEACTIVATE_REQ
, MISDN_ID_ANY
, 0, NULL
,
170 static struct FsmNode DeactFnList
[] =
172 {ST_L1_DEACT
, EV_ACTIVATE_IND
, da_activate
},
173 {ST_L1_ACTIV
, EV_DEACTIVATE_IND
, da_deactivate_ind
},
174 {ST_L1_ACTIV
, EV_DEACTIVATE
, da_deactivate
},
175 {ST_L1_DEACT_PENDING
, EV_ACTIVATE
, da_activate
},
176 {ST_L1_DEACT_PENDING
, EV_UI
, da_ui
},
177 {ST_L1_DEACT_PENDING
, EV_DATIMER
, da_timer
},
186 #define TEI_STATE_COUNT (ST_TEI_IDVERIFY+1)
188 static char *strTeiState
[] =
207 #define TEI_EVENT_COUNT (EV_TIMER+1)
209 static char *strTeiEvent
[] =
223 tei_debug(struct FsmInst
*fi
, char *fmt
, ...)
225 struct teimgr
*tm
= fi
->userdata
;
228 if (!(*debug
& DEBUG_L2_TEIFSM
))
231 printk(KERN_DEBUG
"sapi(%d) tei(%d): ", tm
->l2
->sapi
, tm
->l2
->tei
);
240 get_free_id(struct manager
*mgr
)
246 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
247 if (l2
->ch
.nr
> 63) {
249 "%s: more as 63 layer2 for one device\n",
253 test_and_set_bit(l2
->ch
.nr
, (u_long
*)&ids
);
255 for (i
= 1; i
< 64; i
++)
256 if (!test_bit(i
, (u_long
*)&ids
))
258 printk(KERN_WARNING
"%s: more as 63 layer2 for one device\n",
264 get_free_tei(struct manager
*mgr
)
270 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
273 if ((l2
->ch
.addr
& 0xff) != 0)
275 i
= l2
->ch
.addr
>> 8;
280 test_and_set_bit(i
, (u_long
*)&ids
);
282 for (i
= 0; i
< 64; i
++)
283 if (!test_bit(i
, (u_long
*)&ids
))
285 printk(KERN_WARNING
"%s: more as 63 dynamic tei for one device\n",
291 teiup_create(struct manager
*mgr
, u_int prim
, int len
, void *arg
)
294 struct mISDNhead
*hh
;
297 skb
= mI_alloc_skb(len
, GFP_ATOMIC
);
300 hh
= mISDN_HEAD_P(skb
);
302 hh
->id
= (mgr
->ch
.nr
<< 16) | mgr
->ch
.addr
;
304 memcpy(skb_put(skb
, len
), arg
, len
);
305 err
= mgr
->up
->send(mgr
->up
, skb
);
307 printk(KERN_WARNING
"%s: err=%d\n", __func__
, err
);
313 new_id(struct manager
*mgr
)
321 id
|= GROUP_TEI
<< 8;
327 do_send(struct manager
*mgr
)
329 if (!test_bit(MGR_PH_ACTIVE
, &mgr
->options
))
332 if (!test_and_set_bit(MGR_PH_NOTREADY
, &mgr
->options
)) {
333 struct sk_buff
*skb
= skb_dequeue(&mgr
->sendq
);
336 test_and_clear_bit(MGR_PH_NOTREADY
, &mgr
->options
);
339 mgr
->lastid
= mISDN_HEAD_ID(skb
);
340 mISDN_FsmEvent(&mgr
->deact
, EV_UI
, NULL
);
341 if (mgr
->ch
.recv(mgr
->ch
.peer
, skb
)) {
343 test_and_clear_bit(MGR_PH_NOTREADY
, &mgr
->options
);
344 mgr
->lastid
= MISDN_ID_NONE
;
350 do_ack(struct manager
*mgr
, u_int id
)
352 if (test_bit(MGR_PH_NOTREADY
, &mgr
->options
)) {
353 if (id
== mgr
->lastid
) {
354 if (test_bit(MGR_PH_ACTIVE
, &mgr
->options
)) {
357 skb
= skb_dequeue(&mgr
->sendq
);
359 mgr
->lastid
= mISDN_HEAD_ID(skb
);
360 if (!mgr
->ch
.recv(mgr
->ch
.peer
, skb
))
365 mgr
->lastid
= MISDN_ID_NONE
;
366 test_and_clear_bit(MGR_PH_NOTREADY
, &mgr
->options
);
372 mgr_send_down(struct manager
*mgr
, struct sk_buff
*skb
)
374 skb_queue_tail(&mgr
->sendq
, skb
);
375 if (!test_bit(MGR_PH_ACTIVE
, &mgr
->options
)) {
376 _queue_data(&mgr
->ch
, PH_ACTIVATE_REQ
, MISDN_ID_ANY
, 0,
384 dl_unit_data(struct manager
*mgr
, struct sk_buff
*skb
)
386 if (!test_bit(MGR_OPT_NETWORK
, &mgr
->options
)) /* only net send UI */
388 if (!test_bit(MGR_PH_ACTIVE
, &mgr
->options
))
389 _queue_data(&mgr
->ch
, PH_ACTIVATE_REQ
, MISDN_ID_ANY
, 0,
392 skb
->data
[0] = 0x02; /* SAPI 0 C/R = 1 */
393 skb
->data
[1] = 0xff; /* TEI 127 */
394 skb
->data
[2] = UI
; /* UI frame */
395 mISDN_HEAD_PRIM(skb
) = PH_DATA_REQ
;
396 mISDN_HEAD_ID(skb
) = new_id(mgr
);
397 skb_queue_tail(&mgr
->sendq
, skb
);
407 get_random_bytes(&x
, sizeof(x
));
411 static struct layer2
*
412 findtei(struct manager
*mgr
, int tei
)
417 read_lock_irqsave(&mgr
->lock
, flags
);
418 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
419 if ((l2
->sapi
== 0) && (l2
->tei
> 0) &&
420 (l2
->tei
!= GROUP_TEI
) && (l2
->tei
== tei
))
425 read_unlock_irqrestore(&mgr
->lock
, flags
);
430 put_tei_msg(struct manager
*mgr
, u_char m_id
, unsigned int ri
, int tei
)
435 bp
[0] = (TEI_SAPI
<< 2);
436 if (test_bit(MGR_OPT_NETWORK
, &mgr
->options
))
437 bp
[0] |= 2; /* CR:=1 for net command */
438 bp
[1] = (GROUP_TEI
<< 1) | 0x1;
440 bp
[3] = TEI_ENTITY_ID
;
444 bp
[7] = ((tei
<< 1) & 0xff) | 1;
445 skb
= _alloc_mISDN_skb(PH_DATA_REQ
, new_id(mgr
), 8, bp
, GFP_ATOMIC
);
447 printk(KERN_WARNING
"%s: no skb for tei msg\n", __func__
);
450 mgr_send_down(mgr
, skb
);
454 tei_id_request(struct FsmInst
*fi
, int event
, void *arg
)
456 struct teimgr
*tm
= fi
->userdata
;
458 if (tm
->l2
->tei
!= GROUP_TEI
) {
459 tm
->tei_m
.printdebug(&tm
->tei_m
,
460 "assign request for already assigned tei %d",
464 tm
->ri
= random_ri();
465 if (*debug
& DEBUG_L2_TEI
)
466 tm
->tei_m
.printdebug(&tm
->tei_m
,
467 "assign request ri %d", tm
->ri
);
468 put_tei_msg(tm
->mgr
, ID_REQUEST
, tm
->ri
, GROUP_TEI
);
469 mISDN_FsmChangeState(fi
, ST_TEI_IDREQ
);
470 mISDN_FsmAddTimer(&tm
->timer
, tm
->tval
, EV_TIMER
, NULL
, 1);
475 tei_id_assign(struct FsmInst
*fi
, int event
, void *arg
)
477 struct teimgr
*tm
= fi
->userdata
;
482 ri
= ((unsigned int) *dp
++ << 8);
486 if (*debug
& DEBUG_L2_TEI
)
487 tm
->tei_m
.printdebug(fi
, "identity assign ri %d tei %d",
489 l2
= findtei(tm
->mgr
, tei
);
490 if (l2
) { /* same tei is in use */
491 if (ri
!= l2
->tm
->ri
) {
492 tm
->tei_m
.printdebug(fi
,
493 "possible duplicate assignment tei %d", tei
);
494 tei_l2(l2
, MDL_ERROR_RSP
, 0);
496 } else if (ri
== tm
->ri
) {
497 mISDN_FsmDelTimer(&tm
->timer
, 1);
498 mISDN_FsmChangeState(fi
, ST_TEI_NOP
);
499 tei_l2(tm
->l2
, MDL_ASSIGN_REQ
, tei
);
504 tei_id_test_dup(struct FsmInst
*fi
, int event
, void *arg
)
506 struct teimgr
*tm
= fi
->userdata
;
511 ri
= ((unsigned int) *dp
++ << 8);
515 if (*debug
& DEBUG_L2_TEI
)
516 tm
->tei_m
.printdebug(fi
, "foreign identity assign ri %d tei %d",
518 l2
= findtei(tm
->mgr
, tei
);
519 if (l2
) { /* same tei is in use */
520 if (ri
!= l2
->tm
->ri
) { /* and it wasn't our request */
521 tm
->tei_m
.printdebug(fi
,
522 "possible duplicate assignment tei %d", tei
);
523 mISDN_FsmEvent(&l2
->tm
->tei_m
, EV_VERIFY
, NULL
);
529 tei_id_denied(struct FsmInst
*fi
, int event
, void *arg
)
531 struct teimgr
*tm
= fi
->userdata
;
535 ri
= ((unsigned int) *dp
++ << 8);
539 if (*debug
& DEBUG_L2_TEI
)
540 tm
->tei_m
.printdebug(fi
, "identity denied ri %d tei %d",
545 tei_id_chk_req(struct FsmInst
*fi
, int event
, void *arg
)
547 struct teimgr
*tm
= fi
->userdata
;
552 if (*debug
& DEBUG_L2_TEI
)
553 tm
->tei_m
.printdebug(fi
, "identity check req tei %d", tei
);
554 if ((tm
->l2
->tei
!= GROUP_TEI
) && ((tei
== GROUP_TEI
) ||
555 (tei
== tm
->l2
->tei
))) {
556 mISDN_FsmDelTimer(&tm
->timer
, 4);
557 mISDN_FsmChangeState(&tm
->tei_m
, ST_TEI_NOP
);
558 put_tei_msg(tm
->mgr
, ID_CHK_RES
, random_ri(), tm
->l2
->tei
);
563 tei_id_remove(struct FsmInst
*fi
, int event
, void *arg
)
565 struct teimgr
*tm
= fi
->userdata
;
570 if (*debug
& DEBUG_L2_TEI
)
571 tm
->tei_m
.printdebug(fi
, "identity remove tei %d", tei
);
572 if ((tm
->l2
->tei
!= GROUP_TEI
) &&
573 ((tei
== GROUP_TEI
) || (tei
== tm
->l2
->tei
))) {
574 mISDN_FsmDelTimer(&tm
->timer
, 5);
575 mISDN_FsmChangeState(&tm
->tei_m
, ST_TEI_NOP
);
576 tei_l2(tm
->l2
, MDL_REMOVE_REQ
, 0);
581 tei_id_verify(struct FsmInst
*fi
, int event
, void *arg
)
583 struct teimgr
*tm
= fi
->userdata
;
585 if (*debug
& DEBUG_L2_TEI
)
586 tm
->tei_m
.printdebug(fi
, "id verify request for tei %d",
588 put_tei_msg(tm
->mgr
, ID_VERIFY
, 0, tm
->l2
->tei
);
589 mISDN_FsmChangeState(&tm
->tei_m
, ST_TEI_IDVERIFY
);
590 mISDN_FsmAddTimer(&tm
->timer
, tm
->tval
, EV_TIMER
, NULL
, 2);
595 tei_id_req_tout(struct FsmInst
*fi
, int event
, void *arg
)
597 struct teimgr
*tm
= fi
->userdata
;
600 tm
->ri
= random_ri();
601 if (*debug
& DEBUG_L2_TEI
)
602 tm
->tei_m
.printdebug(fi
, "assign req(%d) ri %d",
603 4 - tm
->nval
, tm
->ri
);
604 put_tei_msg(tm
->mgr
, ID_REQUEST
, tm
->ri
, GROUP_TEI
);
605 mISDN_FsmAddTimer(&tm
->timer
, tm
->tval
, EV_TIMER
, NULL
, 3);
607 tm
->tei_m
.printdebug(fi
, "assign req failed");
608 tei_l2(tm
->l2
, MDL_ERROR_RSP
, 0);
609 mISDN_FsmChangeState(fi
, ST_TEI_NOP
);
614 tei_id_ver_tout(struct FsmInst
*fi
, int event
, void *arg
)
616 struct teimgr
*tm
= fi
->userdata
;
619 if (*debug
& DEBUG_L2_TEI
)
620 tm
->tei_m
.printdebug(fi
,
621 "id verify req(%d) for tei %d",
622 3 - tm
->nval
, tm
->l2
->tei
);
623 put_tei_msg(tm
->mgr
, ID_VERIFY
, 0, tm
->l2
->tei
);
624 mISDN_FsmAddTimer(&tm
->timer
, tm
->tval
, EV_TIMER
, NULL
, 4);
626 tm
->tei_m
.printdebug(fi
, "verify req for tei %d failed",
628 tei_l2(tm
->l2
, MDL_REMOVE_REQ
, 0);
629 mISDN_FsmChangeState(fi
, ST_TEI_NOP
);
633 static struct FsmNode TeiFnListUser
[] =
635 {ST_TEI_NOP
, EV_IDREQ
, tei_id_request
},
636 {ST_TEI_NOP
, EV_ASSIGN
, tei_id_test_dup
},
637 {ST_TEI_NOP
, EV_VERIFY
, tei_id_verify
},
638 {ST_TEI_NOP
, EV_REMOVE
, tei_id_remove
},
639 {ST_TEI_NOP
, EV_CHKREQ
, tei_id_chk_req
},
640 {ST_TEI_IDREQ
, EV_TIMER
, tei_id_req_tout
},
641 {ST_TEI_IDREQ
, EV_ASSIGN
, tei_id_assign
},
642 {ST_TEI_IDREQ
, EV_DENIED
, tei_id_denied
},
643 {ST_TEI_IDVERIFY
, EV_TIMER
, tei_id_ver_tout
},
644 {ST_TEI_IDVERIFY
, EV_REMOVE
, tei_id_remove
},
645 {ST_TEI_IDVERIFY
, EV_CHKREQ
, tei_id_chk_req
},
649 tei_l2remove(struct layer2
*l2
)
651 put_tei_msg(l2
->tm
->mgr
, ID_REMOVE
, 0, l2
->tei
);
652 tei_l2(l2
, MDL_REMOVE_REQ
, 0);
653 list_del(&l2
->ch
.list
);
654 l2
->ch
.ctrl(&l2
->ch
, CLOSE_CHANNEL
, NULL
);
658 tei_assign_req(struct FsmInst
*fi
, int event
, void *arg
)
660 struct teimgr
*tm
= fi
->userdata
;
663 if (tm
->l2
->tei
== GROUP_TEI
) {
664 tm
->tei_m
.printdebug(&tm
->tei_m
,
665 "net tei assign request without tei");
668 tm
->ri
= ((unsigned int) *dp
++ << 8);
670 if (*debug
& DEBUG_L2_TEI
)
671 tm
->tei_m
.printdebug(&tm
->tei_m
,
672 "net assign request ri %d teim %d", tm
->ri
, *dp
);
673 put_tei_msg(tm
->mgr
, ID_ASSIGNED
, tm
->ri
, tm
->l2
->tei
);
674 mISDN_FsmChangeState(fi
, ST_TEI_NOP
);
678 tei_id_chk_req_net(struct FsmInst
*fi
, int event
, void *arg
)
680 struct teimgr
*tm
= fi
->userdata
;
682 if (*debug
& DEBUG_L2_TEI
)
683 tm
->tei_m
.printdebug(fi
, "id check request for tei %d",
686 put_tei_msg(tm
->mgr
, ID_CHK_REQ
, 0, tm
->l2
->tei
);
687 mISDN_FsmChangeState(&tm
->tei_m
, ST_TEI_IDVERIFY
);
688 mISDN_FsmAddTimer(&tm
->timer
, tm
->tval
, EV_TIMER
, NULL
, 2);
693 tei_id_chk_resp(struct FsmInst
*fi
, int event
, void *arg
)
695 struct teimgr
*tm
= fi
->userdata
;
700 if (*debug
& DEBUG_L2_TEI
)
701 tm
->tei_m
.printdebug(fi
, "identity check resp tei %d", tei
);
702 if (tei
== tm
->l2
->tei
)
707 tei_id_verify_net(struct FsmInst
*fi
, int event
, void *arg
)
709 struct teimgr
*tm
= fi
->userdata
;
714 if (*debug
& DEBUG_L2_TEI
)
715 tm
->tei_m
.printdebug(fi
, "identity verify req tei %d/%d",
717 if (tei
== tm
->l2
->tei
)
718 tei_id_chk_req_net(fi
, event
, arg
);
722 tei_id_ver_tout_net(struct FsmInst
*fi
, int event
, void *arg
)
724 struct teimgr
*tm
= fi
->userdata
;
727 if (*debug
& DEBUG_L2_TEI
)
728 tm
->tei_m
.printdebug(fi
,
729 "check req for tei %d successful\n", tm
->l2
->tei
);
730 mISDN_FsmChangeState(fi
, ST_TEI_NOP
);
731 } else if (tm
->rcnt
> 1) {
732 /* duplicate assignment; remove */
733 tei_l2remove(tm
->l2
);
734 } else if (--tm
->nval
) {
735 if (*debug
& DEBUG_L2_TEI
)
736 tm
->tei_m
.printdebug(fi
,
737 "id check req(%d) for tei %d",
738 3 - tm
->nval
, tm
->l2
->tei
);
739 put_tei_msg(tm
->mgr
, ID_CHK_REQ
, 0, tm
->l2
->tei
);
740 mISDN_FsmAddTimer(&tm
->timer
, tm
->tval
, EV_TIMER
, NULL
, 4);
742 tm
->tei_m
.printdebug(fi
, "check req for tei %d failed",
744 mISDN_FsmChangeState(fi
, ST_TEI_NOP
);
745 tei_l2remove(tm
->l2
);
749 static struct FsmNode TeiFnListNet
[] =
751 {ST_TEI_NOP
, EV_ASSIGN_REQ
, tei_assign_req
},
752 {ST_TEI_NOP
, EV_VERIFY
, tei_id_verify_net
},
753 {ST_TEI_NOP
, EV_CHKREQ
, tei_id_chk_req_net
},
754 {ST_TEI_IDVERIFY
, EV_TIMER
, tei_id_ver_tout_net
},
755 {ST_TEI_IDVERIFY
, EV_CHKRESP
, tei_id_chk_resp
},
759 tei_ph_data_ind(struct teimgr
*tm
, u_int mt
, u_char
*dp
, int len
)
761 if (test_bit(FLG_FIXED_TEI
, &tm
->l2
->flag
))
763 if (*debug
& DEBUG_L2_TEI
)
764 tm
->tei_m
.printdebug(&tm
->tei_m
, "tei handler mt %x", mt
);
765 if (mt
== ID_ASSIGNED
)
766 mISDN_FsmEvent(&tm
->tei_m
, EV_ASSIGN
, dp
);
767 else if (mt
== ID_DENIED
)
768 mISDN_FsmEvent(&tm
->tei_m
, EV_DENIED
, dp
);
769 else if (mt
== ID_CHK_REQ
)
770 mISDN_FsmEvent(&tm
->tei_m
, EV_CHKREQ
, dp
);
771 else if (mt
== ID_REMOVE
)
772 mISDN_FsmEvent(&tm
->tei_m
, EV_REMOVE
, dp
);
773 else if (mt
== ID_VERIFY
)
774 mISDN_FsmEvent(&tm
->tei_m
, EV_VERIFY
, dp
);
775 else if (mt
== ID_CHK_RES
)
776 mISDN_FsmEvent(&tm
->tei_m
, EV_CHKRESP
, dp
);
779 static struct layer2
*
780 create_new_tei(struct manager
*mgr
, int tei
, int sapi
)
789 if ((tei
>= 0) && (tei
< 64))
790 test_and_set_bit(OPTION_L2_FIXEDTEI
, &opt
);
791 if (mgr
->ch
.st
->dev
->Dprotocols
792 & ((1 << ISDN_P_TE_E1
) | (1 << ISDN_P_NT_E1
)))
793 test_and_set_bit(OPTION_L2_PMX
, &opt
);
794 l2
= create_l2(mgr
->up
, ISDN_P_LAPD_NT
, opt
, tei
, sapi
);
796 printk(KERN_WARNING
"%s:no memory for layer2\n", __func__
);
799 l2
->tm
= kzalloc(sizeof(struct teimgr
), GFP_KERNEL
);
802 printk(KERN_WARNING
"%s:no memory for teimgr\n", __func__
);
807 l2
->tm
->tei_m
.debug
= *debug
& DEBUG_L2_TEIFSM
;
808 l2
->tm
->tei_m
.userdata
= l2
->tm
;
809 l2
->tm
->tei_m
.printdebug
= tei_debug
;
810 l2
->tm
->tei_m
.fsm
= &teifsmn
;
811 l2
->tm
->tei_m
.state
= ST_TEI_NOP
;
812 l2
->tm
->tval
= 2000; /* T202 2 sec */
813 mISDN_FsmInitTimer(&l2
->tm
->tei_m
, &l2
->tm
->timer
);
814 write_lock_irqsave(&mgr
->lock
, flags
);
815 id
= get_free_id(mgr
);
816 list_add_tail(&l2
->list
, &mgr
->layer2
);
817 write_unlock_irqrestore(&mgr
->lock
, flags
);
819 l2
->ch
.ctrl(&l2
->ch
, CLOSE_CHANNEL
, NULL
);
820 printk(KERN_WARNING
"%s:no free id\n", __func__
);
824 __add_layer2(&l2
->ch
, mgr
->ch
.st
);
825 l2
->ch
.recv
= mgr
->ch
.recv
;
826 l2
->ch
.peer
= mgr
->ch
.peer
;
827 l2
->ch
.ctrl(&l2
->ch
, OPEN_CHANNEL
, NULL
);
833 new_tei_req(struct manager
*mgr
, u_char
*dp
)
842 if (!(dp
[3] & 1)) /* Extension bit != 1 */
845 tei
= dp
[3] >> 1; /* 3GPP TS 08.56 6.1.11.2 */
847 tei
= get_free_tei(mgr
);
849 printk(KERN_WARNING
"%s:No free tei\n", __func__
);
852 l2
= create_new_tei(mgr
, tei
, CTRL_SAPI
);
856 mISDN_FsmEvent(&l2
->tm
->tei_m
, EV_ASSIGN_REQ
, dp
);
859 put_tei_msg(mgr
, ID_DENIED
, ri
, GROUP_TEI
);
863 ph_data_ind(struct manager
*mgr
, struct sk_buff
*skb
)
866 struct layer2
*l2
, *nl2
;
870 if (*debug
& DEBUG_L2_TEI
)
871 printk(KERN_DEBUG
"%s: short mgr frame %d/8\n",
876 if ((skb
->data
[0] >> 2) != TEI_SAPI
) /* not for us */
878 if (skb
->data
[0] & 1) /* EA0 formal error */
880 if (!(skb
->data
[1] & 1)) /* EA1 formal error */
882 if ((skb
->data
[1] >> 1) != GROUP_TEI
) /* not for us */
884 if ((skb
->data
[2] & 0xef) != UI
) /* not UI */
886 if (skb
->data
[3] != TEI_ENTITY_ID
) /* not tei entity */
893 if (!test_bit(MGR_OPT_NETWORK
, &mgr
->options
))
900 if (test_bit(MGR_OPT_NETWORK
, &mgr
->options
))
907 if (mt
== ID_REQUEST
) {
908 new_tei_req(mgr
, &skb
->data
[4]);
911 list_for_each_entry_safe(l2
, nl2
, &mgr
->layer2
, list
) {
912 tei_ph_data_ind(l2
->tm
, mt
, &skb
->data
[4], skb
->len
- 4);
919 l2_tei(struct layer2
*l2
, u_int cmd
, u_long arg
)
921 struct teimgr
*tm
= l2
->tm
;
923 if (test_bit(FLG_FIXED_TEI
, &l2
->flag
))
925 if (*debug
& DEBUG_L2_TEI
)
926 printk(KERN_DEBUG
"%s: cmd(%x)\n", __func__
, cmd
);
929 mISDN_FsmEvent(&tm
->tei_m
, EV_IDREQ
, NULL
);
932 if (test_bit(MGR_OPT_NETWORK
, &tm
->mgr
->options
))
933 mISDN_FsmEvent(&tm
->tei_m
, EV_CHKREQ
, &l2
->tei
);
934 if (test_bit(MGR_OPT_USER
, &tm
->mgr
->options
))
935 mISDN_FsmEvent(&tm
->tei_m
, EV_VERIFY
, NULL
);
937 case MDL_STATUS_UP_IND
:
938 if (test_bit(MGR_OPT_NETWORK
, &tm
->mgr
->options
))
939 mISDN_FsmEvent(&tm
->mgr
->deact
, EV_ACTIVATE
, NULL
);
941 case MDL_STATUS_DOWN_IND
:
942 if (test_bit(MGR_OPT_NETWORK
, &tm
->mgr
->options
))
943 mISDN_FsmEvent(&tm
->mgr
->deact
, EV_DEACTIVATE
, NULL
);
945 case MDL_STATUS_UI_IND
:
946 if (test_bit(MGR_OPT_NETWORK
, &tm
->mgr
->options
))
947 mISDN_FsmEvent(&tm
->mgr
->deact
, EV_UI
, NULL
);
954 TEIrelease(struct layer2
*l2
)
956 struct teimgr
*tm
= l2
->tm
;
959 mISDN_FsmDelTimer(&tm
->timer
, 1);
960 write_lock_irqsave(&tm
->mgr
->lock
, flags
);
962 write_unlock_irqrestore(&tm
->mgr
->lock
, flags
);
968 create_teimgr(struct manager
*mgr
, struct channel_req
*crq
)
975 if (*debug
& DEBUG_L2_TEI
)
976 printk(KERN_DEBUG
"%s: %s proto(%x) adr(%d %d %d %d)\n",
977 __func__
, dev_name(&mgr
->ch
.st
->dev
->dev
),
978 crq
->protocol
, crq
->adr
.dev
, crq
->adr
.channel
,
979 crq
->adr
.sapi
, crq
->adr
.tei
);
980 if (crq
->adr
.tei
> GROUP_TEI
)
982 if (crq
->adr
.tei
< 64)
983 test_and_set_bit(OPTION_L2_FIXEDTEI
, &opt
);
984 if (crq
->adr
.tei
== 0)
985 test_and_set_bit(OPTION_L2_PTP
, &opt
);
986 if (test_bit(MGR_OPT_NETWORK
, &mgr
->options
)) {
987 if (crq
->protocol
== ISDN_P_LAPD_TE
)
988 return -EPROTONOSUPPORT
;
989 if ((crq
->adr
.tei
!= 0) && (crq
->adr
.tei
!= 127))
993 "%s: only one network manager is allowed\n",
997 } else if (test_bit(MGR_OPT_USER
, &mgr
->options
)) {
998 if (crq
->protocol
== ISDN_P_LAPD_NT
)
999 return -EPROTONOSUPPORT
;
1000 if ((crq
->adr
.tei
>= 64) && (crq
->adr
.tei
< GROUP_TEI
))
1001 return -EINVAL
; /* dyn tei */
1003 if (crq
->protocol
== ISDN_P_LAPD_NT
)
1004 test_and_set_bit(MGR_OPT_NETWORK
, &mgr
->options
);
1005 if (crq
->protocol
== ISDN_P_LAPD_TE
)
1006 test_and_set_bit(MGR_OPT_USER
, &mgr
->options
);
1008 if (mgr
->ch
.st
->dev
->Dprotocols
1009 & ((1 << ISDN_P_TE_E1
) | (1 << ISDN_P_NT_E1
)))
1010 test_and_set_bit(OPTION_L2_PMX
, &opt
);
1011 if ((crq
->protocol
== ISDN_P_LAPD_NT
) && (crq
->adr
.tei
== 127)) {
1013 id
= DL_INFO_L2_CONNECT
;
1014 teiup_create(mgr
, DL_INFORMATION_IND
, sizeof(id
), &id
);
1016 if (!list_empty(&mgr
->layer2
)) {
1017 read_lock_irqsave(&mgr
->lock
, flags
);
1018 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
1020 l2
->ch
.ctrl(&l2
->ch
, OPEN_CHANNEL
, NULL
);
1022 read_unlock_irqrestore(&mgr
->lock
, flags
);
1026 l2
= create_l2(crq
->ch
, crq
->protocol
, opt
,
1027 crq
->adr
.tei
, crq
->adr
.sapi
);
1030 l2
->tm
= kzalloc(sizeof(struct teimgr
), GFP_KERNEL
);
1033 printk(KERN_ERR
"kmalloc teimgr failed\n");
1038 l2
->tm
->tei_m
.debug
= *debug
& DEBUG_L2_TEIFSM
;
1039 l2
->tm
->tei_m
.userdata
= l2
->tm
;
1040 l2
->tm
->tei_m
.printdebug
= tei_debug
;
1041 if (crq
->protocol
== ISDN_P_LAPD_TE
) {
1042 l2
->tm
->tei_m
.fsm
= &teifsmu
;
1043 l2
->tm
->tei_m
.state
= ST_TEI_NOP
;
1044 l2
->tm
->tval
= 1000; /* T201 1 sec */
1046 l2
->tm
->tei_m
.fsm
= &teifsmn
;
1047 l2
->tm
->tei_m
.state
= ST_TEI_NOP
;
1048 l2
->tm
->tval
= 2000; /* T202 2 sec */
1050 mISDN_FsmInitTimer(&l2
->tm
->tei_m
, &l2
->tm
->timer
);
1051 write_lock_irqsave(&mgr
->lock
, flags
);
1052 id
= get_free_id(mgr
);
1053 list_add_tail(&l2
->list
, &mgr
->layer2
);
1054 write_unlock_irqrestore(&mgr
->lock
, flags
);
1056 l2
->ch
.ctrl(&l2
->ch
, CLOSE_CHANNEL
, NULL
);
1067 mgr_send(struct mISDNchannel
*ch
, struct sk_buff
*skb
)
1069 struct manager
*mgr
;
1070 struct mISDNhead
*hh
= mISDN_HEAD_P(skb
);
1073 mgr
= container_of(ch
, struct manager
, ch
);
1074 if (*debug
& DEBUG_L2_RECV
)
1075 printk(KERN_DEBUG
"%s: prim(%x) id(%x)\n",
1076 __func__
, hh
->prim
, hh
->id
);
1079 mISDN_FsmEvent(&mgr
->deact
, EV_UI
, NULL
);
1080 ret
= ph_data_ind(mgr
, skb
);
1083 do_ack(mgr
, hh
->id
);
1086 case PH_ACTIVATE_IND
:
1087 test_and_set_bit(MGR_PH_ACTIVE
, &mgr
->options
);
1088 mISDN_FsmEvent(&mgr
->deact
, EV_ACTIVATE_IND
, NULL
);
1092 case PH_DEACTIVATE_IND
:
1093 test_and_clear_bit(MGR_PH_ACTIVE
, &mgr
->options
);
1094 mISDN_FsmEvent(&mgr
->deact
, EV_DEACTIVATE_IND
, NULL
);
1097 case DL_UNITDATA_REQ
:
1098 return dl_unit_data(mgr
, skb
);
1106 free_teimanager(struct manager
*mgr
)
1108 struct layer2
*l2
, *nl2
;
1110 test_and_clear_bit(OPTION_L1_HOLD
, &mgr
->options
);
1111 if (test_bit(MGR_OPT_NETWORK
, &mgr
->options
)) {
1112 /* not locked lock is taken in release tei */
1114 if (test_bit(OPTION_L2_CLEANUP
, &mgr
->options
)) {
1115 list_for_each_entry_safe(l2
, nl2
, &mgr
->layer2
, list
) {
1116 put_tei_msg(mgr
, ID_REMOVE
, 0, l2
->tei
);
1117 mutex_lock(&mgr
->ch
.st
->lmutex
);
1118 list_del(&l2
->ch
.list
);
1119 mutex_unlock(&mgr
->ch
.st
->lmutex
);
1120 l2
->ch
.ctrl(&l2
->ch
, CLOSE_CHANNEL
, NULL
);
1122 test_and_clear_bit(MGR_OPT_NETWORK
, &mgr
->options
);
1124 list_for_each_entry_safe(l2
, nl2
, &mgr
->layer2
, list
) {
1129 if (test_bit(MGR_OPT_USER
, &mgr
->options
)) {
1130 if (list_empty(&mgr
->layer2
))
1131 test_and_clear_bit(MGR_OPT_USER
, &mgr
->options
);
1133 mgr
->ch
.st
->dev
->D
.ctrl(&mgr
->ch
.st
->dev
->D
, CLOSE_CHANNEL
, NULL
);
1138 ctrl_teimanager(struct manager
*mgr
, void *arg
)
1140 /* currently we only have one option */
1141 int *val
= (int *)arg
;
1147 test_and_set_bit(OPTION_L2_CLEANUP
, &mgr
->options
);
1149 test_and_clear_bit(OPTION_L2_CLEANUP
, &mgr
->options
);
1153 test_and_set_bit(OPTION_L1_HOLD
, &mgr
->options
);
1155 test_and_clear_bit(OPTION_L1_HOLD
, &mgr
->options
);
1163 /* This function does create a L2 for fixed TEI in NT Mode */
1165 check_data(struct manager
*mgr
, struct sk_buff
*skb
)
1167 struct mISDNhead
*hh
= mISDN_HEAD_P(skb
);
1171 if (*debug
& DEBUG_L2_CTRL
)
1172 printk(KERN_DEBUG
"%s: prim(%x) id(%x)\n",
1173 __func__
, hh
->prim
, hh
->id
);
1174 if (test_bit(MGR_OPT_USER
, &mgr
->options
))
1176 if (hh
->prim
!= PH_DATA_IND
)
1180 if (skb
->data
[0] & 3) /* EA0 and CR must be 0 */
1182 sapi
= skb
->data
[0] >> 2;
1183 if (!(skb
->data
[1] & 1)) /* invalid EA1 */
1185 tei
= skb
->data
[1] >> 1;
1186 if (tei
> 63) /* not a fixed tei */
1188 if ((skb
->data
[2] & ~0x10) != SABME
)
1190 /* We got a SABME for a fixed TEI */
1191 if (*debug
& DEBUG_L2_CTRL
)
1192 printk(KERN_DEBUG
"%s: SABME sapi(%d) tei(%d)\n",
1193 __func__
, sapi
, tei
);
1194 l2
= create_new_tei(mgr
, tei
, sapi
);
1196 if (*debug
& DEBUG_L2_CTRL
)
1197 printk(KERN_DEBUG
"%s: failed to create new tei\n",
1201 ret
= l2
->ch
.send(&l2
->ch
, skb
);
1206 delete_teimanager(struct mISDNchannel
*ch
)
1208 struct manager
*mgr
;
1209 struct layer2
*l2
, *nl2
;
1211 mgr
= container_of(ch
, struct manager
, ch
);
1212 /* not locked lock is taken in release tei */
1213 list_for_each_entry_safe(l2
, nl2
, &mgr
->layer2
, list
) {
1214 mutex_lock(&mgr
->ch
.st
->lmutex
);
1215 list_del(&l2
->ch
.list
);
1216 mutex_unlock(&mgr
->ch
.st
->lmutex
);
1217 l2
->ch
.ctrl(&l2
->ch
, CLOSE_CHANNEL
, NULL
);
1219 list_del(&mgr
->ch
.list
);
1220 list_del(&mgr
->bcast
.list
);
1221 skb_queue_purge(&mgr
->sendq
);
1226 mgr_ctrl(struct mISDNchannel
*ch
, u_int cmd
, void *arg
)
1228 struct manager
*mgr
;
1231 mgr
= container_of(ch
, struct manager
, ch
);
1232 if (*debug
& DEBUG_L2_CTRL
)
1233 printk(KERN_DEBUG
"%s(%x, %p)\n", __func__
, cmd
, arg
);
1236 ret
= create_teimgr(mgr
, arg
);
1239 ret
= free_teimanager(mgr
);
1241 case CONTROL_CHANNEL
:
1242 ret
= ctrl_teimanager(mgr
, arg
);
1245 ret
= check_data(mgr
, arg
);
1252 mgr_bcast(struct mISDNchannel
*ch
, struct sk_buff
*skb
)
1254 struct manager
*mgr
= container_of(ch
, struct manager
, bcast
);
1255 struct mISDNhead
*hh
= mISDN_HEAD_P(skb
);
1256 struct sk_buff
*cskb
= NULL
;
1261 read_lock_irqsave(&mgr
->lock
, flags
);
1262 list_for_each_entry(l2
, &mgr
->layer2
, list
) {
1263 if ((hh
->id
& MISDN_ID_SAPI_MASK
) ==
1264 (l2
->ch
.addr
& MISDN_ID_SAPI_MASK
)) {
1265 if (list_is_last(&l2
->list
, &mgr
->layer2
)) {
1270 cskb
= skb_copy(skb
, GFP_KERNEL
);
1273 ret
= l2
->ch
.send(&l2
->ch
, cskb
);
1275 if (*debug
& DEBUG_SEND_ERR
)
1277 "%s ch%d prim(%x) addr(%x)"
1279 __func__
, l2
->ch
.nr
,
1280 hh
->prim
, l2
->ch
.addr
, ret
);
1284 printk(KERN_WARNING
"%s ch%d addr %x no mem\n",
1285 __func__
, ch
->nr
, ch
->addr
);
1291 read_unlock_irqrestore(&mgr
->lock
, flags
);
1293 dev_kfree_skb(cskb
);
1300 mgr_bcast_ctrl(struct mISDNchannel
*ch
, u_int cmd
, void *arg
)
1307 create_teimanager(struct mISDNdevice
*dev
)
1309 struct manager
*mgr
;
1311 mgr
= kzalloc(sizeof(struct manager
), GFP_KERNEL
);
1314 INIT_LIST_HEAD(&mgr
->layer2
);
1315 rwlock_init(&mgr
->lock
);
1316 skb_queue_head_init(&mgr
->sendq
);
1318 mgr
->lastid
= MISDN_ID_NONE
;
1319 mgr
->ch
.send
= mgr_send
;
1320 mgr
->ch
.ctrl
= mgr_ctrl
;
1321 mgr
->ch
.st
= dev
->D
.st
;
1322 set_channel_address(&mgr
->ch
, TEI_SAPI
, GROUP_TEI
);
1323 add_layer2(&mgr
->ch
, dev
->D
.st
);
1324 mgr
->bcast
.send
= mgr_bcast
;
1325 mgr
->bcast
.ctrl
= mgr_bcast_ctrl
;
1326 mgr
->bcast
.st
= dev
->D
.st
;
1327 set_channel_address(&mgr
->bcast
, 0, GROUP_TEI
);
1328 add_layer2(&mgr
->bcast
, dev
->D
.st
);
1329 mgr
->deact
.debug
= *debug
& DEBUG_MANAGER
;
1330 mgr
->deact
.userdata
= mgr
;
1331 mgr
->deact
.printdebug
= da_debug
;
1332 mgr
->deact
.fsm
= &deactfsm
;
1333 mgr
->deact
.state
= ST_L1_DEACT
;
1334 mISDN_FsmInitTimer(&mgr
->deact
, &mgr
->datimer
);
1335 dev
->teimgr
= &mgr
->ch
;
1339 int TEIInit(u_int
*deb
)
1342 teifsmu
.state_count
= TEI_STATE_COUNT
;
1343 teifsmu
.event_count
= TEI_EVENT_COUNT
;
1344 teifsmu
.strEvent
= strTeiEvent
;
1345 teifsmu
.strState
= strTeiState
;
1346 mISDN_FsmNew(&teifsmu
, TeiFnListUser
, ARRAY_SIZE(TeiFnListUser
));
1347 teifsmn
.state_count
= TEI_STATE_COUNT
;
1348 teifsmn
.event_count
= TEI_EVENT_COUNT
;
1349 teifsmn
.strEvent
= strTeiEvent
;
1350 teifsmn
.strState
= strTeiState
;
1351 mISDN_FsmNew(&teifsmn
, TeiFnListNet
, ARRAY_SIZE(TeiFnListNet
));
1352 deactfsm
.state_count
= DEACT_STATE_COUNT
;
1353 deactfsm
.event_count
= DEACT_EVENT_COUNT
;
1354 deactfsm
.strEvent
= strDeactEvent
;
1355 deactfsm
.strState
= strDeactState
;
1356 mISDN_FsmNew(&deactfsm
, DeactFnList
, ARRAY_SIZE(DeactFnList
));
1362 mISDN_FsmFree(&teifsmu
);
1363 mISDN_FsmFree(&teifsmn
);
1364 mISDN_FsmFree(&deactfsm
);