Parse IKEv1 Cisco Load Balancing notify (can't act on it yet).

This commit is contained in:
Tobias Brunner 2012-02-03 12:58:11 +01:00
parent 3a9d5cbc14
commit eff331f799
3 changed files with 27 additions and 4 deletions

View File

@ -111,7 +111,9 @@ ENUM_NEXT(notify_type_names, INITIAL_CONTACT_IKEV1, INITIAL_CONTACT_IKEV1, IPSEC
ENUM_NEXT(notify_type_names, DPD_R_U_THERE, DPD_R_U_THERE_ACK, INITIAL_CONTACT_IKEV1, ENUM_NEXT(notify_type_names, DPD_R_U_THERE, DPD_R_U_THERE_ACK, INITIAL_CONTACT_IKEV1,
"DPD_R_U_THERE", "DPD_R_U_THERE",
"DPD_R_U_THERE_ACK"); "DPD_R_U_THERE_ACK");
ENUM_NEXT(notify_type_names, USE_BEET_MODE, USE_BEET_MODE, DPD_R_U_THERE_ACK, ENUM_NEXT(notify_type_names, UNITY_LOAD_BALANCE, UNITY_LOAD_BALANCE, DPD_R_U_THERE_ACK,
"UNITY_LOAD_BALANCE");
ENUM_NEXT(notify_type_names, USE_BEET_MODE, USE_BEET_MODE, UNITY_LOAD_BALANCE,
"USE_BEET_MODE"); "USE_BEET_MODE");
ENUM_NEXT(notify_type_names, ME_MEDIATION, ME_RESPONSE, USE_BEET_MODE, ENUM_NEXT(notify_type_names, ME_MEDIATION, ME_RESPONSE, USE_BEET_MODE,
"ME_MEDIATION", "ME_MEDIATION",
@ -210,7 +212,9 @@ ENUM_NEXT(notify_type_short_names, INITIAL_CONTACT_IKEV1, INITIAL_CONTACT_IKEV1,
ENUM_NEXT(notify_type_short_names, DPD_R_U_THERE, DPD_R_U_THERE_ACK, INITIAL_CONTACT_IKEV1, ENUM_NEXT(notify_type_short_names, DPD_R_U_THERE, DPD_R_U_THERE_ACK, INITIAL_CONTACT_IKEV1,
"DPD", "DPD",
"DPD_ACK"); "DPD_ACK");
ENUM_NEXT(notify_type_short_names, USE_BEET_MODE, USE_BEET_MODE, DPD_R_U_THERE_ACK, ENUM_NEXT(notify_type_short_names, UNITY_LOAD_BALANCE, UNITY_LOAD_BALANCE, DPD_R_U_THERE_ACK,
"UNITY_LB");
ENUM_NEXT(notify_type_short_names, USE_BEET_MODE, USE_BEET_MODE, UNITY_LOAD_BALANCE,
"BEET_MODE"); "BEET_MODE");
ENUM_NEXT(notify_type_short_names, ME_MEDIATION, ME_RESPONSE, USE_BEET_MODE, ENUM_NEXT(notify_type_short_names, ME_MEDIATION, ME_RESPONSE, USE_BEET_MODE,
"ME_MED", "ME_MED",

View File

@ -143,6 +143,8 @@ enum notify_type_t {
/* IKEv1 DPD */ /* IKEv1 DPD */
DPD_R_U_THERE = 36136, DPD_R_U_THERE = 36136,
DPD_R_U_THERE_ACK = 36137, DPD_R_U_THERE_ACK = 36137,
/* IKEv1 Cisco High Availability */
UNITY_LOAD_BALANCE = 40501,
/* BEET mode, not even a draft yet. private use */ /* BEET mode, not even a draft yet. private use */
USE_BEET_MODE = 40961, USE_BEET_MODE = 40961,
/* IKE-ME, private use */ /* IKE-ME, private use */

View File

@ -81,10 +81,27 @@ METHOD(task_t, process_r, status_t,
this->ike_sa->set_condition(this->ike_sa, this->ike_sa->set_condition(this->ike_sa,
COND_INIT_CONTACT_SEEN, TRUE); COND_INIT_CONTACT_SEEN, TRUE);
} }
else if (type == UNITY_LOAD_BALANCE)
{
host_t *redirect;
chunk_t data;
data = notify->get_notification_data(notify);
redirect = host_create_from_chunk(AF_INET, data, 0);
if (redirect)
{
DBG1(DBG_IKE, "received %N notify. redirected to %H",
notify_type_names, type, redirect);
}
else
{
DBG1(DBG_IKE, "received %N notify, invalid address");
}
}
else if (type < 16384) else if (type < 16384)
{ {
DBG1(DBG_IKE, "received %N error notify", DBG1(DBG_IKE, "received %N error notify",
notify_type_names, notify->get_notify_type(notify)); notify_type_names, type);
if (this->ike_sa->get_state(this->ike_sa) == IKE_CONNECTING) if (this->ike_sa->get_state(this->ike_sa) == IKE_CONNECTING)
{ /* only critical during main mode */ { /* only critical during main mode */
status = FAILED; status = FAILED;
@ -94,7 +111,7 @@ METHOD(task_t, process_r, status_t,
else else
{ {
DBG1(DBG_IKE, "received %N notify", DBG1(DBG_IKE, "received %N notify",
notify_type_names, notify->get_notify_type(notify)); notify_type_names, type);
} }
continue; continue;
case DELETE_V1: case DELETE_V1: