l3dss1.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:81k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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