Parse IKEv1 Cisco Load Balancing notify (can't act on it yet).
authorTobias Brunner <tobias@strongswan.org>
Fri, 3 Feb 2012 11:58:11 +0000 (12:58 +0100)
committerTobias Brunner <tobias@strongswan.org>
Tue, 20 Mar 2012 16:31:40 +0000 (17:31 +0100)
src/libcharon/encoding/payloads/notify_payload.c
src/libcharon/encoding/payloads/notify_payload.h
src/libcharon/sa/ikev1/tasks/informational.c

index 7c3aac1..ade2d94 100755 (executable)
@@ -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,
        "DPD_R_U_THERE",
        "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");
 ENUM_NEXT(notify_type_names, ME_MEDIATION, ME_RESPONSE, USE_BEET_MODE,
        "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,
        "DPD",
        "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");
 ENUM_NEXT(notify_type_short_names, ME_MEDIATION, ME_RESPONSE, USE_BEET_MODE,
        "ME_MED",
index 597962d..58d85ff 100755 (executable)
@@ -143,6 +143,8 @@ enum notify_type_t {
        /* IKEv1 DPD */
        DPD_R_U_THERE = 36136,
        DPD_R_U_THERE_ACK = 36137,
+       /* IKEv1 Cisco High Availability */
+       UNITY_LOAD_BALANCE = 40501,
        /* BEET mode, not even a draft yet. private use */
        USE_BEET_MODE = 40961,
        /* IKE-ME, private use */
index 4e53e5c..a521aee 100755 (executable)
@@ -81,10 +81,27 @@ METHOD(task_t, process_r, status_t,
                                        this->ike_sa->set_condition(this->ike_sa,
                                                                                                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)
                                {
                                        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)
                                        {       /* only critical during main mode */
                                                status = FAILED;
@@ -94,7 +111,7 @@ METHOD(task_t, process_r, status_t,
                                else
                                {
                                        DBG1(DBG_IKE, "received %N notify",
-                                                notify_type_names, notify->get_notify_type(notify));
+                                                notify_type_names, type);
                                }
                                continue;
                        case DELETE_V1: