diff options
author | Andreas Steffen <andreas.steffen@strongswan.org> | 2015-03-22 01:07:31 +0100 |
---|---|---|
committer | Andreas Steffen <andreas.steffen@strongswan.org> | 2015-03-23 22:25:43 +0100 |
commit | 7b4a96b2f7df63bddf179378c32a7b1c1998333b (patch) | |
tree | d09f05c17f8e79b44e93a15fade0832b0d637ac4 /src/libtnccs/plugins/tnccs_20/tnccs_20_client.c | |
parent | c6aed8aa21e639ea54eb0605bc2639815757ea82 (diff) | |
download | strongswan-7b4a96b2f7df63bddf179378c32a7b1c1998333b.tar.bz2 strongswan-7b4a96b2f7df63bddf179378c32a7b1c1998333b.tar.xz |
Implemented PB-TNC mutual half-duplex protocol
Diffstat (limited to 'src/libtnccs/plugins/tnccs_20/tnccs_20_client.c')
-rw-r--r-- | src/libtnccs/plugins/tnccs_20/tnccs_20_client.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/libtnccs/plugins/tnccs_20/tnccs_20_client.c b/src/libtnccs/plugins/tnccs_20/tnccs_20_client.c index 4fd27a729..9bfadcb66 100644 --- a/src/libtnccs/plugins/tnccs_20/tnccs_20_client.c +++ b/src/libtnccs/plugins/tnccs_20/tnccs_20_client.c @@ -110,6 +110,11 @@ struct private_tnccs_20_client_t { */ bool mutual; + /** + * Mutual Capability message sent + */ + bool sent_mutual_capability; + }; /** @@ -166,20 +171,29 @@ void tnccs_20_handle_ietf_error_msg(pb_tnc_msg_t *msg, bool *fatal_error) } } -void tnccs_20_handle_ita_mutual_capability_msg(pb_tnc_msg_t *msg, bool *mutual) +bool tnccs_20_handle_ita_mutual_capability_msg(pb_tnc_msg_t *msg) { pb_mutual_capability_msg_t *mutual_msg; uint32_t protocols; + if (!lib->settings->get_bool(lib->settings, + "%s.plugins.tnccs-20.mutual", FALSE, lib->ns)) + { + /* PB-TNC mutual capability disabled, ignore message */ + return FALSE; + } + mutual_msg = (pb_mutual_capability_msg_t*)msg; protocols = mutual_msg->get_protocols(mutual_msg); if (protocols & PB_MUTUAL_HALF_DUPLEX) { - *mutual = TRUE; DBG1(DBG_TNC, "activating mutual PB-TNC %N protocol", pb_tnc_mutual_protocol_type_names, PB_MUTUAL_HALF_DUPLEX); + return TRUE; } + + return FALSE; } /** @@ -396,7 +410,7 @@ static void handle_ita_message(private_tnccs_20_client_t *this, pb_tnc_msg_t *ms switch (msg_type.type) { case PB_ITA_MSG_MUTUAL_CAPABILITY: - tnccs_20_handle_ita_mutual_capability_msg(msg, &this->mutual); + this->mutual = tnccs_20_handle_ita_mutual_capability_msg(msg); break; default: break; @@ -636,7 +650,7 @@ METHOD(tnccs_20_handler_t, build, status_t, } METHOD(tnccs_20_handler_t, begin_handshake, void, - private_tnccs_20_client_t *this) + private_tnccs_20_client_t *this, bool mutual) { pb_tnc_msg_t *msg; char *pref_lang; @@ -645,7 +659,9 @@ METHOD(tnccs_20_handler_t, begin_handshake, void, TNC_CONNECTION_STATE_HANDSHAKE); /* Announce PB-TNC Mutual Capability if activated */ - if (lib->settings->get_bool(lib->settings, + this->sent_mutual_capability = mutual; + + if (!mutual && lib->settings->get_bool(lib->settings, "%s.plugins.tnccs-20.mutual", FALSE, lib->ns)) { pb_tnc_mutual_protocol_type_t protocols; @@ -657,6 +673,7 @@ METHOD(tnccs_20_handler_t, begin_handshake, void, this->mutex->lock(this->mutex); this->messages->insert_last(this->messages, msg); this->mutex->unlock(this->mutex); + this->sent_mutual_capability = TRUE; } /* Create PB-TNC Language Preference message */ @@ -684,6 +701,12 @@ METHOD(tnccs_20_handler_t, get_mutual, bool, return this->mutual; } +METHOD(tnccs_20_handler_t, get_state, pb_tnc_state_t, + private_tnccs_20_client_t *this) +{ + return this->state_machine->get_state(this->state_machine); +} + METHOD(tnccs_20_handler_t, add_msg, void, private_tnccs_20_client_t *this, pb_tnc_msg_t *msg) { @@ -761,6 +784,7 @@ tnccs_20_handler_t* tnccs_20_client_create(tnccs_t *tnccs, .begin_handshake = _begin_handshake, .get_send_flag = _get_send_flag, .get_mutual = _get_mutual, + .get_state = _get_state, .add_msg = _add_msg, .handle_errors = _handle_errors, .destroy = _destroy, |