Separate the control channel from data channel on two different threads.
Solved the DTLS problem of using a separate thread for the data channel.
This commit is contained in:
@ -4,13 +4,21 @@
|
||||
#include "ac_session.h"
|
||||
|
||||
/* DTLS BIO send */
|
||||
int ac_bio_send(struct capwap_dtls* dtls, char* buffer, int length, void* param) {
|
||||
static int ac_bio_send(struct capwap_dtls* dtls, char* buffer, int length, void* param) {
|
||||
struct ac_session_t* session = (struct ac_session_t*)param;
|
||||
struct capwap_socket* socket = ((dtls->session == CAPWAP_DTLS_CONTROL_SESSION) ? &session->ctrlsocket : &session->datasocket);
|
||||
struct sockaddr_storage* wtpaddress = ((dtls->session == CAPWAP_DTLS_CONTROL_SESSION) ? &session->wtpctrladdress : &session->wtpdataaddress);
|
||||
struct sockaddr_storage* acaddress = ((dtls->session == CAPWAP_DTLS_CONTROL_SESSION) ? &session->acctrladdress : &session->acdataaddress);
|
||||
|
||||
return capwap_sendto(socket->socket[socket->type], buffer, length, acaddress, wtpaddress);
|
||||
|
||||
ASSERT(dtls->session == CAPWAP_DTLS_CONTROL_SESSION);
|
||||
|
||||
return capwap_sendto(session->connection.socket.socket[session->connection.socket.type], buffer, length, &session->connection.localaddr, &session->connection.remoteaddr);
|
||||
}
|
||||
|
||||
/* DTLS BIO Data send */
|
||||
static int ac_bio_data_send(struct capwap_dtls* dtls, char* buffer, int length, void* param) {
|
||||
struct ac_session_data_t* sessiondata = (struct ac_session_data_t*)param;
|
||||
|
||||
ASSERT(dtls->session == CAPWAP_DTLS_DATA_SESSION);
|
||||
|
||||
return capwap_sendto(sessiondata->connection.socket.socket[sessiondata->connection.socket.type], buffer, length, &sessiondata->connection.localaddr, &sessiondata->connection.remoteaddr);
|
||||
}
|
||||
|
||||
/* */
|
||||
@ -18,11 +26,11 @@ int ac_dtls_setup(struct ac_session_t* session) {
|
||||
ASSERT(session != NULL);
|
||||
|
||||
/* Create DTLS session */
|
||||
if (!capwap_crypt_createsession(&session->ctrldtls, CAPWAP_DTLS_CONTROL_SESSION, &g_ac.dtlscontext, ac_bio_send, session)) {
|
||||
if (!capwap_crypt_createsession(&session->dtls, CAPWAP_DTLS_CONTROL_SESSION, &g_ac.dtlscontext, ac_bio_send, session)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (capwap_crypt_open(&session->ctrldtls, &session->wtpctrladdress) == CAPWAP_HANDSHAKE_ERROR) {
|
||||
if (capwap_crypt_open(&session->dtls, &session->connection.remoteaddr) == CAPWAP_HANDSHAKE_ERROR) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -31,3 +39,19 @@ int ac_dtls_setup(struct ac_session_t* session) {
|
||||
capwap_set_timeout(session->dfa.rfcWaitDTLS, &session->timeout, CAPWAP_TIMER_CONTROL_CONNECTION);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* */
|
||||
int ac_dtls_data_setup(struct ac_session_data_t* sessiondata) {
|
||||
ASSERT(sessiondata != NULL);
|
||||
|
||||
/* Create DTLS session */
|
||||
if (!capwap_crypt_createsession(&sessiondata->dtls, CAPWAP_DTLS_DATA_SESSION, &g_ac.dtlscontext, ac_bio_data_send, sessiondata)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (capwap_crypt_open(&sessiondata->dtls, &sessiondata->connection.remoteaddr) == CAPWAP_HANDSHAKE_ERROR) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user