//--------------------------------------------------------------------------- //For demo, add automatically a classifier //Equivalent to class add send 0 -f qos <x> -cr 0 void nasrg_ASCTL_start_default_sclassifier(struct cx_entity *cx,struct rb_entity *rb){ //--------------------------------------------------------------------------- struct classifier_entity *gc; // Start debug information #ifdef GRAAL_DEBUG_CLASS printk("nasrg_ASCTL_start_default_sclassifier - begin \n"); #endif if (!cx || !rb){ printk("nasrg_ASCTL_start_default_sclassifier - input parameter is NULL \n"); return; } // End debug information gc=nasrg_CLASS_add_sclassifier(cx, GRAAL_DSCP_DEFAULT, gpriv->next_sclassref); // gc=graal_CLASS_add_sclassifier(cx, 5, 0); if (gc==NULL){ printk("nasrg_ASCTL_start_default_sclassifier - Classifier pointer is null : not added \n"); return; } gc->fct = nasrg_COMMON_QOS_send; gc->rab_id =rb->rab_id; gc->rb= rb; gc->version = NASRG_DEFAULTRAB_IPVERSION; gc->protocol= GRAAL_PROTOCOL_DEFAULT; #ifdef GRAAL_DEBUG_CLASS printk("nasrg_ASCTL_start_default_sclassifier - end \n"); nasrg_TOOL_print_classifier(gc); #endif }
/////////////////////////////////////////////////////////////////////////////// // 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; }