/////////////////////////////////////////////////////////////////////////////// // 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; } } }
//--------------------------------------------------------------------------- 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); }