19 #include <linux/slab.h>
29 static char *strL2State[] =
68 #define L2_EVENT_COUNT (EV_L2_FRAME_ERROR + 1)
70 static char *strL2Event[] =
83 "EV_L2_DL_ESTABLISH_REQ",
84 "EV_L2_DL_RELEASE_REQ",
94 "EV_L2_CLEAR_OWN_BUSY",
105 if (!(*
debug & DEBUG_L2_FSM))
133 l2_newid(
struct layer2 *l2)
153 mISDN_HEAD_PRIM(skb) =
prim;
154 mISDN_HEAD_ID(skb) = (l2->
ch.nr << 16) | l2->
ch.addr;
155 err = l2->
up->send(l2->
up, skb);
175 hh = mISDN_HEAD_P(skb);
177 hh->
id = (l2->
ch.nr << 16) | l2->
ch.addr;
180 err = l2->
up->send(l2->
up, skb);
192 ret = l2->
ch.recv(l2->
ch.peer, skb);
193 if (ret && (*
debug & DEBUG_L2_RECV))
202 struct mISDNhead *hh = mISDN_HEAD_P(skb);
209 l2->
down_id = mISDN_HEAD_ID(skb);
211 return l2down_skb(l2, skb);
217 struct mISDNhead *hh = mISDN_HEAD_P(skb);
221 return l2down_raw(l2, skb);
234 hh = mISDN_HEAD_P(skb);
239 err = l2down_raw(l2, skb);
254 l2->
down_id = mISDN_HEAD_ID(nskb);
255 if (l2down_skb(l2, nskb)) {
274 l2->
down_id = mISDN_HEAD_ID(nskb);
275 if (l2down_skb(l2, nskb)) {
300 hh = mISDN_HEAD_P(skb);
308 l2->
ch.st->own.recv(&l2->
ch.st->own, skb);
332 set_peer_busy(
struct layer2 *l2) {
339 clear_peer_busy(
struct layer2 *l2) {
345 InitWin(
struct layer2 *l2)
354 freewin(
struct layer2 *l2)
369 ReleaseWin(
struct layer2 *l2)
371 int cnt = freewin(l2);
375 "isdnl2 freed %d skbuffs in release\n", cnt);
384 p1 = (l2->
vs - l2->
va) % 128;
386 p1 = (l2->
vs - l2->
va) % 8;
408 *ptr++ = (l2->
sapi << 2) | (crbit ? 2 : 0);
409 *ptr++ = (l2->
tei << 1) | 1;
441 return (data[0] & 0xef) ==
UI;
447 return (data[0] & 0xef) ==
UA;
453 return (data[0] & 0xef) ==
DM;
459 return (data[0] & 0xef) ==
DISC;
466 return data[0] ==
RR;
468 return (data[0] & 0xf) == 1;
478 return ((d & 0xf3) == 1) && ((d & 0x0c) != 0x0c);
493 data[0] ==
REJ : (data[0] & 0xf) ==
REJ;
499 return (data[0] & 0xef) ==
FRMR;
506 data[0] ==
RNR : (data[0] & 0xf) ==
RNR;
513 int rsp = *skb->
data & 0x2;
537 unnum_error(
struct layer2 *l2,
struct sk_buff *skb,
int wantrsp)
539 int rsp = (*skb->
data & 0x2) >> 1;
552 int rsp = *skb->
data & 0x2;
567 int rsp = *skb->
data & 0x2;
574 if (skb->
len < headers + 5)
576 else if (*
debug & DEBUG_L2)
578 "FRMR information %2x %2x %2x %2x %2x",
579 datap[0], datap[1], datap[2], datap[3], datap[4]);
581 if (skb->
len < headers + 3)
583 else if (*
debug & DEBUG_L2)
585 "FRMR information %2x %2x %2x",
586 datap[0], datap[1], datap[2]);
592 legalnr(
struct layer2 *l2,
unsigned int nr)
595 return ((nr - l2->
va) % 128) <= ((l2->
vs - l2->
va) % 128);
597 return ((nr - l2->
va) % 8) <= ((l2->
vs - l2->
va) % 8);
601 setva(
struct layer2 *l2,
unsigned int nr)
605 while (l2->
va != nr) {
631 i = sethdraddr(l2, tmp, cr);
644 enqueue_super(l2, skb);
694 l2up_create(l2, pr, 0,
NULL);
702 l2up_create(l2, f, 0,
NULL);
706 establishlink(
struct FsmInst *fi)
714 send_uframe(l2,
NULL, cmd,
CMD);
723 l2_mdl_error_ua(
struct FsmInst *fi,
int event,
void *arg)
736 l2_mdl_error_dm(
struct FsmInst *fi,
int event,
void *arg)
751 l2_st8_mdl_error_dm(
struct FsmInst *fi,
int event,
void *arg)
765 l2_go_st3(
struct FsmInst *fi,
int event,
void *arg)
767 dev_kfree_skb((
struct sk_buff *)arg);
772 l2_mdl_assign(
struct FsmInst *fi,
int event,
void *arg)
777 dev_kfree_skb((
struct sk_buff *)arg);
782 l2_queue_ui_assign(
struct FsmInst *fi,
int event,
void *arg)
793 l2_queue_ui(
struct FsmInst *fi,
int event,
void *arg)
808 i = sethdraddr(l2, header,
CMD);
819 l2_send_ui(
struct FsmInst *fi,
int event,
void *arg)
829 l2_got_ui(
struct FsmInst *fi,
int event,
void *arg)
845 l2_establish(
struct FsmInst *fi,
int event,
void *arg)
856 l2_discard_i_setl3(
struct FsmInst *fi,
int event,
void *arg)
868 l2_l3_reestablish(
struct FsmInst *fi,
int event,
void *arg)
880 l2_release(
struct FsmInst *fi,
int event,
void *arg)
890 l2_pend_rel(
struct FsmInst *fi,
int event,
void *arg)
900 l2_disconnect(
struct FsmInst *fi,
int event,
void *arg)
917 l2_start_multi(
struct FsmInst *fi,
int event,
void *arg)
937 l2_send_UA(
struct FsmInst *fi,
int event,
void *arg)
946 l2_send_DM(
struct FsmInst *fi,
int event,
void *arg)
955 l2_restart_multi(
struct FsmInst *fi,
int event,
void *arg)
965 if (l2->
vs != l2->
va) {
990 l2_stop_multi(
struct FsmInst *fi,
int event,
void *arg)
1008 l2_connected(
struct FsmInst *fi,
int event,
void *arg)
1015 l2_mdl_error_ua(fi, event, arg);
1020 l2_disconnect(fi, event,
NULL);
1023 }
else if (l2->
vs != l2->
va) {
1035 l2up_create(l2, pr, 0,
NULL);
1045 l2_released(
struct FsmInst *fi,
int event,
void *arg)
1051 l2_mdl_error_ua(fi, event, arg);
1063 l2_reestablish(
struct FsmInst *fi,
int event,
void *arg)
1075 l2_st5_dm_release(
struct FsmInst *fi,
int event,
void *arg)
1086 l2_newid(l2), 0,
NULL);
1095 l2_st6_dm_release(
struct FsmInst *fi,
int event,
void *arg)
1116 i = sethdraddr(l2, tmp, cr);
1119 tmp[i++] = (l2->
vr << 1) | (pf ? 1 : 0);
1121 tmp[i++] = (l2->
vr << 5) | typ | (pf ? 0x10 : 0);
1129 enqueue_super(l2, skb);
1136 enquiry_cr(l2,
RNR,
RSP, 1);
1138 enquiry_cr(l2,
RR,
RSP, 1);
1146 enquiry_cr(l2,
RNR,
CMD, 1);
1148 enquiry_cr(l2,
RR,
CMD, 1);
1155 nrerrorrecovery(
struct FsmInst *fi)
1165 invoke_retransmission(
struct layer2 *l2,
unsigned int nr)
1170 while (l2->
vs != nr) {
1174 p1 = (l2->
vs - l2->
va) % 128;
1177 p1 = (l2->
vs - l2->
va) % 8;
1184 "%s: windowar[%d] is NULL\n",
1193 l2_st7_got_super(
struct FsmInst *fi,
int event,
void *arg)
1197 int PollFlag,
rsp, typ =
RR;
1200 rsp = *skb->
data & 0x2;
1209 clear_peer_busy(l2);
1214 PollFlag = (skb->
data[1] & 0x1) == 0x1;
1215 nr = skb->
data[1] >> 1;
1217 PollFlag = (skb->
data[0] & 0x10);
1218 nr = (skb->
data[0] >> 5) & 0x7;
1228 if (legalnr(l2, nr)) {
1231 invoke_retransmission(l2, nr);
1235 l2m_debug(&l2->
l2m,
"Restart T203 ST7 REJ");
1236 }
else if ((nr == l2->
vs) && (typ ==
RR)) {
1241 }
else if ((l2->
va != nr) || (typ ==
RNR)) {
1247 if (skb_queue_len(&l2->
i_queue) && (typ ==
RR))
1250 nrerrorrecovery(fi);
1254 l2_feed_i_if_reest(
struct FsmInst *fi,
int event,
void *arg)
1266 l2_feed_i_pull(
struct FsmInst *fi,
int event,
void *arg)
1276 l2_feed_iqueue(
struct FsmInst *fi,
int event,
void *arg)
1285 l2_got_iframe(
struct FsmInst *fi,
int event,
void *arg)
1294 PollFlag = ((skb->
data[i + 1] & 0x1) == 0x1);
1295 ns = skb->
data[
i] >> 1;
1296 nr = (skb->
data[i + 1] >> 1) & 0x7f;
1298 PollFlag = (skb->
data[
i] & 0x10);
1299 ns = (skb->
data[
i] >> 1) & 0x7;
1300 nr = (skb->
data[
i] >> 5) & 0x7;
1327 enquiry_cr(l2,
REJ,
RSP, PollFlag);
1332 if (legalnr(l2, nr)) {
1339 }
else if (nr != l2->
va)
1344 nrerrorrecovery(fi);
1350 enquiry_cr(l2,
RR,
RSP, 0);
1354 l2_got_tei(
struct FsmInst *fi,
int event,
void *arg)
1373 l2_st5_tout_200(
struct FsmInst *fi,
int event,
void *arg)
1380 }
else if (l2->
rc == l2->
N200) {
1387 l2_newid(l2), 0,
NULL);
1400 l2_st6_tout_200(
struct FsmInst *fi,
int event,
void *arg)
1407 }
else if (l2->
rc == l2->
N200) {
1423 l2_st7_tout_200(
struct FsmInst *fi,
int event,
void *arg)
1440 l2_st8_tout_200(
struct FsmInst *fi,
int event,
void *arg)
1450 if (l2->
rc == l2->
N200) {
1461 l2_st7_tout_203(
struct FsmInst *fi,
int event,
void *arg)
1476 l2_pull_iqueue(
struct FsmInst *fi,
int event,
void *arg)
1491 p1 = (l2->
vs - l2->
va) % 128;
1493 p1 = (l2->
vs - l2->
va) % 8;
1501 i = sethdraddr(l2, header,
CMD);
1503 header[i++] = l2->
vs << 1;
1504 header[i++] = l2->
vr << 1;
1505 l2->
vs = (l2->
vs + 1) % 128;
1507 header[i++] = (l2->
vr << 5) | (l2->
vs << 1);
1508 l2->
vs = (l2->
vs + 1) % 8;
1512 p1 = skb_headroom(nskb);
1517 "%s: L2 pull_iqueue skb header(%d/%d) too short\n",
1522 dev_kfree_skb(oskb);
1529 dev_kfree_skb(oskb);
1540 l2_st8_got_super(
struct FsmInst *fi,
int event,
void *arg)
1544 int PollFlag,
rsp, rnr = 0;
1547 rsp = *skb->
data & 0x2;
1557 clear_peer_busy(l2);
1560 PollFlag = (skb->
data[1] & 0x1) == 0x1;
1561 nr = skb->
data[1] >> 1;
1563 PollFlag = (skb->
data[0] & 0x10);
1564 nr = (skb->
data[0] >> 5) & 0x7;
1567 if (rsp && PollFlag) {
1568 if (legalnr(l2, nr)) {
1577 invoke_retransmission(l2, nr);
1582 nrerrorrecovery(fi);
1584 if (!rsp && PollFlag)
1586 if (legalnr(l2, nr))
1589 nrerrorrecovery(fi);
1594 l2_got_FRMR(
struct FsmInst *fi,
int event,
void *arg)
1601 if (!(skb->
data[0] & 1) || ((skb->
data[0] & 3) == 1) ||
1611 l2_st24_tei_remove(
struct FsmInst *fi,
int event,
void *arg)
1621 l2_st3_tei_remove(
struct FsmInst *fi,
int event,
void *arg)
1632 l2_st5_tei_remove(
struct FsmInst *fi,
int event,
void *arg)
1646 l2_st6_tei_remove(
struct FsmInst *fi,
int event,
void *arg)
1658 l2_tei_remove(
struct FsmInst *fi,
int event,
void *arg)
1677 l2_st14_persistent_da(
struct FsmInst *fi,
int event,
void *arg)
1691 l2_st5_persistent_da(
struct FsmInst *fi,
int event,
void *arg)
1708 l2_st6_persistent_da(
struct FsmInst *fi,
int event,
void *arg)
1722 l2_persistent_da(
struct FsmInst *fi,
int event,
void *arg)
1739 l2_set_own_busy(
struct FsmInst *fi,
int event,
void *arg)
1745 enquiry_cr(l2,
RNR,
RSP, 0);
1753 l2_clear_own_busy(
struct FsmInst *fi,
int event,
void *arg)
1759 enquiry_cr(l2,
RR,
RSP, 0);
1767 l2_frame_error(
struct FsmInst *fi,
int event,
void *arg)
1775 l2_frame_error_reest(
struct FsmInst *fi,
int event,
void *arg)
1784 static struct FsmNode L2FnList[] =
1891 if (skb->
len <= l) {
1898 if ((psapi & 1) || !(ptei & 1)) {
1900 "%s l2 D-channel frame wrong EA0/EA1\n",
1906 if (psapi != l2->
sapi) {
1908 if (*
debug & DEBUG_L2)
1917 if (*
debug & DEBUG_L2)
1925 if (!(*datap & 1)) {
1926 c = iframe_error(l2, skb);
1930 c = super_error(l2, skb);
1933 }
else if (
IsUI(datap)) {
1934 c = UI_error(l2, skb);
1937 }
else if (
IsSABME(datap, l2)) {
1938 c = unnum_error(l2, skb,
CMD);
1941 }
else if (
IsUA(datap)) {
1942 c = unnum_error(l2, skb,
RSP);
1945 }
else if (
IsDISC(datap)) {
1946 c = unnum_error(l2, skb,
CMD);
1949 }
else if (
IsDM(datap)) {
1950 c = unnum_error(l2, skb,
RSP);
1953 }
else if (
IsFRMR(datap)) {
1954 c = FRMR_error(l2, skb);
1968 l2_send(
struct mISDNchannel *ch,
struct sk_buff *skb)
1971 struct mISDNhead *hh = mISDN_HEAD_P(skb);
1974 if (*
debug & DEBUG_L2_RECV)
1982 if (*
debug & DEBUG_L2_RECV)
1988 ret = ph_data_indication(l2, hh, skb);
1991 ret = ph_data_confirm(l2, hh, skb);
2008 ret = l2->
up->send(l2->
up, skb);
2037 l2_newid(l2), 0,
NULL);
2048 if (*
debug & DEBUG_L2)
2049 l2m_debug(&l2->
l2m,
"l2 unknown pr %04x",
2064 if (*
debug & DEBUG_L2_TEI)
2088 release_l2(
struct layer2 *l2)
2099 l2->
ch.st->dev->D.ctrl(&l2->
ch.st->dev->D,
2106 l2_ctrl(
struct mISDNchannel *ch,
u_int cmd,
void *arg)
2111 if (*
debug & DEBUG_L2_CTRL)
2121 sizeof(info), &info);
2138 struct channel_req rq;
2149 l2->ch.send = l2_send;
2150 l2->ch.ctrl = l2_ctrl;
2175 l2->ch.st->dev->D.ctrl(&l2->ch.st->dev->D,
OPEN_CHANNEL, &rq);
2200 l2->ch.st->dev->D.ctrl(&l2->ch.st->dev->D,
OPEN_CHANNEL, &rq);
2218 skb_queue_head_init(&l2->i_queue);
2219 skb_queue_head_init(&l2->ui_queue);
2220 skb_queue_head_init(&l2->down_queue);
2221 skb_queue_head_init(&l2->tmp_queue);
2223 l2->l2m.fsm = &l2fsm;
2230 l2->l2m.debug = *
debug;
2231 l2->l2m.userdata =
l2;
2232 l2->l2m.userint = 0;
2233 l2->l2m.printdebug = l2m_debug;
2241 x75create(
struct channel_req *crq)
2247 l2 =
create_l2(crq->ch, crq->protocol, 0, 0, 0);
2255 static struct Bprotocol X75SLP = {