///////////////////////////////////////////////////////////////////////////////
// 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;
    }
  }
}
示例#2
0
//---------------------------------------------------------------------------
// 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;
}