#include "indications.h" #include #include #include static void tcp_conn_reset(facilities_t* facilities, TCPConnRSTInfo_t* cri, void* security_socket) { if (cri->destinationAddress.size != 16) return; SecurityRequest_t* sreq = NULL; // Reset tolling, tls tolling_t* tolling = &facilities->tolling; bulletin_t* bulletin = &facilities->bulletin; if (tolling->enabled && tolling->protocol == TOLLING_PROTOCOL_TLS) { for (int i = 0; i < bulletin->to_consume_len; ++i) { if (!memcmp(bulletin->to_consume[i]->endpoint.ipv6_addr, cri->destinationAddress.buf, 16)) { sreq = calloc(1, sizeof(SecurityRequest_t)); sreq->present = SecurityRequest_PR_tlsReset; sreq->choice.tlsReset.connId = tolling->station.obu.tls_conn_id; uint8_t b_s[64]; b_s[0] = 4; asn_enc_rval_t enc = asn_encode_to_buffer(NULL, ATS_CANONICAL_OER, &asn_DEF_SecurityRequest, sreq, b_s+1, 63); if (enc.encoded == -1) { syslog_err("[facilities] SecurityRequest.tlsReset encoding failed"); } zmq_send(security_socket, b_s, enc.encoded+1, 0); zmq_recv(security_socket, b_s, 64, 0); // TODO handle SReply } } } ASN_STRUCT_FREE(asn_DEF_SecurityRequest, sreq); } int transport_data_indication(facilities_t* facilities, TransportDataIndication_t* tdi, void* security_socket) { int rv = 0; switch (tdi->present) { case TransportDataIndication_PR_tcp: switch (tdi->choice.tcp.present) { case TCPDataIndication_PR_connInfoReset: tcp_conn_reset(facilities, &tdi->choice.tcp.choice.connInfoReset, security_socket); break; default: rv = 1; goto cleanup; } break; default: rv = 1; goto cleanup; } cleanup: return rv; }