added updated and cancelation evrsrm responses

This commit is contained in:
gilteixeira 2023-04-24 15:05:04 +01:00
parent 1b75cb351c
commit a8351242f2
3 changed files with 87 additions and 6 deletions

View File

@ -13,6 +13,7 @@
"reservation-id.h": "c", "reservation-id.h": "c",
"stationdetails.h": "c", "stationdetails.h": "c",
"managementrequest.h": "c", "managementrequest.h": "c",
"facilities.h": "c" "facilities.h": "c",
"cancellationresponsecode.h": "c"
} }
} }

View File

@ -156,7 +156,9 @@ int evrsrm_recv(EV_RSR_t *evrsr_request) {
tr_oer[0] = 4; // Facilities tr_oer[0] = 4; // Facilities
fi_oer[0] = 4; fi_oer[0] = 4;
if (!(evrsr_request->messageBody.present == EV_RSR_MessageBody_PR_preReservationRequestMessage || 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; rv = 1;
goto cleanup; 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); 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) 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); 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) { if (evrsr_response != 0) {
rv = 1; rv = 1;
goto cleanup; goto cleanup;
@ -202,6 +208,58 @@ cleanup:
return rv; 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) { static int evrsrm_reservation_response(EV_RSR_t *evrsrm_request, uint8_t *evrsrm_oer, uint32_t *evrsrm_len) {
int rv = 0; int rv = 0;
EV_RSR_t *evrsr_response = calloc(1, sizeof(EV_RSR_t)); 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); asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
if (enc.encoded == -1) { 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; rv = 1;
goto cleanup; goto cleanup;
} }
@ -288,7 +346,7 @@ static int evrsrm_pre_reservation_response(uint8_t *evrsrm_oer, uint32_t *evrsrm
response->preReservationExpirationTime = 0; response->preReservationExpirationTime = 0;
asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512); asn_enc_rval_t enc = uper_encode_to_buffer(&asn_DEF_EV_RSR, NULL, evrsr_response, evrsrm_oer, 512);
if (enc.encoded == -1) { 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; rv = 1;
goto cleanup; goto cleanup;
} }

View File

@ -50,7 +50,7 @@ int evrsrm_recv(EV_RSR_t *evrsr_request);
* @param evrsrm_oer The encoded pre reservation response * @param evrsrm_oer The encoded pre reservation response
* @param evrsrm_len The length of 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); 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_oer The encoded reservation response
* @param evrsrm_len The length of 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); 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 * Analyses a evcsnm
* @param evcsnm The evcsnm to be analyzed * @param evcsnm The evcsnm to be analyzed
* @return 0 on success, other value otherwise * @return 0 on success, other value otherwise
*/ */
int evcsnm_check(EvcsnPdu_t *evcsnm); int evcsnm_check(EvcsnPdu_t *evcsnm);
/** /**