Annotation of embedaddon/strongswan/src/libcharon/sa/task_manager.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2013-2018 Tobias Brunner
                      3:  * Copyright (C) 2006 Martin Willi
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: /**
                     18:  * @defgroup task_manager task_manager
                     19:  * @{ @ingroup sa
                     20:  */
                     21: 
                     22: #ifndef TASK_MANAGER_H_
                     23: #define TASK_MANAGER_H_
                     24: 
                     25: typedef struct task_manager_t task_manager_t;
                     26: typedef enum task_queue_t task_queue_t;
                     27: 
                     28: #include <limits.h>
                     29: 
                     30: #include <library.h>
                     31: #include <encoding/message.h>
                     32: #include <sa/ike_sa.h>
                     33: #include <sa/task.h>
                     34: 
                     35: /**
                     36:  * First retransmit timeout in seconds.
                     37:  */
                     38: #define RETRANSMIT_TIMEOUT 4.0
                     39: 
                     40: /**
                     41:  * Base which is raised to the power of the retransmission try.
                     42:  */
                     43: #define RETRANSMIT_BASE 1.8
                     44: 
                     45: /**
                     46:  * Number of retransmits done before giving up.
                     47:  */
                     48: #define RETRANSMIT_TRIES 5
                     49: 
                     50: /**
                     51:  * Maximum jitter in percent.
                     52:  */
                     53: #define RETRANSMIT_JITTER_MAX 20
                     54: 
                     55: /**
                     56:  * Interval for mobike routability checks in ms.
                     57:  */
                     58: #define ROUTABILITY_CHECK_INTERVAL 2500
                     59: 
                     60: /**
                     61:  * Number of routability checks before giving up
                     62:  */
                     63: #define ROUTABILITY_CHECK_TRIES 10
                     64: 
                     65: /**
                     66:  * Type of task queues the task manager uses to handle tasks
                     67:  */
                     68: enum task_queue_t {
                     69:        /** tasks currently active, initiated by us */
                     70:        TASK_QUEUE_ACTIVE,
                     71:        /** passive tasks initiated by the remote peer */
                     72:        TASK_QUEUE_PASSIVE,
                     73:        /** tasks queued for initiated, but not yet activated */
                     74:        TASK_QUEUE_QUEUED,
                     75: };
                     76: 
                     77: /**
                     78:  * The task manager, juggles task and handles message exchanges.
                     79:  *
                     80:  * On incoming requests, the task manager creates new tasks on demand and
                     81:  * juggles the request through all available tasks. Each task inspects the
                     82:  * request and adds payloads as necessary to the response.
                     83:  * On outgoing requests, the task manager delivers the request through the tasks
                     84:  * to build it, the response gets processed by each task to complete.
                     85:  * The task manager has an internal Queue to store task which should get
                     86:  * completed.
                     87:  * For the initial IKE_SA setup, several tasks are queued: One for the
                     88:  * unauthenticated IKE_SA setup, one for authentication, one for CHILD_SA setup
                     89:  * and maybe one for virtual IP assignment.
                     90:  * The task manager is also responsible for retransmission. It uses a backoff
                     91:  * algorithm. The timeout is calculated using
                     92:  * RETRANSMIT_TIMEOUT * (RETRANSMIT_BASE ** try).
                     93:  * When try reaches RETRANSMIT_TRIES, retransmission is given up.
                     94:  *
                     95:  * Using an initial TIMEOUT of 4s, a BASE of 1.8, and 5 TRIES gives us:
                     96:  * @verbatim
                     97:                    | relative | absolute
                     98:    ---------------------------------------------------------
                     99:    4s * (1.8 ** 0) =    4s         4s
                    100:    4s * (1.8 ** 1) =    7s        11s
                    101:    4s * (1.8 ** 2) =   13s        24s
                    102:    4s * (1.8 ** 3) =   23s        47s
                    103:    4s * (1.8 ** 4) =   42s        89s
                    104:    4s * (1.8 ** 5) =   76s       165s
                    105: 
                    106:    @endverbatim
                    107:  * The peer is considered dead after 2min 45s when no reply comes in.
                    108:  */
                    109: struct task_manager_t {
                    110: 
                    111:        /**
                    112:         * Process an incoming message.
                    113:         *
                    114:         * @param message               message to add payloads to
                    115:         * @return
                    116:         *                                              - DESTROY_ME if IKE_SA must be closed
                    117:         *                                              - SUCCESS otherwise
                    118:         */
                    119:        status_t (*process_message) (task_manager_t *this, message_t *message);
                    120: 
                    121:        /**
                    122:         * Initiate an exchange with the currently queued tasks.
                    123:         */
                    124:        status_t (*initiate) (task_manager_t *this);
                    125: 
                    126:        /**
                    127:         * Queue a task in the manager.
                    128:         *
                    129:         * @param task                  task to queue
                    130:         */
                    131:        void (*queue_task)(task_manager_t *this, task_t *task);
                    132: 
                    133:        /**
                    134:         * Queue a task in the manager, but delay its initiation for at least the
                    135:         * given number of seconds.
                    136:         *
                    137:         * @param task                  task to queue
                    138:         * @param delay                 minimum delay in s before initiating the task
                    139:         */
                    140:        void (*queue_task_delayed)(task_manager_t *this, task_t *task,
                    141:                                                           uint32_t delay);
                    142: 
                    143:        /**
                    144:         * Queue IKE_SA establishing tasks.
                    145:         */
                    146:        void (*queue_ike)(task_manager_t *this);
                    147: 
                    148:        /**
                    149:         * Queue IKE_SA rekey tasks.
                    150:         */
                    151:        void (*queue_ike_rekey)(task_manager_t *this);
                    152: 
                    153:        /**
                    154:         * Queue IKE_SA reauth tasks.
                    155:         */
                    156:        void (*queue_ike_reauth)(task_manager_t *this);
                    157: 
                    158:        /**
                    159:         * Queue MOBIKE task
                    160:         *
                    161:         * @param roam                  TRUE to switch to new address
                    162:         * @param address               TRUE to include address list update
                    163:         */
                    164:        void (*queue_mobike)(task_manager_t *this, bool roam, bool address);
                    165: 
                    166:        /**
                    167:         * Queue IKE_SA delete tasks.
                    168:         */
                    169:        void (*queue_ike_delete)(task_manager_t *this);
                    170: 
                    171:        /**
                    172:         * Queue CHILD_SA establishing tasks.
                    173:         *
                    174:         * @param cfg                   CHILD_SA config to establish
                    175:         * @param reqid                 reqid to use for CHILD_SA
                    176:         * @param tsi                   initiator traffic selector, if packet-triggered
                    177:         * @param tsr                   responder traffic selector, if packet-triggered
                    178:         */
                    179:        void (*queue_child)(task_manager_t *this, child_cfg_t *cfg, uint32_t reqid,
                    180:                                                traffic_selector_t *tsi, traffic_selector_t *tsr);
                    181: 
                    182:        /**
                    183:         * Queue CHILD_SA rekeying tasks.
                    184:         *
                    185:         * @param protocol              CHILD_SA protocol, AH|ESP
                    186:         * @param spi                   CHILD_SA SPI to rekey
                    187:         */
                    188:        void (*queue_child_rekey)(task_manager_t *this, protocol_id_t protocol,
                    189:                                                          uint32_t spi);
                    190: 
                    191:        /**
                    192:         * Queue CHILD_SA delete tasks.
                    193:         *
                    194:         * @param protocol              CHILD_SA protocol, AH|ESP
                    195:         * @param spi                   CHILD_SA SPI to rekey
                    196:         * @param expired               TRUE if SA already expired
                    197:         */
                    198:        void (*queue_child_delete)(task_manager_t *this, protocol_id_t protocol,
                    199:                                                           uint32_t spi, bool expired);
                    200: 
                    201:        /**
                    202:         * Queue liveness checking tasks.
                    203:         */
                    204:        void (*queue_dpd)(task_manager_t *this);
                    205: 
                    206:        /**
                    207:         * Retransmit a request if it hasn't been acknowledged yet.
                    208:         *
                    209:         * A return value of INVALID_STATE means that the message was already
                    210:         * acknowledged and has not to be retransmitted. A return value of SUCCESS
                    211:         * means retransmission was required and the message has been resent.
                    212:         *
                    213:         * @param message_id    ID of the message to retransmit
                    214:         * @return
                    215:         *                                              - INVALID_STATE if retransmission not required
                    216:         *                                              - SUCCESS if retransmission sent
                    217:         */
                    218:        status_t (*retransmit) (task_manager_t *this, uint32_t message_id);
                    219: 
                    220:        /**
                    221:         * Migrate all queued tasks from other to this.
                    222:         *
                    223:         * To rekey or reestablish an IKE_SA completely, all queued or active
                    224:         * tasks should get migrated to the new IKE_SA.
                    225:         *
                    226:         * @param other                 manager which gives away its tasks
                    227:         */
                    228:        void (*adopt_tasks) (task_manager_t *this, task_manager_t *other);
                    229: 
                    230:        /**
                    231:         * Increment a message ID counter, in- or outbound.
                    232:         *
                    233:         * If a message is processed outside of the manager, this call increments
                    234:         * the message ID counters of the task manager.
                    235:         *
                    236:         * @param initiate              TRUE to increment the initiating ID
                    237:         */
                    238:        void (*incr_mid)(task_manager_t *this, bool initiate);
                    239: 
                    240:        /**
                    241:         * Get the current message ID counter, in- or outbound.
                    242:         *
                    243:         * @param initiate              TRUE to get the initiating ID
                    244:         * @return                              current message ID
                    245:         */
                    246:        uint32_t (*get_mid)(task_manager_t *this, bool initiate);
                    247: 
                    248:        /**
                    249:         * Reset message ID counters of the task manager.
                    250:         *
                    251:         * The IKEv2 protocol requires to restart exchanges with message IDs
                    252:         * reset to zero (INVALID_KE_PAYLOAD, COOKIES, ...). The reset() method
                    253:         * resets the message IDs and resets all active tasks using the migrate()
                    254:         * method.
                    255:         * Use a value of UINT_MAX to keep the current message ID.
                    256:         * For IKEv1, the arguments do not set the message ID, but the DPD sequence
                    257:         * number counters.
                    258:         *
                    259:         * @param initiate              message ID / DPD seq to initiate exchanges (send)
                    260:         * @param respond               message ID / DPD seq to respond to exchanges (expect)
                    261:         */
                    262:        void (*reset)(task_manager_t *this, uint32_t initiate, uint32_t respond);
                    263: 
                    264:        /**
                    265:         * Check if we are currently waiting for a reply.
                    266:         *
                    267:         * @return                              TRUE if we are waiting, FALSE otherwise
                    268:         */
                    269:        bool (*busy) (task_manager_t *this);
                    270: 
                    271:        /**
                    272:         * Create an enumerator over tasks in a specific queue.
                    273:         *
                    274:         * @param queue                 queue to create an enumerator over
                    275:         * @return                              enumerator over task_t
                    276:         */
                    277:        enumerator_t* (*create_task_enumerator)(task_manager_t *this,
                    278:                                                                                        task_queue_t queue);
                    279: 
                    280:        /**
                    281:         * Remove the task the given enumerator points to.
                    282:         *
                    283:         * @note This should be used with caution, in particular, for tasks in the
                    284:         * active and passive queues.
                    285:         *
                    286:         * @param enumerator    enumerator created with the method above
                    287:         */
                    288:        void (*remove_task)(task_manager_t *this, enumerator_t *enumerator);
                    289: 
                    290:        /**
                    291:         * Flush all tasks, regardless of the queue.
                    292:         */
                    293:        void (*flush)(task_manager_t *this);
                    294: 
                    295:        /**
                    296:         * Flush a queue, cancelling all tasks.
                    297:         *
                    298:         * @param queue                 queue to flush
                    299:         */
                    300:        void (*flush_queue)(task_manager_t *this, task_queue_t queue);
                    301: 
                    302:        /**
                    303:         * Destroy the task_manager_t.
                    304:         */
                    305:        void (*destroy) (task_manager_t *this);
                    306: };
                    307: 
                    308: /**
                    309:  * Calculate total timeout of the retransmission mechanism.
                    310:  *
                    311:  * This is affected by modifications of retransmit_base, retransmit_timeout,
                    312:  * retransmit_limit or retransmit_tries. The resulting value can then be used
                    313:  * e.g. in kernel plugins to set the system's acquire timeout properly.
                    314:  *
                    315:  * @return                                     calculated total retransmission timeout in seconds
                    316:  */
                    317: u_int task_manager_total_retransmit_timeout();
                    318: 
                    319: /**
                    320:  * Create a task manager instance for the correct IKE version.
                    321:  *
                    322:  * @param ike_sa                       IKE_SA to create a task manager for
                    323:  * @return                                     task manager implementation for IKE version
                    324:  */
                    325: task_manager_t *task_manager_create(ike_sa_t *ike_sa);
                    326: 
                    327: #endif /** TASK_MANAGER_H_ @}*/

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