コード例 #1
0
ファイル: nasrg_ascontrol.c プロジェクト: a4a881d4/oai
//---------------------------------------------------------------------------
//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
}
コード例 #2
0
///////////////////////////////////////////////////////////////////////////////
// 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;
}