///////////////////////////////////////////////////////////////////////////////
// Radio Bearer Release
//---------------------------------------------------------------------------
void nasrg_set_msg_rb_release_reply(struct nas_msg_rb_release_reply *msgrep, struct nas_msg_rb_release_request *msgreq)
{
  //---------------------------------------------------------------------------
  if (msgreq->lcr<NAS_CX_MAX) {
    if (msgreq->rab_id!=NASRG_DEFAULTRAB_RBID) {
      struct rb_entity *rb;
      struct cx_entity *cx;
      cx=nasrg_COMMON_search_cx(msgreq->lcr);
      rb=nasrg_COMMON_search_rb(cx, msgreq->rab_id);

      if ((rb!=NULL)&&(cx!=NULL)) {
        uint8_t dscp;
        msgrep->status=nasrg_ASCTL_DC_send_rb_release_request(cx, rb);
        dscp=rb->dscp;
        nasrg_COMMON_del_rb(cx, msgreq->rab_id, dscp);
      } else
        msgrep->status=-NAS_ERROR_NOTCONNECTED;

      msgrep->cnxid  = msgreq->cnxid;
    } else {
      msgrep->status=-NAS_ERROR_NOTCORRECTRABI;
    }
  } else {
    if (msgreq->mcast_flag) { // multicast
      int mbms_ix=0;  // should search mbms_ix based on cnxid
      msgrep->status=nasrg_ASCTL_GC_send_mbms_bearer_release_req(mbms_ix);
      msgrep->cnxid  = msgreq->cnxid;
    } else {
      msgrep->status=-NAS_ERROR_NOTCORRECTLCR;
    }
  }
}
Beispiel #2
0
//---------------------------------------------------------------------------
void nasrg_ASCTL_timer(unsigned long data){
//---------------------------------------------------------------------------
  u8 cxi;
  struct cx_entity *cx;
  struct rb_entity *rb;
  spin_lock(&gpriv->lock);
#ifdef GRAAL_DEBUG_TIMER
  printk("nasrg_ASCTL_timer - begin \n");
#endif
  (gpriv->timer).function = nasrg_ASCTL_timer;
  (gpriv->timer).expires=jiffies+GRAAL_TIMER_TICK;
  (gpriv->timer).data=0L;
  for (cxi=0; cxi<GRAAL_CX_MAX ; ++cxi){
    cx=gpriv->cx+cxi;
    if (!cx){
      printk("nasrg_ASCTL_timer - No pointer for connection %d \n", cxi);
      continue;
    }
    for (rb=cx->rb;rb!=NULL; rb=rb->next){
      if (rb->countimer!=GRAAL_TIMER_IDLE){
      #ifdef GRAAL_DEBUG_TIMER
        printk("nasrg_ASCTL_timer : rb countimer %d, rb state %d\n", rb->countimer, rb->state);
      #endif
        if (rb->countimer==0){
          switch (rb->state){
            case GRAAL_CX_CONNECTING:
            case GRAAL_CX_CONNECTING_FAILURE:  // MW - 15/01/07 Useless, currently no retry if failure
              if (rb->retry<gpriv->retry_limit){
                printk("nasrg_ASCTL_timer: Retry RB establishment %d\n", rb->retry);
                nasrg_ASCTL_DC_send_rb_establish_request(cx, rb);
              }else{
                printk("nasrg_ASCTL_timer: RB Establishment failure\n");
                rb->state=GRAAL_IDLE;
                rb->countimer=GRAAL_TIMER_IDLE;
              }
              break;
            case GRAAL_CX_DCH:
              #ifdef DEMO_3GSM
              if (cx->num_rb == 1){
                 nasrg_ASCTL_start_default_sclassifier(cx, rb);
              }
              #endif
              nasrg_ASCTL_start_sclassifier(cx, rb);
              rb->countimer=GRAAL_TIMER_IDLE;
              break;
            case GRAAL_CX_RELEASING_FAILURE:
              nasrg_ASCTL_DC_send_rb_release_request(cx, rb);
              break;
            default:
              rb->countimer=GRAAL_TIMER_IDLE;
          }
        }else{
          --rb->countimer;
          printk("nasrg_ASCTL_timer : rb countimer-- %d, rb state %d\n", rb->countimer, rb->state);
        }
      }
    }
  }
  add_timer(&gpriv->timer);
#ifdef GRAAL_DEBUG_TIMER
  printk("nasrg_ASCTL_timer - end \n");
#endif
  spin_unlock(&gpriv->lock);
}