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

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2006-2019 Tobias Brunner
        !             3:  * Copyright (C) 2006 Daniel Roethlisberger
        !             4:  * Copyright (C) 2005-2009 Martin Willi
        !             5:  * Copyright (C) 2005 Jan Hutter
        !             6:  * HSR Hochschule fuer Technik Rapperswil
        !             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: /**
        !            20:  * @defgroup ike_sa ike_sa
        !            21:  * @{ @ingroup sa
        !            22:  */
        !            23: 
        !            24: #ifndef IKE_SA_H_
        !            25: #define IKE_SA_H_
        !            26: 
        !            27: typedef enum ike_extension_t ike_extension_t;
        !            28: typedef enum ike_condition_t ike_condition_t;
        !            29: typedef enum ike_sa_state_t ike_sa_state_t;
        !            30: typedef enum statistic_t statistic_t;
        !            31: typedef struct ike_sa_t ike_sa_t;
        !            32: 
        !            33: #include <library.h>
        !            34: #include <attributes/attribute_handler.h>
        !            35: #include <encoding/message.h>
        !            36: #include <encoding/payloads/proposal_substructure.h>
        !            37: #include <encoding/payloads/configuration_attribute.h>
        !            38: #include <sa/ike_sa_id.h>
        !            39: #include <sa/child_sa.h>
        !            40: #include <sa/task.h>
        !            41: #include <sa/task_manager.h>
        !            42: #include <sa/keymat.h>
        !            43: #include <config/peer_cfg.h>
        !            44: #include <config/ike_cfg.h>
        !            45: #include <credentials/auth_cfg.h>
        !            46: #include <networking/packet.h>
        !            47: 
        !            48: /**
        !            49:  * Timeout in seconds after that a half open IKE_SA gets deleted.
        !            50:  */
        !            51: #define HALF_OPEN_IKE_SA_TIMEOUT 30
        !            52: 
        !            53: /**
        !            54:  * Interval to send keepalives when NATed, in seconds.
        !            55:  */
        !            56: #define KEEPALIVE_INTERVAL 20
        !            57: 
        !            58: /**
        !            59:  * After which time rekeying should be retried if it failed, in seconds.
        !            60:  */
        !            61: #define RETRY_INTERVAL 15
        !            62: 
        !            63: /**
        !            64:  * Jitter to subtract from RETRY_INTERVAL to randomize rekey retry.
        !            65:  */
        !            66: #define RETRY_JITTER 10
        !            67: 
        !            68: /**
        !            69:  * Number of redirects allowed within REDIRECT_LOOP_DETECT_PERIOD.
        !            70:  */
        !            71: #define MAX_REDIRECTS 5
        !            72: 
        !            73: /**
        !            74:  * Time period in seconds in which at most MAX_REDIRECTS are allowed.
        !            75:  */
        !            76: #define REDIRECT_LOOP_DETECT_PERIOD 300
        !            77: 
        !            78: /**
        !            79:  * Extensions (or optional features) the peer supports
        !            80:  */
        !            81: enum ike_extension_t {
        !            82: 
        !            83:        /**
        !            84:         * peer supports NAT traversal as specified in RFC4306 or RFC3947
        !            85:         * including some RFC3947 drafts
        !            86:         */
        !            87:        EXT_NATT = (1<<0),
        !            88: 
        !            89:        /**
        !            90:         * peer supports MOBIKE (RFC4555)
        !            91:         */
        !            92:        EXT_MOBIKE = (1<<1),
        !            93: 
        !            94:        /**
        !            95:         * peer supports HTTP cert lookups as specified in RFC4306
        !            96:         */
        !            97:        EXT_HASH_AND_URL = (1<<2),
        !            98: 
        !            99:        /**
        !           100:         * peer supports multiple authentication exchanges, RFC4739
        !           101:         */
        !           102:        EXT_MULTIPLE_AUTH = (1<<3),
        !           103: 
        !           104:        /**
        !           105:         * peer uses strongSwan, accept private use extensions
        !           106:         */
        !           107:        EXT_STRONGSWAN = (1<<4),
        !           108: 
        !           109:        /**
        !           110:         * peer supports EAP-only authentication, draft-eronen-ipsec-ikev2-eap-auth
        !           111:         */
        !           112:        EXT_EAP_ONLY_AUTHENTICATION = (1<<5),
        !           113: 
        !           114:        /**
        !           115:         * peer is probably a Windows RAS client
        !           116:         */
        !           117:        EXT_MS_WINDOWS = (1<<6),
        !           118: 
        !           119:        /**
        !           120:         * peer supports XAuth authentication, draft-ietf-ipsec-isakmp-xauth-06
        !           121:         */
        !           122:        EXT_XAUTH = (1<<7),
        !           123: 
        !           124:        /**
        !           125:         * peer supports DPD detection, RFC 3706 (or IKEv2)
        !           126:         */
        !           127:        EXT_DPD = (1<<8),
        !           128: 
        !           129:        /**
        !           130:         * peer supports Cisco Unity configuration attributes
        !           131:         */
        !           132:        EXT_CISCO_UNITY = (1<<9),
        !           133: 
        !           134:        /**
        !           135:         * peer supports NAT traversal as specified in
        !           136:         * draft-ietf-ipsec-nat-t-ike-02 .. -03
        !           137:         */
        !           138:        EXT_NATT_DRAFT_02_03 = (1<<10),
        !           139: 
        !           140:        /**
        !           141:         * peer supports proprietary IKEv1 or standardized IKEv2 fragmentation
        !           142:         */
        !           143:        EXT_IKE_FRAGMENTATION = (1<<11),
        !           144: 
        !           145:        /**
        !           146:         * Signature Authentication, RFC 7427
        !           147:         */
        !           148:        EXT_SIGNATURE_AUTH = (1<<12),
        !           149: 
        !           150:        /**
        !           151:         * IKEv2 Redirect Mechanism, RFC 5685
        !           152:         */
        !           153:        EXT_IKE_REDIRECTION = (1<<13),
        !           154: 
        !           155:        /**
        !           156:         * IKEv2 Message ID sync, RFC 6311
        !           157:         */
        !           158:        EXT_IKE_MESSAGE_ID_SYNC = (1<<14),
        !           159: 
        !           160:        /**
        !           161:         * Postquantum Preshared Keys, draft-ietf-ipsecme-qr-ikev2
        !           162:         */
        !           163:        EXT_PPK = (1<<15),
        !           164: 
        !           165:        /**
        !           166:         * Responder accepts childless IKE_SAs, RFC 6023
        !           167:         */
        !           168:        EXT_IKE_CHILDLESS = (1<<16),
        !           169: };
        !           170: 
        !           171: /**
        !           172:  * Conditions of an IKE_SA, change during its lifetime
        !           173:  */
        !           174: enum ike_condition_t {
        !           175: 
        !           176:        /**
        !           177:         * Connection is natted (or faked) somewhere
        !           178:         */
        !           179:        COND_NAT_ANY = (1<<0),
        !           180: 
        !           181:        /**
        !           182:         * we are behind NAT
        !           183:         */
        !           184:        COND_NAT_HERE = (1<<1),
        !           185: 
        !           186:        /**
        !           187:         * other is behind NAT
        !           188:         */
        !           189:        COND_NAT_THERE = (1<<2),
        !           190: 
        !           191:        /**
        !           192:         * Faking NAT to enforce UDP encapsulation
        !           193:         */
        !           194:        COND_NAT_FAKE = (1<<3),
        !           195: 
        !           196:        /**
        !           197:         * peer has been authenticated using EAP at least once
        !           198:         */
        !           199:        COND_EAP_AUTHENTICATED = (1<<4),
        !           200: 
        !           201:        /**
        !           202:         * received a certificate request from the peer
        !           203:         */
        !           204:        COND_CERTREQ_SEEN = (1<<5),
        !           205: 
        !           206:        /**
        !           207:         * Local peer is the "original" IKE initiator. Unaffected from rekeying.
        !           208:         */
        !           209:        COND_ORIGINAL_INITIATOR = (1<<6),
        !           210: 
        !           211:        /**
        !           212:         * IKE_SA is stale, the peer is currently unreachable (MOBIKE)
        !           213:         */
        !           214:        COND_STALE = (1<<7),
        !           215: 
        !           216:        /**
        !           217:         * Initial contact received
        !           218:         */
        !           219:        COND_INIT_CONTACT_SEEN = (1<<8),
        !           220: 
        !           221:        /**
        !           222:         * Peer has been authenticated using XAuth
        !           223:         */
        !           224:        COND_XAUTH_AUTHENTICATED = (1<<9),
        !           225: 
        !           226:        /**
        !           227:         * This IKE_SA is currently being reauthenticated
        !           228:         */
        !           229:        COND_REAUTHENTICATING = (1<<10),
        !           230: 
        !           231:        /**
        !           232:         * This IKE_SA has been redirected
        !           233:         */
        !           234:        COND_REDIRECTED = (1<<11),
        !           235: 
        !           236:        /**
        !           237:         * Online certificate revocation checking is suspended for this IKE_SA
        !           238:         */
        !           239:        COND_ONLINE_VALIDATION_SUSPENDED = (1<<12),
        !           240: 
        !           241:        /**
        !           242:         * A Postquantum Preshared Key was used when this IKE_SA was created
        !           243:         */
        !           244:        COND_PPK = (1<<13),
        !           245: };
        !           246: 
        !           247: /**
        !           248:  * Timing information and statistics to query from an SA
        !           249:  */
        !           250: enum statistic_t {
        !           251:        /** Timestamp of SA establishment */
        !           252:        STAT_ESTABLISHED = 0,
        !           253:        /** Timestamp of scheduled rekeying */
        !           254:        STAT_REKEY,
        !           255:        /** Timestamp of scheduled reauthentication */
        !           256:        STAT_REAUTH,
        !           257:        /** Timestamp of scheduled delete */
        !           258:        STAT_DELETE,
        !           259:        /** Timestamp of last inbound IKE packet */
        !           260:        STAT_INBOUND,
        !           261:        /** Timestamp of last outbound IKE packet */
        !           262:        STAT_OUTBOUND,
        !           263: 
        !           264:        STAT_MAX
        !           265: };
        !           266: 
        !           267: /**
        !           268:  * State of an IKE_SA.
        !           269:  *
        !           270:  * An IKE_SA passes various states in its lifetime. A newly created
        !           271:  * SA is in the state CREATED.
        !           272:  * @verbatim
        !           273:                  +----------------+
        !           274:                  ¦   SA_CREATED   ¦
        !           275:                  +----------------+
        !           276:                          ¦
        !           277:     on initiate()--->    ¦   <----- on IKE_SA_INIT received
        !           278:                          V
        !           279:                  +----------------+
        !           280:                  ¦ SA_CONNECTING  ¦
        !           281:                  +----------------+
        !           282:                          ¦
        !           283:                          ¦   <----- on IKE_AUTH successfully completed
        !           284:                          V
        !           285:                  +----------------+
        !           286:                  ¦ SA_ESTABLISHED ¦-------------------------+ <-- on rekeying
        !           287:                  +----------------+                         ¦
        !           288:                          ¦                                  V
        !           289:     on delete()--->      ¦   <----- on IKE_SA        +-------------+
        !           290:                          ¦          delete request   ¦ SA_REKEYING ¦
        !           291:                          ¦          received         +-------------+
        !           292:                          V                                  ¦
        !           293:                  +----------------+                         ¦
        !           294:                  ¦  SA_DELETING   ¦<------------------------+ <-- after rekeying
        !           295:                  +----------------+
        !           296:                          ¦
        !           297:                          ¦   <----- after delete() acknowledged
        !           298:                          ¦
        !           299:                         \V/
        !           300:                          X
        !           301:                         / \
        !           302:    @endverbatim
        !           303:  */
        !           304: enum ike_sa_state_t {
        !           305: 
        !           306:        /**
        !           307:         * IKE_SA just got created, but is not initiating nor responding yet.
        !           308:         */
        !           309:        IKE_CREATED,
        !           310: 
        !           311:        /**
        !           312:         * IKE_SA gets initiated actively or passively
        !           313:         */
        !           314:        IKE_CONNECTING,
        !           315: 
        !           316:        /**
        !           317:         * IKE_SA is fully established
        !           318:         */
        !           319:        IKE_ESTABLISHED,
        !           320: 
        !           321:        /**
        !           322:         * IKE_SA is managed externally and does not process messages
        !           323:         */
        !           324:        IKE_PASSIVE,
        !           325: 
        !           326:        /**
        !           327:         * IKE_SA rekeying in progress
        !           328:         */
        !           329:        IKE_REKEYING,
        !           330: 
        !           331:        /**
        !           332:         * IKE_SA has been rekeyed (or is redundant)
        !           333:         */
        !           334:        IKE_REKEYED,
        !           335: 
        !           336:        /**
        !           337:         * IKE_SA is in progress of deletion
        !           338:         */
        !           339:        IKE_DELETING,
        !           340: 
        !           341:        /**
        !           342:         * IKE_SA object gets destroyed
        !           343:         */
        !           344:        IKE_DESTROYING,
        !           345: };
        !           346: 
        !           347: /**
        !           348:  * enum names for ike_sa_state_t.
        !           349:  */
        !           350: extern enum_name_t *ike_sa_state_names;
        !           351: 
        !           352: /**
        !           353:  * Class ike_sa_t representing an IKE_SA.
        !           354:  *
        !           355:  * An IKE_SA contains crypto information related to a connection
        !           356:  * with a peer. It contains multiple IPsec CHILD_SA, for which
        !           357:  * it is responsible. All traffic is handled by an IKE_SA, using
        !           358:  * the task manager and its tasks.
        !           359:  */
        !           360: struct ike_sa_t {
        !           361: 
        !           362:        /**
        !           363:         * Get the id of the SA.
        !           364:         *
        !           365:         * Returned ike_sa_id_t object is not getting cloned!
        !           366:         *
        !           367:         * @return                              ike_sa's ike_sa_id_t
        !           368:         */
        !           369:        ike_sa_id_t* (*get_id) (ike_sa_t *this);
        !           370: 
        !           371:        /**
        !           372:         * Gets the IKE version of the SA
        !           373:         */
        !           374:        ike_version_t (*get_version)(ike_sa_t *this);
        !           375: 
        !           376:        /**
        !           377:         * Get the numerical ID uniquely defining this IKE_SA.
        !           378:         *
        !           379:         * @return                              unique ID
        !           380:         */
        !           381:        uint32_t (*get_unique_id) (ike_sa_t *this);
        !           382: 
        !           383:        /**
        !           384:         * Get the state of the IKE_SA.
        !           385:         *
        !           386:         * @return                              state of the IKE_SA
        !           387:         */
        !           388:        ike_sa_state_t (*get_state) (ike_sa_t *this);
        !           389: 
        !           390:        /**
        !           391:         * Set the state of the IKE_SA.
        !           392:         *
        !           393:         * @param state                 state to set for the IKE_SA
        !           394:         */
        !           395:        void (*set_state) (ike_sa_t *this, ike_sa_state_t state);
        !           396: 
        !           397:        /**
        !           398:         * Get the name of the connection this IKE_SA uses.
        !           399:         *
        !           400:         * @return                              name
        !           401:         */
        !           402:        char* (*get_name) (ike_sa_t *this);
        !           403: 
        !           404:        /**
        !           405:         * Get statistic values from the IKE_SA.
        !           406:         *
        !           407:         * @param kind                  kind of requested value
        !           408:         * @return                              value as integer
        !           409:         */
        !           410:        uint32_t (*get_statistic)(ike_sa_t *this, statistic_t kind);
        !           411: 
        !           412:        /**
        !           413:         * Set statistic value of the IKE_SA.
        !           414:         *
        !           415:         * @param kind                  kind of value to update
        !           416:         * @param value                 value as integer
        !           417:         */
        !           418:        void (*set_statistic)(ike_sa_t *this, statistic_t kind, uint32_t value);
        !           419: 
        !           420:        /**
        !           421:         * Get the own host address.
        !           422:         *
        !           423:         * @return                              host address
        !           424:         */
        !           425:        host_t* (*get_my_host) (ike_sa_t *this);
        !           426: 
        !           427:        /**
        !           428:         * Set the own host address.
        !           429:         *
        !           430:         * @param me                    host address
        !           431:         */
        !           432:        void (*set_my_host) (ike_sa_t *this, host_t *me);
        !           433: 
        !           434:        /**
        !           435:         * Get the other peers host address.
        !           436:         *
        !           437:         * @return                              host address
        !           438:         */
        !           439:        host_t* (*get_other_host) (ike_sa_t *this);
        !           440: 
        !           441:        /**
        !           442:         * Set the others host address.
        !           443:         *
        !           444:         * @param other                 host address
        !           445:         */
        !           446:        void (*set_other_host) (ike_sa_t *this, host_t *other);
        !           447: 
        !           448:        /**
        !           449:         * Float to port 4500 (e.g. if a NAT is detected).
        !           450:         *
        !           451:         * The port of either endpoint is changed only if it is currently
        !           452:         * set to the default value of 500.
        !           453:         */
        !           454:        void (*float_ports)(ike_sa_t *this);
        !           455: 
        !           456:        /**
        !           457:         * Update the IKE_SAs host.
        !           458:         *
        !           459:         * Hosts may be NULL to use current host.
        !           460:         *
        !           461:         * @param me                    new local host address, or NULL
        !           462:         * @param other                 new remote host address, or NULL
        !           463:         * @param force                 force update
        !           464:         */
        !           465:        void (*update_hosts)(ike_sa_t *this, host_t *me, host_t *other, bool force);
        !           466: 
        !           467:        /**
        !           468:         * Get the own identification.
        !           469:         *
        !           470:         * @return                              identification
        !           471:         */
        !           472:        identification_t* (*get_my_id) (ike_sa_t *this);
        !           473: 
        !           474:        /**
        !           475:         * Set the own identification.
        !           476:         *
        !           477:         * @param me                    identification
        !           478:         */
        !           479:        void (*set_my_id) (ike_sa_t *this, identification_t *me);
        !           480: 
        !           481:        /**
        !           482:         * Get the other peer's identification.
        !           483:         *
        !           484:         * @return                              identification
        !           485:         */
        !           486:        identification_t* (*get_other_id) (ike_sa_t *this);
        !           487: 
        !           488:        /**
        !           489:         * Get the others peer identity, but prefer an EAP-Identity.
        !           490:         *
        !           491:         * @return                              EAP or IKEv2 identity
        !           492:         */
        !           493:        identification_t* (*get_other_eap_id)(ike_sa_t *this);
        !           494: 
        !           495:        /**
        !           496:         * Set the other peer's identification.
        !           497:         *
        !           498:         * @param other                 identification
        !           499:         */
        !           500:        void (*set_other_id) (ike_sa_t *this, identification_t *other);
        !           501: 
        !           502:        /**
        !           503:         * Get the config used to setup this IKE_SA.
        !           504:         *
        !           505:         * @return                              ike_config
        !           506:         */
        !           507:        ike_cfg_t* (*get_ike_cfg) (ike_sa_t *this);
        !           508: 
        !           509:        /**
        !           510:         * Set the config to setup this IKE_SA.
        !           511:         *
        !           512:         * @param config                ike_config to use
        !           513:         */
        !           514:        void (*set_ike_cfg) (ike_sa_t *this, ike_cfg_t* config);
        !           515: 
        !           516:        /**
        !           517:         * Get the peer config used by this IKE_SA.
        !           518:         *
        !           519:         * @return                              peer_config
        !           520:         */
        !           521:        peer_cfg_t* (*get_peer_cfg) (ike_sa_t *this);
        !           522: 
        !           523:        /**
        !           524:         * Set the peer config to use with this IKE_SA.
        !           525:         *
        !           526:         * @param config                peer_config to use
        !           527:         */
        !           528:        void (*set_peer_cfg) (ike_sa_t *this, peer_cfg_t *config);
        !           529: 
        !           530:        /**
        !           531:         * Get the authentication config with rules of the current auth round.
        !           532:         *
        !           533:         * @param local                 TRUE for local rules, FALSE for remote constraints
        !           534:         * @return                              current cfg
        !           535:         */
        !           536:        auth_cfg_t* (*get_auth_cfg)(ike_sa_t *this, bool local);
        !           537: 
        !           538:        /**
        !           539:         * Insert a completed authentication round.
        !           540:         *
        !           541:         * @param local                 TRUE for own rules, FALSE for others constraints
        !           542:         * @param cfg                   auth config to append
        !           543:         */
        !           544:        void (*add_auth_cfg)(ike_sa_t *this, bool local, auth_cfg_t *cfg);
        !           545: 
        !           546:        /**
        !           547:         * Create an enumerator over added authentication rounds.
        !           548:         *
        !           549:         * @param local                 TRUE for own rules, FALSE for others constraints
        !           550:         * @return                              enumerator over auth_cfg_t
        !           551:         */
        !           552:        enumerator_t* (*create_auth_cfg_enumerator)(ike_sa_t *this, bool local);
        !           553: 
        !           554:        /**
        !           555:         * Verify the trustchains (validity, revocation) in completed public key
        !           556:         * auth rounds.
        !           557:         *
        !           558:         * @return                              TRUE if certificates were valid, FALSE otherwise
        !           559:         */
        !           560:        bool (*verify_peer_certificate)(ike_sa_t *this);
        !           561: 
        !           562:        /**
        !           563:         * Get the selected proposal of this IKE_SA.
        !           564:         *
        !           565:         * @return                              selected proposal
        !           566:         */
        !           567:        proposal_t* (*get_proposal)(ike_sa_t *this);
        !           568: 
        !           569:        /**
        !           570:         * Set the proposal selected for this IKE_SA.
        !           571:         *
        !           572:         * @param                               selected proposal
        !           573:         */
        !           574:        void (*set_proposal)(ike_sa_t *this, proposal_t *proposal);
        !           575: 
        !           576:        /**
        !           577:         * Set the message ID of the IKE_SA.
        !           578:         *
        !           579:         * The IKE_SA stores two message IDs, one for initiating exchanges (send)
        !           580:         * and one to respond to exchanges (expect).
        !           581:         *
        !           582:         * @param initiate              TRUE to set message ID for initiating
        !           583:         * @param mid                   message id to set
        !           584:         */
        !           585:        void (*set_message_id)(ike_sa_t *this, bool initiate, uint32_t mid);
        !           586: 
        !           587:        /**
        !           588:         * Get the message ID of the IKE_SA.
        !           589:         *
        !           590:         * The IKE_SA stores two message IDs, one for initiating exchanges (send)
        !           591:         * and one to respond to exchanges (expect).
        !           592:         *
        !           593:         * @param initiate              TRUE to get message ID for initiating
        !           594:         * @return                              current message
        !           595:         */
        !           596:        uint32_t (*get_message_id)(ike_sa_t *this, bool initiate);
        !           597: 
        !           598:        /**
        !           599:         * Add an additional address for the peer.
        !           600:         *
        !           601:         * In MOBIKE, a peer may transmit additional addresses where it is
        !           602:         * reachable. These are stored in the IKE_SA.
        !           603:         * The own list of addresses is not stored, they are queried from
        !           604:         * the kernel when required.
        !           605:         *
        !           606:         * @param host                  host to add to list
        !           607:         */
        !           608:        void (*add_peer_address)(ike_sa_t *this, host_t *host);
        !           609: 
        !           610:        /**
        !           611:         * Create an enumerator over all known addresses of the peer.
        !           612:         *
        !           613:         * @return                              enumerator over addresses
        !           614:         */
        !           615:        enumerator_t* (*create_peer_address_enumerator)(ike_sa_t *this);
        !           616: 
        !           617:        /**
        !           618:         * Remove all known addresses of the peer.
        !           619:         */
        !           620:        void (*clear_peer_addresses)(ike_sa_t *this);
        !           621: 
        !           622:        /**
        !           623:         * Check if mappings have changed on a NAT for our source address.
        !           624:         *
        !           625:         * @param hash                  received DESTINATION_IP hash
        !           626:         * @return                              TRUE if mappings have changed
        !           627:         */
        !           628:        bool (*has_mapping_changed)(ike_sa_t *this, chunk_t hash);
        !           629: 
        !           630:        /**
        !           631:         * Enable an extension the peer supports.
        !           632:         *
        !           633:         * If support for an IKE extension is detected, this method is called
        !           634:         * to enable that extension and behave accordingly.
        !           635:         *
        !           636:         * @param extension             extension to enable
        !           637:         */
        !           638:        void (*enable_extension)(ike_sa_t *this, ike_extension_t extension);
        !           639: 
        !           640:        /**
        !           641:         * Check if the peer supports an extension.
        !           642:         *
        !           643:         * @param extension             extension to check for support
        !           644:         * @return                              TRUE if peer supports it, FALSE otherwise
        !           645:         */
        !           646:        bool (*supports_extension)(ike_sa_t *this, ike_extension_t extension);
        !           647: 
        !           648:        /**
        !           649:         * Enable/disable a condition flag for this IKE_SA.
        !           650:         *
        !           651:         * @param condition             condition to enable/disable
        !           652:         * @param enable                TRUE to enable condition, FALSE to disable
        !           653:         */
        !           654:        void (*set_condition) (ike_sa_t *this, ike_condition_t condition, bool enable);
        !           655: 
        !           656:        /**
        !           657:         * Check if a condition flag is set.
        !           658:         *
        !           659:         * @param condition             condition to check
        !           660:         * @return                              TRUE if condition flag set, FALSE otherwise
        !           661:         */
        !           662:        bool (*has_condition) (ike_sa_t *this, ike_condition_t condition);
        !           663: 
        !           664: #ifdef ME
        !           665:        /**
        !           666:         * Activate mediation server functionality for this IKE_SA.
        !           667:         */
        !           668:        void (*act_as_mediation_server) (ike_sa_t *this);
        !           669: 
        !           670:        /**
        !           671:         * Get the server reflexive host.
        !           672:         *
        !           673:         * @return                              server reflexive host
        !           674:         */
        !           675:        host_t* (*get_server_reflexive_host) (ike_sa_t *this);
        !           676: 
        !           677:        /**
        !           678:         * Set the server reflexive host.
        !           679:         *
        !           680:         * @param host                  server reflexive host
        !           681:         */
        !           682:        void (*set_server_reflexive_host) (ike_sa_t *this, host_t *host);
        !           683: 
        !           684:        /**
        !           685:         * Get the connect ID.
        !           686:         *
        !           687:         * @return                              connect ID
        !           688:         */
        !           689:        chunk_t (*get_connect_id) (ike_sa_t *this);
        !           690: 
        !           691:        /**
        !           692:         * Initiate the mediation of a mediated connection (i.e. initiate a
        !           693:         * ME_CONNECT exchange to a mediation server).
        !           694:         *
        !           695:         * @param mediated_cfg  peer_cfg of the mediated connection
        !           696:         * @return
        !           697:         *                                              - SUCCESS if initialization started
        !           698:         *                                              - DESTROY_ME if initialization failed
        !           699:         */
        !           700:        status_t (*initiate_mediation) (ike_sa_t *this, peer_cfg_t *mediated_cfg);
        !           701: 
        !           702:        /**
        !           703:         * Initiate the mediated connection
        !           704:         *
        !           705:         * @param me                    local endpoint (gets cloned)
        !           706:         * @param other                 remote endpoint (gets cloned)
        !           707:         * @param connect_id    connect ID (gets cloned)
        !           708:         * @return
        !           709:         *                                              - SUCCESS if initialization started
        !           710:         *                                              - DESTROY_ME if initialization failed
        !           711:         */
        !           712:        status_t (*initiate_mediated) (ike_sa_t *this, host_t *me, host_t *other,
        !           713:                                                                   chunk_t connect_id);
        !           714: 
        !           715:        /**
        !           716:         * Relay data from one peer to another (i.e. initiate a ME_CONNECT exchange
        !           717:         * to a peer).
        !           718:         *
        !           719:         * Data is cloned.
        !           720:         *
        !           721:         * @param requester             ID of the requesting peer
        !           722:         * @param connect_id    data of the ME_CONNECTID payload
        !           723:         * @param connect_key   data of the ME_CONNECTKEY payload
        !           724:         * @param endpoints             endpoints
        !           725:         * @param response              TRUE if this is a response
        !           726:         * @return
        !           727:         *                                              - SUCCESS if relay started
        !           728:         *                                              - DESTROY_ME if relay failed
        !           729:         */
        !           730:        status_t (*relay) (ike_sa_t *this, identification_t *requester,
        !           731:                                           chunk_t connect_id, chunk_t connect_key,
        !           732:                                           linked_list_t *endpoints, bool response);
        !           733: 
        !           734:        /**
        !           735:         * Send a callback to a peer.
        !           736:         *
        !           737:         * Data is cloned.
        !           738:         *
        !           739:         * @param peer_id               ID of the other peer
        !           740:         * @return
        !           741:         *                                              - SUCCESS if response started
        !           742:         *                                              - DESTROY_ME if response failed
        !           743:         */
        !           744:        status_t (*callback) (ike_sa_t *this, identification_t *peer_id);
        !           745: 
        !           746:        /**
        !           747:         * Respond to a ME_CONNECT request.
        !           748:         *
        !           749:         * Data is cloned.
        !           750:         *
        !           751:         * @param peer_id               ID of the other peer
        !           752:         * @param connect_id    the connect ID supplied by the initiator
        !           753:         * @return
        !           754:         *                                              - SUCCESS if response started
        !           755:         *                                              - DESTROY_ME if response failed
        !           756:         */
        !           757:        status_t (*respond) (ike_sa_t *this, identification_t *peer_id,
        !           758:                                                 chunk_t connect_id);
        !           759: #endif /* ME */
        !           760: 
        !           761:        /**
        !           762:         * Initiate a new connection.
        !           763:         *
        !           764:         * The configs are owned by the IKE_SA after the call. If the initiate
        !           765:         * is triggered by a packet, traffic selectors of the packet can be added
        !           766:         * to the CHILD_SA.
        !           767:         *
        !           768:         * @param child_cfg             child config to create CHILD from
        !           769:         * @param reqid                 reqid to use for CHILD_SA, 0 assign uniquely
        !           770:         * @param tsi                   source of triggering packet
        !           771:         * @param tsr                   destination of triggering packet.
        !           772:         * @return
        !           773:         *                                              - SUCCESS if initialization started
        !           774:         *                                              - DESTROY_ME if initialization failed
        !           775:         */
        !           776:        status_t (*initiate) (ike_sa_t *this, child_cfg_t *child_cfg,
        !           777:                                                  uint32_t reqid, traffic_selector_t *tsi,
        !           778:                                                  traffic_selector_t *tsr);
        !           779: 
        !           780:        /**
        !           781:         * Retry initiation of this IKE_SA after it got deferred previously.
        !           782:         *
        !           783:         * @return
        !           784:         *                                              - SUCCESS if initiation deferred or started
        !           785:         *                                              - DESTROY_ME if initiation failed
        !           786:         */
        !           787:        status_t (*retry_initiate) (ike_sa_t *this);
        !           788: 
        !           789:        /**
        !           790:         * Initiates the deletion of an IKE_SA.
        !           791:         *
        !           792:         * Sends a delete message to the remote peer and waits for
        !           793:         * its response. If the response comes in, or a timeout occurs,
        !           794:         * the IKE SA gets destroyed, unless force is TRUE then the IKE_SA is
        !           795:         * destroyed immediately without waiting for a response.
        !           796:         *
        !           797:         * @param force                 whether to immediately destroy the IKE_SA afterwards
        !           798:         *                                              without waiting for a response
        !           799:         * @return
        !           800:         *                                              - SUCCESS if deletion is initialized
        !           801:         *                                              - DESTROY_ME, if destroying is forced, or the IKE_SA
        !           802:         *                                                is not in an established state and can not be
        !           803:         *                                                deleted (but destroyed)
        !           804:         */
        !           805:        status_t (*delete) (ike_sa_t *this, bool force);
        !           806: 
        !           807:        /**
        !           808:         * Update IKE_SAs after network interfaces have changed.
        !           809:         *
        !           810:         * Whenever the network interface configuration changes, the kernel
        !           811:         * interface calls roam() on each IKE_SA. The IKE_SA then checks if
        !           812:         * the new network config requires changes, and handles appropriate.
        !           813:         * If MOBIKE is supported, addresses are updated; If not, the tunnel is
        !           814:         * restarted.
        !           815:         *
        !           816:         * @param address               TRUE if address list changed, FALSE otherwise
        !           817:         * @return                              SUCCESS, FAILED, DESTROY_ME
        !           818:         */
        !           819:        status_t (*roam)(ike_sa_t *this, bool address);
        !           820: 
        !           821:        /**
        !           822:         * Processes an incoming IKE message.
        !           823:         *
        !           824:         * Message processing may fail. If a critical failure occurs,
        !           825:         * process_message() return DESTROY_ME. Then the caller must
        !           826:         * destroy the IKE_SA immediately, as it is unusable.
        !           827:         *
        !           828:         * @param message               message to process
        !           829:         * @return
        !           830:         *                                              - SUCCESS
        !           831:         *                                              - FAILED
        !           832:         *                                              - DESTROY_ME if this IKE_SA MUST be deleted
        !           833:         */
        !           834:        status_t (*process_message)(ike_sa_t *this, message_t *message);
        !           835: 
        !           836:        /**
        !           837:         * Generate an IKE message to send it to the peer.
        !           838:         *
        !           839:         * This method generates all payloads in the message and encrypts/signs
        !           840:         * the packet.
        !           841:         *
        !           842:         * @param message               message to generate
        !           843:         * @param packet                generated output packet
        !           844:         * @return
        !           845:         *                                              - SUCCESS
        !           846:         *                                              - FAILED
        !           847:         *                                              - DESTROY_ME if this IKE_SA MUST be deleted
        !           848:         */
        !           849:        status_t (*generate_message)(ike_sa_t *this, message_t *message,
        !           850:                                                                 packet_t **packet);
        !           851: 
        !           852:        /**
        !           853:         * Generate an IKE message to send it to the peer. If enabled and supported
        !           854:         * it will be fragmented.
        !           855:         *
        !           856:         * This method generates all payloads in the message and encrypts/signs
        !           857:         * the packet/fragments.
        !           858:         *
        !           859:         * @param message               message to generate
        !           860:         * @param packets               enumerator of generated packet_t* (are not destroyed
        !           861:         *                                              with the enumerator)
        !           862:         * @return
        !           863:         *                                              - SUCCESS
        !           864:         *                                              - FAILED
        !           865:         *                                              - DESTROY_ME if this IKE_SA MUST be deleted
        !           866:         */
        !           867:        status_t (*generate_message_fragmented)(ike_sa_t *this, message_t *message,
        !           868:                                                                                        enumerator_t **packets);
        !           869: 
        !           870:        /**
        !           871:         * Retransmits a request.
        !           872:         *
        !           873:         * @param message_id    ID of the request to retransmit
        !           874:         * @return
        !           875:         *                                              - SUCCESS
        !           876:         *                                              - NOT_FOUND if request doesn't have to be retransmitted
        !           877:         */
        !           878:        status_t (*retransmit) (ike_sa_t *this, uint32_t message_id);
        !           879: 
        !           880:        /**
        !           881:         * Sends a DPD request to the peer.
        !           882:         *
        !           883:         * To check if a peer is still alive, periodic
        !           884:         * empty INFORMATIONAL messages are sent if no
        !           885:         * other traffic was received.
        !           886:         *
        !           887:         * @return
        !           888:         *                                              - SUCCESS
        !           889:         *                                              - DESTROY_ME, if peer did not respond
        !           890:         */
        !           891:        status_t (*send_dpd) (ike_sa_t *this);
        !           892: 
        !           893:        /**
        !           894:         * Sends a keep alive packet.
        !           895:         *
        !           896:         * To refresh NAT tables in a NAT router between the peers, periodic empty
        !           897:         * UDP packets are sent if no other traffic was sent.
        !           898:         *
        !           899:         * @param scheduled             if this is a scheduled keepalive
        !           900:         */
        !           901:        void (*send_keepalive) (ike_sa_t *this, bool scheduled);
        !           902: 
        !           903:        /**
        !           904:         * Redirect an active IKE_SA.
        !           905:         *
        !           906:         * @param gateway               gateway ID (IP or FQDN) of the target
        !           907:         * @return                              state, including DESTROY_ME, if this IKE_SA MUST be
        !           908:         *                                              destroyed
        !           909:         */
        !           910:        status_t (*redirect)(ike_sa_t *this, identification_t *gateway);
        !           911: 
        !           912:        /**
        !           913:         * Handle a redirect request.
        !           914:         *
        !           915:         * The behavior is different depending on the state of the IKE_SA.
        !           916:         *
        !           917:         * @param gateway               gateway ID (IP or FQDN) of the target
        !           918:         * @return                              FALSE if redirect not possible, TRUE otherwise
        !           919:         */
        !           920:        bool (*handle_redirect)(ike_sa_t *this, identification_t *gateway);
        !           921: 
        !           922:        /**
        !           923:         * Get the address of the gateway that redirected us.
        !           924:         *
        !           925:         * @return                              original gateway address
        !           926:         */
        !           927:        host_t *(*get_redirected_from)(ike_sa_t *this);
        !           928: 
        !           929:        /**
        !           930:         * Get the keying material of this IKE_SA.
        !           931:         *
        !           932:         * @return                              per IKE_SA keymat instance
        !           933:         */
        !           934:        keymat_t* (*get_keymat)(ike_sa_t *this);
        !           935: 
        !           936:        /**
        !           937:         * Associates a child SA to this IKE SA
        !           938:         *
        !           939:         * @param child_sa              child_sa to add
        !           940:         */
        !           941:        void (*add_child_sa) (ike_sa_t *this, child_sa_t *child_sa);
        !           942: 
        !           943:        /**
        !           944:         * Get a CHILD_SA identified by protocol and SPI.
        !           945:         *
        !           946:         * @param protocol              protocol of the SA
        !           947:         * @param spi                   SPI of the CHILD_SA
        !           948:         * @param inbound               TRUE if SPI is inbound, FALSE if outbound
        !           949:         * @return                              child_sa, or NULL if none found
        !           950:         */
        !           951:        child_sa_t* (*get_child_sa) (ike_sa_t *this, protocol_id_t protocol,
        !           952:                                                                 uint32_t spi, bool inbound);
        !           953: 
        !           954:        /**
        !           955:         * Get the number of CHILD_SAs.
        !           956:         *
        !           957:         * @return                              number of CHILD_SAs
        !           958:         */
        !           959:        int (*get_child_count) (ike_sa_t *this);
        !           960: 
        !           961:        /**
        !           962:         * Create an enumerator over all CHILD_SAs.
        !           963:         *
        !           964:         * @return                              enumerator
        !           965:         */
        !           966:        enumerator_t* (*create_child_sa_enumerator) (ike_sa_t *this);
        !           967: 
        !           968:        /**
        !           969:         * Remove the CHILD_SA the given enumerator points to from this IKE_SA.
        !           970:         *
        !           971:         * @param enumerator    enumerator pointing to CHILD_SA
        !           972:         */
        !           973:        void (*remove_child_sa) (ike_sa_t *this, enumerator_t *enumerator);
        !           974: 
        !           975:        /**
        !           976:         * Rekey the CHILD SA with the specified reqid.
        !           977:         *
        !           978:         * Looks for a CHILD SA owned by this IKE_SA, and start the rekeing.
        !           979:         *
        !           980:         * @param protocol              protocol of the SA
        !           981:         * @param spi                   inbound SPI of the CHILD_SA
        !           982:         * @return
        !           983:         *                                              - NOT_FOUND, if IKE_SA has no such CHILD_SA
        !           984:         *                                              - SUCCESS, if rekeying initiated
        !           985:         */
        !           986:        status_t (*rekey_child_sa) (ike_sa_t *this, protocol_id_t protocol, uint32_t spi);
        !           987: 
        !           988:        /**
        !           989:         * Close the CHILD SA with the specified protocol/SPI.
        !           990:         *
        !           991:         * Looks for a CHILD SA owned by this IKE_SA, deletes it and
        !           992:         * notify's the remote peer about the delete. The associated
        !           993:         * states and policies in the kernel get deleted, if they exist.
        !           994:         *
        !           995:         * @param protocol              protocol of the SA
        !           996:         * @param spi                   inbound SPI of the CHILD_SA
        !           997:         * @param expired               TRUE if CHILD_SA is expired
        !           998:         * @return
        !           999:         *                                              - NOT_FOUND, if IKE_SA has no such CHILD_SA
        !          1000:         *                                              - SUCCESS, if delete message sent
        !          1001:         */
        !          1002:        status_t (*delete_child_sa)(ike_sa_t *this, protocol_id_t protocol,
        !          1003:                                                                uint32_t spi, bool expired);
        !          1004: 
        !          1005:        /**
        !          1006:         * Destroy a CHILD SA with the specified protocol/SPI.
        !          1007:         *
        !          1008:         * Looks for a CHILD SA owned by this IKE_SA and destroys it.
        !          1009:         *
        !          1010:         * @param protocol              protocol of the SA
        !          1011:         * @param spi                   inbound SPI of the CHILD_SA
        !          1012:         * @return
        !          1013:         *                                              - NOT_FOUND, if IKE_SA has no such CHILD_SA
        !          1014:         *                                              - SUCCESS
        !          1015:         */
        !          1016:        status_t (*destroy_child_sa) (ike_sa_t *this, protocol_id_t protocol, uint32_t spi);
        !          1017: 
        !          1018:        /**
        !          1019:         * Rekey the IKE_SA.
        !          1020:         *
        !          1021:         * Sets up a new IKE_SA, moves all CHILD_SAs to it and deletes this IKE_SA.
        !          1022:         *
        !          1023:         * @return                              - SUCCESS, if IKE_SA rekeying initiated
        !          1024:         */
        !          1025:        status_t (*rekey) (ike_sa_t *this);
        !          1026: 
        !          1027:        /**
        !          1028:         * Reauthenticate the IKE_SA.
        !          1029:         *
        !          1030:         * Triggers a new IKE_SA that replaces this one. IKEv1 implicitly inherits
        !          1031:         * all Quick Modes, while IKEv2 recreates all active and queued CHILD_SAs
        !          1032:         * in the new IKE_SA.
        !          1033:         *
        !          1034:         * @return                              DESTROY_ME to destroy the IKE_SA
        !          1035:         */
        !          1036:        status_t (*reauth) (ike_sa_t *this);
        !          1037: 
        !          1038:        /**
        !          1039:         * Reestablish the IKE_SA.
        !          1040:         *
        !          1041:         * Reestablish an IKE_SA after it has been closed.
        !          1042:         *
        !          1043:         * @return                              DESTROY_ME to destroy the IKE_SA
        !          1044:         */
        !          1045:        status_t (*reestablish) (ike_sa_t *this);
        !          1046: 
        !          1047:        /**
        !          1048:         * Set the lifetime limit received/to send in a AUTH_LIFETIME notify.
        !          1049:         *
        !          1050:         * If the IKE_SA is already ESTABLISHED, an INFORMATIONAL is sent with
        !          1051:         * an AUTH_LIFETIME notify. The call never fails on unestablished SAs.
        !          1052:         *
        !          1053:         * @param lifetime              lifetime in seconds
        !          1054:         * @return                              DESTROY_ME to destroy the IKE_SA
        !          1055:         */
        !          1056:        status_t (*set_auth_lifetime)(ike_sa_t *this, uint32_t lifetime);
        !          1057: 
        !          1058:        /**
        !          1059:         * Add a virtual IP to use for this IKE_SA and its children.
        !          1060:         *
        !          1061:         * The virtual IP is assigned per IKE_SA, not per CHILD_SA. It has the same
        !          1062:         * lifetime as the IKE_SA.
        !          1063:         *
        !          1064:         * @param local                 TRUE to set local address, FALSE for remote
        !          1065:         * @param ip                    IP to set as virtual IP
        !          1066:         */
        !          1067:        void (*add_virtual_ip) (ike_sa_t *this, bool local, host_t *ip);
        !          1068: 
        !          1069:        /**
        !          1070:         * Clear all virtual IPs stored on this IKE_SA.
        !          1071:         *
        !          1072:         * @param local                 TRUE to clear local addresses, FALSE for remote
        !          1073:         */
        !          1074:        void (*clear_virtual_ips) (ike_sa_t *this, bool local);
        !          1075: 
        !          1076:        /**
        !          1077:         * Get interface ID to use as default for children of this IKE_SA.
        !          1078:         *
        !          1079:         * @param inbound               TRUE for inbound interface ID
        !          1080:         * @return                              interface ID
        !          1081:         */
        !          1082:        uint32_t (*get_if_id)(ike_sa_t *this, bool inbound);
        !          1083: 
        !          1084:        /**
        !          1085:         * Create an enumerator over virtual IPs.
        !          1086:         *
        !          1087:         * @param local                 TRUE to get local virtual IP, FALSE for remote
        !          1088:         * @return                              enumerator over host_t*
        !          1089:         */
        !          1090:        enumerator_t* (*create_virtual_ip_enumerator) (ike_sa_t *this, bool local);
        !          1091: 
        !          1092:        /**
        !          1093:         * Register a configuration attribute to the IKE_SA.
        !          1094:         *
        !          1095:         * If an IRAS sends a configuration attribute it is installed and
        !          1096:         * registered at the IKE_SA. Attributes are inherit()ed and get released
        !          1097:         * when the IKE_SA is closed.
        !          1098:         *
        !          1099:         * Unhandled attributes are passed as well, but with a NULL handler. They
        !          1100:         * do not get released.
        !          1101:         *
        !          1102:         * @param handler               handler installed the attribute, use for release()
        !          1103:         * @param type                  configuration attribute type
        !          1104:         * @param data                  associated attribute data
        !          1105:         */
        !          1106:        void (*add_configuration_attribute)(ike_sa_t *this,
        !          1107:                                                        attribute_handler_t *handler,
        !          1108:                                                        configuration_attribute_type_t type, chunk_t data);
        !          1109: 
        !          1110:        /**
        !          1111:         * Create an enumerator over received configuration attributes.
        !          1112:         *
        !          1113:         * The resulting enumerator is over the configuration_attribute_type_t type,
        !          1114:         * a value chunk_t followed by a bool flag. The boolean flag indicates if
        !          1115:         * the attribute has been handled by an attribute handler.
        !          1116:         *
        !          1117:         * @return                              enumerator over type, value and the "handled" flag.
        !          1118:         */
        !          1119:        enumerator_t* (*create_attribute_enumerator)(ike_sa_t *this);
        !          1120: 
        !          1121:        /**
        !          1122:         * Set local and remote host addresses to be used for IKE.
        !          1123:         *
        !          1124:         * These addresses are communicated via the KMADDRESS field of a MIGRATE
        !          1125:         * message sent via the NETLINK or PF _KEY kernel socket interface.
        !          1126:         *
        !          1127:         * @param local                 local kmaddress
        !          1128:         * @param remote                remote kmaddress
        !          1129:         */
        !          1130:        void (*set_kmaddress) (ike_sa_t *this, host_t *local, host_t *remote);
        !          1131: 
        !          1132:        /**
        !          1133:         * Create enumerator over a task queue of this IKE_SA.
        !          1134:         *
        !          1135:         * @param                               queue type to enumerate
        !          1136:         * @return                              enumerator over task_t
        !          1137:         */
        !          1138:        enumerator_t* (*create_task_enumerator)(ike_sa_t *this, task_queue_t queue);
        !          1139: 
        !          1140:        /**
        !          1141:         * Remove the task the given enumerator points to.
        !          1142:         *
        !          1143:         * @note This should be used with caution, in particular, for tasks in the
        !          1144:         * active and passive queues.
        !          1145:         *
        !          1146:         * @param enumerator    enumerator created with the method above
        !          1147:         */
        !          1148:        void (*remove_task)(ike_sa_t *this, enumerator_t *enumerator);
        !          1149: 
        !          1150:        /**
        !          1151:         * Flush a task queue, cancelling all tasks in it.
        !          1152:         *
        !          1153:         * @param queue                 queue type to flush
        !          1154:         */
        !          1155:        void (*flush_queue)(ike_sa_t *this, task_queue_t queue);
        !          1156: 
        !          1157:        /**
        !          1158:         * Queue a task for initiation to the task manager.
        !          1159:         *
        !          1160:         * @param task                  task to queue
        !          1161:         */
        !          1162:        void (*queue_task)(ike_sa_t *this, task_t *task);
        !          1163: 
        !          1164:        /**
        !          1165:         * Queue a task in the manager, but delay its initiation for at least the
        !          1166:         * given number of seconds.
        !          1167:         *
        !          1168:         * @param task                  task to queue
        !          1169:         * @param delay                 minimum delay in s before initiating the task
        !          1170:         */
        !          1171:        void (*queue_task_delayed)(ike_sa_t *this, task_t *task, uint32_t delay);
        !          1172: 
        !          1173:        /**
        !          1174:         * Adopt child creating tasks from the given IKE_SA.
        !          1175:         *
        !          1176:         * @param other                 other IKE_SA to adopt tasks from
        !          1177:         */
        !          1178:        void (*adopt_child_tasks)(ike_sa_t *this, ike_sa_t *other);
        !          1179: 
        !          1180:        /**
        !          1181:         * Inherit required attributes to new SA before rekeying.
        !          1182:         *
        !          1183:         * Some properties of the SA must be applied before starting IKE_SA
        !          1184:         * rekeying, such as the configuration or support extensions.
        !          1185:         *
        !          1186:         * @param other                 other IKE_SA to inherit from
        !          1187:         */
        !          1188:        void (*inherit_pre)(ike_sa_t *this, ike_sa_t *other);
        !          1189: 
        !          1190:        /**
        !          1191:         * Inherit all attributes of other to this after rekeying.
        !          1192:         *
        !          1193:         * When rekeying is completed, all CHILD_SAs, the virtual IP and all
        !          1194:         * outstanding tasks are moved from other to this.
        !          1195:         *
        !          1196:         * @param other                 other IKE SA to inherit from
        !          1197:         */
        !          1198:        void (*inherit_post) (ike_sa_t *this, ike_sa_t *other);
        !          1199: 
        !          1200:        /**
        !          1201:         * Reset the IKE_SA, usable when initiating fails.
        !          1202:         *
        !          1203:         * @param new_spi               TRUE to allocate a new initiator SPI
        !          1204:         */
        !          1205:        void (*reset) (ike_sa_t *this, bool new_spi);
        !          1206: 
        !          1207:        /**
        !          1208:         * Destroys a ike_sa_t object.
        !          1209:         */
        !          1210:        void (*destroy) (ike_sa_t *this);
        !          1211: };
        !          1212: 
        !          1213: /**
        !          1214:  * Creates an ike_sa_t object with a specific ID and IKE version.
        !          1215:  *
        !          1216:  * @param ike_sa_id            ike_sa_id_t to associate with new IKE_SA/ISAKMP_SA
        !          1217:  * @param initiator            TRUE to create this IKE_SA as initiator
        !          1218:  * @param version              IKE version of this SA
        !          1219:  * @return                             ike_sa_t object
        !          1220:  */
        !          1221: ike_sa_t *ike_sa_create(ike_sa_id_t *ike_sa_id, bool initiator,
        !          1222:                                                ike_version_t version);
        !          1223: 
        !          1224: #endif /** IKE_SA_H_ @}*/

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