/* 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); }