l3ni1.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:79k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: l3ni1.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
  2.  *
  3.  * NI1 D-channel protocol
  4.  *
  5.  * Author       Matt Henderson & Guy Ellis
  6.  * Copyright    by Traverse Technologies Pty Ltd, www.travers.com.au
  7.  * 
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  *
  11.  * 2000.6.6 Initial implementation of routines for US NI1 
  12.  * Layer 3 protocol based on the EURO/DSS1 D-channel protocol 
  13.  * driver written by Karsten Keil et al.  
  14.  * NI-1 Hall of Fame - Thanks to.... 
  15.  * Ragnar Paulson - for some handy code fragments
  16.  * Will Scales - beta tester extraordinaire
  17.  * Brett Whittacre - beta tester and remote devel system in Vegas
  18.  *
  19.  */
  20. #define __NO_VERSION__
  21. #include "hisax.h"
  22. #include "isdnl3.h"
  23. #include "l3ni1.h"
  24. #include <linux/ctype.h>
  25. extern char *HiSax_getrev(const char *revision);
  26. const char *ni1_revision = "$Revision: 1.1.4.1 $";
  27. #define EXT_BEARER_CAPS 1
  28. #define MsgHead(ptr, cref, mty) 
  29. *ptr++ = 0x8; 
  30. if (cref == -1) { 
  31. *ptr++ = 0x0; 
  32. } else { 
  33. *ptr++ = 0x1; 
  34. *ptr++ = cref^0x80; 
  35. *ptr++ = mty
  36. /**********************************************/
  37. /* get a new invoke id for remote operations. */
  38. /* Only a return value != 0 is valid          */
  39. /**********************************************/
  40. static unsigned char new_invoke_id(struct PStack *p)
  41. {
  42. unsigned char retval;
  43. unsigned long flags;
  44. int i;
  45.   
  46. i = 32; /* maximum search depth */
  47. save_flags(flags);
  48. cli();
  49. retval = p->prot.ni1.last_invoke_id + 1; /* try new id */
  50. while ((i) && (p->prot.ni1.invoke_used[retval >> 3] == 0xFF)) {
  51. p->prot.ni1.last_invoke_id = (retval & 0xF8) + 8;
  52. i--;
  53. }  
  54. if (i) {
  55. while (p->prot.ni1.invoke_used[retval >> 3] & (1 << (retval & 7)))
  56. retval++; 
  57. } else
  58. retval = 0;
  59. p->prot.ni1.last_invoke_id = retval;
  60. p->prot.ni1.invoke_used[retval >> 3] |= (1 << (retval & 7));
  61. restore_flags(flags);
  62. return(retval);  
  63. } /* new_invoke_id */
  64. /*************************/
  65. /* free a used invoke id */
  66. /*************************/
  67. static void free_invoke_id(struct PStack *p, unsigned char id)
  68. { unsigned long flags;
  69.   if (!id) return; /* 0 = invalid value */
  70.   save_flags(flags);
  71.   cli();
  72.   p->prot.ni1.invoke_used[id >> 3] &= ~(1 << (id & 7));
  73.   restore_flags(flags);
  74. } /* free_invoke_id */  
  75. /**********************************************************/
  76. /* create a new l3 process and fill in ni1 specific data */
  77. /**********************************************************/
  78. static struct l3_process
  79. *ni1_new_l3_process(struct PStack *st, int cr)
  80. {  struct l3_process *proc;
  81.    if (!(proc = new_l3_process(st, cr))) 
  82.      return(NULL);
  83.    proc->prot.ni1.invoke_id = 0;
  84.    proc->prot.ni1.remote_operation = 0;
  85.    proc->prot.ni1.uus1_data[0] = '';
  86.    
  87.    return(proc);
  88. } /* ni1_new_l3_process */
  89. /************************************************/
  90. /* free a l3 process and all ni1 specific data */
  91. /************************************************/ 
  92. static void
  93. ni1_release_l3_process(struct l3_process *p)
  94. {
  95.    free_invoke_id(p->st,p->prot.ni1.invoke_id);
  96.    release_l3_process(p);
  97. } /* ni1_release_l3_process */
  98.  
  99. /********************************************************/
  100. /* search a process with invoke id id and dummy callref */
  101. /********************************************************/
  102. static struct l3_process *
  103. l3ni1_search_dummy_proc(struct PStack *st, int id)
  104. { struct l3_process *pc = st->l3.proc; /* start of processes */
  105.   if (!id) return(NULL);
  106.   while (pc)
  107.    { if ((pc->callref == -1) && (pc->prot.ni1.invoke_id == id))
  108.        return(pc);
  109.      pc = pc->next;
  110.    } 
  111.   return(NULL);
  112. } /* l3ni1_search_dummy_proc */
  113. /*******************************************************************/
  114. /* called when a facility message with a dummy callref is received */
  115. /* and a return result is delivered. id specifies the invoke id.   */
  116. /*******************************************************************/ 
  117. static void 
  118. l3ni1_dummy_return_result(struct PStack *st, int id, u_char *p, u_char nlen)
  119. { isdn_ctrl ic;
  120.   struct IsdnCardState *cs;
  121.   struct l3_process *pc = NULL; 
  122.   if ((pc = l3ni1_search_dummy_proc(st, id)))
  123.    { L3DelTimer(&pc->timer); /* remove timer */
  124.      cs = pc->st->l1.hardware;
  125.      ic.driver = cs->myid;
  126.      ic.command = ISDN_STAT_PROT;
  127.      ic.arg = NI1_STAT_INVOKE_RES;
  128.      ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
  129.      ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
  130.      ic.parm.ni1_io.proc = pc->prot.ni1.proc;
  131.      ic.parm.ni1_io.timeout= 0;
  132.      ic.parm.ni1_io.datalen = nlen;
  133.      ic.parm.ni1_io.data = p;
  134.      free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
  135.      pc->prot.ni1.invoke_id = 0; /* reset id */
  136.      cs->iif.statcallb(&ic);
  137.      ni1_release_l3_process(pc); 
  138.    }
  139.   else
  140.    l3_debug(st, "dummy return result id=0x%x result len=%d",id,nlen);
  141. } /* l3ni1_dummy_return_result */
  142. /*******************************************************************/
  143. /* called when a facility message with a dummy callref is received */
  144. /* and a return error is delivered. id specifies the invoke id.    */
  145. /*******************************************************************/ 
  146. static void 
  147. l3ni1_dummy_error_return(struct PStack *st, int id, ulong error)
  148. { isdn_ctrl ic;
  149.   struct IsdnCardState *cs;
  150.   struct l3_process *pc = NULL; 
  151.   if ((pc = l3ni1_search_dummy_proc(st, id)))
  152.    { L3DelTimer(&pc->timer); /* remove timer */
  153.      cs = pc->st->l1.hardware;
  154.      ic.driver = cs->myid;
  155.      ic.command = ISDN_STAT_PROT;
  156.      ic.arg = NI1_STAT_INVOKE_ERR;
  157.      ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
  158.      ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
  159.      ic.parm.ni1_io.proc = pc->prot.ni1.proc;
  160.      ic.parm.ni1_io.timeout= error;
  161.      ic.parm.ni1_io.datalen = 0;
  162.      ic.parm.ni1_io.data = NULL;
  163.      free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
  164.      pc->prot.ni1.invoke_id = 0; /* reset id */
  165.      cs->iif.statcallb(&ic);
  166.      ni1_release_l3_process(pc); 
  167.    }
  168.   else
  169.    l3_debug(st, "dummy return error id=0x%x error=0x%lx",id,error);
  170. } /* l3ni1_error_return */
  171. /*******************************************************************/
  172. /* called when a facility message with a dummy callref is received */
  173. /* and a invoke is delivered. id specifies the invoke id.          */
  174. /*******************************************************************/ 
  175. static void 
  176. l3ni1_dummy_invoke(struct PStack *st, int cr, int id, 
  177.                     int ident, u_char *p, u_char nlen)
  178. { isdn_ctrl ic;
  179.   struct IsdnCardState *cs;
  180.   l3_debug(st, "dummy invoke %s id=0x%x ident=0x%x datalen=%d",
  181.                (cr == -1) ? "local" : "broadcast",id,ident,nlen);
  182.   if (cr >= -1) return; /* ignore local data */
  183.   cs = st->l1.hardware;
  184.   ic.driver = cs->myid;
  185.   ic.command = ISDN_STAT_PROT;
  186.   ic.arg = NI1_STAT_INVOKE_BRD;
  187.   ic.parm.ni1_io.hl_id = id;
  188.   ic.parm.ni1_io.ll_id = 0;
  189.   ic.parm.ni1_io.proc = ident;
  190.   ic.parm.ni1_io.timeout= 0;
  191.   ic.parm.ni1_io.datalen = nlen;
  192.   ic.parm.ni1_io.data = p;
  193.   cs->iif.statcallb(&ic);
  194. } /* l3ni1_dummy_invoke */
  195. static void
  196. l3ni1_parse_facility(struct PStack *st, struct l3_process *pc,
  197.                       int cr, u_char * p)
  198. {
  199. int qd_len = 0;
  200. unsigned char nlen = 0, ilen, cp_tag;
  201. int ident, id;
  202. ulong err_ret;
  203. if (pc) 
  204. st = pc->st; /* valid Stack */
  205. else
  206. if ((!st) || (cr >= 0)) return; /* neither pc nor st specified */
  207. p++;
  208. qd_len = *p++;
  209. if (qd_len == 0) {
  210. l3_debug(st, "qd_len == 0");
  211. return;
  212. }
  213. if ((*p & 0x1F) != 0x11) { /* Service discriminator, supplementary service */
  214. l3_debug(st, "supplementary service != 0x11");
  215. return;
  216. }
  217. while (qd_len > 0 && !(*p & 0x80)) { /* extension ? */
  218. p++;
  219. qd_len--;
  220. }
  221. if (qd_len < 2) {
  222. l3_debug(st, "qd_len < 2");
  223. return;
  224. }
  225. p++;
  226. qd_len--;
  227. if ((*p & 0xE0) != 0xA0) { /* class and form */
  228. l3_debug(st, "class and form != 0xA0");
  229. return;
  230. }
  231.        
  232.         cp_tag = *p & 0x1F; /* remember tag value */
  233.         p++;
  234. qd_len--;
  235. if (qd_len < 1) 
  236.           { l3_debug(st, "qd_len < 1");
  237.     return;
  238.   }
  239. if (*p & 0x80) 
  240.           { /* length format indefinite or limited */
  241.     nlen = *p++ & 0x7F; /* number of len bytes or indefinite */
  242.             if ((qd_len-- < ((!nlen) ? 3 : (1 + nlen))) ||
  243.                 (nlen > 1))   
  244.      { l3_debug(st, "length format error or not implemented");
  245.        return;
  246.              }
  247.             if (nlen == 1)
  248.      { nlen = *p++; /* complete length */
  249.                qd_len--;
  250.              } 
  251.             else
  252.      { qd_len -= 2; /* trailing null bytes */
  253.                if ((*(p+qd_len)) || (*(p+qd_len+1)))
  254. { l3_debug(st,"length format indefinite error");
  255.                   return;
  256.                 }
  257.                nlen = qd_len;
  258.              }
  259.   }
  260.         else
  261.   { nlen = *p++;
  262.     qd_len--;
  263.           } 
  264. if (qd_len < nlen) 
  265.           { l3_debug(st, "qd_len < nlen");
  266.     return;
  267.   }
  268. qd_len -= nlen;
  269. if (nlen < 2) 
  270.           { l3_debug(st, "nlen < 2");
  271.     return;
  272.   }
  273.         if (*p != 0x02) 
  274.           {  /* invoke identifier tag */
  275.      l3_debug(st, "invoke identifier tag !=0x02");
  276.      return;
  277.   }
  278. p++;
  279. nlen--;
  280. if (*p & 0x80) 
  281.           { /* length format */
  282.     l3_debug(st, "invoke id length format 2");
  283.     return;
  284.   }
  285. ilen = *p++;
  286. nlen--;
  287. if (ilen > nlen || ilen == 0) 
  288.           { l3_debug(st, "ilen > nlen || ilen == 0");
  289.     return;
  290.   }
  291. nlen -= ilen;
  292. id = 0;
  293. while (ilen > 0) 
  294.           { id = (id << 8) | (*p++ & 0xFF); /* invoke identifier */
  295.     ilen--;
  296.   }
  297. switch (cp_tag) { /* component tag */
  298. case 1: /* invoke */
  299. if (nlen < 2) {
  300. l3_debug(st, "nlen < 2 22");
  301. return;
  302. }
  303. if (*p != 0x02) { /* operation value */
  304. l3_debug(st, "operation value !=0x02");
  305. return;
  306. }
  307. p++;
  308. nlen--;
  309. ilen = *p++;
  310. nlen--;
  311. if (ilen > nlen || ilen == 0) {
  312. l3_debug(st, "ilen > nlen || ilen == 0 22");
  313. return;
  314. }
  315. nlen -= ilen;
  316. ident = 0;
  317. while (ilen > 0) {
  318. ident = (ident << 8) | (*p++ & 0xFF);
  319. ilen--;
  320. }
  321. if (!pc) 
  322. {
  323. l3ni1_dummy_invoke(st, cr, id, ident, p, nlen);
  324. return;
  325. l3_debug(st, "invoke break");
  326. break;
  327. case 2: /* return result */
  328.  /* if no process available handle separately */ 
  329.                         if (!pc)
  330.  { if (cr == -1) 
  331.                              l3ni1_dummy_return_result(st, id, p, nlen);
  332.                            return; 
  333.                          }   
  334.                         if ((pc->prot.ni1.invoke_id) && (pc->prot.ni1.invoke_id == id))
  335.                           { /* Diversion successful */
  336.                             free_invoke_id(st,pc->prot.ni1.invoke_id);
  337.                             pc->prot.ni1.remote_result = 0; /* success */     
  338.                             pc->prot.ni1.invoke_id = 0;
  339.                             pc->redir_result = pc->prot.ni1.remote_result; 
  340.                             st->l3.l3l4(st, CC_REDIR | INDICATION, pc);                                  } /* Diversion successful */
  341.                         else
  342.                           l3_debug(st,"return error unknown identifier");
  343. break;
  344. case 3: /* return error */
  345.                             err_ret = 0;
  346.                     if (nlen < 2) 
  347.                               { l3_debug(st, "return error nlen < 2");
  348.                         return;
  349.                       }
  350.                             if (*p != 0x02) 
  351.                               { /* result tag */
  352.                         l3_debug(st, "invoke error tag !=0x02");
  353.                         return;
  354.                       }
  355.                     p++;
  356.                     nlen--;
  357.                     if (*p > 4) 
  358.                               { /* length format */
  359.                         l3_debug(st, "invoke return errlen > 4 ");
  360.                         return;
  361.                       }
  362.                     ilen = *p++;
  363.                     nlen--;
  364.                     if (ilen > nlen || ilen == 0) 
  365.                               { l3_debug(st, "error return ilen > nlen || ilen == 0");
  366.                         return;
  367.                        }
  368.                     nlen -= ilen;
  369.                     while (ilen > 0) 
  370.                              { err_ret = (err_ret << 8) | (*p++ & 0xFF); /* error value */
  371.                        ilen--;
  372.                      }
  373.  /* if no process available handle separately */ 
  374.                         if (!pc)
  375.  { if (cr == -1)
  376.                              l3ni1_dummy_error_return(st, id, err_ret);
  377.                            return; 
  378.                          }   
  379.                         if ((pc->prot.ni1.invoke_id) && (pc->prot.ni1.invoke_id == id))
  380.                           { /* Deflection error */
  381.                             free_invoke_id(st,pc->prot.ni1.invoke_id);
  382.                             pc->prot.ni1.remote_result = err_ret; /* result */
  383.                             pc->prot.ni1.invoke_id = 0; 
  384.                             pc->redir_result = pc->prot.ni1.remote_result; 
  385.                             st->l3.l3l4(st, CC_REDIR | INDICATION, pc);  
  386.                           } /* Deflection error */
  387.                         else
  388.                           l3_debug(st,"return result unknown identifier");
  389. break;
  390. default:
  391. l3_debug(st, "facility default break tag=0x%02x",cp_tag);
  392. break;
  393. }
  394. }
  395. static void
  396. l3ni1_message(struct l3_process *pc, u_char mt)
  397. {
  398. struct sk_buff *skb;
  399. u_char *p;
  400. if (!(skb = l3_alloc_skb(4)))
  401. return;
  402. p = skb_put(skb, 4);
  403. MsgHead(p, pc->callref, mt);
  404. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  405. }
  406. static void
  407. l3ni1_message_plus_chid(struct l3_process *pc, u_char mt)
  408. /* sends an l3 messages plus channel id -  added GE 05/09/00 */
  409. {
  410. struct sk_buff *skb;
  411. u_char tmp[16];
  412. u_char *p = tmp;
  413. u_char chid;
  414. chid = (u_char)(pc->para.bchannel & 0x03) | 0x88;
  415. MsgHead(p, pc->callref, mt);
  416. *p++ = IE_CHANNEL_ID;
  417. *p++ = 0x01;
  418. *p++ = chid;
  419. if (!(skb = l3_alloc_skb(7)))
  420. return;
  421. memcpy(skb_put(skb, 7), tmp, 7);
  422. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  423. }
  424. static void
  425. l3ni1_message_cause(struct l3_process *pc, u_char mt, u_char cause)
  426. {
  427. struct sk_buff *skb;
  428. u_char tmp[16];
  429. u_char *p = tmp;
  430. int l;
  431. MsgHead(p, pc->callref, mt);
  432. *p++ = IE_CAUSE;
  433. *p++ = 0x2;
  434. *p++ = 0x80;
  435. *p++ = cause | 0x80;
  436. l = p - tmp;
  437. if (!(skb = l3_alloc_skb(l)))
  438. return;
  439. memcpy(skb_put(skb, l), tmp, l);
  440. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  441. }
  442. static void
  443. l3ni1_status_send(struct l3_process *pc, u_char pr, void *arg)
  444. {
  445. u_char tmp[16];
  446. u_char *p = tmp;
  447. int l;
  448. struct sk_buff *skb;
  449. MsgHead(p, pc->callref, MT_STATUS);
  450. *p++ = IE_CAUSE;
  451. *p++ = 0x2;
  452. *p++ = 0x80;
  453. *p++ = pc->para.cause | 0x80;
  454. *p++ = IE_CALL_STATE;
  455. *p++ = 0x1;
  456. *p++ = pc->state & 0x3f;
  457. l = p - tmp;
  458. if (!(skb = l3_alloc_skb(l)))
  459. return;
  460. memcpy(skb_put(skb, l), tmp, l);
  461. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  462. }
  463. static void
  464. l3ni1_msg_without_setup(struct l3_process *pc, u_char pr, void *arg)
  465. {
  466. /* This routine is called if here was no SETUP made (checks in ni1up and in
  467.  * l3ni1_setup) and a RELEASE_COMPLETE have to be sent with an error code
  468.  * MT_STATUS_ENQUIRE in the NULL state is handled too
  469.  */
  470. u_char tmp[16];
  471. u_char *p = tmp;
  472. int l;
  473. struct sk_buff *skb;
  474. switch (pc->para.cause) {
  475. case 81: /* invalid callreference */
  476. case 88: /* incomp destination */
  477. case 96: /* mandory IE missing */
  478. case 100:       /* invalid IE contents */
  479. case 101: /* incompatible Callstate */
  480. MsgHead(p, pc->callref, MT_RELEASE_COMPLETE);
  481. *p++ = IE_CAUSE;
  482. *p++ = 0x2;
  483. *p++ = 0x80;
  484. *p++ = pc->para.cause | 0x80;
  485. break;
  486. default:
  487. printk(KERN_ERR "HiSax l3ni1_msg_without_setup wrong cause %dn",
  488. pc->para.cause);
  489. return;
  490. }
  491. l = p - tmp;
  492. if (!(skb = l3_alloc_skb(l)))
  493. return;
  494. memcpy(skb_put(skb, l), tmp, l);
  495. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  496. ni1_release_l3_process(pc);
  497. }
  498. static int ie_ALERTING[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
  499. IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_HLC,
  500. IE_USER_USER, -1};
  501. static int ie_CALL_PROCEEDING[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1,
  502. IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_HLC, -1};
  503. static int ie_CONNECT[] = {IE_BEARER, IE_CHANNEL_ID | IE_MANDATORY_1, 
  504. IE_FACILITY, IE_PROGRESS, IE_DISPLAY, IE_DATE, IE_SIGNAL,
  505. IE_CONNECT_PN, IE_CONNECT_SUB, IE_LLC, IE_HLC, IE_USER_USER, -1};
  506. static int ie_CONNECT_ACKNOWLEDGE[] = {IE_CHANNEL_ID, IE_DISPLAY, IE_SIGNAL, -1};
  507. static int ie_DISCONNECT[] = {IE_CAUSE | IE_MANDATORY, IE_FACILITY,
  508. IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
  509. static int ie_INFORMATION[] = {IE_COMPLETE, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL,
  510. IE_CALLED_PN, -1};
  511. static int ie_NOTIFY[] = {IE_BEARER, IE_NOTIFY | IE_MANDATORY, IE_DISPLAY, -1};
  512. static int ie_PROGRESS[] = {IE_BEARER, IE_CAUSE, IE_FACILITY, IE_PROGRESS |
  513. IE_MANDATORY, IE_DISPLAY, IE_HLC, IE_USER_USER, -1};
  514. static int ie_RELEASE[] = {IE_CAUSE | IE_MANDATORY_1, IE_FACILITY, IE_DISPLAY,
  515. IE_SIGNAL, IE_USER_USER, -1};
  516. /* a RELEASE_COMPLETE with errors don't require special actions 
  517. static int ie_RELEASE_COMPLETE[] = {IE_CAUSE | IE_MANDATORY_1, IE_DISPLAY, IE_SIGNAL, IE_USER_USER, -1};
  518. */
  519. static int ie_RESUME_ACKNOWLEDGE[] = {IE_CHANNEL_ID| IE_MANDATORY, IE_FACILITY,
  520. IE_DISPLAY, -1};
  521. static int ie_RESUME_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  522. static int ie_SETUP[] = {IE_COMPLETE, IE_BEARER  | IE_MANDATORY,
  523. IE_CHANNEL_ID| IE_MANDATORY, IE_FACILITY, IE_PROGRESS,
  524. IE_NET_FAC, IE_DISPLAY, IE_KEYPAD, IE_SIGNAL, IE_CALLING_PN,
  525. IE_CALLING_SUB, IE_CALLED_PN, IE_CALLED_SUB, IE_REDIR_NR,
  526. IE_LLC, IE_HLC, IE_USER_USER, -1};
  527. static int ie_SETUP_ACKNOWLEDGE[] = {IE_CHANNEL_ID | IE_MANDATORY, IE_FACILITY,
  528. IE_PROGRESS, IE_DISPLAY, IE_SIGNAL, -1};
  529. static int ie_STATUS[] = {IE_CAUSE | IE_MANDATORY, IE_CALL_STATE |
  530. IE_MANDATORY, IE_DISPLAY, -1};
  531. static int ie_STATUS_ENQUIRY[] = {IE_DISPLAY, -1};
  532. static int ie_SUSPEND_ACKNOWLEDGE[] = {IE_DISPLAY, IE_FACILITY, -1};
  533. static int ie_SUSPEND_REJECT[] = {IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  534. /* not used 
  535.  * static int ie_CONGESTION_CONTROL[] = {IE_CONGESTION | IE_MANDATORY,
  536.  * IE_CAUSE | IE_MANDATORY, IE_DISPLAY, -1};
  537.  * static int ie_USER_INFORMATION[] = {IE_MORE_DATA, IE_USER_USER | IE_MANDATORY, -1};
  538.  * static int ie_RESTART[] = {IE_CHANNEL_ID, IE_DISPLAY, IE_RESTART_IND |
  539.  * IE_MANDATORY, -1};
  540.  */
  541. static int ie_FACILITY[] = {IE_FACILITY | IE_MANDATORY, IE_DISPLAY, -1};
  542. static int comp_required[] = {1,2,3,5,6,7,9,10,11,14,15,-1};
  543. static int l3_valid_states[] = {0,1,2,3,4,6,7,8,9,10,11,12,15,17,19,25,-1};
  544. struct ie_len {
  545. int ie;
  546. int len;
  547. };
  548. static
  549. struct ie_len max_ie_len[] = {
  550. {IE_SEGMENT, 4},
  551. {IE_BEARER, 12},
  552. {IE_CAUSE, 32},
  553. {IE_CALL_ID, 10},
  554. {IE_CALL_STATE, 3},
  555. {IE_CHANNEL_ID, 34},
  556. {IE_FACILITY, 255},
  557. {IE_PROGRESS, 4},
  558. {IE_NET_FAC, 255},
  559. {IE_NOTIFY, 3},
  560. {IE_DISPLAY, 82},
  561. {IE_DATE, 8},
  562. {IE_KEYPAD, 34},
  563. {IE_SIGNAL, 3},
  564. {IE_INFORATE, 6},
  565. {IE_E2E_TDELAY, 11},
  566. {IE_TDELAY_SEL, 5},
  567. {IE_PACK_BINPARA, 3},
  568. {IE_PACK_WINSIZE, 4},
  569. {IE_PACK_SIZE, 4},
  570. {IE_CUG, 7},
  571. {IE_REV_CHARGE, 3},
  572. {IE_CALLING_PN, 24},
  573. {IE_CALLING_SUB, 23},
  574. {IE_CALLED_PN, 24},
  575. {IE_CALLED_SUB, 23},
  576. {IE_REDIR_NR, 255},
  577. {IE_TRANS_SEL, 255},
  578. {IE_RESTART_IND, 3},
  579. {IE_LLC, 18},
  580. {IE_HLC, 5},
  581. {IE_USER_USER, 131},
  582. {-1,0},
  583. };
  584. static int
  585. getmax_ie_len(u_char ie) {
  586. int i = 0;
  587. while (max_ie_len[i].ie != -1) {
  588. if (max_ie_len[i].ie == ie)
  589. return(max_ie_len[i].len);
  590. i++;
  591. }
  592. return(255);
  593. }
  594. static int
  595. ie_in_set(struct l3_process *pc, u_char ie, int *checklist) {
  596. int ret = 1;
  597. while (*checklist != -1) {
  598. if ((*checklist & 0xff) == ie) {
  599. if (ie & 0x80)
  600. return(-ret);
  601. else
  602. return(ret);
  603. }
  604. ret++;
  605. checklist++;
  606. }
  607. return(0);
  608. }
  609. static int
  610. check_infoelements(struct l3_process *pc, struct sk_buff *skb, int *checklist)
  611. {
  612. int *cl = checklist;
  613. u_char mt;
  614. u_char *p, ie;
  615. int l, newpos, oldpos;
  616. int err_seq = 0, err_len = 0, err_compr = 0, err_ureg = 0;
  617. u_char codeset = 0;
  618. u_char old_codeset = 0;
  619. u_char codelock = 1;
  620. p = skb->data;
  621. /* skip cr */
  622. p++;
  623. l = (*p++) & 0xf;
  624. p += l;
  625. mt = *p++;
  626. oldpos = 0;
  627. while ((p - skb->data) < skb->len) {
  628. if ((*p & 0xf0) == 0x90) { /* shift codeset */
  629. old_codeset = codeset;
  630. codeset = *p & 7;
  631. if (*p & 0x08)
  632. codelock = 0;
  633. else
  634. codelock = 1;
  635. if (pc->debug & L3_DEB_CHECK)
  636. l3_debug(pc->st, "check IE shift%scodeset %d->%d",
  637. codelock ? " locking ": " ", old_codeset, codeset);
  638. p++;
  639. continue;
  640. }
  641. if (!codeset) { /* only codeset 0 */
  642. if ((newpos = ie_in_set(pc, *p, cl))) {
  643. if (newpos > 0) {
  644. if (newpos < oldpos)
  645. err_seq++;
  646. else
  647. oldpos = newpos;
  648. }
  649. } else {
  650. if (ie_in_set(pc, *p, comp_required))
  651. err_compr++;
  652. else
  653. err_ureg++;
  654. }
  655. }
  656. ie = *p++;
  657. if (ie & 0x80) {
  658. l = 1;
  659. } else {
  660. l = *p++;
  661. p += l;
  662. l += 2;
  663. }
  664. if (!codeset && (l > getmax_ie_len(ie)))
  665. err_len++;
  666. if (!codelock) {
  667. if (pc->debug & L3_DEB_CHECK)
  668. l3_debug(pc->st, "check IE shift back codeset %d->%d",
  669. codeset, old_codeset);
  670. codeset = old_codeset;
  671. codelock = 1;
  672. }
  673. }
  674. if (err_compr | err_ureg | err_len | err_seq) {
  675. if (pc->debug & L3_DEB_CHECK)
  676. l3_debug(pc->st, "check IE MT(%x) %d/%d/%d/%d",
  677. mt, err_compr, err_ureg, err_len, err_seq);
  678. if (err_compr)
  679. return(ERR_IE_COMPREHENSION);
  680. if (err_ureg)
  681. return(ERR_IE_UNRECOGNIZED);
  682. if (err_len)
  683. return(ERR_IE_LENGTH);
  684. if (err_seq)
  685. return(ERR_IE_SEQUENCE);
  686. return(0);
  687. }
  688. /* verify if a message type exists and contain no IE error */
  689. static int
  690. l3ni1_check_messagetype_validity(struct l3_process *pc, int mt, void *arg)
  691. {
  692. switch (mt) {
  693. case MT_ALERTING:
  694. case MT_CALL_PROCEEDING:
  695. case MT_CONNECT:
  696. case MT_CONNECT_ACKNOWLEDGE:
  697. case MT_DISCONNECT:
  698. case MT_INFORMATION:
  699. case MT_FACILITY:
  700. case MT_NOTIFY:
  701. case MT_PROGRESS:
  702. case MT_RELEASE:
  703. case MT_RELEASE_COMPLETE:
  704. case MT_SETUP:
  705. case MT_SETUP_ACKNOWLEDGE:
  706. case MT_RESUME_ACKNOWLEDGE:
  707. case MT_RESUME_REJECT:
  708. case MT_SUSPEND_ACKNOWLEDGE:
  709. case MT_SUSPEND_REJECT:
  710. case MT_USER_INFORMATION:
  711. case MT_RESTART:
  712. case MT_RESTART_ACKNOWLEDGE:
  713. case MT_CONGESTION_CONTROL:
  714. case MT_STATUS:
  715. case MT_STATUS_ENQUIRY:
  716. if (pc->debug & L3_DEB_CHECK)
  717. l3_debug(pc->st, "l3ni1_check_messagetype_validity mt(%x) OK", mt);
  718. break;
  719. case MT_RESUME: /* RESUME only in user->net */
  720. case MT_SUSPEND: /* SUSPEND only in user->net */
  721. default:
  722. if (pc->debug & (L3_DEB_CHECK | L3_DEB_WARN))
  723. l3_debug(pc->st, "l3ni1_check_messagetype_validity mt(%x) fail", mt);
  724. pc->para.cause = 97;
  725. l3ni1_status_send(pc, 0, NULL);
  726. return(1);
  727. }
  728. return(0);
  729. }
  730. static void
  731. l3ni1_std_ie_err(struct l3_process *pc, int ret) {
  732. if (pc->debug & L3_DEB_CHECK)
  733. l3_debug(pc->st, "check_infoelements ret %d", ret);
  734. switch(ret) {
  735. case 0: 
  736. break;
  737. case ERR_IE_COMPREHENSION:
  738. pc->para.cause = 96;
  739. l3ni1_status_send(pc, 0, NULL);
  740. break;
  741. case ERR_IE_UNRECOGNIZED:
  742. pc->para.cause = 99;
  743. l3ni1_status_send(pc, 0, NULL);
  744. break;
  745. case ERR_IE_LENGTH:
  746. pc->para.cause = 100;
  747. l3ni1_status_send(pc, 0, NULL);
  748. break;
  749. case ERR_IE_SEQUENCE:
  750. default:
  751. break;
  752. }
  753. }
  754. static int
  755. l3ni1_get_channel_id(struct l3_process *pc, struct sk_buff *skb) {
  756. u_char *p;
  757. p = skb->data;
  758. if ((p = findie(p, skb->len, IE_CHANNEL_ID, 0))) {
  759. p++;
  760. if (*p != 1) { /* len for BRI = 1 */
  761. if (pc->debug & L3_DEB_WARN)
  762. l3_debug(pc->st, "wrong chid len %d", *p);
  763. return (-2);
  764. }
  765. p++;
  766. if (*p & 0x60) { /* only base rate interface */
  767. if (pc->debug & L3_DEB_WARN)
  768. l3_debug(pc->st, "wrong chid %x", *p);
  769. return (-3);
  770. }
  771. return(*p & 0x3);
  772. } else
  773. return(-1);
  774. }
  775. static int
  776. l3ni1_get_cause(struct l3_process *pc, struct sk_buff *skb) {
  777. u_char l, i=0;
  778. u_char *p;
  779. p = skb->data;
  780. pc->para.cause = 31;
  781. pc->para.loc = 0;
  782. if ((p = findie(p, skb->len, IE_CAUSE, 0))) {
  783. p++;
  784. l = *p++;
  785. if (l>30)
  786. return(1);
  787. if (l) {
  788. pc->para.loc = *p++;
  789. l--;
  790. } else {
  791. return(2);
  792. }
  793. if (l && !(pc->para.loc & 0x80)) {
  794. l--;
  795. p++; /* skip recommendation */
  796. }
  797. if (l) {
  798. pc->para.cause = *p++;
  799. l--;
  800. if (!(pc->para.cause & 0x80))
  801. return(3);
  802. } else
  803. return(4);
  804. while (l && (i<6)) {
  805. pc->para.diag[i++] = *p++;
  806. l--;
  807. }
  808. } else
  809. return(-1);
  810. return(0);
  811. }
  812. static void
  813. l3ni1_msg_with_uus(struct l3_process *pc, u_char cmd)
  814. {
  815. struct sk_buff *skb;
  816. u_char tmp[16+40];
  817. u_char *p = tmp;
  818. int l;
  819. MsgHead(p, pc->callref, cmd);
  820.         if (pc->prot.ni1.uus1_data[0])
  821.  { *p++ = IE_USER_USER; /* UUS info element */
  822.            *p++ = strlen(pc->prot.ni1.uus1_data) + 1;
  823.            *p++ = 0x04; /* IA5 chars */
  824.            strcpy(p,pc->prot.ni1.uus1_data);
  825.            p += strlen(pc->prot.ni1.uus1_data);
  826.            pc->prot.ni1.uus1_data[0] = '';   
  827.          } 
  828. l = p - tmp;
  829. if (!(skb = l3_alloc_skb(l)))
  830. return;
  831. memcpy(skb_put(skb, l), tmp, l);
  832. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  833. } /* l3ni1_msg_with_uus */
  834. static void
  835. l3ni1_release_req(struct l3_process *pc, u_char pr, void *arg)
  836. {
  837. StopAllL3Timer(pc);
  838. newl3state(pc, 19);
  839. if (!pc->prot.ni1.uus1_data[0]) 
  840. l3ni1_message(pc, MT_RELEASE);
  841. else
  842. l3ni1_msg_with_uus(pc, MT_RELEASE);
  843. L3AddTimer(&pc->timer, T308, CC_T308_1);
  844. }
  845. static void
  846. l3ni1_release_cmpl(struct l3_process *pc, u_char pr, void *arg)
  847. {
  848. struct sk_buff *skb = arg;
  849. int ret;
  850. if ((ret = l3ni1_get_cause(pc, skb))>0) {
  851. if (pc->debug & L3_DEB_WARN)
  852. l3_debug(pc->st, "RELCMPL get_cause ret(%d)",ret);
  853. } else if (ret < 0)
  854. pc->para.cause = NO_CAUSE;
  855. StopAllL3Timer(pc);
  856. newl3state(pc, 0);
  857. pc->st->l3.l3l4(pc->st, CC_RELEASE | CONFIRM, pc);
  858. ni1_release_l3_process(pc);
  859. }
  860. #if EXT_BEARER_CAPS
  861. static u_char *
  862. EncodeASyncParams(u_char * p, u_char si2)
  863. { // 7c 06 88  90 21 42 00 bb
  864. p[0] = 0;
  865. p[1] = 0x40; // Intermediate rate: 16 kbit/s jj 2000.02.19
  866. p[2] = 0x80;
  867. if (si2 & 32) // 7 data bits
  868. p[2] += 16;
  869. else // 8 data bits
  870. p[2] += 24;
  871. if (si2 & 16) // 2 stop bits
  872. p[2] += 96;
  873. else // 1 stop bit
  874. p[2] += 32;
  875. if (si2 & 8) // even parity
  876. p[2] += 2;
  877. else // no parity
  878. p[2] += 3;
  879. switch (si2 & 0x07) {
  880. case 0:
  881. p[0] = 66; // 1200 bit/s
  882. break;
  883. case 1:
  884. p[0] = 88; // 1200/75 bit/s
  885. break;
  886. case 2:
  887. p[0] = 87; // 75/1200 bit/s
  888. break;
  889. case 3:
  890. p[0] = 67; // 2400 bit/s
  891. break;
  892. case 4:
  893. p[0] = 69; // 4800 bit/s
  894. break;
  895. case 5:
  896. p[0] = 72; // 9600 bit/s
  897. break;
  898. case 6:
  899. p[0] = 73; // 14400 bit/s
  900. break;
  901. case 7:
  902. p[0] = 75; // 19200 bit/s
  903. break;
  904. }
  905. return p + 3;
  906. }
  907. static u_char
  908. EncodeSyncParams(u_char si2, u_char ai)
  909. {
  910. switch (si2) {
  911. case 0:
  912. return ai + 2; // 1200 bit/s
  913. case 1:
  914. return ai + 24; // 1200/75 bit/s
  915. case 2:
  916. return ai + 23; // 75/1200 bit/s
  917. case 3:
  918. return ai + 3; // 2400 bit/s
  919. case 4:
  920. return ai + 5; // 4800 bit/s
  921. case 5:
  922. return ai + 8; // 9600 bit/s
  923. case 6:
  924. return ai + 9; // 14400 bit/s
  925. case 7:
  926. return ai + 11; // 19200 bit/s
  927. case 8:
  928. return ai + 14; // 48000 bit/s
  929. case 9:
  930. return ai + 15; // 56000 bit/s
  931. case 15:
  932. return ai + 40; // negotiate bit/s
  933. default:
  934. break;
  935. }
  936. return ai;
  937. }
  938. static u_char
  939. DecodeASyncParams(u_char si2, u_char * p)
  940. {
  941. u_char info;
  942. switch (p[5]) {
  943. case 66: // 1200 bit/s
  944. break; // si2 don't change
  945. case 88: // 1200/75 bit/s
  946. si2 += 1;
  947. break;
  948. case 87: // 75/1200 bit/s
  949. si2 += 2;
  950. break;
  951. case 67: // 2400 bit/s
  952. si2 += 3;
  953. break;
  954. case 69: // 4800 bit/s
  955. si2 += 4;
  956. break;
  957. case 72: // 9600 bit/s
  958. si2 += 5;
  959. break;
  960. case 73: // 14400 bit/s
  961. si2 += 6;
  962. break;
  963. case 75: // 19200 bit/s
  964. si2 += 7;
  965. break;
  966. }
  967. info = p[7] & 0x7f;
  968. if ((info & 16) && (!(info & 8))) // 7 data bits
  969. si2 += 32; // else 8 data bits
  970. if ((info & 96) == 96) // 2 stop bits
  971. si2 += 16; // else 1 stop bit
  972. if ((info & 2) && (!(info & 1))) // even parity
  973. si2 += 8; // else no parity
  974. return si2;
  975. }
  976. static u_char
  977. DecodeSyncParams(u_char si2, u_char info)
  978. {
  979. info &= 0x7f;
  980. switch (info) {
  981. case 40: // bit/s negotiation failed  ai := 165 not 175!
  982. return si2 + 15;
  983. case 15: // 56000 bit/s failed, ai := 0 not 169 !
  984. return si2 + 9;
  985. case 14: // 48000 bit/s
  986. return si2 + 8;
  987. case 11: // 19200 bit/s
  988. return si2 + 7;
  989. case 9: // 14400 bit/s
  990. return si2 + 6;
  991. case 8: // 9600  bit/s
  992. return si2 + 5;
  993. case 5: // 4800  bit/s
  994. return si2 + 4;
  995. case 3: // 2400  bit/s
  996. return si2 + 3;
  997. case 23: // 75/1200 bit/s
  998. return si2 + 2;
  999. case 24: // 1200/75 bit/s
  1000. return si2 + 1;
  1001. default: // 1200 bit/s
  1002. return si2;
  1003. }
  1004. }
  1005. static u_char
  1006. DecodeSI2(struct sk_buff *skb)
  1007. {
  1008. u_char *p; //, *pend=skb->data + skb->len;
  1009. if ((p = findie(skb->data, skb->len, 0x7c, 0))) {
  1010. switch (p[4] & 0x0f) {
  1011. case 0x01:
  1012. if (p[1] == 0x04) // sync. Bitratenadaption
  1013. return DecodeSyncParams(160, p[5]); // V.110/X.30
  1014. else if (p[1] == 0x06) // async. Bitratenadaption
  1015. return DecodeASyncParams(192, p); // V.110/X.30
  1016. break;
  1017. case 0x08: // if (p[5] == 0x02) // sync. Bitratenadaption
  1018. if (p[1] > 3) 
  1019. return DecodeSyncParams(176, p[5]); // V.120
  1020. break;
  1021. }
  1022. }
  1023. return 0;
  1024. }
  1025. #endif
  1026. static void
  1027. l3ni1_setup_req(struct l3_process *pc, u_char pr,
  1028.  void *arg)
  1029. {
  1030. struct sk_buff *skb;
  1031. u_char tmp[128];
  1032. u_char *p = tmp;
  1033. u_char *teln;
  1034. u_char *sub;
  1035. u_char *sp;
  1036. int l;
  1037. MsgHead(p, pc->callref, MT_SETUP);
  1038. teln = pc->para.setup.phone;
  1039. *p++ = 0xa1; /* complete indicator */
  1040. /*
  1041.  * Set Bearer Capability, Map info from 1TR6-convention to NI1
  1042.  */
  1043. switch (pc->para.setup.si1) {
  1044. case 1:                   /* Telephony                                */
  1045. *p++ = IE_BEARER;
  1046. *p++ = 0x3;   /* Length                                   */
  1047. *p++ = 0x90;   /* 3.1khz Audio             */
  1048. *p++ = 0x90;   /* Circuit-Mode 64kbps                      */
  1049. *p++ = 0xa2;   /* u-Law Audio                              */
  1050. break;
  1051. case 5:                   /* Datatransmission 64k, BTX                */
  1052. case 7:                   /* Datatransmission 64k                     */
  1053. default:
  1054. *p++ = IE_BEARER;
  1055. *p++ = 0x2;   /* Length                                   */
  1056. *p++ = 0x88;   /* Coding Std. CCITT, unrestr. dig. Inform. */
  1057. *p++ = 0x90;   /* Circuit-Mode 64kbps                      */
  1058. break;
  1059. }
  1060. sub = NULL;
  1061. sp = teln;
  1062. while (*sp) {
  1063. if ('.' == *sp) {
  1064. sub = sp;
  1065. *sp = 0;
  1066. } else
  1067. sp++;
  1068. }
  1069. *p++ = IE_KEYPAD;
  1070. *p++ = strlen(teln);
  1071. while (*teln)
  1072. *p++ = (*teln++) & 0x7F;
  1073. if (sub)
  1074. *sub++ = '.';
  1075. #if EXT_BEARER_CAPS
  1076. if ((pc->para.setup.si2 >= 160) && (pc->para.setup.si2 <= 175)) { // sync. Bitratenadaption, V.110/X.30
  1077. *p++ = IE_LLC;
  1078. *p++ = 0x04;
  1079. *p++ = 0x88;
  1080. *p++ = 0x90;
  1081. *p++ = 0x21;
  1082. *p++ = EncodeSyncParams(pc->para.setup.si2 - 160, 0x80);
  1083. } else if ((pc->para.setup.si2 >= 176) && (pc->para.setup.si2 <= 191)) { // sync. Bitratenadaption, V.120
  1084. *p++ = IE_LLC;
  1085. *p++ = 0x05;
  1086. *p++ = 0x88;
  1087. *p++ = 0x90;
  1088. *p++ = 0x28;
  1089. *p++ = EncodeSyncParams(pc->para.setup.si2 - 176, 0);
  1090. *p++ = 0x82;
  1091. } else if (pc->para.setup.si2 >= 192) { // async. Bitratenadaption, V.110/X.30
  1092. *p++ = IE_LLC;
  1093. *p++ = 0x06;
  1094. *p++ = 0x88;
  1095. *p++ = 0x90;
  1096. *p++ = 0x21;
  1097. p = EncodeASyncParams(p, pc->para.setup.si2 - 192);
  1098. } else {
  1099.   switch (pc->para.setup.si1) {
  1100. case 1:                 /* Telephony                                */
  1101. *p++ = IE_LLC;
  1102. *p++ = 0x3; /* Length                                   */
  1103. *p++ = 0x90; /* Coding Std. CCITT, 3.1 kHz audio         */
  1104. *p++ = 0x90; /* Circuit-Mode 64kbps                      */
  1105. *p++ = 0xa2; /* u-Law Audio                              */
  1106. break;
  1107. case 5:                 /* Datatransmission 64k, BTX                */
  1108. case 7:                 /* Datatransmission 64k                     */
  1109. default:
  1110. *p++ = IE_LLC;
  1111. *p++ = 0x2; /* Length                                   */
  1112. *p++ = 0x88; /* Coding Std. CCITT, unrestr. dig. Inform. */
  1113. *p++ = 0x90; /* Circuit-Mode 64kbps                      */
  1114. break;
  1115.   }
  1116. }
  1117. #endif
  1118. l = p - tmp;
  1119. if (!(skb = l3_alloc_skb(l)))
  1120. {
  1121. return;
  1122. }
  1123. memcpy(skb_put(skb, l), tmp, l);
  1124. L3DelTimer(&pc->timer);
  1125. L3AddTimer(&pc->timer, T303, CC_T303);
  1126. newl3state(pc, 1);
  1127. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  1128. }
  1129. static void
  1130. l3ni1_call_proc(struct l3_process *pc, u_char pr, void *arg)
  1131. {
  1132. struct sk_buff *skb = arg;
  1133. int id, ret;
  1134. if ((id = l3ni1_get_channel_id(pc, skb)) >= 0) {
  1135. if ((0 == id) || ((3 == id) && (0x10 == pc->para.moderate))) {
  1136. if (pc->debug & L3_DEB_WARN)
  1137. l3_debug(pc->st, "setup answer with wrong chid %x", id);
  1138. pc->para.cause = 100;
  1139. l3ni1_status_send(pc, pr, NULL);
  1140. return;
  1141. }
  1142. pc->para.bchannel = id;
  1143. } else if (1 == pc->state) {
  1144. if (pc->debug & L3_DEB_WARN)
  1145. l3_debug(pc->st, "setup answer wrong chid (ret %d)", id);
  1146. if (id == -1)
  1147. pc->para.cause = 96;
  1148. else
  1149. pc->para.cause = 100;
  1150. l3ni1_status_send(pc, pr, NULL);
  1151. return;
  1152. }
  1153. /* Now we are on none mandatory IEs */
  1154. ret = check_infoelements(pc, skb, ie_CALL_PROCEEDING);
  1155. if (ERR_IE_COMPREHENSION == ret) {
  1156. l3ni1_std_ie_err(pc, ret);
  1157. return;
  1158. }
  1159. L3DelTimer(&pc->timer);
  1160. newl3state(pc, 3);
  1161. L3AddTimer(&pc->timer, T310, CC_T310);
  1162. if (ret) /* STATUS for none mandatory IE errors after actions are taken */
  1163. l3ni1_std_ie_err(pc, ret);
  1164. pc->st->l3.l3l4(pc->st, CC_PROCEEDING | INDICATION, pc);
  1165. }
  1166. static void
  1167. l3ni1_setup_ack(struct l3_process *pc, u_char pr, void *arg)
  1168. {
  1169. struct sk_buff *skb = arg;
  1170. int id, ret;
  1171. if ((id = l3ni1_get_channel_id(pc, skb)) >= 0) {
  1172. if ((0 == id) || ((3 == id) && (0x10 == pc->para.moderate))) {
  1173. if (pc->debug & L3_DEB_WARN)
  1174. l3_debug(pc->st, "setup answer with wrong chid %x", id);
  1175. pc->para.cause = 100;
  1176. l3ni1_status_send(pc, pr, NULL);
  1177. return;
  1178. }
  1179. pc->para.bchannel = id;
  1180. } else {
  1181. if (pc->debug & L3_DEB_WARN)
  1182. l3_debug(pc->st, "setup answer wrong chid (ret %d)", id);
  1183. if (id == -1)
  1184. pc->para.cause = 96;
  1185. else
  1186. pc->para.cause = 100;
  1187. l3ni1_status_send(pc, pr, NULL);
  1188. return;
  1189. }
  1190. /* Now we are on none mandatory IEs */
  1191. ret = check_infoelements(pc, skb, ie_SETUP_ACKNOWLEDGE);
  1192. if (ERR_IE_COMPREHENSION == ret) {
  1193. l3ni1_std_ie_err(pc, ret);
  1194. return;
  1195. }
  1196. L3DelTimer(&pc->timer);
  1197. newl3state(pc, 2);
  1198. L3AddTimer(&pc->timer, T304, CC_T304);
  1199. if (ret) /* STATUS for none mandatory IE errors after actions are taken */
  1200. l3ni1_std_ie_err(pc, ret);
  1201. pc->st->l3.l3l4(pc->st, CC_MORE_INFO | INDICATION, pc);
  1202. }
  1203. static void
  1204. l3ni1_disconnect(struct l3_process *pc, u_char pr, void *arg)
  1205. {
  1206. struct sk_buff *skb = arg;
  1207. u_char *p;
  1208. int ret;
  1209. u_char cause = 0;
  1210. StopAllL3Timer(pc);
  1211. if ((ret = l3ni1_get_cause(pc, skb))) {
  1212. if (pc->debug & L3_DEB_WARN)
  1213. l3_debug(pc->st, "DISC get_cause ret(%d)", ret);
  1214. if (ret < 0)
  1215. cause = 96;
  1216. else if (ret > 0)
  1217. cause = 100;
  1218. if ((p = findie(skb->data, skb->len, IE_FACILITY, 0)))
  1219. l3ni1_parse_facility(pc->st, pc, pc->callref, p);
  1220. ret = check_infoelements(pc, skb, ie_DISCONNECT);
  1221. if (ERR_IE_COMPREHENSION == ret)
  1222. cause = 96;
  1223. else if ((!cause) && (ERR_IE_UNRECOGNIZED == ret))
  1224. cause = 99;
  1225. ret = pc->state;
  1226. newl3state(pc, 12);
  1227. if (cause)
  1228. newl3state(pc, 19);
  1229.         if (11 != ret)
  1230. pc->st->l3.l3l4(pc->st, CC_DISCONNECT | INDICATION, pc);
  1231.         else if (!cause)
  1232.    l3ni1_release_req(pc, pr, NULL);
  1233. if (cause) {
  1234. l3ni1_message_cause(pc, MT_RELEASE, cause);
  1235. L3AddTimer(&pc->timer, T308, CC_T308_1);
  1236. }
  1237. }
  1238. static void
  1239. l3ni1_connect(struct l3_process *pc, u_char pr, void *arg)
  1240. {
  1241. struct sk_buff *skb = arg;
  1242. int ret;
  1243. ret = check_infoelements(pc, skb, ie_CONNECT);
  1244. if (ERR_IE_COMPREHENSION == ret) {
  1245. l3ni1_std_ie_err(pc, ret);
  1246. return;
  1247. }
  1248. L3DelTimer(&pc->timer); /* T310 */
  1249. newl3state(pc, 10);
  1250. pc->para.chargeinfo = 0;
  1251. /* here should inserted COLP handling KKe */
  1252. if (ret)
  1253. l3ni1_std_ie_err(pc, ret);
  1254. pc->st->l3.l3l4(pc->st, CC_SETUP | CONFIRM, pc);
  1255. }
  1256. static void
  1257. l3ni1_alerting(struct l3_process *pc, u_char pr, void *arg)
  1258. {
  1259. struct sk_buff *skb = arg;
  1260. int ret;
  1261. ret = check_infoelements(pc, skb, ie_ALERTING);
  1262. if (ERR_IE_COMPREHENSION == ret) {
  1263. l3ni1_std_ie_err(pc, ret);
  1264. return;
  1265. }
  1266. L3DelTimer(&pc->timer); /* T304 */
  1267. newl3state(pc, 4);
  1268. if (ret)
  1269. l3ni1_std_ie_err(pc, ret);
  1270. pc->st->l3.l3l4(pc->st, CC_ALERTING | INDICATION, pc);
  1271. }
  1272. static void
  1273. l3ni1_setup(struct l3_process *pc, u_char pr, void *arg)
  1274. {
  1275. u_char *p;
  1276. int bcfound = 0;
  1277. char tmp[80];
  1278. struct sk_buff *skb = arg;
  1279. int id;
  1280. int err = 0;
  1281. /*
  1282.  * Bearer Capabilities
  1283.  */
  1284. p = skb->data;
  1285. /* only the first occurence 'll be detected ! */
  1286. if ((p = findie(p, skb->len, 0x04, 0))) {
  1287. if ((p[1] < 2) || (p[1] > 11))
  1288. err = 1;
  1289. else {
  1290. pc->para.setup.si2 = 0;
  1291. switch (p[2] & 0x7f) {
  1292. case 0x00: /* Speech */
  1293. case 0x10: /* 3.1 Khz audio */
  1294. pc->para.setup.si1 = 1;
  1295. break;
  1296. case 0x08: /* Unrestricted digital information */
  1297. pc->para.setup.si1 = 7;
  1298. /* JIM, 05.11.97 I wanna set service indicator 2 */
  1299. #if EXT_BEARER_CAPS
  1300. pc->para.setup.si2 = DecodeSI2(skb);
  1301. #endif
  1302. break;
  1303. case 0x09: /* Restricted digital information */
  1304. pc->para.setup.si1 = 2;
  1305. break;
  1306. case 0x11:
  1307. /* Unrestr. digital information  with 
  1308.  * tones/announcements ( or 7 kHz audio
  1309.  */
  1310. pc->para.setup.si1 = 3;
  1311. break;
  1312. case 0x18: /* Video */
  1313. pc->para.setup.si1 = 4;
  1314. break;
  1315. default:
  1316. err = 2;
  1317. break;
  1318. }
  1319. switch (p[3] & 0x7f) {
  1320. case 0x40: /* packed mode */
  1321. pc->para.setup.si1 = 8;
  1322. break;
  1323. case 0x10: /* 64 kbit */
  1324. case 0x11: /* 2*64 kbit */
  1325. case 0x13: /* 384 kbit */
  1326. case 0x15: /* 1536 kbit */
  1327. case 0x17: /* 1920 kbit */
  1328. pc->para.moderate = p[3] & 0x7f;
  1329. break;
  1330. default:
  1331. err = 3;
  1332. break;
  1333. }
  1334. }
  1335. if (pc->debug & L3_DEB_SI)
  1336. l3_debug(pc->st, "SI=%d, AI=%d",
  1337. pc->para.setup.si1, pc->para.setup.si2);
  1338. if (err) {
  1339. if (pc->debug & L3_DEB_WARN)
  1340. l3_debug(pc->st, "setup with wrong bearer(l=%d:%x,%x)",
  1341. p[1], p[2], p[3]);
  1342. pc->para.cause = 100;
  1343. l3ni1_msg_without_setup(pc, pr, NULL);
  1344. return;
  1345. }
  1346. } else {
  1347. if (pc->debug & L3_DEB_WARN)
  1348. l3_debug(pc->st, "setup without bearer capabilities");
  1349. /* ETS 300-104 1.3.3 */
  1350. pc->para.cause = 96;
  1351. l3ni1_msg_without_setup(pc, pr, NULL);
  1352. return;
  1353. }
  1354. /*
  1355.  * Channel Identification
  1356.  */
  1357. if ((id = l3ni1_get_channel_id(pc, skb)) >= 0) {
  1358. if ((pc->para.bchannel = id)) {
  1359. if ((3 == id) && (0x10 == pc->para.moderate)) {
  1360. if (pc->debug & L3_DEB_WARN)
  1361. l3_debug(pc->st, "setup with wrong chid %x",
  1362. id);
  1363. pc->para.cause = 100;
  1364. l3ni1_msg_without_setup(pc, pr, NULL);
  1365. return;
  1366. }
  1367. bcfound++;
  1368. } else 
  1369.                    { if (pc->debug & L3_DEB_WARN)
  1370.  l3_debug(pc->st, "setup without bchannel, call waiting");
  1371.                      bcfound++;
  1372.                    } 
  1373. } else {
  1374. if (pc->debug & L3_DEB_WARN)
  1375. l3_debug(pc->st, "setup with wrong chid ret %d", id);
  1376. if (id == -1)
  1377. pc->para.cause = 96;
  1378. else
  1379. pc->para.cause = 100;
  1380. l3ni1_msg_without_setup(pc, pr, NULL);
  1381. return;
  1382. }
  1383. /* Now we are on none mandatory IEs */
  1384. err = check_infoelements(pc, skb, ie_SETUP);
  1385. if (ERR_IE_COMPREHENSION == err) {
  1386. pc->para.cause = 96;
  1387. l3ni1_msg_without_setup(pc, pr, NULL);
  1388. return;
  1389. }
  1390. p = skb->data;
  1391. if ((p = findie(p, skb->len, 0x70, 0)))
  1392. iecpy(pc->para.setup.eazmsn, p, 1);
  1393. else
  1394. pc->para.setup.eazmsn[0] = 0;
  1395. p = skb->data;
  1396. if ((p = findie(p, skb->len, 0x71, 0))) {
  1397. /* Called party subaddress */
  1398. if ((p[1] >= 2) && (p[2] == 0x80) && (p[3] == 0x50)) {
  1399. tmp[0] = '.';
  1400. iecpy(&tmp[1], p, 2);
  1401. strcat(pc->para.setup.eazmsn, tmp);
  1402. } else if (pc->debug & L3_DEB_WARN)
  1403. l3_debug(pc->st, "wrong called subaddress");
  1404. }
  1405. p = skb->data;
  1406. if ((p = findie(p, skb->len, 0x6c, 0))) {
  1407. pc->para.setup.plan = p[2];
  1408. if (p[2] & 0x80) {
  1409. iecpy(pc->para.setup.phone, p, 1);
  1410. pc->para.setup.screen = 0;
  1411. } else {
  1412. iecpy(pc->para.setup.phone, p, 2);
  1413. pc->para.setup.screen = p[3];
  1414. }
  1415. } else {
  1416. pc->para.setup.phone[0] = 0;
  1417. pc->para.setup.plan = 0;
  1418. pc->para.setup.screen = 0;
  1419. }
  1420. p = skb->data;
  1421. if ((p = findie(p, skb->len, 0x6d, 0))) {
  1422. /* Calling party subaddress */
  1423. if ((p[1] >= 2) && (p[2] == 0x80) && (p[3] == 0x50)) {
  1424. tmp[0] = '.';
  1425. iecpy(&tmp[1], p, 2);
  1426. strcat(pc->para.setup.phone, tmp);
  1427. } else if (pc->debug & L3_DEB_WARN)
  1428. l3_debug(pc->st, "wrong calling subaddress");
  1429. }
  1430. newl3state(pc, 6);
  1431. if (err) /* STATUS for none mandatory IE errors after actions are taken */
  1432. l3ni1_std_ie_err(pc, err);
  1433. pc->st->l3.l3l4(pc->st, CC_SETUP | INDICATION, pc);
  1434. }
  1435. static void
  1436. l3ni1_reset(struct l3_process *pc, u_char pr, void *arg)
  1437. {
  1438. ni1_release_l3_process(pc);
  1439. }
  1440. static void
  1441. l3ni1_disconnect_req(struct l3_process *pc, u_char pr, void *arg)
  1442. {
  1443. struct sk_buff *skb;
  1444. u_char tmp[16+40];
  1445. u_char *p = tmp;
  1446. int l;
  1447. u_char cause = 16;
  1448. if (pc->para.cause != NO_CAUSE)
  1449. cause = pc->para.cause;
  1450. StopAllL3Timer(pc);
  1451. MsgHead(p, pc->callref, MT_DISCONNECT);
  1452. *p++ = IE_CAUSE;
  1453. *p++ = 0x2;
  1454. *p++ = 0x80;
  1455. *p++ = cause | 0x80;
  1456.         if (pc->prot.ni1.uus1_data[0])
  1457.  { *p++ = IE_USER_USER; /* UUS info element */
  1458.            *p++ = strlen(pc->prot.ni1.uus1_data) + 1;
  1459.            *p++ = 0x04; /* IA5 chars */
  1460.            strcpy(p,pc->prot.ni1.uus1_data);
  1461.            p += strlen(pc->prot.ni1.uus1_data);
  1462.            pc->prot.ni1.uus1_data[0] = '';   
  1463.          } 
  1464. l = p - tmp;
  1465. if (!(skb = l3_alloc_skb(l)))
  1466. return;
  1467. memcpy(skb_put(skb, l), tmp, l);
  1468. newl3state(pc, 11);
  1469. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  1470. L3AddTimer(&pc->timer, T305, CC_T305);
  1471. }
  1472. static void
  1473. l3ni1_setup_rsp(struct l3_process *pc, u_char pr,
  1474.  void *arg)
  1475. {
  1476.         if (!pc->para.bchannel) 
  1477.  { if (pc->debug & L3_DEB_WARN)
  1478.        l3_debug(pc->st, "D-chan connect for waiting call");
  1479.            l3ni1_disconnect_req(pc, pr, arg);
  1480.            return;
  1481.          }
  1482. newl3state(pc, 8);
  1483. if (pc->debug & L3_DEB_WARN)
  1484. l3_debug(pc->st, "D-chan connect for waiting call");
  1485. l3ni1_message_plus_chid(pc, MT_CONNECT); /* GE 05/09/00 */ 
  1486. L3DelTimer(&pc->timer);
  1487. L3AddTimer(&pc->timer, T313, CC_T313);
  1488. }
  1489. static void
  1490. l3ni1_connect_ack(struct l3_process *pc, u_char pr, void *arg)
  1491. {
  1492. struct sk_buff *skb = arg;
  1493. int ret;
  1494. ret = check_infoelements(pc, skb, ie_CONNECT_ACKNOWLEDGE);
  1495. if (ERR_IE_COMPREHENSION == ret) {
  1496. l3ni1_std_ie_err(pc, ret);
  1497. return;
  1498. }
  1499. newl3state(pc, 10);
  1500. L3DelTimer(&pc->timer);
  1501. if (ret)
  1502. l3ni1_std_ie_err(pc, ret);
  1503. pc->st->l3.l3l4(pc->st, CC_SETUP_COMPL | INDICATION, pc);
  1504. }
  1505. static void
  1506. l3ni1_reject_req(struct l3_process *pc, u_char pr, void *arg)
  1507. {
  1508. struct sk_buff *skb;
  1509. u_char tmp[16];
  1510. u_char *p = tmp;
  1511. int l;
  1512. u_char cause = 21;
  1513. if (pc->para.cause != NO_CAUSE)
  1514. cause = pc->para.cause;
  1515. MsgHead(p, pc->callref, MT_RELEASE_COMPLETE);
  1516. *p++ = IE_CAUSE;
  1517. *p++ = 0x2;
  1518. *p++ = 0x80;
  1519. *p++ = cause | 0x80;
  1520. l = p - tmp;
  1521. if (!(skb = l3_alloc_skb(l)))
  1522. return;
  1523. memcpy(skb_put(skb, l), tmp, l);
  1524. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  1525. pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
  1526. newl3state(pc, 0);
  1527. ni1_release_l3_process(pc);
  1528. }
  1529. static void
  1530. l3ni1_release(struct l3_process *pc, u_char pr, void *arg)
  1531. {
  1532. struct sk_buff *skb = arg;
  1533. u_char *p;
  1534. int ret, cause=0;
  1535. StopAllL3Timer(pc);
  1536. if ((ret = l3ni1_get_cause(pc, skb))>0) {
  1537. if (pc->debug & L3_DEB_WARN)
  1538. l3_debug(pc->st, "REL get_cause ret(%d)", ret);
  1539. } else if (ret<0)
  1540. pc->para.cause = NO_CAUSE;
  1541. if ((p = findie(skb->data, skb->len, IE_FACILITY, 0))) {
  1542. l3ni1_parse_facility(pc->st, pc, pc->callref, p);
  1543. }
  1544. if ((ret<0) && (pc->state != 11))
  1545. cause = 96;
  1546. else if (ret>0)
  1547. cause = 100;
  1548. ret = check_infoelements(pc, skb, ie_RELEASE);
  1549. if (ERR_IE_COMPREHENSION == ret)
  1550. cause = 96;
  1551. else if ((ERR_IE_UNRECOGNIZED == ret) && (!cause))
  1552. cause = 99;  
  1553. if (cause)
  1554. l3ni1_message_cause(pc, MT_RELEASE_COMPLETE, cause);
  1555. else
  1556. l3ni1_message(pc, MT_RELEASE_COMPLETE);
  1557. pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
  1558. newl3state(pc, 0);
  1559. ni1_release_l3_process(pc);
  1560. }
  1561. static void
  1562. l3ni1_alert_req(struct l3_process *pc, u_char pr,
  1563.  void *arg)
  1564. {
  1565. newl3state(pc, 7);
  1566. if (!pc->prot.ni1.uus1_data[0]) 
  1567. l3ni1_message(pc, MT_ALERTING);
  1568. else
  1569. l3ni1_msg_with_uus(pc, MT_ALERTING); 
  1570. }
  1571. static void
  1572. l3ni1_proceed_req(struct l3_process *pc, u_char pr,
  1573.    void *arg)
  1574. {
  1575. newl3state(pc, 9);
  1576. l3ni1_message(pc, MT_CALL_PROCEEDING);
  1577. pc->st->l3.l3l4(pc->st, CC_PROCEED_SEND | INDICATION, pc); 
  1578. }
  1579. static void
  1580. l3ni1_setup_ack_req(struct l3_process *pc, u_char pr,
  1581.    void *arg)
  1582. {
  1583. newl3state(pc, 25);
  1584. L3DelTimer(&pc->timer);
  1585. L3AddTimer(&pc->timer, T302, CC_T302);
  1586. l3ni1_message(pc, MT_SETUP_ACKNOWLEDGE);
  1587. }
  1588. /********************************************/
  1589. /* deliver a incoming display message to HL */
  1590. /********************************************/
  1591. static void
  1592. l3ni1_deliver_display(struct l3_process *pc, int pr, u_char *infp)
  1593. {       u_char len;
  1594.         isdn_ctrl ic; 
  1595. struct IsdnCardState *cs;
  1596.         char *p; 
  1597.         if (*infp++ != IE_DISPLAY) return;
  1598.         if ((len = *infp++) > 80) return; /* total length <= 82 */
  1599. if (!pc->chan) return;
  1600. p = ic.parm.display; 
  1601.         while (len--)
  1602.   *p++ = *infp++;
  1603. *p = '';
  1604. ic.command = ISDN_STAT_DISPLAY;
  1605. cs = pc->st->l1.hardware;
  1606. ic.driver = cs->myid;
  1607. ic.arg = pc->chan->chan; 
  1608. cs->iif.statcallb(&ic);
  1609. } /* l3ni1_deliver_display */
  1610. static void
  1611. l3ni1_progress(struct l3_process *pc, u_char pr, void *arg)
  1612. {
  1613. struct sk_buff *skb = arg;
  1614. int err = 0;
  1615. u_char *p;
  1616. if ((p = findie(skb->data, skb->len, IE_PROGRESS, 0))) {
  1617. if (p[1] != 2) {
  1618. err = 1;
  1619. pc->para.cause = 100;
  1620. } else if (!(p[2] & 0x70)) {
  1621. switch (p[2]) {
  1622. case 0x80:
  1623. case 0x81:
  1624. case 0x82:
  1625. case 0x84:
  1626. case 0x85:
  1627. case 0x87:
  1628. case 0x8a:
  1629. switch (p[3]) {
  1630. case 0x81:
  1631. case 0x82:
  1632. case 0x83:
  1633. case 0x84:
  1634. case 0x88:
  1635. break;
  1636. default:
  1637. err = 2;
  1638. pc->para.cause = 100;
  1639. break;
  1640. }
  1641. break;
  1642. default:
  1643. err = 3;
  1644. pc->para.cause = 100;
  1645. break;
  1646. }
  1647. }
  1648. } else {
  1649. pc->para.cause = 96;
  1650. err = 4;
  1651. }
  1652. if (err) {
  1653. if (pc->debug & L3_DEB_WARN)
  1654. l3_debug(pc->st, "progress error %d", err);
  1655. l3ni1_status_send(pc, pr, NULL);
  1656. return;
  1657. }
  1658. /* Now we are on none mandatory IEs */
  1659. err = check_infoelements(pc, skb, ie_PROGRESS);
  1660. if (err)
  1661. l3ni1_std_ie_err(pc, err);
  1662. if (ERR_IE_COMPREHENSION != err)
  1663. pc->st->l3.l3l4(pc->st, CC_PROGRESS | INDICATION, pc);
  1664. }
  1665. static void
  1666. l3ni1_notify(struct l3_process *pc, u_char pr, void *arg)
  1667. {
  1668. struct sk_buff *skb = arg;
  1669. int err = 0;
  1670. u_char *p;
  1671. if ((p = findie(skb->data, skb->len, IE_NOTIFY, 0))) {
  1672. if (p[1] != 1) {
  1673. err = 1;
  1674. pc->para.cause = 100;
  1675. } else {
  1676. switch (p[2]) {
  1677. case 0x80:
  1678. case 0x81:
  1679. case 0x82:
  1680. break;
  1681. default:
  1682. pc->para.cause = 100;
  1683. err = 2;
  1684. break;
  1685. }
  1686. }
  1687. } else {
  1688. pc->para.cause = 96;
  1689. err = 3;
  1690. }
  1691. if (err) {
  1692. if (pc->debug & L3_DEB_WARN)
  1693. l3_debug(pc->st, "notify error %d", err);
  1694. l3ni1_status_send(pc, pr, NULL);
  1695. return;
  1696. }
  1697. /* Now we are on none mandatory IEs */
  1698. err = check_infoelements(pc, skb, ie_NOTIFY);
  1699. if (err)
  1700. l3ni1_std_ie_err(pc, err);
  1701. if (ERR_IE_COMPREHENSION != err)
  1702. pc->st->l3.l3l4(pc->st, CC_NOTIFY | INDICATION, pc);
  1703. }
  1704. static void
  1705. l3ni1_status_enq(struct l3_process *pc, u_char pr, void *arg)
  1706. {
  1707. int ret;
  1708. struct sk_buff *skb = arg;
  1709. ret = check_infoelements(pc, skb, ie_STATUS_ENQUIRY);
  1710. l3ni1_std_ie_err(pc, ret);
  1711. pc->para.cause = 30; /* response to STATUS_ENQUIRY */
  1712.         l3ni1_status_send(pc, pr, NULL);
  1713. }
  1714. static void
  1715. l3ni1_information(struct l3_process *pc, u_char pr, void *arg)
  1716. {
  1717. int ret;
  1718. struct sk_buff *skb = arg;
  1719. u_char *p;
  1720. char tmp[32];
  1721. ret = check_infoelements(pc, skb, ie_INFORMATION);
  1722. if (ret)
  1723. l3ni1_std_ie_err(pc, ret);
  1724. if (pc->state == 25) { /* overlap receiving */
  1725. L3DelTimer(&pc->timer);
  1726. p = skb->data;
  1727. if ((p = findie(p, skb->len, 0x70, 0))) {
  1728. iecpy(tmp, p, 1);
  1729. strcat(pc->para.setup.eazmsn, tmp);
  1730. pc->st->l3.l3l4(pc->st, CC_MORE_INFO | INDICATION, pc);
  1731. }
  1732. L3AddTimer(&pc->timer, T302, CC_T302);
  1733. }
  1734. }
  1735. /******************************/
  1736. /* handle deflection requests */
  1737. /******************************/
  1738. static void l3ni1_redir_req(struct l3_process *pc, u_char pr, void *arg)
  1739. {
  1740. struct sk_buff *skb;
  1741. u_char tmp[128];
  1742. u_char *p = tmp;
  1743.         u_char *subp;
  1744.         u_char len_phone = 0;
  1745.         u_char len_sub = 0;
  1746. int l; 
  1747.         strcpy(pc->prot.ni1.uus1_data,pc->chan->setup.eazmsn); /* copy uus element if available */
  1748.         if (!pc->chan->setup.phone[0])
  1749.           { pc->para.cause = -1;
  1750.             l3ni1_disconnect_req(pc,pr,arg); /* disconnect immediately */
  1751.             return;
  1752.           } /* only uus */
  1753.  
  1754.         if (pc->prot.ni1.invoke_id) 
  1755.           free_invoke_id(pc->st,pc->prot.ni1.invoke_id);
  1756.  
  1757.         if (!(pc->prot.ni1.invoke_id = new_invoke_id(pc->st))) 
  1758.           return;
  1759.         MsgHead(p, pc->callref, MT_FACILITY);
  1760.         for (subp = pc->chan->setup.phone; (*subp) && (*subp != '.'); subp++) len_phone++; /* len of phone number */
  1761.         if (*subp++ == '.') len_sub = strlen(subp) + 2; /* length including info subaddress element */ 
  1762. *p++ = 0x1c;   /* Facility info element */
  1763.         *p++ = len_phone + len_sub + 2 + 2 + 8 + 3 + 3; /* length of element */
  1764.         *p++ = 0x91;  /* remote operations protocol */
  1765.         *p++ = 0xa1;  /* invoke component */
  1766.   
  1767.         *p++ = len_phone + len_sub + 2 + 2 + 8 + 3; /* length of data */
  1768.         *p++ = 0x02;  /* invoke id tag, integer */
  1769. *p++ = 0x01;  /* length */
  1770.         *p++ = pc->prot.ni1.invoke_id;  /* invoke id */ 
  1771.         *p++ = 0x02;  /* operation value tag, integer */
  1772. *p++ = 0x01;  /* length */
  1773.         *p++ = 0x0D;  /* Call Deflect */
  1774.   
  1775.         *p++ = 0x30;  /* sequence phone number */
  1776.         *p++ = len_phone + 2 + 2 + 3 + len_sub; /* length */
  1777.   
  1778.         *p++ = 0x30;  /* Deflected to UserNumber */
  1779.         *p++ = len_phone+2+len_sub; /* length */
  1780.         *p++ = 0x80; /* NumberDigits */
  1781. *p++ = len_phone; /* length */
  1782.         for (l = 0; l < len_phone; l++)
  1783.  *p++ = pc->chan->setup.phone[l];
  1784.         if (len_sub)
  1785.   { *p++ = 0x04; /* called party subaddress */
  1786.             *p++ = len_sub - 2;
  1787.             while (*subp) *p++ = *subp++;
  1788.           }
  1789.         *p++ = 0x01; /* screening identifier */
  1790.         *p++ = 0x01;
  1791.         *p++ = pc->chan->setup.screen;
  1792. l = p - tmp;
  1793. if (!(skb = l3_alloc_skb(l))) return;
  1794. memcpy(skb_put(skb, l), tmp, l);
  1795.         l3_msg(pc->st, DL_DATA | REQUEST, skb);
  1796. } /* l3ni1_redir_req */
  1797. /********************************************/
  1798. /* handle deflection request in early state */
  1799. /********************************************/
  1800. static void l3ni1_redir_req_early(struct l3_process *pc, u_char pr, void *arg)
  1801. {
  1802.   l3ni1_proceed_req(pc,pr,arg);
  1803.   l3ni1_redir_req(pc,pr,arg);
  1804. } /* l3ni1_redir_req_early */
  1805. /***********************************************/
  1806. /* handle special commands for this protocol.  */
  1807. /* Examples are call independant services like */
  1808. /* remote operations with dummy  callref.      */
  1809. /***********************************************/
  1810. static int l3ni1_cmd_global(struct PStack *st, isdn_ctrl *ic)
  1811. { u_char id;
  1812.   u_char temp[265];
  1813.   u_char *p = temp;
  1814.   int i, l, proc_len; 
  1815.   struct sk_buff *skb;
  1816.   struct l3_process *pc = NULL;
  1817.   switch (ic->arg)
  1818.    { case NI1_CMD_INVOKE:
  1819.        if (ic->parm.ni1_io.datalen < 0) return(-2); /* invalid parameter */ 
  1820.        for (proc_len = 1, i = ic->parm.ni1_io.proc >> 8; i; i++) 
  1821.          i = i >> 8; /* add one byte */    
  1822.        l = ic->parm.ni1_io.datalen + proc_len + 8; /* length excluding ie header */
  1823.        if (l > 255) 
  1824.          return(-2); /* too long */
  1825.        if (!(id = new_invoke_id(st))) 
  1826.          return(0); /* first get a invoke id -> return if no available */
  1827.        
  1828.        i = -1; 
  1829.        MsgHead(p, i, MT_FACILITY); /* build message head */
  1830.        *p++ = 0x1C; /* Facility IE */
  1831.        *p++ = l; /* length of ie */
  1832.        *p++ = 0x91; /* remote operations */
  1833.        *p++ = 0xA1; /* invoke */
  1834.        *p++ = l - 3; /* length of invoke */
  1835.        *p++ = 0x02; /* invoke id tag */
  1836.        *p++ = 0x01; /* length is 1 */
  1837.        *p++ = id; /* invoke id */
  1838.        *p++ = 0x02; /* operation */
  1839.        *p++ = proc_len; /* length of operation */
  1840.        
  1841.        for (i = proc_len; i; i--)
  1842.          *p++ = (ic->parm.ni1_io.proc >> (i-1)) & 0xFF;
  1843.        memcpy(p, ic->parm.ni1_io.data, ic->parm.ni1_io.datalen); /* copy data */
  1844.        l = (p - temp) + ic->parm.ni1_io.datalen; /* total length */         
  1845.        if (ic->parm.ni1_io.timeout > 0)
  1846.         if (!(pc = ni1_new_l3_process(st, -1)))
  1847.           { free_invoke_id(st, id);
  1848.             return(-2);
  1849.           } 
  1850.        pc->prot.ni1.ll_id = ic->parm.ni1_io.ll_id; /* remember id */ 
  1851.        pc->prot.ni1.proc = ic->parm.ni1_io.proc; /* and procedure */
  1852.        if (!(skb = l3_alloc_skb(l))) 
  1853.          { free_invoke_id(st, id);
  1854.            if (pc) ni1_release_l3_process(pc);
  1855.            return(-2);
  1856.          }
  1857.        memcpy(skb_put(skb, l), temp, l);
  1858.        
  1859.        if (pc)
  1860.         { pc->prot.ni1.invoke_id = id; /* remember id */
  1861.           L3AddTimer(&pc->timer, ic->parm.ni1_io.timeout, CC_TNI1_IO | REQUEST);
  1862.         }
  1863.        
  1864.        l3_msg(st, DL_DATA | REQUEST, skb);
  1865.        ic->parm.ni1_io.hl_id = id; /* return id */
  1866.        return(0);
  1867.      case NI1_CMD_INVOKE_ABORT:
  1868.        if ((pc = l3ni1_search_dummy_proc(st, ic->parm.ni1_io.hl_id)))
  1869. { L3DelTimer(&pc->timer); /* remove timer */
  1870.           ni1_release_l3_process(pc);
  1871.           return(0); 
  1872.         } 
  1873.        else
  1874. { l3_debug(st, "l3ni1_cmd_global abort unknown id");
  1875.           return(-2);
  1876.         } 
  1877.        break;
  1878.     
  1879.      default: 
  1880.        l3_debug(st, "l3ni1_cmd_global unknown cmd 0x%lx", ic->arg);
  1881.        return(-1);  
  1882.    } /* switch ic-> arg */
  1883.   return(-1);
  1884. } /* l3ni1_cmd_global */
  1885. static void 
  1886. l3ni1_io_timer(struct l3_process *pc)
  1887. { isdn_ctrl ic;
  1888.   struct IsdnCardState *cs = pc->st->l1.hardware;
  1889.   L3DelTimer(&pc->timer); /* remove timer */
  1890.   ic.driver = cs->myid;
  1891.   ic.command = ISDN_STAT_PROT;
  1892.   ic.arg = NI1_STAT_INVOKE_ERR;
  1893.   ic.parm.ni1_io.hl_id = pc->prot.ni1.invoke_id;
  1894.   ic.parm.ni1_io.ll_id = pc->prot.ni1.ll_id;
  1895.   ic.parm.ni1_io.proc = pc->prot.ni1.proc;
  1896.   ic.parm.ni1_io.timeout= -1;
  1897.   ic.parm.ni1_io.datalen = 0;
  1898.   ic.parm.ni1_io.data = NULL;
  1899.   free_invoke_id(pc->st, pc->prot.ni1.invoke_id);
  1900.   pc->prot.ni1.invoke_id = 0; /* reset id */
  1901.   cs->iif.statcallb(&ic);
  1902.   ni1_release_l3_process(pc); 
  1903. } /* l3ni1_io_timer */
  1904. static void
  1905. l3ni1_release_ind(struct l3_process *pc, u_char pr, void *arg)
  1906. {
  1907. u_char *p;
  1908. struct sk_buff *skb = arg;
  1909. int callState = 0;
  1910. p = skb->data;
  1911. if ((p = findie(p, skb->len, IE_CALL_STATE, 0))) {
  1912. p++;
  1913. if (1 == *p++)
  1914. callState = *p;
  1915. }
  1916. if (callState == 0) {
  1917. /* ETS 300-104 7.6.1, 8.6.1, 10.6.1... and 16.1
  1918.  * set down layer 3 without sending any message
  1919.  */
  1920. pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
  1921. newl3state(pc, 0);
  1922. ni1_release_l3_process(pc);
  1923. } else {
  1924. pc->st->l3.l3l4(pc->st, CC_IGNORE | INDICATION, pc);
  1925. }
  1926. }
  1927. static void
  1928. l3ni1_dummy(struct l3_process *pc, u_char pr, void *arg)
  1929. {
  1930. }
  1931. static void
  1932. l3ni1_t302(struct l3_process *pc, u_char pr, void *arg)
  1933. {
  1934. L3DelTimer(&pc->timer);
  1935. pc->para.loc = 0;
  1936. pc->para.cause = 28; /* invalid number */
  1937. l3ni1_disconnect_req(pc, pr, NULL);
  1938. pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
  1939. }
  1940. static void
  1941. l3ni1_t303(struct l3_process *pc, u_char pr, void *arg)
  1942. {
  1943. if (pc->N303 > 0) {
  1944. pc->N303--;
  1945. L3DelTimer(&pc->timer);
  1946. l3ni1_setup_req(pc, pr, arg);
  1947. } else {
  1948. L3DelTimer(&pc->timer);
  1949. l3ni1_message_cause(pc, MT_RELEASE_COMPLETE, 102);
  1950. pc->st->l3.l3l4(pc->st, CC_NOSETUP_RSP, pc);
  1951. ni1_release_l3_process(pc);
  1952. }
  1953. }
  1954. static void
  1955. l3ni1_t304(struct l3_process *pc, u_char pr, void *arg)
  1956. {
  1957. L3DelTimer(&pc->timer);
  1958. pc->para.loc = 0;
  1959. pc->para.cause = 102;
  1960. l3ni1_disconnect_req(pc, pr, NULL);
  1961. pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
  1962. }
  1963. static void
  1964. l3ni1_t305(struct l3_process *pc, u_char pr, void *arg)
  1965. {
  1966. u_char tmp[16];
  1967. u_char *p = tmp;
  1968. int l;
  1969. struct sk_buff *skb;
  1970. u_char cause = 16;
  1971. L3DelTimer(&pc->timer);
  1972. if (pc->para.cause != NO_CAUSE)
  1973. cause = pc->para.cause;
  1974. MsgHead(p, pc->callref, MT_RELEASE);
  1975. *p++ = IE_CAUSE;
  1976. *p++ = 0x2;
  1977. *p++ = 0x80;
  1978. *p++ = cause | 0x80;
  1979. l = p - tmp;
  1980. if (!(skb = l3_alloc_skb(l)))
  1981. return;
  1982. memcpy(skb_put(skb, l), tmp, l);
  1983. newl3state(pc, 19);
  1984. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  1985. L3AddTimer(&pc->timer, T308, CC_T308_1);
  1986. }
  1987. static void
  1988. l3ni1_t310(struct l3_process *pc, u_char pr, void *arg)
  1989. {
  1990. L3DelTimer(&pc->timer);
  1991. pc->para.loc = 0;
  1992. pc->para.cause = 102;
  1993. l3ni1_disconnect_req(pc, pr, NULL);
  1994. pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
  1995. }
  1996. static void
  1997. l3ni1_t313(struct l3_process *pc, u_char pr, void *arg)
  1998. {
  1999. L3DelTimer(&pc->timer);
  2000. pc->para.loc = 0;
  2001. pc->para.cause = 102;
  2002. l3ni1_disconnect_req(pc, pr, NULL);
  2003. pc->st->l3.l3l4(pc->st, CC_CONNECT_ERR, pc);
  2004. }
  2005. static void
  2006. l3ni1_t308_1(struct l3_process *pc, u_char pr, void *arg)
  2007. {
  2008. newl3state(pc, 19);
  2009. L3DelTimer(&pc->timer);
  2010. l3ni1_message(pc, MT_RELEASE);
  2011. L3AddTimer(&pc->timer, T308, CC_T308_2);
  2012. }
  2013. static void
  2014. l3ni1_t308_2(struct l3_process *pc, u_char pr, void *arg)
  2015. {
  2016. L3DelTimer(&pc->timer);
  2017. pc->st->l3.l3l4(pc->st, CC_RELEASE_ERR, pc);
  2018. ni1_release_l3_process(pc);
  2019. }
  2020. static void
  2021. l3ni1_t318(struct l3_process *pc, u_char pr, void *arg)
  2022. {
  2023. L3DelTimer(&pc->timer);
  2024. pc->para.cause = 102; /* Timer expiry */
  2025. pc->para.loc = 0; /* local */
  2026. pc->st->l3.l3l4(pc->st, CC_RESUME_ERR, pc);
  2027. newl3state(pc, 19);
  2028. l3ni1_message(pc, MT_RELEASE);
  2029. L3AddTimer(&pc->timer, T308, CC_T308_1);
  2030. }
  2031. static void
  2032. l3ni1_t319(struct l3_process *pc, u_char pr, void *arg)
  2033. {
  2034. L3DelTimer(&pc->timer);
  2035. pc->para.cause = 102; /* Timer expiry */
  2036. pc->para.loc = 0; /* local */
  2037. pc->st->l3.l3l4(pc->st, CC_SUSPEND_ERR, pc);
  2038. newl3state(pc, 10);
  2039. }
  2040. static void
  2041. l3ni1_restart(struct l3_process *pc, u_char pr, void *arg)
  2042. {
  2043. L3DelTimer(&pc->timer);
  2044. pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
  2045. ni1_release_l3_process(pc);
  2046. }
  2047. static void
  2048. l3ni1_status(struct l3_process *pc, u_char pr, void *arg)
  2049. {
  2050. u_char *p;
  2051. struct sk_buff *skb = arg;
  2052. int ret; 
  2053. u_char cause = 0, callState = 0;
  2054. if ((ret = l3ni1_get_cause(pc, skb))) {
  2055. if (pc->debug & L3_DEB_WARN)
  2056. l3_debug(pc->st, "STATUS get_cause ret(%d)",ret);
  2057. if (ret < 0)
  2058. cause = 96;
  2059. else if (ret > 0)
  2060. cause = 100;
  2061. }
  2062. if ((p = findie(skb->data, skb->len, IE_CALL_STATE, 0))) {
  2063. p++;
  2064. if (1 == *p++) {
  2065. callState = *p;
  2066. if (!ie_in_set(pc, *p, l3_valid_states))
  2067. cause = 100;
  2068. } else
  2069. cause = 100;
  2070. } else
  2071. cause = 96;
  2072. if (!cause) { /*  no error before */
  2073. ret = check_infoelements(pc, skb, ie_STATUS);
  2074. if (ERR_IE_COMPREHENSION == ret)
  2075. cause = 96;
  2076. else if (ERR_IE_UNRECOGNIZED == ret)
  2077. cause = 99;
  2078. }
  2079. if (cause) {
  2080. u_char tmp;
  2081. if (pc->debug & L3_DEB_WARN)
  2082. l3_debug(pc->st, "STATUS error(%d/%d)",ret,cause);
  2083. tmp = pc->para.cause;
  2084. pc->para.cause = cause;
  2085. l3ni1_status_send(pc, 0, NULL);
  2086. if (cause == 99)
  2087. pc->para.cause = tmp;
  2088. else
  2089. return;
  2090. }
  2091. cause = pc->para.cause;
  2092. if (((cause & 0x7f) == 111) && (callState == 0)) {
  2093. /* ETS 300-104 7.6.1, 8.6.1, 10.6.1...
  2094.  * if received MT_STATUS with cause == 111 and call
  2095.  * state == 0, then we must set down layer 3
  2096.  */
  2097. pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
  2098. newl3state(pc, 0);
  2099. ni1_release_l3_process(pc);
  2100. }
  2101. }
  2102. static void
  2103. l3ni1_facility(struct l3_process *pc, u_char pr, void *arg)
  2104. {
  2105. struct sk_buff *skb = arg;
  2106. int ret;
  2107. ret = check_infoelements(pc, skb, ie_FACILITY);
  2108. l3ni1_std_ie_err(pc, ret);
  2109.     {
  2110. u_char *p;
  2111. if ((p = findie(skb->data, skb->len, IE_FACILITY, 0)))
  2112. l3ni1_parse_facility(pc->st, pc, pc->callref, p);
  2113. }
  2114. }
  2115. static void
  2116. l3ni1_suspend_req(struct l3_process *pc, u_char pr, void *arg)
  2117. {
  2118. struct sk_buff *skb;
  2119. u_char tmp[32];
  2120. u_char *p = tmp;
  2121. u_char i, l;
  2122. u_char *msg = pc->chan->setup.phone;
  2123. MsgHead(p, pc->callref, MT_SUSPEND);
  2124. l = *msg++;
  2125. if (l && (l <= 10)) { /* Max length 10 octets */
  2126. *p++ = IE_CALL_ID;
  2127. *p++ = l;
  2128. for (i = 0; i < l; i++)
  2129. *p++ = *msg++;
  2130. } else if (l) {
  2131. l3_debug(pc->st, "SUS wrong CALL_ID len %d", l);
  2132. return;
  2133. }
  2134. l = p - tmp;
  2135. if (!(skb = l3_alloc_skb(l)))
  2136. return;
  2137. memcpy(skb_put(skb, l), tmp, l);
  2138. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  2139. newl3state(pc, 15);
  2140. L3AddTimer(&pc->timer, T319, CC_T319);
  2141. }
  2142. static void
  2143. l3ni1_suspend_ack(struct l3_process *pc, u_char pr, void *arg)
  2144. {
  2145. struct sk_buff *skb = arg;
  2146. int ret;
  2147. L3DelTimer(&pc->timer);
  2148. newl3state(pc, 0);
  2149. pc->para.cause = NO_CAUSE;
  2150. pc->st->l3.l3l4(pc->st, CC_SUSPEND | CONFIRM, pc);
  2151. /* We don't handle suspend_ack for IE errors now */
  2152. if ((ret = check_infoelements(pc, skb, ie_SUSPEND_ACKNOWLEDGE)))
  2153. if (pc->debug & L3_DEB_WARN)
  2154. l3_debug(pc->st, "SUSPACK check ie(%d)",ret);
  2155. ni1_release_l3_process(pc);
  2156. }
  2157. static void
  2158. l3ni1_suspend_rej(struct l3_process *pc, u_char pr, void *arg)
  2159. {
  2160. struct sk_buff *skb = arg;
  2161. int ret;
  2162. if ((ret = l3ni1_get_cause(pc, skb))) {
  2163. if (pc->debug & L3_DEB_WARN)
  2164. l3_debug(pc->st, "SUSP_REJ get_cause ret(%d)",ret);
  2165. if (ret < 0) 
  2166. pc->para.cause = 96;
  2167. else
  2168. pc->para.cause = 100;
  2169. l3ni1_status_send(pc, pr, NULL);
  2170. return;
  2171. }
  2172. ret = check_infoelements(pc, skb, ie_SUSPEND_REJECT);
  2173. if (ERR_IE_COMPREHENSION == ret) {
  2174. l3ni1_std_ie_err(pc, ret);
  2175. return;
  2176. }
  2177. L3DelTimer(&pc->timer);
  2178. pc->st->l3.l3l4(pc->st, CC_SUSPEND_ERR, pc);
  2179. newl3state(pc, 10);
  2180. if (ret) /* STATUS for none mandatory IE errors after actions are taken */
  2181. l3ni1_std_ie_err(pc, ret);
  2182. }
  2183. static void
  2184. l3ni1_resume_req(struct l3_process *pc, u_char pr, void *arg)
  2185. {
  2186. struct sk_buff *skb;
  2187. u_char tmp[32];
  2188. u_char *p = tmp;
  2189. u_char i, l;
  2190. u_char *msg = pc->para.setup.phone;
  2191. MsgHead(p, pc->callref, MT_RESUME);
  2192. l = *msg++;
  2193. if (l && (l <= 10)) { /* Max length 10 octets */
  2194. *p++ = IE_CALL_ID;
  2195. *p++ = l;
  2196. for (i = 0; i < l; i++)
  2197. *p++ = *msg++;
  2198. } else if (l) {
  2199. l3_debug(pc->st, "RES wrong CALL_ID len %d", l);
  2200. return;
  2201. }
  2202. l = p - tmp;
  2203. if (!(skb = l3_alloc_skb(l)))
  2204. return;
  2205. memcpy(skb_put(skb, l), tmp, l);
  2206. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  2207. newl3state(pc, 17);
  2208. L3AddTimer(&pc->timer, T318, CC_T318);
  2209. }
  2210. static void
  2211. l3ni1_resume_ack(struct l3_process *pc, u_char pr, void *arg)
  2212. {
  2213. struct sk_buff *skb = arg;
  2214. int id, ret;
  2215. if ((id = l3ni1_get_channel_id(pc, skb)) > 0) {
  2216. if ((0 == id) || ((3 == id) && (0x10 == pc->para.moderate))) {
  2217. if (pc->debug & L3_DEB_WARN)
  2218. l3_debug(pc->st, "resume ack with wrong chid %x", id);
  2219. pc->para.cause = 100;
  2220. l3ni1_status_send(pc, pr, NULL);
  2221. return;
  2222. }
  2223. pc->para.bchannel = id;
  2224. } else if (1 == pc->state) {
  2225. if (pc->debug & L3_DEB_WARN)
  2226. l3_debug(pc->st, "resume ack without chid (ret %d)", id);
  2227. pc->para.cause = 96;
  2228. l3ni1_status_send(pc, pr, NULL);
  2229. return;
  2230. }
  2231. ret = check_infoelements(pc, skb, ie_RESUME_ACKNOWLEDGE);
  2232. if (ERR_IE_COMPREHENSION == ret) {
  2233. l3ni1_std_ie_err(pc, ret);
  2234. return;
  2235. }
  2236. L3DelTimer(&pc->timer);
  2237. pc->st->l3.l3l4(pc->st, CC_RESUME | CONFIRM, pc);
  2238. newl3state(pc, 10);
  2239. if (ret) /* STATUS for none mandatory IE errors after actions are taken */
  2240. l3ni1_std_ie_err(pc, ret);
  2241. }
  2242. static void
  2243. l3ni1_resume_rej(struct l3_process *pc, u_char pr, void *arg)
  2244. {
  2245. struct sk_buff *skb = arg;
  2246. int ret;
  2247. if ((ret = l3ni1_get_cause(pc, skb))) {
  2248. if (pc->debug & L3_DEB_WARN)
  2249. l3_debug(pc->st, "RES_REJ get_cause ret(%d)",ret);
  2250. if (ret < 0) 
  2251. pc->para.cause = 96;
  2252. else
  2253. pc->para.cause = 100;
  2254. l3ni1_status_send(pc, pr, NULL);
  2255. return;
  2256. }
  2257. ret = check_infoelements(pc, skb, ie_RESUME_REJECT);
  2258. if (ERR_IE_COMPREHENSION == ret) {
  2259. l3ni1_std_ie_err(pc, ret);
  2260. return;
  2261. }
  2262. L3DelTimer(&pc->timer);
  2263. pc->st->l3.l3l4(pc->st, CC_RESUME_ERR, pc);
  2264. newl3state(pc, 0);
  2265. if (ret) /* STATUS for none mandatory IE errors after actions are taken */
  2266. l3ni1_std_ie_err(pc, ret);
  2267. ni1_release_l3_process(pc);
  2268. }
  2269. static void
  2270. l3ni1_global_restart(struct l3_process *pc, u_char pr, void *arg)
  2271. {
  2272. u_char tmp[32];
  2273. u_char *p;
  2274. u_char ri, ch = 0, chan = 0;
  2275. int l;
  2276. struct sk_buff *skb = arg;
  2277. struct l3_process *up;
  2278. newl3state(pc, 2);
  2279. L3DelTimer(&pc->timer);
  2280. p = skb->data;
  2281. if ((p = findie(p, skb->len, IE_RESTART_IND, 0))) {
  2282. ri = p[2];
  2283. l3_debug(pc->st, "Restart %x", ri);
  2284. } else {
  2285. l3_debug(pc->st, "Restart without restart IE");
  2286. ri = 0x86;
  2287. }
  2288. p = skb->data;
  2289. if ((p = findie(p, skb->len, IE_CHANNEL_ID, 0))) {
  2290. chan = p[2] & 3;
  2291. ch = p[2];
  2292. if (pc->st->l3.debug)
  2293. l3_debug(pc->st, "Restart for channel %d", chan);
  2294. }
  2295. newl3state(pc, 2);
  2296. up = pc->st->l3.proc;
  2297. while (up) {
  2298. if ((ri & 7) == 7)
  2299. up->st->lli.l4l3(up->st, CC_RESTART | REQUEST, up);
  2300. else if (up->para.bchannel == chan)
  2301. up->st->lli.l4l3(up->st, CC_RESTART | REQUEST, up);
  2302. up = up->next;
  2303. }
  2304. p = tmp;
  2305. MsgHead(p, pc->callref, MT_RESTART_ACKNOWLEDGE);
  2306. if (chan) {
  2307. *p++ = IE_CHANNEL_ID;
  2308. *p++ = 1;
  2309. *p++ = ch | 0x80;
  2310. }
  2311. *p++ = 0x79; /* RESTART Ind */
  2312. *p++ = 1;
  2313. *p++ = ri;
  2314. l = p - tmp;
  2315. if (!(skb = l3_alloc_skb(l)))
  2316. return;
  2317. memcpy(skb_put(skb, l), tmp, l);
  2318. newl3state(pc, 0);
  2319. l3_msg(pc->st, DL_DATA | REQUEST, skb);
  2320. }
  2321. static void
  2322. l3ni1_dl_reset(struct l3_process *pc, u_char pr, void *arg)
  2323. {
  2324.         pc->para.cause = 0x29;          /* Temporary failure */
  2325.         pc->para.loc = 0;
  2326.         l3ni1_disconnect_req(pc, pr, NULL);
  2327.         pc->st->l3.l3l4(pc->st, CC_SETUP_ERR, pc);
  2328. }
  2329. static void
  2330. l3ni1_dl_release(struct l3_process *pc, u_char pr, void *arg)
  2331. {
  2332.         newl3state(pc, 0);
  2333.         pc->para.cause = 0x1b;          /* Destination out of order */
  2334.         pc->para.loc = 0;
  2335.         pc->st->l3.l3l4(pc->st, CC_RELEASE | INDICATION, pc);
  2336.         release_l3_process(pc);
  2337. }
  2338. static void
  2339. l3ni1_dl_reestablish(struct l3_process *pc, u_char pr, void *arg)
  2340. {
  2341.         L3DelTimer(&pc->timer);
  2342.         L3AddTimer(&pc->timer, T309, CC_T309);
  2343.         l3_msg(pc->st, DL_ESTABLISH | REQUEST, NULL);
  2344. }
  2345.  
  2346. static void
  2347. l3ni1_dl_reest_status(struct l3_process *pc, u_char pr, void *arg)
  2348. {
  2349. L3DelTimer(&pc->timer);
  2350.  
  2351.   pc->para.cause = 0x1F; /* normal, unspecified */
  2352. l3ni1_status_send(pc, 0, NULL);
  2353. }
  2354. static void l3ni1_SendSpid( struct l3_process *pc, u_char pr, struct sk_buff *skb, int iNewState )
  2355. {
  2356. u_char         * p;
  2357. char           * pSPID;
  2358. struct Channel * pChan = pc->st->lli.userdata;
  2359. int              l;
  2360. if ( skb )
  2361. dev_kfree_skb( skb);
  2362. if ( !( pSPID = strchr( pChan->setup.eazmsn, ':' ) ) )
  2363. {
  2364. printk( KERN_ERR "SPID not supplied in EAZMSN %sn", pChan->setup.eazmsn );
  2365. newl3state( pc, 0 );
  2366. pc->st->l3.l3l2( pc->st, DL_RELEASE | REQUEST, NULL );
  2367. return;
  2368. }
  2369. l = strlen( ++pSPID );
  2370. if ( !( skb = l3_alloc_skb( 5+l ) ) )
  2371. {
  2372. printk( KERN_ERR "HiSax can't get memory to send SPIDn" );
  2373. return;
  2374. }
  2375. p = skb_put( skb, 5 );
  2376. *p++ = PROTO_DIS_EURO;
  2377. *p++ = 0;
  2378. *p++ = MT_INFORMATION;
  2379. *p++ = IE_SPID;
  2380. *p++ = l;
  2381. memcpy( skb_put( skb, l ), pSPID, l );
  2382. newl3state( pc, iNewState );
  2383. L3DelTimer( &pc->timer );
  2384. L3AddTimer( &pc->timer, TSPID, CC_TSPID );
  2385. pc->st->l3.l3l2( pc->st, DL_DATA | REQUEST, skb );
  2386. }
  2387. static void l3ni1_spid_send( struct l3_process *pc, u_char pr, void *arg )
  2388. {
  2389. l3ni1_SendSpid( pc, pr, arg, 20 );
  2390. }
  2391. void l3ni1_spid_epid( struct l3_process *pc, u_char pr, void *arg )
  2392. {
  2393. struct sk_buff *skb = arg;
  2394. if ( skb->data[ 1 ] == 0 )
  2395. if ( skb->data[ 3 ] == IE_ENDPOINT_ID )
  2396. {
  2397. L3DelTimer( &pc->timer );
  2398. newl3state( pc, 0 );
  2399. l3_msg( pc->st, DL_ESTABLISH | CONFIRM, NULL );
  2400. }
  2401. dev_kfree_skb( skb);
  2402. }
  2403. static void l3ni1_spid_tout( struct l3_process *pc, u_char pr, void *arg )
  2404. {
  2405. if ( pc->state < 22 )
  2406. l3ni1_SendSpid( pc, pr, arg, pc->state+1 );
  2407. else
  2408. {
  2409. L3DelTimer( &pc->timer );
  2410. dev_kfree_skb( arg);
  2411. printk( KERN_ERR "SPID not acceptedn" );
  2412. newl3state( pc, 0 );
  2413. pc->st->l3.l3l2( pc->st, DL_RELEASE | REQUEST, NULL );
  2414. }
  2415. }
  2416. /* *INDENT-OFF* */
  2417. static struct stateentry downstatelist[] =
  2418. {
  2419. {SBIT(0),
  2420.  CC_SETUP | REQUEST, l3ni1_setup_req},
  2421. {SBIT(0),
  2422.  CC_RESUME | REQUEST, l3ni1_resume_req},
  2423. {SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4) | SBIT(6) | SBIT(7) | SBIT(8) | SBIT(9) | SBIT(10) | SBIT(25),
  2424.  CC_DISCONNECT | REQUEST, l3ni1_disconnect_req},
  2425. {SBIT(12),
  2426.  CC_RELEASE | REQUEST, l3ni1_release_req},
  2427. {ALL_STATES,
  2428.  CC_RESTART | REQUEST, l3ni1_restart},
  2429. {SBIT(6) | SBIT(25),
  2430.  CC_IGNORE | REQUEST, l3ni1_reset},
  2431. {SBIT(6) | SBIT(25),
  2432.  CC_REJECT | REQUEST, l3ni1_reject_req},
  2433. {SBIT(6) | SBIT(25),
  2434.  CC_PROCEED_SEND | REQUEST, l3ni1_proceed_req},
  2435. {SBIT(6),
  2436.  CC_MORE_INFO | REQUEST, l3ni1_setup_ack_req},
  2437. {SBIT(25),
  2438.  CC_MORE_INFO | REQUEST, l3ni1_dummy},
  2439. {SBIT(6) | SBIT(9) | SBIT(25),
  2440.  CC_ALERTING | REQUEST, l3ni1_alert_req},
  2441. {SBIT(6) | SBIT(7) | SBIT(9) | SBIT(25),
  2442.  CC_SETUP | RESPONSE, l3ni1_setup_rsp},
  2443. {SBIT(10),
  2444.  CC_SUSPEND | REQUEST, l3ni1_suspend_req},
  2445.         {SBIT(7) | SBIT(9) | SBIT(25),
  2446.          CC_REDIR | REQUEST, l3ni1_redir_req},
  2447.         {SBIT(6),
  2448.          CC_REDIR | REQUEST, l3ni1_redir_req_early},
  2449.         {SBIT(9) | SBIT(25),
  2450.          CC_DISCONNECT | REQUEST, l3ni1_disconnect_req},
  2451. {SBIT(25),
  2452.  CC_T302, l3ni1_t302},
  2453. {SBIT(1),
  2454.  CC_T303, l3ni1_t303},
  2455. {SBIT(2),
  2456.  CC_T304, l3ni1_t304},
  2457. {SBIT(3),
  2458.  CC_T310, l3ni1_t310},
  2459. {SBIT(8),
  2460.  CC_T313, l3ni1_t313},
  2461. {SBIT(11),
  2462.  CC_T305, l3ni1_t305},
  2463. {SBIT(15),
  2464.  CC_T319, l3ni1_t319},
  2465. {SBIT(17),
  2466.  CC_T318, l3ni1_t318},
  2467. {SBIT(19),
  2468.  CC_T308_1, l3ni1_t308_1},
  2469. {SBIT(19),
  2470.  CC_T308_2, l3ni1_t308_2},
  2471. {SBIT(10),
  2472.  CC_T309, l3ni1_dl_release},
  2473. { SBIT( 20 ) | SBIT( 21 ) | SBIT( 22 ),
  2474.  CC_TSPID, l3ni1_spid_tout },
  2475. };
  2476. #define DOWNSLLEN 
  2477. (sizeof(downstatelist) / sizeof(struct stateentry))
  2478. static struct stateentry datastatelist[] =
  2479. {
  2480. {ALL_STATES,
  2481.  MT_STATUS_ENQUIRY, l3ni1_status_enq},
  2482. {ALL_STATES,
  2483.  MT_FACILITY, l3ni1_facility},
  2484. {SBIT(19),
  2485.  MT_STATUS, l3ni1_release_ind},
  2486. {ALL_STATES,
  2487.  MT_STATUS, l3ni1_status},
  2488. {SBIT(0),
  2489.  MT_SETUP, l3ni1_setup},
  2490. {SBIT(6) | SBIT(7) | SBIT(8) | SBIT(9) | SBIT(10) | SBIT(11) | SBIT(12) |
  2491.  SBIT(15) | SBIT(17) | SBIT(19) | SBIT(25),
  2492.  MT_SETUP, l3ni1_dummy},
  2493. {SBIT(1) | SBIT(2),
  2494.  MT_CALL_PROCEEDING, l3ni1_call_proc},
  2495. {SBIT(1),
  2496.  MT_SETUP_ACKNOWLEDGE, l3ni1_setup_ack},
  2497. {SBIT(2) | SBIT(3),
  2498.  MT_ALERTING, l3ni1_alerting},
  2499. {SBIT(2) | SBIT(3),
  2500.  MT_PROGRESS, l3ni1_progress},
  2501. {SBIT(2) | SBIT(3) | SBIT(4) | SBIT(7) | SBIT(8) | SBIT(9) | SBIT(10) |
  2502.  SBIT(11) | SBIT(12) | SBIT(15) | SBIT(17) | SBIT(19) | SBIT(25),
  2503.  MT_INFORMATION, l3ni1_information},
  2504. {SBIT(10) | SBIT(11) | SBIT(15),
  2505.  MT_NOTIFY, l3ni1_notify},
  2506. {SBIT(0) | SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4) | SBIT(7) | SBIT(8) | SBIT(10) |
  2507.  SBIT(11) | SBIT(12) | SBIT(15) | SBIT(17) | SBIT(19) | SBIT(25),
  2508.  MT_RELEASE_COMPLETE, l3ni1_release_cmpl},
  2509. {SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4) | SBIT(7) | SBIT(8) | SBIT(9) | SBIT(10) | SBIT(11) | SBIT(12) | SBIT(15) | SBIT(17) | SBIT(25),
  2510.  MT_RELEASE, l3ni1_release},
  2511. {SBIT(19),  MT_RELEASE, l3ni1_release_ind},
  2512. {SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4) | SBIT(7) | SBIT(8) | SBIT(9) | SBIT(10) | SBIT(11) | SBIT(15) | SBIT(17) | SBIT(25),
  2513.  MT_DISCONNECT, l3ni1_disconnect},
  2514. {SBIT(19),
  2515.  MT_DISCONNECT, l3ni1_dummy},
  2516. {SBIT(1) | SBIT(2) | SBIT(3) | SBIT(4),
  2517.  MT_CONNECT, l3ni1_connect},
  2518. {SBIT(8),
  2519.  MT_CONNECT_ACKNOWLEDGE, l3ni1_connect_ack},
  2520. {SBIT(15),
  2521.  MT_SUSPEND_ACKNOWLEDGE, l3ni1_suspend_ack},
  2522. {SBIT(15),
  2523.  MT_SUSPEND_REJECT, l3ni1_suspend_rej},
  2524. {SBIT(17),
  2525.  MT_RESUME_ACKNOWLEDGE, l3ni1_resume_ack},
  2526. {SBIT(17),
  2527.  MT_RESUME_REJECT, l3ni1_resume_rej},
  2528. };
  2529. #define DATASLLEN 
  2530. (sizeof(datastatelist) / sizeof(struct stateentry))
  2531. static struct stateentry globalmes_list[] =
  2532. {
  2533. {ALL_STATES,
  2534.  MT_STATUS, l3ni1_status},
  2535. {SBIT(0),
  2536.  MT_RESTART, l3ni1_global_restart},
  2537. /* {SBIT(1),
  2538.  MT_RESTART_ACKNOWLEDGE, l3ni1_restart_ack},
  2539. */
  2540. { SBIT( 0 ), MT_DL_ESTABLISHED, l3ni1_spid_send },
  2541. { SBIT( 20 ) | SBIT( 21 ) | SBIT( 22 ), MT_INFORMATION, l3ni1_spid_epid },
  2542. };
  2543. #define GLOBALM_LEN 
  2544. (sizeof(globalmes_list) / sizeof(struct stateentry))
  2545. static struct stateentry manstatelist[] =
  2546. {
  2547.         {SBIT(2),
  2548.          DL_ESTABLISH | INDICATION, l3ni1_dl_reset},
  2549.         {SBIT(10),
  2550.          DL_ESTABLISH | CONFIRM, l3ni1_dl_reest_status},
  2551.         {SBIT(10),
  2552.          DL_RELEASE | INDICATION, l3ni1_dl_reestablish},
  2553.         {ALL_STATES,
  2554.          DL_RELEASE | INDICATION, l3ni1_dl_release},
  2555. };
  2556. #define MANSLLEN 
  2557.         (sizeof(manstatelist) / sizeof(struct stateentry))
  2558. /* *INDENT-ON* */
  2559. static void
  2560. global_handler(struct PStack *st, int mt, struct sk_buff *skb)
  2561. {
  2562. u_char tmp[16];
  2563. u_char *p = tmp;
  2564. int l;
  2565. int i;
  2566. struct l3_process *proc = st->l3.global;
  2567. if ( skb )
  2568. proc->callref = skb->data[2]; /* cr flag */
  2569. else
  2570. proc->callref = 0;
  2571. for (i = 0; i < GLOBALM_LEN; i++)
  2572. if ((mt == globalmes_list[i].primitive) &&
  2573.     ((1 << proc->state) & globalmes_list[i].state))
  2574. break;
  2575. if (i == GLOBALM_LEN) {
  2576. if (st->l3.debug & L3_DEB_STATE) {
  2577. l3_debug(st, "ni1 global state %d mt %x unhandled",
  2578. proc->state, mt);
  2579. }
  2580. MsgHead(p, proc->callref, MT_STATUS);
  2581. *p++ = IE_CAUSE;
  2582. *p++ = 0x2;
  2583. *p++ = 0x80;
  2584. *p++ = 81 |0x80; /* invalid cr */
  2585. *p++ = 0x14; /* CallState */
  2586. *p++ = 0x1;
  2587. *p++ = proc->state & 0x3f;
  2588. l = p - tmp;
  2589. if (!(skb = l3_alloc_skb(l)))
  2590. return;
  2591. memcpy(skb_put(skb, l), tmp, l);
  2592. l3_msg(proc->st, DL_DATA | REQUEST, skb);
  2593. } else {
  2594. if (st->l3.debug & L3_DEB_STATE) {
  2595. l3_debug(st, "ni1 global %d mt %x",
  2596. proc->state, mt);
  2597. }
  2598. globalmes_list[i].rout(proc, mt, skb);
  2599. }
  2600. }
  2601. static void
  2602. ni1up(struct PStack *st, int pr, void *arg)
  2603. {
  2604. int i, mt, cr, cause, callState;
  2605. char *ptr;
  2606. u_char *p;
  2607. struct sk_buff *skb = arg;
  2608. struct l3_process *proc;
  2609. switch (pr) {
  2610. case (DL_DATA | INDICATION):
  2611. case (DL_UNIT_DATA | INDICATION):
  2612. break;
  2613. case (DL_ESTABLISH | INDICATION):
  2614. case (DL_RELEASE | INDICATION):
  2615. case (DL_RELEASE | CONFIRM):
  2616. l3_msg(st, pr, arg);
  2617. return;
  2618. break;
  2619. case (DL_ESTABLISH | CONFIRM):
  2620. global_handler( st, MT_DL_ESTABLISHED, NULL );
  2621. return;
  2622. default:
  2623. printk(KERN_ERR "HiSax ni1up unknown pr=%04xn", pr);
  2624. return;
  2625. }
  2626. if (skb->len < 3) {
  2627. l3_debug(st, "ni1up frame too short(%d)", skb->len);
  2628. dev_kfree_skb(skb);
  2629. return;
  2630. }
  2631. if (skb->data[0] != PROTO_DIS_EURO) {
  2632. if (st->l3.debug & L3_DEB_PROTERR) {
  2633. l3_debug(st, "ni1up%sunexpected discriminator %x message len %d",
  2634.  (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
  2635.  skb->data[0], skb->len);
  2636. }
  2637. dev_kfree_skb(skb);
  2638. return;
  2639. }
  2640. cr = getcallref(skb->data);
  2641. if (skb->len < ((skb->data[1] & 0x0f) + 3)) {
  2642. l3_debug(st, "ni1up frame too short(%d)", skb->len);
  2643. dev_kfree_skb(skb);
  2644. return;
  2645. }
  2646. mt = skb->data[skb->data[1] + 2];
  2647. if (st->l3.debug & L3_DEB_STATE)
  2648. l3_debug(st, "ni1up cr %d", cr);
  2649. if (cr == -2) {  /* wrong Callref */
  2650. if (st->l3.debug & L3_DEB_WARN)
  2651. l3_debug(st, "ni1up wrong Callref");
  2652. dev_kfree_skb(skb);
  2653. return;
  2654. } else if (cr == -1) { /* Dummy Callref */
  2655. if (mt == MT_FACILITY)
  2656. {
  2657. if ((p = findie(skb->data, skb->len, IE_FACILITY, 0))) {
  2658. l3ni1_parse_facility(st, NULL, 
  2659. (pr == (DL_DATA | INDICATION)) ? -1 : -2, p); 
  2660. dev_kfree_skb(skb);
  2661. return;  
  2662. }
  2663. }
  2664. else
  2665. {
  2666. global_handler(st, mt, skb);
  2667. return;
  2668. }
  2669. if (st->l3.debug & L3_DEB_WARN)
  2670. l3_debug(st, "ni1up dummy Callref (no facility msg or ie)");
  2671. dev_kfree_skb(skb);
  2672. return;
  2673. } else if ((((skb->data[1] & 0x0f) == 1) && (0==(cr & 0x7f))) ||
  2674. (((skb->data[1] & 0x0f) == 2) && (0==(cr & 0x7fff)))) { /* Global CallRef */
  2675. if (st->l3.debug & L3_DEB_STATE)
  2676. l3_debug(st, "ni1up Global CallRef");
  2677. global_handler(st, mt, skb);
  2678. dev_kfree_skb(skb);
  2679. return;
  2680. } else if (!(proc = getl3proc(st, cr))) {
  2681. /* No transaction process exist, that means no call with
  2682.  * this callreference is active
  2683.  */
  2684. if (mt == MT_SETUP) {
  2685. /* Setup creates a new transaction process */
  2686. if (skb->data[2] & 0x80) {
  2687. /* Setup with wrong CREF flag */
  2688. if (st->l3.debug & L3_DEB_STATE)
  2689. l3_debug(st, "ni1up wrong CRef flag");
  2690. dev_kfree_skb(skb);
  2691. return;
  2692. }
  2693. if (!(proc = ni1_new_l3_process(st, cr))) {
  2694. /* May be to answer with RELEASE_COMPLETE and
  2695.  * CAUSE 0x2f "Resource unavailable", but this
  2696.  * need a new_l3_process too ... arghh
  2697.  */
  2698. dev_kfree_skb(skb);
  2699. return;
  2700. }
  2701. } else if (mt == MT_STATUS) {
  2702. cause = 0;
  2703. if ((ptr = findie(skb->data, skb->len, IE_CAUSE, 0)) != NULL) {
  2704. ptr++;
  2705. if (*ptr++ == 2)
  2706. ptr++;
  2707. cause = *ptr & 0x7f;
  2708. }
  2709. callState = 0;
  2710. if ((ptr = findie(skb->data, skb->len, IE_CALL_STATE, 0)) != NULL) {
  2711. ptr++;
  2712. if (*ptr++ == 2)
  2713. ptr++;
  2714. callState = *ptr;
  2715. }
  2716. /* ETS 300-104 part 2.4.1
  2717.  * if setup has not been made and a message type
  2718.  * MT_STATUS is received with call state == 0,
  2719.  * we must send nothing
  2720.  */
  2721. if (callState != 0) {
  2722. /* ETS 300-104 part 2.4.2
  2723.  * if setup has not been made and a message type
  2724.  * MT_STATUS is received with call state != 0,
  2725.  * we must send MT_RELEASE_COMPLETE cause 101
  2726.  */
  2727. if ((proc = ni1_new_l3_process(st, cr))) {
  2728. proc->para.cause = 101;
  2729. l3ni1_msg_without_setup(proc, 0, NULL);
  2730. }
  2731. }
  2732. dev_kfree_skb(skb);
  2733. return;
  2734. } else if (mt == MT_RELEASE_COMPLETE) {
  2735. dev_kfree_skb(skb);
  2736. return;
  2737. } else {
  2738. /* ETS 300-104 part 2
  2739.  * if setup has not been made and a message type
  2740.  * (except MT_SETUP and RELEASE_COMPLETE) is received,
  2741.  * we must send MT_RELEASE_COMPLETE cause 81 */
  2742. dev_kfree_skb(skb);
  2743. if ((proc = ni1_new_l3_process(st, cr))) {
  2744. proc->para.cause = 81;
  2745. l3ni1_msg_without_setup(proc, 0, NULL);
  2746. }
  2747. return;
  2748. }
  2749. }
  2750. if (l3ni1_check_messagetype_validity(proc, mt, skb)) {
  2751. dev_kfree_skb(skb);
  2752. return;
  2753. }
  2754. if ((p = findie(skb->data, skb->len, IE_DISPLAY, 0)) != NULL) 
  2755.   l3ni1_deliver_display(proc, pr, p); /* Display IE included */
  2756. for (i = 0; i < DATASLLEN; i++)
  2757. if ((mt == datastatelist[i].primitive) &&
  2758.     ((1 << proc->state) & datastatelist[i].state))
  2759. break;
  2760. if (i == DATASLLEN) {
  2761. if (st->l3.debug & L3_DEB_STATE) {
  2762. l3_debug(st, "ni1up%sstate %d mt %#x unhandled",
  2763. (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
  2764. proc->state, mt);
  2765. }
  2766. if ((MT_RELEASE_COMPLETE != mt) && (MT_RELEASE != mt)) {
  2767. proc->para.cause = 101;
  2768. l3ni1_status_send(proc, pr, skb);
  2769. }
  2770. } else {
  2771. if (st->l3.debug & L3_DEB_STATE) {
  2772. l3_debug(st, "ni1up%sstate %d mt %x",
  2773. (pr == (DL_DATA | INDICATION)) ? " " : "(broadcast) ",
  2774. proc->state, mt);
  2775. }
  2776. datastatelist[i].rout(proc, pr, skb);
  2777. }
  2778. dev_kfree_skb(skb);
  2779. return;
  2780. }
  2781. static void
  2782. ni1down(struct PStack *st, int pr, void *arg)
  2783. {
  2784. int i, cr;
  2785. struct l3_process *proc;
  2786. struct Channel *chan;
  2787. if ((DL_ESTABLISH | REQUEST) == pr) {
  2788. l3_msg(st, pr, NULL);
  2789. return;
  2790. } else if (((CC_SETUP | REQUEST) == pr) || ((CC_RESUME | REQUEST) == pr)) {
  2791. chan = arg;
  2792. cr = newcallref();
  2793. cr |= 0x80;
  2794. if ((proc = ni1_new_l3_process(st, cr))) {
  2795. proc->chan = chan;
  2796. chan->proc = proc;
  2797. memcpy(&proc->para.setup, &chan->setup, sizeof(setup_parm));
  2798. proc->callref = cr;
  2799. }
  2800. } else {
  2801. proc = arg;
  2802. }
  2803. if (!proc) {
  2804. printk(KERN_ERR "HiSax ni1down without proc pr=%04xn", pr);
  2805. return;
  2806. }
  2807. if ( pr == (CC_TNI1_IO | REQUEST)) {
  2808. l3ni1_io_timer(proc); /* timer expires */ 
  2809. return;
  2810. }  
  2811. for (i = 0; i < DOWNSLLEN; i++)
  2812. if ((pr == downstatelist[i].primitive) &&
  2813.     ((1 << proc->state) & downstatelist[i].state))
  2814. break;
  2815. if (i == DOWNSLLEN) {
  2816. if (st->l3.debug & L3_DEB_STATE) {
  2817. l3_debug(st, "ni1down state %d prim %#x unhandled",
  2818. proc->state, pr);
  2819. }
  2820. } else {
  2821. if (st->l3.debug & L3_DEB_STATE) {
  2822. l3_debug(st, "ni1down state %d prim %#x",
  2823. proc->state, pr);
  2824. }
  2825. downstatelist[i].rout(proc, pr, arg);
  2826. }
  2827. }
  2828. static void
  2829. ni1man(struct PStack *st, int pr, void *arg)
  2830. {
  2831.         int i;
  2832.         struct l3_process *proc = arg;
  2833.         if (!proc) {
  2834.                 printk(KERN_ERR "HiSax ni1man without proc pr=%04xn", pr);
  2835.                 return;
  2836.         }
  2837.         for (i = 0; i < MANSLLEN; i++)
  2838.                 if ((pr == manstatelist[i].primitive) &&
  2839.                     ((1 << proc->state) & manstatelist[i].state))
  2840.                         break;
  2841.         if (i == MANSLLEN) {
  2842.                 if (st->l3.debug & L3_DEB_STATE) {
  2843.                         l3_debug(st, "cr %d ni1man state %d prim %#x unhandled",
  2844.                                 proc->callref & 0x7f, proc->state, pr);
  2845.                 }
  2846.         } else {
  2847.                 if (st->l3.debug & L3_DEB_STATE) {
  2848.                         l3_debug(st, "cr %d ni1man state %d prim %#x",
  2849.                                 proc->callref & 0x7f, proc->state, pr);
  2850.                 }
  2851.                 manstatelist[i].rout(proc, pr, arg);
  2852.         }
  2853. }
  2854.  
  2855. void
  2856. setstack_ni1(struct PStack *st)
  2857. {
  2858. char tmp[64];
  2859. int i;
  2860. st->lli.l4l3 = ni1down;
  2861. st->lli.l4l3_proto = l3ni1_cmd_global;
  2862. st->l2.l2l3 = ni1up;
  2863. st->l3.l3ml3 = ni1man;
  2864. st->l3.N303 = 1;
  2865. st->prot.ni1.last_invoke_id = 0;
  2866. st->prot.ni1.invoke_used[0] = 1; /* Bit 0 must always be set to 1 */
  2867. i = 1;
  2868. while (i < 32) 
  2869. st->prot.ni1.invoke_used[i++] = 0;   
  2870. if (!(st->l3.global = kmalloc(sizeof(struct l3_process), GFP_ATOMIC))) {
  2871. printk(KERN_ERR "HiSax can't get memory for ni1 global CRn");
  2872. } else {
  2873. st->l3.global->state = 0;
  2874. st->l3.global->callref = 0;
  2875. st->l3.global->next = NULL;
  2876. st->l3.global->debug = L3_DEB_WARN;
  2877. st->l3.global->st = st;
  2878. st->l3.global->N303 = 1;
  2879. st->l3.global->prot.ni1.invoke_id = 0; 
  2880. L3InitTimer(st->l3.global, &st->l3.global->timer);
  2881. }
  2882. strcpy(tmp, ni1_revision);
  2883. printk(KERN_INFO "HiSax: National ISDN-1 Rev. %sn", HiSax_getrev(tmp));
  2884. }