Annotation of embedaddon/strongswan/src/libcharon/sa/ike_sa_manager.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2008-2017 Tobias Brunner
        !             3:  * Copyright (C) 2005-2008 Martin Willi
        !             4:  * Copyright (C) 2005 Jan Hutter
        !             5:  * HSR Hochschule fuer Technik Rapperswil
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or modify it
        !             8:  * under the terms of the GNU General Public License as published by the
        !             9:  * Free Software Foundation; either version 2 of the License, or (at your
        !            10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            15:  * for more details.
        !            16:  */
        !            17: 
        !            18: /**
        !            19:  * @defgroup ike_sa_manager ike_sa_manager
        !            20:  * @{ @ingroup sa
        !            21:  */
        !            22: 
        !            23: #ifndef IKE_SA_MANAGER_H_
        !            24: #define IKE_SA_MANAGER_H_
        !            25: 
        !            26: typedef struct ike_sa_manager_t ike_sa_manager_t;
        !            27: 
        !            28: #include <library.h>
        !            29: #include <sa/ike_sa.h>
        !            30: #include <encoding/message.h>
        !            31: #include <config/peer_cfg.h>
        !            32: 
        !            33: /**
        !            34:  * Callback called to generate an IKE SPI.
        !            35:  *
        !            36:  * This may be called from multiple threads concurrently.
        !            37:  *
        !            38:  * @param data         data supplied during registration of the callback
        !            39:  * @return                     allocated SPI, 0 on failure
        !            40:  */
        !            41: typedef uint64_t (*spi_cb_t)(void *data);
        !            42: 
        !            43: /**
        !            44:  * Manages and synchronizes access to all IKE_SAs.
        !            45:  *
        !            46:  * To synchronize access to thread-unsave IKE_SAs, they are checked out for
        !            47:  * use and checked in afterwards. A checked out SA is exclusively accessible
        !            48:  * by the owning thread.
        !            49:  */
        !            50: struct ike_sa_manager_t {
        !            51: 
        !            52:        /**
        !            53:         * Checkout an existing IKE_SA.
        !            54:         *
        !            55:         * @param ike_sa_id                     the SA identifier, will be updated
        !            56:         * @returns
        !            57:         *                                                      - checked out IKE_SA if found
        !            58:         *                                                      - NULL, if specified IKE_SA is not found.
        !            59:         */
        !            60:        ike_sa_t* (*checkout) (ike_sa_manager_t* this, ike_sa_id_t *sa_id);
        !            61: 
        !            62:        /**
        !            63:         * Create and check out a new IKE_SA.
        !            64:         *
        !            65:         * @param version                       IKE version of this SA
        !            66:         * @param initiator                     TRUE for initiator, FALSE otherwise
        !            67:         * @returns                             created and checked out IKE_SA
        !            68:         */
        !            69:        ike_sa_t* (*checkout_new) (ike_sa_manager_t* this, ike_version_t version,
        !            70:                                                           bool initiator);
        !            71: 
        !            72:        /**
        !            73:         * Checkout an IKE_SA by a message.
        !            74:         *
        !            75:         * In some situations, it is necessary that the manager knows the
        !            76:         * message to use for the checkout. This has the following reasons:
        !            77:         *
        !            78:         * 1. If the targeted IKE_SA is already processing a message, we do not
        !            79:         *    check it out if the message ID is the same.
        !            80:         * 2. If it is an IKE_SA_INIT request, we have to check if it is a
        !            81:         *    retransmission. If so, we have to drop the message, we would
        !            82:         *    create another unneeded IKE_SA for each retransmitted packet.
        !            83:         *
        !            84:         * A call to checkout_by_message() returns a (maybe new created) IKE_SA.
        !            85:         * If processing the message does not make sense (for the reasons above),
        !            86:         * NULL is returned.
        !            87:         *
        !            88:         * @param ike_sa_id                     the SA identifier, will be updated
        !            89:         * @returns
        !            90:         *                                                      - checked out/created IKE_SA
        !            91:         *                                                      - NULL to not process message further
        !            92:         */
        !            93:        ike_sa_t* (*checkout_by_message) (ike_sa_manager_t* this, message_t *message);
        !            94: 
        !            95:        /**
        !            96:         * Checkout an IKE_SA for initiation by a peer_config.
        !            97:         *
        !            98:         * To initiate, a CHILD_SA may be established within an existing IKE_SA.
        !            99:         * This call checks for an existing IKE_SA by comparing the configuration.
        !           100:         * If the CHILD_SA can be created in an existing IKE_SA, the matching SA
        !           101:         * is returned.
        !           102:         * If no IKE_SA is found, a new one is created. This is also the case when
        !           103:         * the found IKE_SA is in the DELETING state.
        !           104:         *
        !           105:         * @param peer_cfg                      configuration used to find an existing IKE_SA
        !           106:         * @return                                      checked out/created IKE_SA
        !           107:         */
        !           108:        ike_sa_t* (*checkout_by_config) (ike_sa_manager_t* this,
        !           109:                                                                         peer_cfg_t *peer_cfg);
        !           110: 
        !           111:        /**
        !           112:         * Reset initiator SPI.
        !           113:         *
        !           114:         * Allocate a new initiator SPI for the given IKE_SA in state IKE_CONNECTING
        !           115:         * and update internal data.
        !           116:         *
        !           117:         * @param ike_sa                        IKE_SA to update
        !           118:         * @return                                      TRUE if SPI successfully changed
        !           119:         */
        !           120:        bool (*new_initiator_spi)(ike_sa_manager_t* this, ike_sa_t *ike_sa);
        !           121: 
        !           122:        /**
        !           123:         * Check for duplicates of the given IKE_SA.
        !           124:         *
        !           125:         * Measures are taken according to the uniqueness policy of the IKE_SA.
        !           126:         * The return value indicates whether duplicates have been found and if
        !           127:         * further measures should be taken (e.g. cancelling an IKE_AUTH exchange).
        !           128:         * check_uniqueness() must be called before the IKE_SA is complete,
        !           129:         * deadlocks occur otherwise.
        !           130:         *
        !           131:         * @param ike_sa                        ike_sa to check
        !           132:         * @param force_replace         replace existing SAs, regardless of unique policy
        !           133:         * @return                                      TRUE, if the given IKE_SA has duplicates and
        !           134:         *                                                      should be deleted
        !           135:         */
        !           136:        bool (*check_uniqueness)(ike_sa_manager_t *this, ike_sa_t *ike_sa,
        !           137:                                                         bool force_replace);
        !           138: 
        !           139:        /**
        !           140:         * Check if we already have a connected IKE_SA between two identities.
        !           141:         *
        !           142:         * @param me                            own identity
        !           143:         * @param other                         remote identity
        !           144:         * @param family                        address family to include in uniqueness check
        !           145:         * @return                                      TRUE if we have a connected IKE_SA
        !           146:         */
        !           147:        bool (*has_contact)(ike_sa_manager_t *this, identification_t *me,
        !           148:                                                identification_t *other, int family);
        !           149: 
        !           150:        /**
        !           151:         * Check out an IKE_SA a unique ID.
        !           152:         *
        !           153:         * Every IKE_SA is uniquely identified by a numerical ID. This checkout
        !           154:         * function uses the unique ID of the IKE_SA to check it out.
        !           155:         *
        !           156:         * @param id                            unique ID of the object
        !           157:         * @return
        !           158:         *                                                      - checked out IKE_SA, if found
        !           159:         *                                                      - NULL, if not found
        !           160:         */
        !           161:        ike_sa_t* (*checkout_by_id) (ike_sa_manager_t* this, uint32_t id);
        !           162: 
        !           163:        /**
        !           164:         * Check out an IKE_SA by the policy/connection name.
        !           165:         *
        !           166:         * Check out the IKE_SA by the configuration name, either from the IKE- or
        !           167:         * one of its CHILD_SAs.
        !           168:         *
        !           169:         * @param name                          name of the connection/policy
        !           170:         * @param child                         TRUE to use policy name, FALSE to use conn name
        !           171:         * @return
        !           172:         *                                                      - checked out IKE_SA, if found
        !           173:         *                                                      - NULL, if not found
        !           174:         */
        !           175:        ike_sa_t* (*checkout_by_name) (ike_sa_manager_t* this, char *name,
        !           176:                                                                   bool child);
        !           177: 
        !           178:        /**
        !           179:         * Create an enumerator over all stored IKE_SAs.
        !           180:         *
        !           181:         * While enumerating an IKE_SA, it is temporarily checked out and
        !           182:         * automatically checked in after the current enumeration step.
        !           183:         *
        !           184:         * @param wait                          TRUE to wait for checked out SAs, FALSE to skip
        !           185:         * @return                                      enumerator over all IKE_SAs.
        !           186:         */
        !           187:        enumerator_t *(*create_enumerator) (ike_sa_manager_t* this, bool wait);
        !           188: 
        !           189:        /**
        !           190:         * Create an enumerator over ike_sa_id_t*, matching peer identities.
        !           191:         *
        !           192:         * The remote peer is identified by its XAuth or EAP identity, if available.
        !           193:         *
        !           194:         * @param me                            local peer identity to match
        !           195:         * @param other                         remote peer identity to match
        !           196:         * @param family                        address family to match, 0 for any
        !           197:         * @return                                      enumerator over ike_sa_id_t*
        !           198:         */
        !           199:        enumerator_t* (*create_id_enumerator)(ike_sa_manager_t *this,
        !           200:                                                                identification_t *me, identification_t *other,
        !           201:                                                                int family);
        !           202: 
        !           203:        /**
        !           204:         * Checkin the SA after usage.
        !           205:         *
        !           206:         * If the IKE_SA is not registered in the manager, a new entry is created.
        !           207:         *
        !           208:         * @param ike_sa_id                     the SA identifier, will be updated
        !           209:         * @param ike_sa                        checked out SA
        !           210:         */
        !           211:        void (*checkin) (ike_sa_manager_t* this, ike_sa_t *ike_sa);
        !           212: 
        !           213:        /**
        !           214:         * Destroy a checked out SA.
        !           215:         *
        !           216:         * The IKE SA is destroyed without notification of the remote peer.
        !           217:         * Use this only if the other peer doesn't respond or behaves not
        !           218:         * as predicted.
        !           219:         * Checking in and destruction is an atomic operation (for the IKE_SA),
        !           220:         * so this can be called if the SA is in a "unclean" state, without the
        !           221:         * risk that another thread can get the SA.
        !           222:         *
        !           223:         * @param ike_sa                        SA to delete
        !           224:         */
        !           225:        void (*checkin_and_destroy) (ike_sa_manager_t* this, ike_sa_t *ike_sa);
        !           226: 
        !           227:        /**
        !           228:         * Get the number of IKE_SAs currently registered.
        !           229:         *
        !           230:         * @return                                      number of registered IKE_SAs
        !           231:         */
        !           232:        u_int (*get_count)(ike_sa_manager_t *this);
        !           233: 
        !           234:        /**
        !           235:         * Get the number of IKE_SAs which are in the connecting state.
        !           236:         *
        !           237:         * To prevent the server from resource exhaustion, cookies and other
        !           238:         * mechanisms are used. The number of half open IKE_SAs is a good
        !           239:         * indicator to see if a peer is flooding the server.
        !           240:         * If a host is supplied, only the number of half open IKE_SAs with this IP
        !           241:         * are counted.
        !           242:         *
        !           243:         * @param ip                            NULL for all, IP for half open IKE_SAs with IP
        !           244:         * @param responder_only        TRUE to return only the number of responding SAs
        !           245:         * @return                                      number of half open IKE_SAs
        !           246:         */
        !           247:        u_int (*get_half_open_count)(ike_sa_manager_t *this, host_t *ip,
        !           248:                                                                 bool responder_only);
        !           249: 
        !           250:        /**
        !           251:         * Set the callback to generate IKE SPIs
        !           252:         *
        !           253:         * @param callback              callback to register
        !           254:         * @param data                  data provided to callback
        !           255:         */
        !           256:        void (*set_spi_cb)(ike_sa_manager_t *this, spi_cb_t callback,
        !           257:                                           void *data);
        !           258: 
        !           259:        /**
        !           260:         * Delete all existing IKE_SAs and destroy them immediately.
        !           261:         *
        !           262:         * Threads will be driven out, so all SAs can be deleted cleanly.
        !           263:         * To a flush(), an immediate call to destroy() is mandatory; no other
        !           264:         * method may be used.
        !           265:         */
        !           266:        void (*flush)(ike_sa_manager_t *this);
        !           267: 
        !           268:        /**
        !           269:         * Destroys the manager with all associated SAs.
        !           270:         *
        !           271:         * A call to flush() is required before calling destroy.
        !           272:         */
        !           273:        void (*destroy) (ike_sa_manager_t *this);
        !           274: };
        !           275: 
        !           276: /**
        !           277:  * Create the IKE_SA manager.
        !           278:  *
        !           279:  * @returns    ike_sa_manager_t object, NULL if initialization fails
        !           280:  */
        !           281: ike_sa_manager_t *ike_sa_manager_create(void);
        !           282: 
        !           283: #endif /** IKE_SA_MANAGER_H_ @}*/

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