diff --git a/.vscode/settings.json b/.vscode/settings.json index 767a2af..a2c6a84 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,7 @@ "reservation-id.h": "c", "stationdetails.h": "c", "managementrequest.h": "c", - "facilities.h": "c" + "facilities.h": "c", + "cancellationresponsecode.h": "c" } } \ No newline at end of file diff --git a/src/evm.c b/src/evm.c index 877e50b..ff4a1ac 100644 --- a/src/evm.c +++ b/src/evm.c @@ -156,7 +156,9 @@ int evrsrm_recv(EV_RSR_t *evrsr_request) { tr_oer[0] = 4; // Facilities fi_oer[0] = 4; if (!(evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_preReservationRequestMessage || - evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_reservationRequestMessage)) { + evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_reservationRequestMessage || + evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_cancellationRequestMessage || + evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_updateRequestMessage)) { rv = 1; goto cleanup; } @@ -165,6 +167,10 @@ int evrsrm_recv(EV_RSR_t *evrsr_request) { evrsr_response = evrsrm_pre_reservation_response(bpr->data.buf, (uint32_t *)&bpr->data.size); else if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_reservationRequestMessage) evrsr_response = evrsrm_reservation_response(evrsr_request, bpr->data.buf, (uint32_t *)&bpr->data.size); + else if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_cancellationRequestMessage) + evrsr_response = evrsrm_cancelation_response(evrsr_request, bpr->data.buf, (uint32_t *)&bpr->data.size); + else if (evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_updateRequestMessage) + evrsr_response = evrsrm_update_response(evrsr_request, bpr->data.buf, (uint32_t *)&bpr->data.size); if (evrsr_response != 0) { rv = 1; goto cleanup; @@ -202,6 +208,58 @@ cleanup: return rv; } +static int evrsrm_cancelation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len){ + int rv = 0; + EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t)); + evrsr_response->header.protocolVersion = 1; + evrsr_response->header.messageID = 7; + pthread_mutex_lock(&facilities.id.lock); + evrsr_response->header.stationID = facilities.id.station_id; + pthread_mutex_unlock(&facilities.id.lock); + evrsr_response->messageBody.present = EV_RSR_MessageBody_PR_cancellationResponseMessage; + CancellationResponseMessage_t *evrsr_cancellation_response = &evrsr_response->messageBody.choice.cancellationResponseMessage; + evrsr_cancellation_response->reservation_ID = evrsrm_request->messageBody.choice.cancellationRequestMessage.reservation_ID; + evrsr_cancellation_response->cancellationResponseCode = CancellationResponseCode_ok; + + asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 1023); + if (enc.encoded == -1) { + log_error("[ev] failed encoding evrsrm cancelation response (%s)", enc.failed_type->name); + rv = 1; + goto cleanup; + } + *evrsrm_len = (enc.encoded + 7) / 8; +cleanup: + ASN_STRUCT_FREE(asn_DEF_EV_RSR, evrsr_response); + return rv; +} +static int evrsrm_update_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len){ + int rv = 0; + EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t)); + evrsr_response->header.protocolVersion = 1; + evrsr_response->header.messageID = 7; + pthread_mutex_lock(&facilities.id.lock); + evrsr_response->header.stationID = facilities.id.station_id; + pthread_mutex_unlock(&facilities.id.lock); + + evrsr_response->messageBody.present = EV_RSR_MessageBody_PR_updateResponseMessage; + UpdateResponseMessage_t *evrsr_update_response = &evrsr_response->messageBody.choice.updateResponseMessage; + + evrsr_update_response->reservation_ID = evrsrm_request->messageBody.choice.updateRequestMessage.reservation_ID; + evrsr_update_response->updateResponseCode = UpdateResponseCode_ok; + + asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 1023); + if (enc.encoded == -1) { + log_error("[ev] failed encoding evrsrm update response (%s)", enc.failed_type->name); + rv = 1; + goto cleanup; + } + *evrsrm_len = (enc.encoded + 7) / 8; +cleanup: + ASN_STRUCT_FREE(asn_DEF_EV_RSR, evrsr_response); + return rv; +} + + static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len) { int rv = 0; EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t)); @@ -245,7 +303,7 @@ static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512); if (enc.encoded == -1) { - log_error("[ev] failed encoding evrsrm (%s)", enc.failed_type->name); + log_error("[ev] failed encoding evrsrm reservation response (%s)", enc.failed_type->name); rv = 1; goto cleanup; } @@ -288,7 +346,7 @@ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm response->preReservationExpirationTime = 0; asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512); if (enc.encoded == -1) { - log_error("[ev] failed encoding evrsrm (%s)", enc.failed_type->name); + log_error("[ev] failed encoding evrsrm pre reservation response (%s)", enc.failed_type->name); rv = 1; goto cleanup; } diff --git a/src/evm.h b/src/evm.h index 9223110..10d9672 100644 --- a/src/evm.h +++ b/src/evm.h @@ -50,7 +50,7 @@ int evrsrm_recv(EV_RSR_t *evrsr_request); * @param evrsrm_oer The encoded pre reservation response * @param evrsrm_len The length of the encoded pre reservation response * - * @return The reservation response or NULL if the request isn't a Pre reservation request + * @return The reservation response */ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm_len); @@ -60,16 +60,38 @@ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm * @param evrsrm_oer The encoded reservation response * @param evrsrm_len The length of the encoded reservation response * - * @return The reservation response or NULL if the request isn't a Reservation request + * @return The reservation response */ static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len); +/** + * @brief Creates a reservation cancelation response. + * @param evrsrm_oer The encoded reservation response + * @param evrsrm_len The length of the encoded reservation response + * + * @return The reservation response + */ + +static int evrsrm_cancelation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len); + +/** + * @brief Creates a reservation update response. + * @param evrsrm_oer The encoded reservation response + * @param evrsrm_len The length of the encoded reservation response + * + * @return The reservation response + */ + +static int evrsrm_update_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len); + + /** * Analyses a evcsnm * @param evcsnm The evcsnm to be analyzed * @return 0 on success, other value otherwise */ + int evcsnm_check(EvcsnPdu_t *evcsnm); /**