Annotation of embedaddon/strongswan/src/libcharon/sa/ikev1/tasks/isakmp_delete.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2015 Tobias Brunner
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * Copyright (C) 2011 Martin Willi
! 6: * Copyright (C) 2011 revosec AG
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify it
! 9: * under the terms of the GNU General Public License as published by the
! 10: * Free Software Foundation; either version 2 of the License, or (at your
! 11: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 12: *
! 13: * This program is distributed in the hope that it will be useful, but
! 14: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 15: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 16: * for more details.
! 17: */
! 18:
! 19: #include "isakmp_delete.h"
! 20:
! 21: #include <daemon.h>
! 22: #include <encoding/payloads/delete_payload.h>
! 23:
! 24: typedef struct private_isakmp_delete_t private_isakmp_delete_t;
! 25:
! 26: /**
! 27: * Private members of a isakmp_delete_t task.
! 28: */
! 29: struct private_isakmp_delete_t {
! 30:
! 31: /**
! 32: * Public methods and task_t interface.
! 33: */
! 34: isakmp_delete_t public;
! 35:
! 36: /**
! 37: * Assigned IKE_SA.
! 38: */
! 39: ike_sa_t *ike_sa;
! 40: };
! 41:
! 42: METHOD(task_t, build_i, status_t,
! 43: private_isakmp_delete_t *this, message_t *message)
! 44: {
! 45: delete_payload_t *delete_payload;
! 46: ike_sa_id_t *id;
! 47:
! 48: DBG0(DBG_IKE, "deleting IKE_SA %s[%d] between %H[%Y]...%H[%Y]",
! 49: this->ike_sa->get_name(this->ike_sa),
! 50: this->ike_sa->get_unique_id(this->ike_sa),
! 51: this->ike_sa->get_my_host(this->ike_sa),
! 52: this->ike_sa->get_my_id(this->ike_sa),
! 53: this->ike_sa->get_other_host(this->ike_sa),
! 54: this->ike_sa->get_other_id(this->ike_sa));
! 55:
! 56: delete_payload = delete_payload_create(PLV1_DELETE, PROTO_IKE);
! 57: id = this->ike_sa->get_id(this->ike_sa);
! 58: delete_payload->set_ike_spi(delete_payload, id->get_initiator_spi(id),
! 59: id->get_responder_spi(id));
! 60: message->add_payload(message, (payload_t*)delete_payload);
! 61:
! 62: DBG1(DBG_IKE, "sending DELETE for IKE_SA %s[%d]",
! 63: this->ike_sa->get_name(this->ike_sa),
! 64: this->ike_sa->get_unique_id(this->ike_sa));
! 65:
! 66: this->ike_sa->set_state(this->ike_sa, IKE_DELETING);
! 67: charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
! 68: return SUCCESS;
! 69: }
! 70:
! 71: METHOD(task_t, process_i, status_t,
! 72: private_isakmp_delete_t *this, message_t *message)
! 73: {
! 74: return FAILED;
! 75: }
! 76:
! 77: METHOD(task_t, process_r, status_t,
! 78: private_isakmp_delete_t *this, message_t *message)
! 79: {
! 80: enumerator_t *payloads;
! 81: payload_t *payload;
! 82: delete_payload_t *delete_payload;
! 83: ike_sa_id_t *id;
! 84: uint64_t spi_i, spi_r;
! 85: bool found = FALSE;
! 86:
! 87: /* some peers send DELETE payloads for other IKE_SAs, e.g. those for expired
! 88: * ones after a rekeying, make sure the SPIs match */
! 89: id = this->ike_sa->get_id(this->ike_sa);
! 90: payloads = message->create_payload_enumerator(message);
! 91: while (payloads->enumerate(payloads, &payload))
! 92: {
! 93: if (payload->get_type(payload) == PLV1_DELETE)
! 94: {
! 95: delete_payload = (delete_payload_t*)payload;
! 96: if (!delete_payload->get_ike_spi(delete_payload, &spi_i, &spi_r))
! 97: {
! 98: continue;
! 99: }
! 100: if (id->get_initiator_spi(id) == spi_i &&
! 101: id->get_responder_spi(id) == spi_r)
! 102: {
! 103: found = TRUE;
! 104: break;
! 105: }
! 106: }
! 107: }
! 108: payloads->destroy(payloads);
! 109:
! 110: if (!found)
! 111: {
! 112: DBG1(DBG_IKE, "received DELETE for different IKE_SA, ignored");
! 113: return SUCCESS;
! 114: }
! 115:
! 116: DBG1(DBG_IKE, "received DELETE for IKE_SA %s[%d]",
! 117: this->ike_sa->get_name(this->ike_sa),
! 118: this->ike_sa->get_unique_id(this->ike_sa));
! 119: DBG0(DBG_IKE, "deleting IKE_SA %s[%d] between %H[%Y]...%H[%Y]",
! 120: this->ike_sa->get_name(this->ike_sa),
! 121: this->ike_sa->get_unique_id(this->ike_sa),
! 122: this->ike_sa->get_my_host(this->ike_sa),
! 123: this->ike_sa->get_my_id(this->ike_sa),
! 124: this->ike_sa->get_other_host(this->ike_sa),
! 125: this->ike_sa->get_other_id(this->ike_sa));
! 126:
! 127: if (this->ike_sa->get_state(this->ike_sa) == IKE_ESTABLISHED)
! 128: {
! 129: this->ike_sa->set_state(this->ike_sa, IKE_DELETING);
! 130: this->ike_sa->reestablish(this->ike_sa);
! 131: }
! 132: this->ike_sa->set_state(this->ike_sa, IKE_DELETING);
! 133: charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
! 134: return DESTROY_ME;
! 135: }
! 136:
! 137: METHOD(task_t, build_r, status_t,
! 138: private_isakmp_delete_t *this, message_t *message)
! 139: {
! 140: return FAILED;
! 141: }
! 142:
! 143: METHOD(task_t, get_type, task_type_t,
! 144: private_isakmp_delete_t *this)
! 145: {
! 146: return TASK_ISAKMP_DELETE;
! 147: }
! 148:
! 149: METHOD(task_t, migrate, void,
! 150: private_isakmp_delete_t *this, ike_sa_t *ike_sa)
! 151: {
! 152: this->ike_sa = ike_sa;
! 153: }
! 154:
! 155: METHOD(task_t, destroy, void,
! 156: private_isakmp_delete_t *this)
! 157: {
! 158: free(this);
! 159: }
! 160:
! 161: /*
! 162: * Described in header.
! 163: */
! 164: isakmp_delete_t *isakmp_delete_create(ike_sa_t *ike_sa, bool initiator)
! 165: {
! 166: private_isakmp_delete_t *this;
! 167:
! 168: INIT(this,
! 169: .public = {
! 170: .task = {
! 171: .get_type = _get_type,
! 172: .migrate = _migrate,
! 173: .destroy = _destroy,
! 174: },
! 175: },
! 176: .ike_sa = ike_sa,
! 177: );
! 178:
! 179: if (initiator)
! 180: {
! 181: this->public.task.build = _build_i;
! 182: this->public.task.process = _process_i;
! 183: }
! 184: else
! 185: {
! 186: this->public.task.build = _build_r;
! 187: this->public.task.process = _process_r;
! 188: }
! 189:
! 190: return &this->public;
! 191: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>