Annotation of embedaddon/strongswan/src/libcharon/sa/ikev2/tasks/ike_redirect.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2015 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "ike_redirect.h"
                     17: 
                     18: #include <daemon.h>
                     19: #include <processing/jobs/delete_ike_sa_job.h>
                     20: 
                     21: typedef struct private_ike_redirect_t private_ike_redirect_t;
                     22: 
                     23: /**
                     24:  * Private members
                     25:  */
                     26: struct private_ike_redirect_t {
                     27: 
                     28:        /**
                     29:         * Public interface
                     30:         */
                     31:        ike_redirect_t public;
                     32: 
                     33:        /**
                     34:         * Assigned IKE_SA
                     35:         */
                     36:        ike_sa_t *ike_sa;
                     37: 
                     38:        /**
                     39:         * Gateway ID to redirect to
                     40:         */
                     41:        identification_t *gateway;
                     42: };
                     43: 
                     44: METHOD(task_t, build_i, status_t,
                     45:        private_ike_redirect_t *this, message_t *message)
                     46: {
                     47:        chunk_t data;
                     48: 
                     49:        DBG1(DBG_IKE, "redirecting peer to %Y", this->gateway);
                     50:        data = redirect_data_create(this->gateway, chunk_empty);
                     51:        message->add_notify(message, FALSE, REDIRECT, data);
                     52:        chunk_free(&data);
                     53:        this->ike_sa->set_condition(this->ike_sa, COND_REDIRECTED, TRUE);
                     54:        return NEED_MORE;
                     55: }
                     56: 
                     57: METHOD(task_t, process_r, status_t,
                     58:        private_ike_redirect_t *this, message_t *message)
                     59: {
                     60:        notify_payload_t *notify;
                     61:        identification_t *to;
                     62: 
                     63:        notify = message->get_notify(message, REDIRECT);
                     64:        if (!notify)
                     65:        {
                     66:                return SUCCESS;
                     67:        }
                     68: 
                     69:        to = redirect_data_parse(notify->get_notification_data(notify), NULL);
                     70:        if (!to)
                     71:        {
                     72:                DBG1(DBG_IKE, "received invalid REDIRECT notify");
                     73:        }
                     74:        else
                     75:        {
                     76:                this->ike_sa->handle_redirect(this->ike_sa, to);
                     77:                to->destroy(to);
                     78:        }
                     79:        return SUCCESS;
                     80: }
                     81: 
                     82: METHOD(task_t, build_r, status_t,
                     83:        private_ike_redirect_t *this, message_t *message)
                     84: {
                     85:        /* not called because SUCCESS is returned above */
                     86:        return SUCCESS;
                     87: }
                     88: 
                     89: METHOD(task_t, process_i, status_t,
                     90:        private_ike_redirect_t *this, message_t *message)
                     91: {
                     92:        delete_ike_sa_job_t *job;
                     93: 
                     94:        /* if the peer does not delete the SA we do so after a while */
                     95:        job = delete_ike_sa_job_create(this->ike_sa->get_id(this->ike_sa), TRUE);
                     96:        lib->scheduler->schedule_job(lib->scheduler, (job_t*)job,
                     97:                                        lib->settings->get_int(lib->settings,
                     98:                                                        "%s.half_open_timeout", HALF_OPEN_IKE_SA_TIMEOUT,
                     99:                                                        lib->ns));
                    100:        return SUCCESS;
                    101: }
                    102: 
                    103: METHOD(task_t, get_type, task_type_t,
                    104:        private_ike_redirect_t *this)
                    105: {
                    106:        return TASK_IKE_REDIRECT;
                    107: }
                    108: 
                    109: METHOD(task_t, migrate, void,
                    110:        private_ike_redirect_t *this, ike_sa_t *ike_sa)
                    111: {
                    112:        this->ike_sa = ike_sa;
                    113: }
                    114: 
                    115: METHOD(task_t, destroy, void,
                    116:        private_ike_redirect_t *this)
                    117: {
                    118:        DESTROY_IF(this->gateway);
                    119:        free(this);
                    120: }
                    121: 
                    122: /*
                    123:  * Described in header.
                    124:  */
                    125: ike_redirect_t *ike_redirect_create(ike_sa_t *ike_sa, identification_t *to)
                    126: {
                    127:        private_ike_redirect_t *this;
                    128: 
                    129:        INIT(this,
                    130:                .public = {
                    131:                        .task = {
                    132:                                .get_type = _get_type,
                    133:                                .build = _build_r,
                    134:                                .process = _process_r,
                    135:                                .migrate = _migrate,
                    136:                                .destroy = _destroy,
                    137:                        },
                    138:                },
                    139:                .ike_sa = ike_sa,
                    140:        );
                    141: 
                    142:        if (to)
                    143:        {
                    144:                this->gateway = to->clone(to);
                    145:                this->public.task.build = _build_i;
                    146:                this->public.task.process = _process_i;
                    147:        }
                    148: 
                    149:        return &this->public;
                    150: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>