Exemple #1
0
/* Function called every time we received something on SCTP */
int s1ap_sctp_recv_callback(uint32_t assocId, uint32_t stream, uint8_t *buffer, uint32_t length) {
    s1ap_message message;

    if (s1ap_eNB_decode_pdu(&message, buffer, length) < 0)
        return -1;
    return s1ap_eNB_handle_message(assocId, stream, &message);
}
void doit (void)
{
  int i;

  break_on_error = 1;

  //     asn1_xer_print = 1;
  //     asn_debug = 1;

  for (i = 0; i < sizeof(s1ap_test) / sizeof(s1ap_test_t); i++) {
    struct s1ap_message_s message;
    uint8_t *buffer;
    uint32_t length;

    memset(&message, 0, sizeof(struct s1ap_message_s));

    if (s1ap_test[i].originating == ENB) {
      /* eNB originated procedure -> USE MME decoder */
      if (s1ap_mme_decode_pdu(&message, s1ap_test[i].buffer,
                              s1ap_test[i].buf_len) < 0) {
        fail("Failed to decode %s\n", s1ap_test[i].procedure_name);
      } else {
        success("Decoded %s correctly\n", s1ap_test[i].procedure_name);
      }
    } else {
      /* MME originated procedure -> USE eNB decoder */
      if (s1ap_eNB_decode_pdu(&message, s1ap_test[i].buffer,
                              s1ap_test[i].buf_len) < 0) {
        fail("Failed to decode %s\n", s1ap_test[i].procedure_name);
      } else {
        success("Decoded %s correctly\n", s1ap_test[i].procedure_name);
      }
    }

    if (s1ap_test[i].originating == ENB) {
      /* eNB originated procedure -> USE eNB encoder */
      if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) {
        fail("Failed to decode %s\n", s1ap_test[i].procedure_name);
      } else {
        success("Encoded %s correctly\n", s1ap_test[i].procedure_name);
      }
    } else {
      /* MME originated procedure -> USE mme encoder */
      if (s1ap_mme_encode_pdu(&message, &buffer, &length) < 0) {
        fail("Failed to encode %s\n", s1ap_test[i].procedure_name);
      } else {
        success("Encoded %s correctly\n", s1ap_test[i].procedure_name);
      }
    }

    if (compare_buffer(buffer, length, s1ap_test[i].buffer, s1ap_test[i].buf_len) < 0) {
      fail("Mismatch in buffers\n");
    }
  }
}
int main(int argc, char *argv[])
{
  int i;
  asn1_xer_print = 2;

  if (argc > 1) {
    asn_debug = 1;
  }

  for (i = 0; i < sizeof(s1ap_test) / sizeof(s1ap_test_t); i++) {
    struct s1ap_message_s message;
    uint8_t *buffer;
    uint32_t length;
    memset(&message, 0, sizeof(struct s1ap_message_s));
    printf("Trying to decode %s procedure with asn1c decoder\n",
           s1ap_test[i].procedure_name);

    if (s1ap_mme_decode_pdu(&message, s1ap_test[i].buffer,
                            s1ap_test[i].buf_len) < 0) {
      if (s1ap_eNB_decode_pdu(&message, s1ap_test[i].buffer,
                              s1ap_test[i].buf_len) < 0) {
        printf("Failed to decode this message\n");
      } else {
        printf("Succesfully decoded %s with eNB decoder\n", s1ap_test[i].procedure_name);
      }
    } else {
      printf("Succesfully decoded %s with MME decoder\n", s1ap_test[i].procedure_name);
    }

    printf("Trying to encode %s procedure with asn1c encoder\n",
           s1ap_test[i].procedure_name);

    if (s1ap_eNB_encode_pdu(&message, &buffer, &length) < 0) {
      printf("Failed to encode this message on MME side, trying eNB side\n");
    } else {
      compare_buffer(buffer, length, s1ap_test[i].buffer, s1ap_test[i].buf_len);
      free(buffer);
    }
  }

  return 0;
}
int s1ap_eNB_handle_message(uint32_t assoc_id, int32_t stream,
                            const uint8_t * const data, const uint32_t data_length)
{
  struct s1ap_message_s message;

  DevAssert(data != NULL);

  memset(&message, 0, sizeof(struct s1ap_message_s));

  if (s1ap_eNB_decode_pdu(&message, data, data_length) < 0) {
    S1AP_ERROR("Failed to decode PDU\n");
    return -1;
  }

  /* Checking procedure Code and direction of message */
  if (message.procedureCode > sizeof(messages_callback) / (3 * sizeof(
        s1ap_message_decoded_callback))
      || (message.direction > S1AP_PDU_PR_unsuccessfulOutcome)) {
    S1AP_ERROR("[SCTP %d] Either procedureCode %d or direction %d exceed expected\n",
               assoc_id, message.procedureCode, message.direction);
    return -1;
  }

  /* No handler present.
   * This can mean not implemented or no procedure for eNB (wrong direction).
   */
  if (messages_callback[message.procedureCode][message.direction-1] == NULL) {
    S1AP_ERROR("[SCTP %d] No handler for procedureCode %d in %s\n",
               assoc_id, message.procedureCode,
               s1ap_direction2String[message.direction]);
    return -1;
  }

  /* Calling the right handler */
  return (*messages_callback[message.procedureCode][message.direction-1])
         (assoc_id, stream, &message);
}