Example #1
0
//---------------------------------------------------------------------------
//For demo, add automatically a radio bearer
//Equivalent to rb add send 0 5 2
void nasrg_ASCTL_start_default_rb(struct cx_entity *cx){
//---------------------------------------------------------------------------
#ifdef DEMO_3GSM
	struct rb_entity *rb;
  int status;

// Start debug information
#ifdef GRAAL_DEBUG_DC
	printk("nasrg_ASCTL_start_default_rb - begin \n");
#endif
  if (!cx){
 	  printk("nasrg_ASCTL_start_default_rb - input parameter cx is NULL \n");
    return;
  }
// End debug information

//	rb=graal_COMMON_add_rb(cx, 5, 2);
	rb = nasrg_COMMON_add_rb(cx, NASRG_DEFAULTRAB_RBID, NASRG_DEFAULTRAB_QoS);
	if (rb!=NULL){
    rb->cnxid = (GRAAL_RB_MAX_NUM * cx->lcr)+1;
    //rb->default_rab =1;
    rb->dscp = NASRG_DEFAULTRAB_DSCP;
		status=nasrg_ASCTL_DC_send_rb_establish_request(cx, rb);
  }
	else
		status=-GRAAL_ERROR_NOMEMORY;
#ifdef GRAAL_DEBUG_DC
	printk("nasrg_ASCTL_start_default_rb - end %d \n",status);
#endif
}
///////////////////////////////////////////////////////////////////////////////
// Radio Bearer Establishment
//---------------------------------------------------------------------------
void nasrg_set_msg_rb_establishment_reply(struct nas_msg_rb_establishment_reply *msgrep, struct nas_msg_rb_establishment_request *msgreq)
{
  //---------------------------------------------------------------------------
  if ((msgreq->rab_id<5)||(msgreq->rab_id>(NAS_RB_MAX_NUM-1)))
    msgrep->status=-NAS_ERROR_NOTCORRECTRABI;
  else {
    struct cx_entity *cx;
    cx=nasrg_COMMON_search_cx(msgreq->lcr);

    if (cx!=NULL) { //not multicast
      struct rb_entity *rb;
      rb=nasrg_COMMON_add_rb(cx, msgreq->rab_id, msgreq->qos);

      if (rb!=NULL) {
        rb->cnxid = msgreq->cnxid;
        rb->dscp = msgreq->dscp_dl;
        rb->dscp_ul = msgreq->dscp_ul;
        msgrep->status=nasrg_ASCTL_DC_send_rb_establish_request(cx, rb);
      } else {
        msgrep->status=-NAS_ERROR_NOMEMORY;
      }
    } else { //no MT found
      if (msgreq->mcast_flag) { //multicast
        int mbms_ix=0; // should allocate index based on Service_id /cnxid / MC IP address
        //
        gpriv->mbms_rb[mbms_ix].cnxid = msgreq->cnxid;
        gpriv->mbms_rb[mbms_ix].serviceId = msgreq->cnxid;
        gpriv->mbms_rb[mbms_ix].sessionId = NASRG_TEMP_MBMS_SESSION_ID; //Temp hard coded
        gpriv->mbms_rb[mbms_ix].mbms_rbId = msgreq->rab_id;
        gpriv->mbms_rb[mbms_ix].sapi = NAS_DC_INPUT_SAPI;
#ifdef NAS_DEBUG_MBMS_PROT
        gpriv->mbms_rb[mbms_ix].sapi = NAS_DRB_INPUT_SAPI; //Only one RT-FIFO is used
#endif
        gpriv->mbms_rb[mbms_ix].qos = msgreq->qos;
        gpriv->mbms_rb[mbms_ix].dscp = msgreq->dscp_dl;
        gpriv->mbms_rb[mbms_ix].duration = NASRG_TEMP_MBMS_DURATION; //Temp hard coded
        memcpy ((char *)&(gpriv->mbms_rb[mbms_ix].mcast_address),(char *)&(msgreq->mcast_group), 16);
        msgrep->status=nasrg_ASCTL_GC_send_mbms_bearer_establish_req(mbms_ix);
      } else {
        msgrep->status=-NAS_ERROR_NOTCORRECTLCR;
      }

      msgrep->cnxid  = msgreq->cnxid;
    }
  }
}
Example #3
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);
}