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;
}