/////////////////////////////////////////////////////////////////////////////// // 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; } } }
//--------------------------------------------------------------------------- // Decode RB_ESTABLISH_CNF message from RRC void nasrg_ASCTL_DC_decode_rb_establish_cnf(struct cx_entity *cx, struct nas_rg_dc_element *p){ //--------------------------------------------------------------------------- struct rb_entity *rb; int rb_id; // Start debug information #ifdef GRAAL_DEBUG_DC printk("nasrg_ASCTL_DC_decode_rb_establish - begin \n"); #endif if (!cx || !p){ printk("nasrg_ASCTL_DC_decode_rb_establish - input parameter is NULL \n"); return; } // End debug information rb_id = p->nasRGDCPrimitive.rb_establish_conf.rbId; // rb=graal_COMMON_search_rb(cx, rb_id); // original version rb=nasrg_COMMON_search_rb(cx, rb_id - (GRAAL_RB_MAX_NUM * cx->lcr)); // if (rb!=NULL){ if (rb->state==GRAAL_CX_CONNECTING){ #ifdef GRAAL_DEBUG_DC printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF received\n"); printk(" Primitive length %u\n", p->length); printk(" Local Connection reference %u\n",p->nasRGDCPrimitive.rb_establish_conf.localConnectionRef); printk(" RB Id %u\n",p->nasRGDCPrimitive.rb_establish_conf.rbId); printk(" SAP Id %u\n",p->nasRGDCPrimitive.rb_establish_conf.sapId); printk(" Status %u, Failure code %d, Cx state, RB state\n",p->nasRGDCPrimitive.rb_establish_conf.status, p->nasRGDCPrimitive.rb_establish_conf.fail_code); nasrg_TOOL_print_state(cx->state); nasrg_TOOL_print_state(rb->state); #endif switch (p->nasRGDCPrimitive.rb_establish_conf.status){ case ACCEPTED: rb->state = GRAAL_CX_DCH; rb->countimer=1; break; case FAILURE: printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF rejected\n"); rb->state = GRAAL_CX_CONNECTING_FAILURE; //delete rb break; default: printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF reception, invalid status\n"); } } else printk("nasrg_ASCTL_DC_decode_rb_establish: invalid state %u\n", cx->state); } else printk("nasrg_ASCTL_DC_decode_rb_establish: RB_ESTABLISH_CNF, No corresponding radio bearer\n"); }
/////////////////////////////////////////////////////////////////////////////// // Request the addition of a classifier rule //--------------------------------------------------------------------------- void nasrg_set_msg_class_add_reply(struct nas_msg_class_add_reply *msgrep, struct nas_msg_class_add_request *msgreq) { //--------------------------------------------------------------------------- struct classifier_entity *gc; if (msgreq->dscp>NAS_DSCP_DEFAULT) { printk("nasrg_set_msg_class_add: Incoherent parameter value\n"); msgrep->status=-NAS_ERROR_NOTCORRECTDSCP; return; } if (msgreq->dir==NAS_DIRECTION_SEND) { struct cx_entity *cx; cx=nasrg_COMMON_search_cx(msgreq->lcr); if (cx!=NULL) { printk("nasrg_set_msg_class_add: DSCP %d, Classref %d\n",msgreq->dscp, msgreq->classref ); gc=nasrg_CLASS_add_sclassifier(cx, msgreq->dscp, msgreq->classref); printk("nasrg_set_msg_class_add: %p %p\n" , msgreq, gc); if (gc==NULL) { msgrep->status=-NAS_ERROR_NOMEMORY; return; } } else { msgrep->status=-NAS_ERROR_NOTCORRECTLCR; return; } gc->rab_id=msgreq->rab_id; gc->rb=nasrg_COMMON_search_rb(cx, gc->rab_id); } else { if (msgreq->dir==NAS_DIRECTION_RECEIVE) { gc=nasrg_CLASS_add_rclassifier(msgreq->dscp, msgreq->classref); if (gc==NULL) { msgrep->status=-NAS_ERROR_NOMEMORY; return; } } else { msgrep->status=-NAS_ERROR_NOTCORRECTDIR; return; } } nasrg_TOOL_fct(gc, msgreq->fct); gc->version=msgreq->version; switch(gc->version) { case 4: gc->saddr.ipv4=msgreq->saddr.ipv4; gc->daddr.ipv4=msgreq->daddr.ipv4; gc->splen=msgreq->splen; gc->dplen=msgreq->dplen; break; case 6: gc->saddr.ipv6=msgreq->saddr.ipv6; gc->daddr.ipv6=msgreq->daddr.ipv6; gc->splen=msgreq->splen; gc->dplen=msgreq->dplen; break; case 0: gc->saddr.ipv6.s6_addr32[0]=0; gc->daddr.ipv6.s6_addr32[1]=0; gc->saddr.ipv6.s6_addr32[2]=0; gc->daddr.ipv6.s6_addr32[3]=0; gc->splen=0; gc->dplen=0; break; default: msgrep->status=-NAS_ERROR_NOTCORRECTVERSION; kfree(gc); return; } gc->protocol=msgreq->protocol; gc->sport=htons(msgreq->sport); gc->dport=htons(msgreq->dport); msgrep->status=0; }