RSU tolling client repay protection
This commit is contained in:
parent
174c20aaea
commit
f16d636ae0
53
src/tpm.c
53
src/tpm.c
|
|
@ -687,6 +687,50 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
tpm->tpm->referencePosition.positionConfidenceEllipse.semiMajorOrientation = 900;
|
tpm->tpm->referencePosition.positionConfidenceEllipse.semiMajorOrientation = 900;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Client management
|
||||||
|
for (int i = 0 ; i < tolling->station.rsu.clients_len; ++i) {
|
||||||
|
if (itss_time_get() > tolling->station.rsu.clients[i]->ts + TOLLING_CLIENT_LIFETIME_MS) {
|
||||||
|
free(tolling->station.rsu.clients[i]);
|
||||||
|
tolling->station.rsu.clients[i] = NULL;
|
||||||
|
for (int j = i; j < tolling->station.rsu.clients_len-1; ++j) {
|
||||||
|
tolling->station.rsu.clients[j] = tolling->station.rsu.clients[j+1];
|
||||||
|
}
|
||||||
|
--tolling->station.rsu.clients_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find client
|
||||||
|
toll_client_t* client = NULL;
|
||||||
|
for (int i = 0; i < tolling->station.rsu.clients_len; ++i) {
|
||||||
|
if (tolling->station.rsu.clients[i]->id == client_id) {
|
||||||
|
client = tolling->station.rsu.clients[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create client
|
||||||
|
if (!client) {
|
||||||
|
if (tolling->station.rsu.clients_len-1 >= TOLLING_MAX_CLIENTS) {
|
||||||
|
syslog_err("[facilities] [tolling] max clients reached");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
tolling->station.rsu.clients[tolling->station.rsu.clients_len] = malloc(sizeof(toll_client_t));
|
||||||
|
client = tolling->station.rsu.clients[tolling->station.rsu.clients_len];
|
||||||
|
client->id = client_id;
|
||||||
|
client->station_id = tpm_rx->header.stationID;
|
||||||
|
client->ts = itss_time_get();
|
||||||
|
client->accepted = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t confirmation_code = TollingConfirmationCode_rejected;
|
||||||
|
if (itss_time_get() > client->ts + TOLLING_PAYMENT_MIN_PERIOD_MS ||
|
||||||
|
client->accepted == -1) {
|
||||||
|
confirmation_code = TollingConfirmationCode_accepted;
|
||||||
|
client->accepted = true;
|
||||||
|
} else if (client->accepted &&
|
||||||
|
itss_time_get() < client->ts + TOLLING_PAYMENT_MIN_PERIOD_MS) {
|
||||||
|
confirmation_code = TollingConfirmationCode_alreadyAccepted;
|
||||||
|
}
|
||||||
|
|
||||||
tpm->tpm->tollingType = calloc(1, sizeof(TollingType_t));
|
tpm->tpm->tollingType = calloc(1, sizeof(TollingType_t));
|
||||||
switch (tpm_rx->tpm->tollingType->present) {
|
switch (tpm_rx->tpm->tollingType->present) {
|
||||||
case TollingType_PR_entry:
|
case TollingType_PR_entry:
|
||||||
|
|
@ -695,7 +739,7 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
tpm->tpm->tollingType->choice.entry.choice.reply.clientId = client_id;
|
tpm->tpm->tollingType->choice.entry.choice.reply.clientId = client_id;
|
||||||
tpm->tpm->tollingType->choice.entry.choice.reply.infoId = info_id;
|
tpm->tpm->tollingType->choice.entry.choice.reply.infoId = info_id;
|
||||||
tpm->tpm->tollingType->choice.entry.choice.reply.transactionNonce = nonce;
|
tpm->tpm->tollingType->choice.entry.choice.reply.transactionNonce = nonce;
|
||||||
tpm->tpm->tollingType->choice.entry.choice.reply.confirmationCode = TollingConfirmationCode_accepted;
|
tpm->tpm->tollingType->choice.entry.choice.reply.confirmationCode = confirmation_code;
|
||||||
break;
|
break;
|
||||||
case TollingType_PR_exit:
|
case TollingType_PR_exit:
|
||||||
tpm->tpm->tollingType->present = TollingType_PR_exit;
|
tpm->tpm->tollingType->present = TollingType_PR_exit;
|
||||||
|
|
@ -704,7 +748,7 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
tpm->tpm->tollingType->choice.exit->choice.reply.clientId = client_id;
|
tpm->tpm->tollingType->choice.exit->choice.reply.clientId = client_id;
|
||||||
tpm->tpm->tollingType->choice.exit->choice.reply.infoId = info_id;
|
tpm->tpm->tollingType->choice.exit->choice.reply.infoId = info_id;
|
||||||
tpm->tpm->tollingType->choice.exit->choice.reply.transactionNonce = nonce;
|
tpm->tpm->tollingType->choice.exit->choice.reply.transactionNonce = nonce;
|
||||||
tpm->tpm->tollingType->choice.exit->choice.reply.confirmationCode = TollingConfirmationCode_accepted;
|
tpm->tpm->tollingType->choice.exit->choice.reply.confirmationCode = confirmation_code;
|
||||||
break;
|
break;
|
||||||
case TollingType_PR_single:
|
case TollingType_PR_single:
|
||||||
tpm->tpm->tollingType->present = TollingType_PR_single;
|
tpm->tpm->tollingType->present = TollingType_PR_single;
|
||||||
|
|
@ -712,7 +756,7 @@ static void rsu_handle_recv(facilities_t* facilities, TPM_t* tpm_rx, void* secur
|
||||||
tpm->tpm->tollingType->choice.single.choice.reply.clientId = client_id;
|
tpm->tpm->tollingType->choice.single.choice.reply.clientId = client_id;
|
||||||
tpm->tpm->tollingType->choice.single.choice.reply.infoId = info_id;
|
tpm->tpm->tollingType->choice.single.choice.reply.infoId = info_id;
|
||||||
tpm->tpm->tollingType->choice.single.choice.reply.transactionNonce = nonce;
|
tpm->tpm->tollingType->choice.single.choice.reply.transactionNonce = nonce;
|
||||||
tpm->tpm->tollingType->choice.single.choice.reply.confirmationCode = TollingConfirmationCode_accepted;
|
tpm->tpm->tollingType->choice.single.choice.reply.confirmationCode = confirmation_code;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
@ -1290,6 +1334,9 @@ int tolling_init(tolling_t* tolling, void* zmq_ctx, char* security_address, uint
|
||||||
|
|
||||||
switch (station_type) {
|
switch (station_type) {
|
||||||
case 15:
|
case 15:
|
||||||
|
for (int i = 0; i < TOLLING_MAX_CLIENTS; ++i) {
|
||||||
|
tolling->station.rsu.clients[i] = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tolling->station.obu.toll_type = -1;
|
tolling->station.obu.toll_type = -1;
|
||||||
|
|
|
||||||
11
src/tpm.h
11
src/tpm.h
|
|
@ -12,6 +12,8 @@
|
||||||
#define TOLLING_CONN_TIMEOUT_MS 10000
|
#define TOLLING_CONN_TIMEOUT_MS 10000
|
||||||
#define TOLLING_RT_PERIOD_MS 400
|
#define TOLLING_RT_PERIOD_MS 400
|
||||||
#define TOLLING_RT_TIMEOUT_MS 10000
|
#define TOLLING_RT_TIMEOUT_MS 10000
|
||||||
|
#define TOLLING_MAX_CLIENTS 256
|
||||||
|
#define TOLLING_CLIENT_LIFETIME_MS 300000
|
||||||
|
|
||||||
typedef enum TOLLING_PROTOCOL {
|
typedef enum TOLLING_PROTOCOL {
|
||||||
TOLLING_PROTOCOL_SIMPLE,
|
TOLLING_PROTOCOL_SIMPLE,
|
||||||
|
|
@ -41,6 +43,13 @@ typedef struct tlsc {
|
||||||
uint16_t nmsg;
|
uint16_t nmsg;
|
||||||
} tlsc_t;
|
} tlsc_t;
|
||||||
|
|
||||||
|
typedef struct toll_client {
|
||||||
|
uint64_t station_id;
|
||||||
|
uint64_t id;
|
||||||
|
uint64_t ts;
|
||||||
|
int8_t accepted;
|
||||||
|
} toll_client_t;
|
||||||
|
|
||||||
typedef struct tolling {
|
typedef struct tolling {
|
||||||
bool enabled;
|
bool enabled;
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
|
|
@ -63,6 +72,8 @@ typedef struct tolling {
|
||||||
union {
|
union {
|
||||||
// RSU
|
// RSU
|
||||||
struct {
|
struct {
|
||||||
|
toll_client_t* clients[TOLLING_MAX_CLIENTS];
|
||||||
|
uint16_t clients_len;
|
||||||
} rsu;
|
} rsu;
|
||||||
|
|
||||||
// OBU
|
// OBU
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue