Annotation of embedaddon/strongswan/src/libcharon/sa/ikev1/task_manager_v1.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * Copyright (C) 2007-2019 Tobias Brunner
                      3:  * Copyright (C) 2007-2011 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: #include "task_manager_v1.h"
                     18: 
                     19: #include <math.h>
                     20: 
                     21: #include <daemon.h>
                     22: #include <sa/ikev1/tasks/main_mode.h>
                     23: #include <sa/ikev1/tasks/aggressive_mode.h>
                     24: #include <sa/ikev1/tasks/quick_mode.h>
                     25: #include <sa/ikev1/tasks/quick_delete.h>
                     26: #include <sa/ikev1/tasks/xauth.h>
                     27: #include <sa/ikev1/tasks/mode_config.h>
                     28: #include <sa/ikev1/tasks/informational.h>
                     29: #include <sa/ikev1/tasks/isakmp_natd.h>
                     30: #include <sa/ikev1/tasks/isakmp_vendor.h>
                     31: #include <sa/ikev1/tasks/isakmp_cert_pre.h>
                     32: #include <sa/ikev1/tasks/isakmp_cert_post.h>
                     33: #include <sa/ikev1/tasks/isakmp_delete.h>
                     34: #include <sa/ikev1/tasks/isakmp_dpd.h>
                     35: 
                     36: #include <processing/jobs/retransmit_job.h>
                     37: #include <processing/jobs/delete_ike_sa_job.h>
                     38: #include <processing/jobs/dpd_timeout_job.h>
                     39: #include <processing/jobs/process_message_job.h>
                     40: 
                     41: #include <collections/array.h>
                     42: 
                     43: /**
                     44:  * Number of old messages hashes we keep for retransmission.
                     45:  *
                     46:  * In Main Mode, we must ignore messages from a previous message pair if
                     47:  * we already continued to the next. Otherwise a late retransmission
                     48:  * could be considered as a reply to the newer request.
                     49:  */
                     50: #define MAX_OLD_HASHES 2
                     51: 
                     52: /**
                     53:  * First sequence number of responding packets.
                     54:  *
                     55:  * To distinguish retransmission jobs for initiating and responding packets,
                     56:  * we split up the sequence counter and use the upper half for responding.
                     57:  */
                     58: #define RESPONDING_SEQ INT_MAX
                     59: 
                     60: typedef struct exchange_t exchange_t;
                     61: 
                     62: /**
                     63:  * An exchange in the air, used do detect and handle retransmission
                     64:  */
                     65: struct exchange_t {
                     66: 
                     67:        /**
                     68:         * Message ID used for this transaction
                     69:         */
                     70:        uint32_t mid;
                     71: 
                     72:        /**
                     73:         * generated packet for retransmission
                     74:         */
                     75:        packet_t *packet;
                     76: };
                     77: 
                     78: typedef struct private_task_manager_t private_task_manager_t;
                     79: 
                     80: /**
                     81:  * private data of the task manager
                     82:  */
                     83: struct private_task_manager_t {
                     84: 
                     85:        /**
                     86:         * public functions
                     87:         */
                     88:        task_manager_v1_t public;
                     89: 
                     90:        /**
                     91:         * associated IKE_SA we are serving
                     92:         */
                     93:        ike_sa_t *ike_sa;
                     94: 
                     95:        /**
                     96:         * RNG to create message IDs
                     97:         */
                     98:        rng_t *rng;
                     99: 
                    100:        /**
                    101:         * Exchange we are currently handling as responder
                    102:         */
                    103:        struct {
                    104:                /**
                    105:                 * Message ID of the last response
                    106:                 */
                    107:                uint32_t mid;
                    108: 
                    109:                /**
                    110:                 * Hash of a previously received message
                    111:                 */
                    112:                uint32_t hash;
                    113: 
                    114:                /**
                    115:                 * packet(s) for retransmission
                    116:                 */
                    117:                array_t *packets;
                    118: 
                    119:                /**
                    120:                 * Sequence number of the last sent message
                    121:                 */
                    122:                uint32_t seqnr;
                    123: 
                    124:                /**
                    125:                 * how many times we have retransmitted so far
                    126:                 */
                    127:                u_int retransmitted;
                    128: 
                    129:        } responding;
                    130: 
                    131:        /**
                    132:         * Exchange we are currently handling as initiator
                    133:         */
                    134:        struct {
                    135:                /**
                    136:                 * Message ID of the exchange
                    137:                 */
                    138:                uint32_t mid;
                    139: 
                    140:                /**
                    141:                 * Hashes of old responses we can ignore
                    142:                 */
                    143:                uint32_t old_hashes[MAX_OLD_HASHES];
                    144: 
                    145:                /**
                    146:                 * Position in old hash array
                    147:                 */
                    148:                int old_hash_pos;
                    149: 
                    150:                /**
                    151:                 * Sequence number of the last sent message
                    152:                 */
                    153:                uint32_t seqnr;
                    154: 
                    155:                /**
                    156:                 * how many times we have retransmitted so far
                    157:                 */
                    158:                u_int retransmitted;
                    159: 
                    160:                /**
                    161:                 * packet(s) for retransmission
                    162:                 */
                    163:                array_t *packets;
                    164: 
                    165:                /**
                    166:                 * type of the initiated exchange
                    167:                 */
                    168:                exchange_type_t type;
                    169: 
                    170:        } initiating;
                    171: 
                    172:        /**
                    173:         * Message we are currently defragmenting, if any (only one at a time)
                    174:         */
                    175:        message_t *defrag;
                    176: 
                    177:        /**
                    178:         * List of queued tasks not yet in action
                    179:         */
                    180:        linked_list_t *queued_tasks;
                    181: 
                    182:        /**
                    183:         * List of active tasks, initiated by ourselves
                    184:         */
                    185:        linked_list_t *active_tasks;
                    186: 
                    187:        /**
                    188:         * List of tasks initiated by peer
                    189:         */
                    190:        linked_list_t *passive_tasks;
                    191: 
                    192:        /**
                    193:         * Queued messages not yet ready to process
                    194:         */
                    195:        message_t *queued;
                    196: 
                    197:        /**
                    198:         * Number of times we retransmit messages before giving up
                    199:         */
                    200:        u_int retransmit_tries;
                    201: 
                    202:        /**
1.1.1.2 ! misho     203:         * Maximum number of tries possible with current retransmission settings
        !           204:         * before overflowing the range of uint32_t, which we use for the timeout.
        !           205:         * Note that UINT32_MAX milliseconds equal nearly 50 days, so that doesn't
        !           206:         * make much sense without retransmit_limit anyway.
        !           207:         */
        !           208:        u_int retransmit_tries_max;
        !           209: 
        !           210:        /**
1.1       misho     211:         * Retransmission timeout
                    212:         */
                    213:        double retransmit_timeout;
                    214: 
                    215:        /**
                    216:         * Base to calculate retransmission timeout
                    217:         */
                    218:        double retransmit_base;
                    219: 
                    220:        /**
                    221:         * Jitter to apply to calculated retransmit timeout (in percent)
                    222:         */
                    223:        u_int retransmit_jitter;
                    224: 
                    225:        /**
                    226:         * Limit retransmit timeout to this value
                    227:         */
                    228:        uint32_t retransmit_limit;
                    229: 
                    230:        /**
                    231:         * Sequence number for sending DPD requests
                    232:         */
                    233:        uint32_t dpd_send;
                    234: 
                    235:        /**
                    236:         * Sequence number for received DPD requests
                    237:         */
                    238:        uint32_t dpd_recv;
                    239: };
                    240: 
                    241: /**
                    242:  * Reset retransmission packet list
                    243:  */
                    244: static void clear_packets(array_t *array)
                    245: {
                    246:        packet_t *packet;
                    247: 
                    248:        while (array_remove(array, ARRAY_TAIL, &packet))
                    249:        {
                    250:                packet->destroy(packet);
                    251:        }
                    252: }
                    253: 
                    254: METHOD(task_manager_t, flush_queue, void,
                    255:        private_task_manager_t *this, task_queue_t queue)
                    256: {
                    257:        linked_list_t *list;
                    258:        task_t *task;
                    259: 
                    260:        if (this->queued)
                    261:        {
                    262:                this->queued->destroy(this->queued);
                    263:                this->queued = NULL;
                    264:        }
                    265:        switch (queue)
                    266:        {
                    267:                case TASK_QUEUE_ACTIVE:
                    268:                        list = this->active_tasks;
                    269:                        /* cancel pending retransmits */
                    270:                        this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
                    271:                        clear_packets(this->initiating.packets);
                    272:                        break;
                    273:                case TASK_QUEUE_PASSIVE:
                    274:                        list = this->passive_tasks;
                    275:                        break;
                    276:                case TASK_QUEUE_QUEUED:
                    277:                        list = this->queued_tasks;
                    278:                        break;
                    279:                default:
                    280:                        return;
                    281:        }
                    282:        while (list->remove_last(list, (void**)&task) == SUCCESS)
                    283:        {
                    284:                task->destroy(task);
                    285:        }
                    286: }
                    287: 
                    288: METHOD(task_manager_t, flush, void,
                    289:        private_task_manager_t *this)
                    290: {
                    291:        flush_queue(this, TASK_QUEUE_QUEUED);
                    292:        flush_queue(this, TASK_QUEUE_PASSIVE);
                    293:        flush_queue(this, TASK_QUEUE_ACTIVE);
                    294: }
                    295: 
                    296: /**
                    297:  * move a task of a specific type from the queue to the active list
                    298:  */
                    299: static bool activate_task(private_task_manager_t *this, task_type_t type)
                    300: {
                    301:        enumerator_t *enumerator;
                    302:        task_t *task;
                    303:        bool found = FALSE;
                    304: 
                    305:        enumerator = this->queued_tasks->create_enumerator(this->queued_tasks);
                    306:        while (enumerator->enumerate(enumerator, (void**)&task))
                    307:        {
                    308:                if (task->get_type(task) == type)
                    309:                {
                    310:                        DBG2(DBG_IKE, "  activating %N task", task_type_names, type);
                    311:                        this->queued_tasks->remove_at(this->queued_tasks, enumerator);
                    312:                        this->active_tasks->insert_last(this->active_tasks, task);
                    313:                        found = TRUE;
                    314:                        break;
                    315:                }
                    316:        }
                    317:        enumerator->destroy(enumerator);
                    318:        return found;
                    319: }
                    320: 
                    321: /**
                    322:  * Send packets in the given array (they get cloned)
                    323:  */
                    324: static void send_packets(private_task_manager_t *this, array_t *packets)
                    325: {
                    326:        enumerator_t *enumerator;
                    327:        packet_t *packet;
                    328: 
                    329:        enumerator = array_create_enumerator(packets);
                    330:        while (enumerator->enumerate(enumerator, &packet))
                    331:        {
                    332:                charon->sender->send(charon->sender, packet->clone(packet));
                    333:        }
                    334:        enumerator->destroy(enumerator);
                    335: }
                    336: 
                    337: /**
                    338:  * Generates the given message and stores packet(s) in the given array
                    339:  */
                    340: static bool generate_message(private_task_manager_t *this, message_t *message,
                    341:                                                         array_t **packets)
                    342: {
                    343:        enumerator_t *fragments;
                    344:        packet_t *fragment;
                    345: 
                    346:        if (this->ike_sa->generate_message_fragmented(this->ike_sa, message,
                    347:                                                                                                  &fragments) != SUCCESS)
                    348:        {
                    349:                return FALSE;
                    350:        }
                    351:        while (fragments->enumerate(fragments, &fragment))
                    352:        {
                    353:                array_insert_create(packets, ARRAY_TAIL, fragment);
                    354:        }
                    355:        fragments->destroy(fragments);
                    356:        return TRUE;
                    357: }
                    358: 
                    359: /**
                    360:  * Retransmit a packet (or its fragments)
                    361:  */
                    362: static status_t retransmit_packet(private_task_manager_t *this, uint32_t seqnr,
                    363:                                                        u_int mid, u_int retransmitted, array_t *packets)
                    364: {
                    365:        packet_t *packet;
1.1.1.2 ! misho     366:        uint32_t t = UINT32_MAX, max_jitter;
1.1       misho     367: 
                    368:        array_get(packets, 0, &packet);
                    369:        if (retransmitted > this->retransmit_tries)
                    370:        {
                    371:                DBG1(DBG_IKE, "giving up after %u retransmits", retransmitted - 1);
                    372:                charon->bus->alert(charon->bus, ALERT_RETRANSMIT_SEND_TIMEOUT, packet);
                    373:                return DESTROY_ME;
                    374:        }
1.1.1.2 ! misho     375:        if (!this->retransmit_tries_max ||
        !           376:                retransmitted <= this->retransmit_tries_max)
        !           377:        {
        !           378:                t = (uint32_t)(this->retransmit_timeout * 1000.0 *
        !           379:                                                pow(this->retransmit_base, retransmitted));
        !           380:        }
1.1       misho     381:        if (this->retransmit_limit)
                    382:        {
                    383:                t = min(t, this->retransmit_limit);
                    384:        }
                    385:        if (this->retransmit_jitter)
                    386:        {
                    387:                max_jitter = (t / 100.0) * this->retransmit_jitter;
                    388:                t -= max_jitter * (random() / (RAND_MAX + 1.0));
                    389:        }
                    390:        if (retransmitted)
                    391:        {
                    392:                DBG1(DBG_IKE, "sending retransmit %u of %s message ID %u, seq %u",
                    393:                         retransmitted, seqnr < RESPONDING_SEQ ? "request" : "response",
                    394:                         mid, seqnr < RESPONDING_SEQ ? seqnr : seqnr - RESPONDING_SEQ);
                    395:                charon->bus->alert(charon->bus, ALERT_RETRANSMIT_SEND, packet,
                    396:                                                   retransmitted);
                    397:        }
                    398:        send_packets(this, packets);
                    399:        lib->scheduler->schedule_job_ms(lib->scheduler, (job_t*)
                    400:                        retransmit_job_create(seqnr, this->ike_sa->get_id(this->ike_sa)), t);
                    401:        return SUCCESS;
                    402: }
                    403: 
                    404: METHOD(task_manager_t, retransmit, status_t,
                    405:        private_task_manager_t *this, uint32_t seqnr)
                    406: {
1.1.1.2 ! misho     407:        status_t status = INVALID_STATE;
1.1       misho     408: 
                    409:        if (seqnr == this->initiating.seqnr &&
                    410:                array_count(this->initiating.packets))
                    411:        {
                    412:                status = retransmit_packet(this, seqnr, this->initiating.mid,
                    413:                                        this->initiating.retransmitted, this->initiating.packets);
                    414:                if (status == SUCCESS)
                    415:                {
                    416:                        this->initiating.retransmitted++;
                    417:                }
                    418:        }
                    419:        if (seqnr == this->responding.seqnr &&
                    420:                array_count(this->responding.packets))
                    421:        {
                    422:                status = retransmit_packet(this, seqnr, this->responding.mid,
                    423:                                        this->responding.retransmitted, this->responding.packets);
                    424:                if (status == SUCCESS)
                    425:                {
                    426:                        this->responding.retransmitted++;
                    427:                }
                    428:        }
                    429:        return status;
                    430: }
                    431: 
                    432: /**
                    433:  * Check if we have to wait for a mode config before starting a quick mode
                    434:  */
                    435: static bool mode_config_expected(private_task_manager_t *this)
                    436: {
                    437:        enumerator_t *enumerator;
                    438:        peer_cfg_t *peer_cfg;
                    439:        char *pool;
                    440:        bool local;
                    441:        host_t *host;
                    442: 
                    443:        peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
                    444:        if (peer_cfg)
                    445:        {
                    446:                if (peer_cfg->use_pull_mode(peer_cfg))
                    447:                {
                    448:                        enumerator = peer_cfg->create_pool_enumerator(peer_cfg);
                    449:                        if (!enumerator->enumerate(enumerator, &pool))
                    450:                        {       /* no pool configured */
                    451:                                enumerator->destroy(enumerator);
                    452:                                return FALSE;
                    453:                        }
                    454:                        enumerator->destroy(enumerator);
                    455: 
                    456:                        local = FALSE;
                    457:                }
                    458:                else
                    459:                {
                    460:                        enumerator = peer_cfg->create_virtual_ip_enumerator(peer_cfg);
                    461:                        if (!enumerator->enumerate(enumerator, &host))
                    462:                        {       /* not requesting a vip */
                    463:                                enumerator->destroy(enumerator);
                    464:                                return FALSE;
                    465:                        }
                    466:                        enumerator->destroy(enumerator);
                    467: 
                    468:                        local = TRUE;
                    469:                }
                    470:                enumerator = this->ike_sa->create_virtual_ip_enumerator(this->ike_sa,
                    471:                                                                                                                                local);
                    472:                if (!enumerator->enumerate(enumerator, &host))
                    473:                {       /* expecting a VIP exchange, but no VIP assigned yet */
                    474:                        enumerator->destroy(enumerator);
                    475:                        return TRUE;
                    476:                }
                    477:                enumerator->destroy(enumerator);
                    478:        }
                    479:        return FALSE;
                    480: }
                    481: 
                    482: METHOD(task_manager_t, initiate, status_t,
                    483:        private_task_manager_t *this)
                    484: {
                    485:        enumerator_t *enumerator;
                    486:        task_t *task;
                    487:        message_t *message;
                    488:        host_t *me, *other;
                    489:        exchange_type_t exchange = EXCHANGE_TYPE_UNDEFINED;
                    490:        bool new_mid = FALSE, expect_response = FALSE, cancelled = FALSE, keep = FALSE;
                    491: 
                    492:        if (this->initiating.type != EXCHANGE_TYPE_UNDEFINED &&
                    493:                this->initiating.type != INFORMATIONAL_V1)
                    494:        {
                    495:                DBG2(DBG_IKE, "delaying task initiation, %N exchange in progress",
                    496:                                exchange_type_names, this->initiating.type);
                    497:                /* do not initiate if we already have a message in the air */
                    498:                return SUCCESS;
                    499:        }
                    500: 
                    501:        if (this->active_tasks->get_count(this->active_tasks) == 0)
                    502:        {
                    503:                DBG2(DBG_IKE, "activating new tasks");
                    504:                switch (this->ike_sa->get_state(this->ike_sa))
                    505:                {
                    506:                        case IKE_CREATED:
                    507:                                activate_task(this, TASK_ISAKMP_VENDOR);
                    508:                                activate_task(this, TASK_ISAKMP_CERT_PRE);
                    509:                                if (activate_task(this, TASK_MAIN_MODE))
                    510:                                {
                    511:                                        exchange = ID_PROT;
                    512:                                }
                    513:                                else if (activate_task(this, TASK_AGGRESSIVE_MODE))
                    514:                                {
                    515:                                        exchange = AGGRESSIVE;
                    516:                                }
                    517:                                activate_task(this, TASK_ISAKMP_CERT_POST);
                    518:                                activate_task(this, TASK_ISAKMP_NATD);
                    519:                                break;
                    520:                        case IKE_CONNECTING:
                    521:                                if (activate_task(this, TASK_ISAKMP_DELETE))
                    522:                                {
                    523:                                        exchange = INFORMATIONAL_V1;
                    524:                                        new_mid = TRUE;
                    525:                                        break;
                    526:                                }
                    527:                                if (activate_task(this, TASK_XAUTH))
                    528:                                {
                    529:                                        exchange = TRANSACTION;
                    530:                                        new_mid = TRUE;
                    531:                                        break;
                    532:                                }
                    533:                                if (activate_task(this, TASK_INFORMATIONAL))
                    534:                                {
                    535:                                        exchange = INFORMATIONAL_V1;
                    536:                                        new_mid = TRUE;
                    537:                                        break;
                    538:                                }
                    539:                                break;
                    540:                        case IKE_ESTABLISHED:
                    541:                                if (activate_task(this, TASK_MODE_CONFIG))
                    542:                                {
                    543:                                        exchange = TRANSACTION;
                    544:                                        new_mid = TRUE;
                    545:                                        break;
                    546:                                }
                    547:                                if (activate_task(this, TASK_QUICK_DELETE))
                    548:                                {
                    549:                                        exchange = INFORMATIONAL_V1;
                    550:                                        new_mid = TRUE;
                    551:                                        break;
                    552:                                }
                    553:                                if (activate_task(this, TASK_ISAKMP_DELETE))
                    554:                                {
                    555:                                        exchange = INFORMATIONAL_V1;
                    556:                                        new_mid = TRUE;
                    557:                                        break;
                    558:                                }
                    559:                                if (activate_task(this, TASK_ISAKMP_DPD))
                    560:                                {
                    561:                                        exchange = INFORMATIONAL_V1;
                    562:                                        new_mid = TRUE;
                    563:                                        break;
                    564:                                }
                    565:                                if (!mode_config_expected(this) &&
                    566:                                        activate_task(this, TASK_QUICK_MODE))
                    567:                                {
                    568:                                        exchange = QUICK_MODE;
                    569:                                        new_mid = TRUE;
                    570:                                        break;
                    571:                                }
                    572:                                if (activate_task(this, TASK_INFORMATIONAL))
                    573:                                {
                    574:                                        exchange = INFORMATIONAL_V1;
                    575:                                        new_mid = TRUE;
                    576:                                        break;
                    577:                                }
                    578:                                break;
                    579:                        case IKE_REKEYING:
                    580:                                if (activate_task(this, TASK_ISAKMP_DELETE))
                    581:                                {
                    582:                                        exchange = INFORMATIONAL_V1;
                    583:                                        new_mid = TRUE;
                    584:                                        break;
                    585:                                }
                    586:                                if (activate_task(this, TASK_ISAKMP_DPD))
                    587:                                {
                    588:                                        exchange = INFORMATIONAL_V1;
                    589:                                        new_mid = TRUE;
                    590:                                        break;
                    591:                                }
                    592:                                break;
                    593:                        default:
                    594:                                break;
                    595:                }
                    596:        }
                    597:        else
                    598:        {
                    599:                DBG2(DBG_IKE, "reinitiating already active tasks");
                    600:                enumerator = this->active_tasks->create_enumerator(this->active_tasks);
                    601:                while (enumerator->enumerate(enumerator, (void**)&task))
                    602:                {
                    603:                        DBG2(DBG_IKE, "  %N task", task_type_names, task->get_type(task));
                    604:                        switch (task->get_type(task))
                    605:                        {
                    606:                                case TASK_MAIN_MODE:
                    607:                                        exchange = ID_PROT;
                    608:                                        break;
                    609:                                case TASK_AGGRESSIVE_MODE:
                    610:                                        exchange = AGGRESSIVE;
                    611:                                        break;
                    612:                                case TASK_QUICK_MODE:
                    613:                                        exchange = QUICK_MODE;
                    614:                                        break;
                    615:                                case TASK_XAUTH:
                    616:                                        exchange = TRANSACTION;
                    617:                                        new_mid = TRUE;
                    618:                                        break;
                    619:                                default:
                    620:                                        continue;
                    621:                        }
                    622:                        break;
                    623:                }
                    624:                enumerator->destroy(enumerator);
                    625:        }
                    626: 
                    627:        if (exchange == EXCHANGE_TYPE_UNDEFINED)
                    628:        {
                    629:                DBG2(DBG_IKE, "nothing to initiate");
                    630:                /* nothing to do yet... */
                    631:                return SUCCESS;
                    632:        }
                    633: 
                    634:        me = this->ike_sa->get_my_host(this->ike_sa);
                    635:        other = this->ike_sa->get_other_host(this->ike_sa);
                    636: 
                    637:        if (new_mid)
                    638:        {
                    639:                if (!this->rng->get_bytes(this->rng, sizeof(this->initiating.mid),
                    640:                                                                 (void*)&this->initiating.mid))
                    641:                {
                    642:                        DBG1(DBG_IKE, "failed to allocate message ID, destroying IKE_SA");
                    643:                        flush(this);
                    644:                        return DESTROY_ME;
                    645:                }
                    646:        }
                    647:        message = message_create(IKEV1_MAJOR_VERSION, IKEV1_MINOR_VERSION);
                    648:        message->set_message_id(message, this->initiating.mid);
                    649:        message->set_source(message, me->clone(me));
                    650:        message->set_destination(message, other->clone(other));
                    651:        message->set_exchange_type(message, exchange);
                    652:        this->initiating.type = exchange;
                    653:        this->initiating.retransmitted = 0;
                    654: 
                    655:        enumerator = this->active_tasks->create_enumerator(this->active_tasks);
                    656:        while (enumerator->enumerate(enumerator, (void*)&task))
                    657:        {
                    658:                switch (task->build(task, message))
                    659:                {
                    660:                        case SUCCESS:
                    661:                                /* task completed, remove it */
                    662:                                this->active_tasks->remove_at(this->active_tasks, enumerator);
                    663:                                if (task->get_type(task) == TASK_AGGRESSIVE_MODE ||
                    664:                                        task->get_type(task) == TASK_QUICK_MODE)
                    665:                                {       /* last message of three message exchange */
                    666:                                        keep = TRUE;
                    667:                                }
                    668:                                task->destroy(task);
                    669:                                continue;
                    670:                        case NEED_MORE:
                    671:                                expect_response = TRUE;
                    672:                                /* processed, but task needs another exchange */
                    673:                                continue;
                    674:                        case ALREADY_DONE:
                    675:                                cancelled = TRUE;
                    676:                                break;
                    677:                        case FAILED:
                    678:                        default:
                    679:                                if (this->ike_sa->get_state(this->ike_sa) != IKE_CONNECTING)
                    680:                                {
                    681:                                        charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                    682:                                }
                    683:                                /* FALL */
                    684:                        case DESTROY_ME:
                    685:                                /* critical failure, destroy IKE_SA */
                    686:                                enumerator->destroy(enumerator);
                    687:                                message->destroy(message);
                    688:                                flush(this);
                    689:                                return DESTROY_ME;
                    690:                }
                    691:                break;
                    692:        }
                    693:        enumerator->destroy(enumerator);
                    694: 
                    695:        if (this->active_tasks->get_count(this->active_tasks) == 0 &&
                    696:                (exchange == QUICK_MODE || exchange == AGGRESSIVE))
                    697:        {       /* tasks completed, no exchange active anymore */
                    698:                this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
                    699:        }
                    700:        if (cancelled)
                    701:        {
                    702:                message->destroy(message);
                    703:                return initiate(this);
                    704:        }
                    705: 
                    706:        clear_packets(this->initiating.packets);
                    707:        if (!generate_message(this, message, &this->initiating.packets))
                    708:        {
                    709:                /* message generation failed. There is nothing more to do than to
                    710:                 * close the SA */
                    711:                message->destroy(message);
                    712:                flush(this);
                    713:                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                    714:                return DESTROY_ME;
                    715:        }
                    716: 
                    717:        this->initiating.seqnr++;
                    718:        if (expect_response)
                    719:        {
                    720:                message->destroy(message);
                    721:                return retransmit(this, this->initiating.seqnr);
                    722:        }
                    723:        send_packets(this, this->initiating.packets);
                    724:        if (!keep)
                    725:        {
                    726:                clear_packets(this->initiating.packets);
                    727:        }
                    728:        message->destroy(message);
                    729: 
                    730:        if (exchange == INFORMATIONAL_V1)
                    731:        {
                    732:                switch (this->ike_sa->get_state(this->ike_sa))
                    733:                {
                    734:                        case IKE_CONNECTING:
                    735:                                /* close after sending an INFORMATIONAL when unestablished */
                    736:                                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                    737:                                return FAILED;
                    738:                        case IKE_DELETING:
                    739:                                /* close after sending a DELETE */
                    740:                                return DESTROY_ME;
                    741:                        default:
                    742:                                break;
                    743:                }
                    744:        }
                    745:        return initiate(this);
                    746: }
                    747: 
                    748: /**
                    749:  * build a response depending on the "passive" task list
                    750:  */
                    751: static status_t build_response(private_task_manager_t *this, message_t *request)
                    752: {
                    753:        enumerator_t *enumerator;
                    754:        task_t *task;
                    755:        message_t *message;
                    756:        host_t *me, *other;
                    757:        bool delete = FALSE, cancelled = FALSE, expect_request = FALSE;
                    758: 
                    759:        me = request->get_destination(request);
                    760:        other = request->get_source(request);
                    761: 
                    762:        message = message_create(IKEV1_MAJOR_VERSION, IKEV1_MINOR_VERSION);
                    763:        message->set_exchange_type(message, request->get_exchange_type(request));
                    764:        /* send response along the path the request came in */
                    765:        message->set_source(message, me->clone(me));
                    766:        message->set_destination(message, other->clone(other));
                    767:        message->set_message_id(message, request->get_message_id(request));
                    768:        message->set_request(message, FALSE);
                    769: 
                    770:        this->responding.mid = request->get_message_id(request);
                    771:        this->responding.retransmitted = 0;
                    772:        this->responding.seqnr++;
                    773: 
                    774:        enumerator = this->passive_tasks->create_enumerator(this->passive_tasks);
                    775:        while (enumerator->enumerate(enumerator, (void*)&task))
                    776:        {
                    777:                switch (task->build(task, message))
                    778:                {
                    779:                        case SUCCESS:
                    780:                                /* task completed, remove it */
                    781:                                this->passive_tasks->remove_at(this->passive_tasks, enumerator);
                    782:                                task->destroy(task);
                    783:                                continue;
                    784:                        case NEED_MORE:
                    785:                                /* processed, but task needs another exchange */
                    786:                                if (task->get_type(task) == TASK_QUICK_MODE ||
                    787:                                        task->get_type(task) == TASK_AGGRESSIVE_MODE)
                    788:                                {       /* we rely on initiator retransmission, except for
                    789:                                         * three-message exchanges */
                    790:                                        expect_request = TRUE;
                    791:                                }
                    792:                                continue;
                    793:                        case ALREADY_DONE:
                    794:                                cancelled = TRUE;
                    795:                                break;
                    796:                        case INVALID_ARG:
                    797:                                if (task->get_type(task) == TASK_QUICK_MODE)
                    798:                                {       /* not responsible for this exchange */
                    799:                                        continue;
                    800:                                }
                    801:                                /* FALL */
                    802:                        case FAILED:
                    803:                        default:
                    804:                                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                    805:                                /* FALL */
                    806:                        case DESTROY_ME:
                    807:                                /* destroy IKE_SA, but SEND response first */
                    808:                                delete = TRUE;
                    809:                                break;
                    810:                }
                    811:                break;
                    812:        }
                    813:        enumerator->destroy(enumerator);
                    814: 
                    815:        clear_packets(this->responding.packets);
                    816:        if (cancelled)
                    817:        {
                    818:                message->destroy(message);
                    819:                return initiate(this);
                    820:        }
                    821:        if (!generate_message(this, message, &this->responding.packets))
                    822:        {
                    823:                message->destroy(message);
                    824:                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                    825:                return DESTROY_ME;
                    826:        }
                    827:        message->destroy(message);
                    828: 
                    829:        if (expect_request && !delete)
                    830:        {
                    831:                return retransmit(this, this->responding.seqnr);
                    832:        }
                    833:        send_packets(this, this->responding.packets);
                    834:        if (delete)
                    835:        {
                    836:                return DESTROY_ME;
                    837:        }
                    838:        return SUCCESS;
                    839: }
                    840: 
                    841: /**
                    842:  * Send a notify in a separate INFORMATIONAL exchange back to the sender.
                    843:  * The notify protocol_id is set to ISAKMP
                    844:  */
                    845: static void send_notify(private_task_manager_t *this, message_t *request,
                    846:                                                notify_type_t type)
                    847: {
                    848:        message_t *response;
                    849:        array_t *packets = NULL;
                    850:        host_t *me, *other;
                    851:        uint32_t mid;
                    852: 
                    853:        if (request->get_exchange_type(request) == INFORMATIONAL_V1)
                    854:        {       /* don't respond to INFORMATIONAL requests to avoid a notify war */
                    855:                DBG1(DBG_IKE, "ignore malformed INFORMATIONAL request");
                    856:                return;
                    857:        }
                    858:        if (!this->rng->get_bytes(this->rng, sizeof(mid), (void*)&mid))
                    859:        {
                    860:                DBG1(DBG_IKE, "failed to allocate message ID");
                    861:                return;
                    862:        }
                    863:        response = message_create(IKEV1_MAJOR_VERSION, IKEV1_MINOR_VERSION);
                    864:        response->set_exchange_type(response, INFORMATIONAL_V1);
                    865:        response->set_request(response, TRUE);
                    866:        response->set_message_id(response, mid);
                    867:        response->add_payload(response, (payload_t*)
                    868:                                notify_payload_create_from_protocol_and_type(PLV1_NOTIFY,
                    869:                                                                                                        PROTO_IKE, type));
                    870: 
                    871:        me = this->ike_sa->get_my_host(this->ike_sa);
                    872:        if (me->is_anyaddr(me))
                    873:        {
                    874:                me = request->get_destination(request);
                    875:                this->ike_sa->set_my_host(this->ike_sa, me->clone(me));
                    876:        }
                    877:        other = this->ike_sa->get_other_host(this->ike_sa);
                    878:        if (other->is_anyaddr(other))
                    879:        {
                    880:                other = request->get_source(request);
                    881:                this->ike_sa->set_other_host(this->ike_sa, other->clone(other));
                    882:        }
                    883:        response->set_source(response, me->clone(me));
                    884:        response->set_destination(response, other->clone(other));
                    885:        if (generate_message(this, response, &packets))
                    886:        {
                    887:                send_packets(this, packets);
                    888:        }
                    889:        clear_packets(packets);
                    890:        array_destroy(packets);
                    891:        response->destroy(response);
                    892: }
                    893: 
                    894: /**
                    895:  * Process a DPD request/response
                    896:  */
                    897: static bool process_dpd(private_task_manager_t *this, message_t *message)
                    898: {
                    899:        notify_payload_t *notify;
                    900:        notify_type_t type;
                    901:        uint32_t seq;
                    902:        chunk_t data;
                    903: 
                    904:        type = DPD_R_U_THERE;
                    905:        notify = message->get_notify(message, type);
                    906:        if (!notify)
                    907:        {
                    908:                type = DPD_R_U_THERE_ACK;
                    909:                notify = message->get_notify(message, type);
                    910:        }
                    911:        if (!notify)
                    912:        {
                    913:                return FALSE;
                    914:        }
                    915:        data = notify->get_notification_data(notify);
                    916:        if (data.len != 4)
                    917:        {
                    918:                return FALSE;
                    919:        }
                    920:        seq = untoh32(data.ptr);
                    921: 
                    922:        if (type == DPD_R_U_THERE)
                    923:        {
                    924:                if (this->dpd_recv == 0 || seq == this->dpd_recv)
                    925:                {       /* check sequence validity */
                    926:                        this->dpd_recv = seq + 1;
                    927:                        this->ike_sa->set_statistic(this->ike_sa, STAT_INBOUND,
                    928:                                                                                time_monotonic(NULL));
                    929:                }
                    930:                /* but respond anyway */
                    931:                this->ike_sa->queue_task(this->ike_sa,
                    932:                                &isakmp_dpd_create(this->ike_sa, DPD_R_U_THERE_ACK, seq)->task);
                    933:        }
                    934:        else /* DPD_R_U_THERE_ACK */
                    935:        {
                    936:                if (seq == this->dpd_send)
                    937:                {
                    938:                        this->dpd_send++;
                    939:                        this->ike_sa->set_statistic(this->ike_sa, STAT_INBOUND,
                    940:                                                                                time_monotonic(NULL));
                    941:                }
                    942:                else
                    943:                {
                    944:                        DBG1(DBG_IKE, "received invalid DPD sequence number %u "
                    945:                                 "(expected %u), ignored", seq, this->dpd_send);
                    946:                }
                    947:        }
                    948:        return TRUE;
                    949: }
                    950: 
                    951: /**
                    952:  * Check if we already have a quick mode task queued for the exchange with the
                    953:  * given message ID
                    954:  */
                    955: static bool have_quick_mode_task(private_task_manager_t *this, uint32_t mid)
                    956: {
                    957:        enumerator_t *enumerator;
                    958:        quick_mode_t *qm;
                    959:        task_t *task;
                    960:        bool found = FALSE;
                    961: 
                    962:        enumerator = this->passive_tasks->create_enumerator(this->passive_tasks);
                    963:        while (enumerator->enumerate(enumerator, &task))
                    964:        {
                    965:                if (task->get_type(task) == TASK_QUICK_MODE)
                    966:                {
                    967:                        qm = (quick_mode_t*)task;
                    968:                        if (qm->get_mid(qm) == mid)
                    969:                        {
                    970:                                found = TRUE;
                    971:                                break;
                    972:                        }
                    973:                }
                    974:        }
                    975:        enumerator->destroy(enumerator);
                    976:        return found;
                    977: }
                    978: 
                    979: /**
                    980:  * Check if we still have a specific task queued
                    981:  */
                    982: static bool have_task_queued(private_task_manager_t *this, task_type_t type)
                    983: {
                    984:        enumerator_t *enumerator;
                    985:        task_t *task;
                    986:        bool found = FALSE;
                    987: 
                    988:        enumerator = this->passive_tasks->create_enumerator(this->passive_tasks);
                    989:        while (enumerator->enumerate(enumerator, &task))
                    990:        {
                    991:                if (task->get_type(task) == type)
                    992:                {
                    993:                        found = TRUE;
                    994:                        break;
                    995:                }
                    996:        }
                    997:        enumerator->destroy(enumerator);
                    998:        return found;
                    999: }
                   1000: 
                   1001: /**
                   1002:  * handle an incoming request message
                   1003:  */
                   1004: static status_t process_request(private_task_manager_t *this,
                   1005:                                                                message_t *message)
                   1006: {
                   1007:        enumerator_t *enumerator;
                   1008:        task_t *task = NULL;
                   1009:        bool send_response = FALSE, dpd = FALSE;
                   1010: 
                   1011:        if (message->get_exchange_type(message) == INFORMATIONAL_V1 ||
                   1012:                message->get_exchange_type(message) == QUICK_MODE ||
                   1013:                this->passive_tasks->get_count(this->passive_tasks) == 0)
                   1014:        {       /* create tasks depending on request type, if not already some queued */
                   1015:                switch (message->get_exchange_type(message))
                   1016:                {
                   1017:                        case ID_PROT:
                   1018:                                task = (task_t *)isakmp_vendor_create(this->ike_sa, FALSE);
                   1019:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1020:                                task = (task_t*)isakmp_cert_pre_create(this->ike_sa, FALSE);
                   1021:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1022:                                task = (task_t *)main_mode_create(this->ike_sa, FALSE);
                   1023:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1024:                                task = (task_t*)isakmp_cert_post_create(this->ike_sa, FALSE);
                   1025:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1026:                                task = (task_t *)isakmp_natd_create(this->ike_sa, FALSE);
                   1027:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1028:                                break;
                   1029:                        case AGGRESSIVE:
                   1030:                                task = (task_t *)isakmp_vendor_create(this->ike_sa, FALSE);
                   1031:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1032:                                task = (task_t*)isakmp_cert_pre_create(this->ike_sa, FALSE);
                   1033:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1034:                                task = (task_t *)aggressive_mode_create(this->ike_sa, FALSE);
                   1035:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1036:                                task = (task_t*)isakmp_cert_post_create(this->ike_sa, FALSE);
                   1037:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1038:                                task = (task_t *)isakmp_natd_create(this->ike_sa, FALSE);
                   1039:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1040:                                break;
                   1041:                        case QUICK_MODE:
                   1042:                                if (this->ike_sa->get_state(this->ike_sa) != IKE_ESTABLISHED)
                   1043:                                {
                   1044:                                        DBG1(DBG_IKE, "received quick mode request for "
                   1045:                                                 "unestablished IKE_SA, ignored");
                   1046:                                        return FAILED;
                   1047:                                }
                   1048:                                if (have_quick_mode_task(this, message->get_message_id(message)))
                   1049:                                {
                   1050:                                        break;
                   1051:                                }
                   1052:                                task = (task_t *)quick_mode_create(this->ike_sa, NULL,
                   1053:                                                                                                   NULL, NULL);
                   1054:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1055:                                break;
                   1056:                        case INFORMATIONAL_V1:
                   1057:                                if (process_dpd(this, message))
                   1058:                                {
                   1059:                                        dpd = TRUE;
                   1060:                                }
                   1061:                                else
                   1062:                                {
                   1063:                                        task = (task_t *)informational_create(this->ike_sa, NULL);
                   1064:                                        this->passive_tasks->insert_first(this->passive_tasks, task);
                   1065:                                }
                   1066:                                break;
                   1067:                        case TRANSACTION:
                   1068:                                if (this->ike_sa->get_state(this->ike_sa) != IKE_CONNECTING)
                   1069:                                {
                   1070:                                        task = (task_t *)mode_config_create(this->ike_sa,
                   1071:                                                                                                                FALSE, TRUE);
                   1072:                                }
                   1073:                                else
                   1074:                                {
                   1075:                                        task = (task_t *)xauth_create(this->ike_sa, FALSE);
                   1076:                                }
                   1077:                                this->passive_tasks->insert_last(this->passive_tasks, task);
                   1078:                                break;
                   1079:                        default:
                   1080:                                return FAILED;
                   1081:                }
                   1082:        }
                   1083:        if (dpd)
                   1084:        {
                   1085:                return initiate(this);
                   1086:        }
                   1087:        this->ike_sa->set_statistic(this->ike_sa, STAT_INBOUND, time_monotonic(NULL));
                   1088: 
                   1089:        /* let the tasks process the message */
                   1090:        enumerator = this->passive_tasks->create_enumerator(this->passive_tasks);
                   1091:        while (enumerator->enumerate(enumerator, (void*)&task))
                   1092:        {
                   1093:                switch (task->process(task, message))
                   1094:                {
                   1095:                        case SUCCESS:
                   1096:                                /* task completed, remove it */
                   1097:                                this->passive_tasks->remove_at(this->passive_tasks, enumerator);
                   1098:                                task->destroy(task);
                   1099:                                continue;
                   1100:                        case NEED_MORE:
                   1101:                                /* processed, but task needs at least another call to build() */
                   1102:                                send_response = TRUE;
                   1103:                                continue;
                   1104:                        case ALREADY_DONE:
                   1105:                                send_response = FALSE;
                   1106:                                break;
                   1107:                        case INVALID_ARG:
                   1108:                                if (task->get_type(task) == TASK_QUICK_MODE)
                   1109:                                {       /* not responsible for this exchange */
                   1110:                                        continue;
                   1111:                                }
                   1112:                                /* FALL */
                   1113:                        case FAILED:
                   1114:                        default:
                   1115:                                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                   1116:                                /* FALL */
                   1117:                        case DESTROY_ME:
                   1118:                                /* critical failure, destroy IKE_SA */
                   1119:                                this->passive_tasks->remove_at(this->passive_tasks, enumerator);
                   1120:                                enumerator->destroy(enumerator);
                   1121:                                task->destroy(task);
                   1122:                                return DESTROY_ME;
                   1123:                }
                   1124:                break;
                   1125:        }
                   1126:        enumerator->destroy(enumerator);
                   1127: 
                   1128:        if (send_response)
                   1129:        {
                   1130:                if (build_response(this, message) != SUCCESS)
                   1131:                {
                   1132:                        return DESTROY_ME;
                   1133:                }
                   1134:        }
                   1135:        else
                   1136:        {
                   1137:                if (this->responding.retransmitted > 1)
                   1138:                {
                   1139:                        packet_t *packet = NULL;
                   1140:                        array_get(this->responding.packets, 0, &packet);
                   1141:                        charon->bus->alert(charon->bus, ALERT_RETRANSMIT_SEND_CLEARED,
                   1142:                                                           packet);
                   1143:                }
                   1144:                /* We don't send a response, so don't retransmit one if we get
                   1145:                 * the same message again. */
                   1146:                clear_packets(this->responding.packets);
                   1147:        }
                   1148:        if (this->queued &&
                   1149:                this->queued->get_exchange_type(this->queued) == INFORMATIONAL_V1)
                   1150:        {
                   1151:                message_t *queued;
                   1152:                status_t status;
                   1153: 
                   1154:                queued = this->queued;
                   1155:                this->queued = NULL;
                   1156:                status = this->public.task_manager.process_message(
                   1157:                                                                                        &this->public.task_manager, queued);
                   1158:                queued->destroy(queued);
                   1159:                if (status == DESTROY_ME)
                   1160:                {
                   1161:                        return status;
                   1162:                }
                   1163:        }
                   1164:        if (this->passive_tasks->get_count(this->passive_tasks) == 0 &&
                   1165:                this->queued_tasks->get_count(this->queued_tasks) > 0)
                   1166:        {
                   1167:                /* passive tasks completed, check if an active task has been queued,
                   1168:                 * such as XAUTH or modeconfig push */
                   1169:                return initiate(this);
                   1170:        }
                   1171:        return SUCCESS;
                   1172: }
                   1173: 
                   1174: /**
                   1175:  * handle an incoming response message
                   1176:  */
                   1177: static status_t process_response(private_task_manager_t *this,
                   1178:                                                                 message_t *message)
                   1179: {
                   1180:        enumerator_t *enumerator;
                   1181:        message_t *queued;
                   1182:        status_t status;
                   1183:        task_t *task;
                   1184: 
                   1185:        if (message->get_exchange_type(message) != this->initiating.type)
                   1186:        {
                   1187:                /* Windows server sends a fourth quick mode message having an initial
                   1188:                 * contact notify. Ignore this message for compatibility. */
                   1189:                if (this->initiating.type == EXCHANGE_TYPE_UNDEFINED &&
                   1190:                        message->get_exchange_type(message) == QUICK_MODE &&
                   1191:                        message->get_notify(message, INITIAL_CONTACT))
                   1192:                {
                   1193:                        DBG1(DBG_IKE, "ignoring fourth Quick Mode message");
                   1194:                        return SUCCESS;
                   1195:                }
                   1196:                DBG1(DBG_IKE, "received %N response, but expected %N",
                   1197:                         exchange_type_names, message->get_exchange_type(message),
                   1198:                         exchange_type_names, this->initiating.type);
                   1199:                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                   1200:                return DESTROY_ME;
                   1201:        }
                   1202: 
                   1203:        enumerator = this->active_tasks->create_enumerator(this->active_tasks);
                   1204:        while (enumerator->enumerate(enumerator, (void*)&task))
                   1205:        {
                   1206:                switch (task->process(task, message))
                   1207:                {
                   1208:                        case SUCCESS:
                   1209:                                /* task completed, remove it */
                   1210:                                this->active_tasks->remove_at(this->active_tasks, enumerator);
                   1211:                                task->destroy(task);
                   1212:                                continue;
                   1213:                        case NEED_MORE:
                   1214:                                /* processed, but task needs another exchange */
                   1215:                                continue;
                   1216:                        case ALREADY_DONE:
                   1217:                                break;
                   1218:                        case FAILED:
                   1219:                        default:
                   1220:                                charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
                   1221:                                /* FALL */
                   1222:                        case DESTROY_ME:
                   1223:                                /* critical failure, destroy IKE_SA */
                   1224:                                this->active_tasks->remove_at(this->active_tasks, enumerator);
                   1225:                                enumerator->destroy(enumerator);
                   1226:                                task->destroy(task);
                   1227:                                return DESTROY_ME;
                   1228:                }
                   1229:                break;
                   1230:        }
                   1231:        enumerator->destroy(enumerator);
                   1232: 
                   1233:        if (this->initiating.retransmitted > 1)
                   1234:        {
                   1235:                packet_t *packet = NULL;
                   1236:                array_get(this->initiating.packets, 0, &packet);
                   1237:                charon->bus->alert(charon->bus, ALERT_RETRANSMIT_SEND_CLEARED, packet);
                   1238:        }
                   1239:        this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
                   1240:        clear_packets(this->initiating.packets);
                   1241: 
                   1242:        if (this->queued && !this->active_tasks->get_count(this->active_tasks) &&
                   1243:                this->queued->get_exchange_type(this->queued) == TRANSACTION)
                   1244:        {
                   1245:                queued = this->queued;
                   1246:                this->queued = NULL;
                   1247:                status = this->public.task_manager.process_message(
                   1248:                                                                                        &this->public.task_manager, queued);
                   1249:                queued->destroy(queued);
                   1250:                if (status == DESTROY_ME)
                   1251:                {
                   1252:                        return status;
                   1253:                }
                   1254:        }
                   1255: 
                   1256:        return initiate(this);
                   1257: }
                   1258: 
                   1259: static status_t handle_fragment(private_task_manager_t *this, message_t *msg)
                   1260: {
                   1261:        status_t status;
                   1262: 
                   1263:        if (!this->defrag)
                   1264:        {
                   1265:                this->defrag = message_create_defrag(msg);
                   1266:                if (!this->defrag)
                   1267:                {
                   1268:                        return FAILED;
                   1269:                }
                   1270:        }
                   1271:        status = this->defrag->add_fragment(this->defrag, msg);
                   1272:        if (status == SUCCESS)
                   1273:        {
                   1274:                lib->processor->queue_job(lib->processor,
                   1275:                                                        (job_t*)process_message_job_create(this->defrag));
                   1276:                this->defrag = NULL;
                   1277:                /* do not process the last fragment */
                   1278:                status = NEED_MORE;
                   1279:        }
                   1280:        return status;
                   1281: }
                   1282: 
                   1283: /**
                   1284:  * Parse the given message and verify that it is valid.
                   1285:  */
                   1286: static status_t parse_message(private_task_manager_t *this, message_t *msg)
                   1287: {
                   1288:        status_t status;
                   1289: 
                   1290:        status = msg->parse_body(msg, this->ike_sa->get_keymat(this->ike_sa));
                   1291: 
                   1292:        if (status != SUCCESS)
                   1293:        {
                   1294:                switch (status)
                   1295:                {
                   1296:                        case NOT_SUPPORTED:
                   1297:                                DBG1(DBG_IKE, "unsupported exchange type");
                   1298:                                send_notify(this, msg, INVALID_EXCHANGE_TYPE);
                   1299:                                break;
                   1300:                        case PARSE_ERROR:
                   1301:                                DBG1(DBG_IKE, "message parsing failed");
                   1302:                                send_notify(this, msg, PAYLOAD_MALFORMED);
                   1303:                                break;
                   1304:                        case VERIFY_ERROR:
                   1305:                                DBG1(DBG_IKE, "message verification failed");
                   1306:                                send_notify(this, msg, PAYLOAD_MALFORMED);
                   1307:                                break;
                   1308:                        case FAILED:
                   1309:                                DBG1(DBG_IKE, "integrity check failed");
                   1310:                                send_notify(this, msg, INVALID_HASH_INFORMATION);
                   1311:                                break;
                   1312:                        case INVALID_STATE:
                   1313:                                DBG1(DBG_IKE, "found encrypted message, but no keys available");
                   1314:                                send_notify(this, msg, PAYLOAD_MALFORMED);
                   1315:                        default:
                   1316:                                break;
                   1317:                }
                   1318:                DBG1(DBG_IKE, "%N %s with message ID %u processing failed",
                   1319:                         exchange_type_names, msg->get_exchange_type(msg),
                   1320:                         msg->get_request(msg) ? "request" : "response",
                   1321:                         msg->get_message_id(msg));
                   1322: 
                   1323:                charon->bus->alert(charon->bus, ALERT_PARSE_ERROR_BODY, msg, status);
                   1324: 
                   1325:                if (this->ike_sa->get_state(this->ike_sa) == IKE_CREATED)
                   1326:                {       /* invalid initiation attempt, close SA */
                   1327:                        return DESTROY_ME;
                   1328:                }
                   1329:        }
                   1330: 
                   1331:        if (msg->get_first_payload_type(msg) == PLV1_FRAGMENT)
                   1332:        {
                   1333:                return handle_fragment(this, msg);
                   1334:        }
                   1335:        return status;
                   1336: }
                   1337: 
                   1338: /**
                   1339:  * Queue the given message if possible
                   1340:  */
                   1341: static status_t queue_message(private_task_manager_t *this, message_t *msg)
                   1342: {
                   1343:        if (this->queued)
                   1344:        {
                   1345:                DBG1(DBG_IKE, "ignoring %N request, queue full",
                   1346:                         exchange_type_names, msg->get_exchange_type(msg));
                   1347:                return FAILED;
                   1348:        }
                   1349:        this->queued = message_create_from_packet(msg->get_packet(msg));
                   1350:        if (this->queued->parse_header(this->queued) != SUCCESS)
                   1351:        {
                   1352:                this->queued->destroy(this->queued);
                   1353:                this->queued = NULL;
                   1354:                return FAILED;
                   1355:        }
                   1356:        DBG1(DBG_IKE, "queueing %N request as tasks still active",
                   1357:                 exchange_type_names, msg->get_exchange_type(msg));
                   1358:        return SUCCESS;
                   1359: }
                   1360: 
                   1361: METHOD(task_manager_t, process_message, status_t,
                   1362:        private_task_manager_t *this, message_t *msg)
                   1363: {
                   1364:        uint32_t hash, mid, i;
                   1365:        host_t *me, *other;
                   1366:        status_t status;
                   1367: 
                   1368:        /* TODO-IKEv1: update hosts more selectively */
                   1369:        me = msg->get_destination(msg);
                   1370:        other = msg->get_source(msg);
                   1371:        mid = msg->get_message_id(msg);
                   1372:        hash = chunk_hash(msg->get_packet_data(msg));
                   1373:        for (i = 0; i < MAX_OLD_HASHES; i++)
                   1374:        {
                   1375:                if (this->initiating.old_hashes[i] == hash)
                   1376:                {
                   1377:                        if (array_count(this->initiating.packets) &&
                   1378:                                i == (this->initiating.old_hash_pos % MAX_OLD_HASHES) &&
                   1379:                                (msg->get_exchange_type(msg) == QUICK_MODE ||
                   1380:                                 msg->get_exchange_type(msg) == AGGRESSIVE))
                   1381:                        {
                   1382:                                DBG1(DBG_IKE, "received retransmit of response with ID %u, "
                   1383:                                         "resending last request", mid);
                   1384:                                send_packets(this, this->initiating.packets);
                   1385:                                return SUCCESS;
                   1386:                        }
                   1387:                        DBG1(DBG_IKE, "received retransmit of response with ID %u, "
                   1388:                                 "but next request already sent", mid);
                   1389:                        return SUCCESS;
                   1390:                }
                   1391:        }
                   1392: 
                   1393:        if ((mid && mid == this->initiating.mid) ||
                   1394:                (this->initiating.mid == 0 &&
                   1395:                 msg->get_exchange_type(msg) == this->initiating.type &&
                   1396:                 this->active_tasks->get_count(this->active_tasks)))
                   1397:        {
                   1398:                msg->set_request(msg, FALSE);
                   1399:                charon->bus->message(charon->bus, msg, TRUE, FALSE);
                   1400:                status = parse_message(this, msg);
                   1401:                if (status == NEED_MORE)
                   1402:                {
                   1403:                        return SUCCESS;
                   1404:                }
                   1405:                if (status != SUCCESS)
                   1406:                {
                   1407:                        return status;
                   1408:                }
                   1409:                this->ike_sa->set_statistic(this->ike_sa, STAT_INBOUND,
                   1410:                                                                        time_monotonic(NULL));
1.1.1.2 ! misho    1411:                this->ike_sa->update_hosts(this->ike_sa, me, other, UPDATE_HOSTS_FORCE_ADDRS);
1.1       misho    1412:                charon->bus->message(charon->bus, msg, TRUE, TRUE);
                   1413:                if (process_response(this, msg) != SUCCESS)
                   1414:                {
                   1415:                        flush(this);
                   1416:                        return DESTROY_ME;
                   1417:                }
                   1418:                this->initiating.old_hashes[(++this->initiating.old_hash_pos) %
                   1419:                                                                        MAX_OLD_HASHES] = hash;
                   1420:        }
                   1421:        else
                   1422:        {
                   1423:                if (hash == this->responding.hash)
                   1424:                {
                   1425:                        if (array_count(this->responding.packets))
                   1426:                        {
                   1427:                                DBG1(DBG_IKE, "received retransmit of request with ID %u, "
                   1428:                                         "retransmitting response", mid);
                   1429:                                send_packets(this, this->responding.packets);
                   1430:                        }
                   1431:                        else if (array_count(this->initiating.packets) &&
                   1432:                                         this->initiating.type == INFORMATIONAL_V1)
                   1433:                        {
                   1434:                                DBG1(DBG_IKE, "received retransmit of DPD request, "
                   1435:                                         "retransmitting response");
                   1436:                                send_packets(this, this->initiating.packets);
                   1437:                        }
                   1438:                        else
                   1439:                        {
                   1440:                                DBG1(DBG_IKE, "received retransmit of request with ID %u, "
                   1441:                                         "but no response to retransmit", mid);
                   1442:                        }
                   1443:                        charon->bus->alert(charon->bus, ALERT_RETRANSMIT_RECEIVE, msg);
                   1444:                        return SUCCESS;
                   1445:                }
                   1446: 
                   1447:                /* reject Main/Aggressive Modes once established */
                   1448:                if (msg->get_exchange_type(msg) == ID_PROT ||
                   1449:                        msg->get_exchange_type(msg) == AGGRESSIVE)
                   1450:                {
                   1451:                        if (this->ike_sa->get_state(this->ike_sa) != IKE_CREATED &&
                   1452:                                this->ike_sa->get_state(this->ike_sa) != IKE_CONNECTING &&
                   1453:                                msg->get_first_payload_type(msg) != PLV1_FRAGMENT)
                   1454:                        {
                   1455:                                DBG1(DBG_IKE, "ignoring %N in established IKE_SA state",
                   1456:                                         exchange_type_names, msg->get_exchange_type(msg));
                   1457:                                return FAILED;
                   1458:                        }
                   1459:                }
                   1460: 
                   1461:                /* drop XAuth/Mode Config/Quick Mode messages until we received the last
                   1462:                 * Aggressive Mode message.  since Informational messages are not
                   1463:                 * retransmitted we queue them. */
                   1464:                if (have_task_queued(this, TASK_AGGRESSIVE_MODE))
                   1465:                {
                   1466:                        if (msg->get_exchange_type(msg) == INFORMATIONAL_V1)
                   1467:                        {
                   1468:                                return queue_message(this, msg);
                   1469:                        }
                   1470:                        else if (msg->get_exchange_type(msg) != AGGRESSIVE)
                   1471:                        {
                   1472:                                DBG1(DBG_IKE, "ignoring %N request while phase 1 is incomplete",
                   1473:                                         exchange_type_names, msg->get_exchange_type(msg));
                   1474:                                return FAILED;
                   1475:                        }
                   1476:                }
                   1477: 
                   1478:                /* queue XAuth/Mode Config messages unless the Main Mode exchange we
                   1479:                 * initiated is complete */
                   1480:                if (msg->get_exchange_type(msg) == TRANSACTION &&
                   1481:                        this->active_tasks->get_count(this->active_tasks))
                   1482:                {
                   1483:                        return queue_message(this, msg);
                   1484:                }
                   1485: 
                   1486:                /* some peers send INITIAL_CONTACT notifies during XAuth, cache it */
                   1487:                if (have_task_queued(this, TASK_XAUTH) &&
                   1488:                        msg->get_exchange_type(msg) == INFORMATIONAL_V1)
                   1489:                {
                   1490:                        return queue_message(this, msg);
                   1491:                }
                   1492: 
                   1493:                msg->set_request(msg, TRUE);
                   1494:                charon->bus->message(charon->bus, msg, TRUE, FALSE);
                   1495:                status = parse_message(this, msg);
                   1496:                if (status == NEED_MORE)
                   1497:                {
                   1498:                        return SUCCESS;
                   1499:                }
                   1500:                if (status != SUCCESS)
                   1501:                {
                   1502:                        return status;
                   1503:                }
                   1504:                /* if this IKE_SA is virgin, we check for a config */
                   1505:                if (this->ike_sa->get_ike_cfg(this->ike_sa) == NULL)
                   1506:                {
                   1507:                        ike_sa_id_t *ike_sa_id;
                   1508:                        ike_cfg_t *ike_cfg;
                   1509:                        job_t *job;
                   1510: 
                   1511:                        ike_cfg = charon->backends->get_ike_cfg(charon->backends,
                   1512:                                                                                                        me, other, IKEV1);
                   1513:                        if (ike_cfg == NULL)
                   1514:                        {
                   1515:                                /* no config found for these hosts, destroy */
                   1516:                                DBG1(DBG_IKE, "no IKE config found for %H...%H, sending %N",
                   1517:                                         me, other, notify_type_names, NO_PROPOSAL_CHOSEN);
                   1518:                                send_notify(this, msg, NO_PROPOSAL_CHOSEN);
                   1519:                                return DESTROY_ME;
                   1520:                        }
                   1521:                        this->ike_sa->set_ike_cfg(this->ike_sa, ike_cfg);
                   1522:                        ike_cfg->destroy(ike_cfg);
                   1523:                        /* add a timeout if peer does not establish it completely */
                   1524:                        ike_sa_id = this->ike_sa->get_id(this->ike_sa);
                   1525:                        job = (job_t*)delete_ike_sa_job_create(ike_sa_id, FALSE);
                   1526:                        lib->scheduler->schedule_job(lib->scheduler, job,
                   1527:                                        lib->settings->get_int(lib->settings,
                   1528:                                                        "%s.half_open_timeout", HALF_OPEN_IKE_SA_TIMEOUT,
                   1529:                                                        lib->ns));
                   1530:                }
1.1.1.2 ! misho    1531:                this->ike_sa->update_hosts(this->ike_sa, me, other, UPDATE_HOSTS_FORCE_ADDRS);
1.1       misho    1532:                charon->bus->message(charon->bus, msg, TRUE, TRUE);
                   1533:                if (process_request(this, msg) != SUCCESS)
                   1534:                {
                   1535:                        flush(this);
                   1536:                        return DESTROY_ME;
                   1537:                }
                   1538:                this->responding.hash = hash;
                   1539:        }
                   1540:        return SUCCESS;
                   1541: }
                   1542: 
                   1543: /**
                   1544:  * Check if a given task has been queued already
                   1545:  */
                   1546: static bool has_queued(private_task_manager_t *this, task_type_t type)
                   1547: {
                   1548:        enumerator_t *enumerator;
                   1549:        bool found = FALSE;
                   1550:        task_t *task;
                   1551: 
                   1552:        enumerator = this->queued_tasks->create_enumerator(this->queued_tasks);
                   1553:        while (enumerator->enumerate(enumerator, &task))
                   1554:        {
                   1555:                if (task->get_type(task) == type)
                   1556:                {
                   1557:                        found = TRUE;
                   1558:                        break;
                   1559:                }
                   1560:        }
                   1561:        enumerator->destroy(enumerator);
                   1562:        return found;
                   1563: }
                   1564: 
                   1565: METHOD(task_manager_t, queue_task_delayed, void,
                   1566:        private_task_manager_t *this, task_t *task, uint32_t delay)
                   1567: {
                   1568:        task_type_t type = task->get_type(task);
                   1569: 
                   1570:        switch (type)
                   1571:        {
                   1572:                case TASK_MODE_CONFIG:
                   1573:                case TASK_XAUTH:
                   1574:                        if (has_queued(this, type))
                   1575:                        {
                   1576:                                task->destroy(task);
                   1577:                                return;
                   1578:                        }
                   1579:                        break;
                   1580:                default:
                   1581:                        break;
                   1582:        }
                   1583:        DBG2(DBG_IKE, "queueing %N task", task_type_names, task->get_type(task));
                   1584:        this->queued_tasks->insert_last(this->queued_tasks, task);
                   1585: }
                   1586: 
                   1587: METHOD(task_manager_t, queue_task, void,
                   1588:        private_task_manager_t *this, task_t *task)
                   1589: {
                   1590:        queue_task_delayed(this, task, 0);
                   1591: }
                   1592: 
                   1593: METHOD(task_manager_t, queue_ike, void,
                   1594:        private_task_manager_t *this)
                   1595: {
                   1596:        peer_cfg_t *peer_cfg;
                   1597: 
                   1598:        if (!has_queued(this, TASK_ISAKMP_VENDOR))
                   1599:        {
                   1600:                queue_task(this, (task_t*)isakmp_vendor_create(this->ike_sa, TRUE));
                   1601:        }
                   1602:        if (!has_queued(this, TASK_ISAKMP_CERT_PRE))
                   1603:        {
                   1604:                queue_task(this, (task_t*)isakmp_cert_pre_create(this->ike_sa, TRUE));
                   1605:        }
                   1606:        peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
                   1607:        if (peer_cfg->use_aggressive(peer_cfg))
                   1608:        {
                   1609:                if (!has_queued(this, TASK_AGGRESSIVE_MODE))
                   1610:                {
                   1611:                        queue_task(this, (task_t*)aggressive_mode_create(this->ike_sa, TRUE));
                   1612:                }
                   1613:        }
                   1614:        else
                   1615:        {
                   1616:                if (!has_queued(this, TASK_MAIN_MODE))
                   1617:                {
                   1618:                        queue_task(this, (task_t*)main_mode_create(this->ike_sa, TRUE));
                   1619:                }
                   1620:        }
                   1621:        if (!has_queued(this, TASK_ISAKMP_CERT_POST))
                   1622:        {
                   1623:                queue_task(this, (task_t*)isakmp_cert_post_create(this->ike_sa, TRUE));
                   1624:        }
                   1625:        if (!has_queued(this, TASK_ISAKMP_NATD))
                   1626:        {
                   1627:                queue_task(this, (task_t*)isakmp_natd_create(this->ike_sa, TRUE));
                   1628:        }
                   1629: }
                   1630: 
                   1631: METHOD(task_manager_t, queue_ike_reauth, void,
                   1632:        private_task_manager_t *this)
                   1633: {
                   1634:        enumerator_t *enumerator;
                   1635:        child_sa_t *child_sa;
                   1636:        ike_sa_t *new;
                   1637:        host_t *host;
                   1638: 
1.1.1.2 ! misho    1639:        new = charon->ike_sa_manager->create_new(charon->ike_sa_manager,
1.1       misho    1640:                                                                this->ike_sa->get_version(this->ike_sa), TRUE);
                   1641:        if (!new)
                   1642:        {       /* shouldn't happen */
                   1643:                return;
                   1644:        }
                   1645: 
                   1646:        new->set_peer_cfg(new, this->ike_sa->get_peer_cfg(this->ike_sa));
                   1647:        host = this->ike_sa->get_other_host(this->ike_sa);
                   1648:        new->set_other_host(new, host->clone(host));
                   1649:        host = this->ike_sa->get_my_host(this->ike_sa);
                   1650:        new->set_my_host(new, host->clone(host));
                   1651:        enumerator = this->ike_sa->create_virtual_ip_enumerator(this->ike_sa, TRUE);
                   1652:        while (enumerator->enumerate(enumerator, &host))
                   1653:        {
                   1654:                new->add_virtual_ip(new, TRUE, host);
                   1655:        }
                   1656:        enumerator->destroy(enumerator);
                   1657: 
                   1658:        charon->bus->children_migrate(charon->bus, new->get_id(new),
                   1659:                                                                  new->get_unique_id(new));
                   1660:        enumerator = this->ike_sa->create_child_sa_enumerator(this->ike_sa);
                   1661:        while (enumerator->enumerate(enumerator, &child_sa))
                   1662:        {
                   1663:                this->ike_sa->remove_child_sa(this->ike_sa, enumerator);
                   1664:                new->add_child_sa(new, child_sa);
                   1665:        }
                   1666:        enumerator->destroy(enumerator);
                   1667:        charon->bus->set_sa(charon->bus, new);
                   1668:        charon->bus->children_migrate(charon->bus, NULL, 0);
                   1669:        charon->bus->set_sa(charon->bus, this->ike_sa);
                   1670: 
                   1671:        if (!new->get_child_count(new))
                   1672:        {       /* check if a Quick Mode task is queued (UNITY_LOAD_BALANCE case) */
                   1673:                task_t *task;
                   1674: 
                   1675:                enumerator = this->queued_tasks->create_enumerator(this->queued_tasks);
                   1676:                while (enumerator->enumerate(enumerator, &task))
                   1677:                {
                   1678:                        if (task->get_type(task) == TASK_QUICK_MODE)
                   1679:                        {
                   1680:                                this->queued_tasks->remove_at(this->queued_tasks, enumerator);
                   1681:                                task->migrate(task, new);
                   1682:                                new->queue_task(new, task);
                   1683:                        }
                   1684:                }
                   1685:                enumerator->destroy(enumerator);
                   1686:        }
                   1687: 
                   1688:        if (new->initiate(new, NULL, 0, NULL, NULL) != DESTROY_ME)
                   1689:        {
                   1690:                charon->ike_sa_manager->checkin(charon->ike_sa_manager, new);
                   1691:                this->ike_sa->set_state(this->ike_sa, IKE_REKEYING);
                   1692:        }
                   1693:        else
                   1694:        {
                   1695:                charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, new);
                   1696:                DBG1(DBG_IKE, "reauthenticating IKE_SA failed");
                   1697:        }
                   1698:        charon->bus->set_sa(charon->bus, this->ike_sa);
                   1699: }
                   1700: 
                   1701: METHOD(task_manager_t, queue_ike_rekey, void,
                   1702:        private_task_manager_t *this)
                   1703: {
                   1704:        queue_ike_reauth(this);
                   1705: }
                   1706: 
                   1707: METHOD(task_manager_t, queue_ike_delete, void,
                   1708:        private_task_manager_t *this)
                   1709: {
                   1710:        enumerator_t *enumerator;
                   1711:        child_sa_t *child_sa;
                   1712: 
                   1713:        /* cancel any currently active task to get the DELETE done quickly */
                   1714:        flush_queue(this, TASK_QUEUE_ACTIVE);
                   1715: 
                   1716:        enumerator = this->ike_sa->create_child_sa_enumerator(this->ike_sa);
                   1717:        while (enumerator->enumerate(enumerator, &child_sa))
                   1718:        {
                   1719:                queue_task(this, (task_t*)
                   1720:                        quick_delete_create(this->ike_sa, child_sa->get_protocol(child_sa),
                   1721:                                                                child_sa->get_spi(child_sa, TRUE), FALSE, FALSE));
                   1722:        }
                   1723:        enumerator->destroy(enumerator);
                   1724: 
                   1725:        queue_task(this, (task_t*)isakmp_delete_create(this->ike_sa, TRUE));
                   1726: }
                   1727: 
                   1728: METHOD(task_manager_t, queue_mobike, void,
                   1729:        private_task_manager_t *this, bool roam, bool address)
                   1730: {
                   1731:        /* Not supported in IKEv1 */
                   1732: }
                   1733: 
                   1734: METHOD(task_manager_t, queue_child, void,
                   1735:        private_task_manager_t *this, child_cfg_t *cfg, uint32_t reqid,
                   1736:        traffic_selector_t *tsi, traffic_selector_t *tsr)
                   1737: {
                   1738:        quick_mode_t *task;
                   1739: 
                   1740:        task = quick_mode_create(this->ike_sa, cfg, tsi, tsr);
                   1741:        task->use_reqid(task, reqid);
                   1742: 
                   1743:        queue_task(this, &task->task);
                   1744: }
                   1745: 
                   1746: /**
                   1747:  * Check if two CHILD_SAs have the same traffic selector
                   1748:  */
                   1749: static bool have_equal_ts(child_sa_t *child1, child_sa_t *child2, bool local)
                   1750: {
                   1751:        enumerator_t *e1, *e2;
                   1752:        traffic_selector_t *ts1, *ts2;
                   1753:        bool equal = FALSE;
                   1754: 
                   1755:        e1 = child1->create_ts_enumerator(child1, local);
                   1756:        e2 = child2->create_ts_enumerator(child2, local);
                   1757:        if (e1->enumerate(e1, &ts1) && e2->enumerate(e2, &ts2))
                   1758:        {
                   1759:                equal = ts1->equals(ts1, ts2);
                   1760:        }
                   1761:        e2->destroy(e2);
                   1762:        e1->destroy(e1);
                   1763: 
                   1764:        return equal;
                   1765: }
                   1766: 
                   1767: /*
                   1768:  * Described in header
                   1769:  */
                   1770: bool ikev1_child_sa_is_redundant(ike_sa_t *ike_sa, child_sa_t *child_sa,
                   1771:                                                                 bool (*cmp)(child_sa_t*,child_sa_t*))
                   1772: {
                   1773:        enumerator_t *enumerator;
                   1774:        child_sa_t *current;
                   1775:        bool redundant = FALSE;
                   1776: 
                   1777:        enumerator = ike_sa->create_child_sa_enumerator(ike_sa);
                   1778:        while (enumerator->enumerate(enumerator, &current))
                   1779:        {
                   1780:                if (current != child_sa &&
                   1781:                        current->get_state(current) == CHILD_INSTALLED &&
                   1782:                        streq(current->get_name(current), child_sa->get_name(child_sa)) &&
                   1783:                        have_equal_ts(current, child_sa, TRUE) &&
                   1784:                        have_equal_ts(current, child_sa, FALSE) &&
                   1785:                        (!cmp || cmp(child_sa, current)))
                   1786:                {
                   1787:                        DBG1(DBG_IKE, "detected redundant CHILD_SA %s{%d}",
                   1788:                                 child_sa->get_name(child_sa),
                   1789:                                 child_sa->get_unique_id(child_sa));
                   1790:                        redundant = TRUE;
                   1791:                        break;
                   1792:                }
                   1793:        }
                   1794:        enumerator->destroy(enumerator);
                   1795: 
                   1796:        return redundant;
                   1797: }
                   1798: 
                   1799: /**
                   1800:  * Compare the rekey times of two CHILD_SAs, a CHILD_SA is redundant if it is
                   1801:  * rekeyed sooner than another.
                   1802:  */
                   1803: static bool is_rekeyed_sooner(child_sa_t *is_redundant, child_sa_t *other)
                   1804: {
                   1805:        return other->get_lifetime(other, FALSE) >
                   1806:                                is_redundant->get_lifetime(is_redundant, FALSE);
                   1807: }
                   1808: 
                   1809: /**
                   1810:  * Get the first traffic selector of a CHILD_SA, local or remote
                   1811:  */
                   1812: static traffic_selector_t* get_first_ts(child_sa_t *child_sa, bool local)
                   1813: {
                   1814:        traffic_selector_t *ts = NULL;
                   1815:        enumerator_t *enumerator;
                   1816: 
                   1817:        enumerator = child_sa->create_ts_enumerator(child_sa, local);
                   1818:        enumerator->enumerate(enumerator, &ts);
                   1819:        enumerator->destroy(enumerator);
                   1820: 
                   1821:        return ts;
                   1822: }
                   1823: 
                   1824: METHOD(task_manager_t, queue_child_rekey, void,
                   1825:        private_task_manager_t *this, protocol_id_t protocol, uint32_t spi)
                   1826: {
                   1827:        child_sa_t *child_sa;
                   1828:        child_cfg_t *cfg;
                   1829:        quick_mode_t *task;
                   1830: 
                   1831:        child_sa = this->ike_sa->get_child_sa(this->ike_sa, protocol, spi, TRUE);
                   1832:        if (!child_sa)
                   1833:        {
                   1834:                child_sa = this->ike_sa->get_child_sa(this->ike_sa, protocol, spi, FALSE);
                   1835:        }
                   1836:        if (child_sa && child_sa->get_state(child_sa) == CHILD_INSTALLED)
                   1837:        {
                   1838:                if (ikev1_child_sa_is_redundant(this->ike_sa, child_sa,
                   1839:                                                                                is_rekeyed_sooner))
                   1840:                {
                   1841:                        child_sa->set_state(child_sa, CHILD_REKEYED);
                   1842:                        if (lib->settings->get_bool(lib->settings, "%s.delete_rekeyed",
                   1843:                                                                                FALSE, lib->ns))
                   1844:                        {
                   1845:                                queue_task(this, (task_t*)quick_delete_create(this->ike_sa,
                   1846:                                                                                                protocol, spi, FALSE, FALSE));
                   1847:                        }
                   1848:                }
                   1849:                else
                   1850:                {
                   1851:                        child_sa->set_state(child_sa, CHILD_REKEYING);
                   1852:                        cfg = child_sa->get_config(child_sa);
                   1853:                        task = quick_mode_create(this->ike_sa, cfg->get_ref(cfg),
                   1854:                                get_first_ts(child_sa, TRUE), get_first_ts(child_sa, FALSE));
                   1855:                        task->use_reqid(task, child_sa->get_reqid(child_sa));
                   1856:                        task->use_marks(task, child_sa->get_mark(child_sa, TRUE).value,
                   1857:                                                        child_sa->get_mark(child_sa, FALSE).value);
                   1858:                        task->use_if_ids(task, child_sa->get_if_id(child_sa, TRUE),
                   1859:                                                         child_sa->get_if_id(child_sa, FALSE));
                   1860:                        task->rekey(task, child_sa->get_spi(child_sa, TRUE));
                   1861: 
                   1862:                        queue_task(this, &task->task);
                   1863:                }
                   1864:        }
                   1865: }
                   1866: 
                   1867: METHOD(task_manager_t, queue_child_delete, void,
                   1868:        private_task_manager_t *this, protocol_id_t protocol, uint32_t spi,
                   1869:        bool expired)
                   1870: {
                   1871:        queue_task(this, (task_t*)quick_delete_create(this->ike_sa, protocol,
                   1872:                                                                                                  spi, FALSE, expired));
                   1873: }
                   1874: 
                   1875: METHOD(task_manager_t, queue_dpd, void,
                   1876:        private_task_manager_t *this)
                   1877: {
                   1878:        peer_cfg_t *peer_cfg;
                   1879:        uint32_t t, retransmit;
                   1880: 
                   1881:        queue_task(this, (task_t*)isakmp_dpd_create(this->ike_sa, DPD_R_U_THERE,
                   1882:                                                                                                this->dpd_send));
                   1883:        peer_cfg = this->ike_sa->get_peer_cfg(this->ike_sa);
                   1884: 
                   1885:        /* compute timeout in milliseconds */
                   1886:        t = 1000 * peer_cfg->get_dpd_timeout(peer_cfg);
                   1887:        if (t == 0)
                   1888:        {
                   1889:                /* use the same timeout as a retransmitting IKE message would have */
                   1890:                for (retransmit = 0; retransmit <= this->retransmit_tries; retransmit++)
                   1891:                {
                   1892:                        t += (uint32_t)(this->retransmit_timeout * 1000.0 *
                   1893:                                                        pow(this->retransmit_base, retransmit));
                   1894:                }
                   1895:        }
                   1896:        /* compensate for the already elapsed dpd delay */
                   1897:        t -= 1000 * peer_cfg->get_dpd(peer_cfg);
                   1898: 
                   1899:        /* schedule DPD timeout job */
                   1900:        lib->scheduler->schedule_job_ms(lib->scheduler,
                   1901:                (job_t*)dpd_timeout_job_create(this->ike_sa->get_id(this->ike_sa)), t);
                   1902: }
                   1903: 
                   1904: METHOD(task_manager_t, adopt_tasks, void,
                   1905:        private_task_manager_t *this, task_manager_t *other_public)
                   1906: {
                   1907:        private_task_manager_t *other = (private_task_manager_t*)other_public;
                   1908:        task_t *task;
                   1909: 
                   1910:        /* move queued tasks from other to this */
                   1911:        while (other->queued_tasks->remove_last(other->queued_tasks,
                   1912:                                                                                                (void**)&task) == SUCCESS)
                   1913:        {
                   1914:                DBG2(DBG_IKE, "migrating %N task", task_type_names, task->get_type(task));
                   1915:                task->migrate(task, this->ike_sa);
                   1916:                this->queued_tasks->insert_first(this->queued_tasks, task);
                   1917:        }
                   1918: }
                   1919: 
                   1920: METHOD(task_manager_t, busy, bool,
                   1921:        private_task_manager_t *this)
                   1922: {
                   1923:        return (this->active_tasks->get_count(this->active_tasks) > 0);
                   1924: }
                   1925: 
                   1926: METHOD(task_manager_t, incr_mid, void,
                   1927:        private_task_manager_t *this, bool initiate)
                   1928: {
                   1929: }
                   1930: 
                   1931: METHOD(task_manager_t, get_mid, uint32_t,
                   1932:        private_task_manager_t *this, bool initiate)
                   1933: {
                   1934:        return initiate ? this->initiating.mid : this->responding.mid;
                   1935: }
                   1936: 
                   1937: METHOD(task_manager_t, reset, void,
                   1938:        private_task_manager_t *this, uint32_t initiate, uint32_t respond)
                   1939: {
                   1940:        enumerator_t *enumerator;
                   1941:        task_t *task;
                   1942: 
                   1943:        /* reset message counters and retransmit packets */
                   1944:        clear_packets(this->responding.packets);
                   1945:        clear_packets(this->initiating.packets);
                   1946:        this->responding.seqnr = RESPONDING_SEQ;
                   1947:        this->responding.retransmitted = 0;
                   1948:        this->initiating.mid = 0;
                   1949:        this->initiating.seqnr = 0;
                   1950:        this->initiating.retransmitted = 0;
                   1951:        this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
                   1952:        DESTROY_IF(this->defrag);
                   1953:        this->defrag = NULL;
                   1954:        if (initiate != UINT_MAX)
                   1955:        {
                   1956:                this->dpd_send = initiate;
                   1957:        }
                   1958:        if (respond != UINT_MAX)
                   1959:        {
                   1960:                this->dpd_recv = respond;
                   1961:        }
                   1962: 
                   1963:        /* reset queued tasks */
                   1964:        enumerator = this->queued_tasks->create_enumerator(this->queued_tasks);
                   1965:        while (enumerator->enumerate(enumerator, &task))
                   1966:        {
                   1967:                task->migrate(task, this->ike_sa);
                   1968:        }
                   1969:        enumerator->destroy(enumerator);
                   1970: 
                   1971:        /* reset active tasks */
                   1972:        while (this->active_tasks->remove_last(this->active_tasks,
                   1973:                                                                                   (void**)&task) == SUCCESS)
                   1974:        {
                   1975:                task->migrate(task, this->ike_sa);
                   1976:                this->queued_tasks->insert_first(this->queued_tasks, task);
                   1977:        }
                   1978: }
                   1979: 
                   1980: /**
                   1981:  * Data for a task queue enumerator
                   1982:  */
                   1983: typedef struct {
                   1984:        enumerator_t public;
                   1985:        task_queue_t queue;
                   1986:        enumerator_t *inner;
                   1987: } task_enumerator_t;
                   1988: 
                   1989: METHOD(enumerator_t, task_enumerator_destroy, void,
                   1990:        task_enumerator_t *this)
                   1991: {
                   1992:        this->inner->destroy(this->inner);
                   1993:        free(this);
                   1994: }
                   1995: 
                   1996: METHOD(enumerator_t, task_enumerator_enumerate, bool,
                   1997:        task_enumerator_t *this, va_list args)
                   1998: {
                   1999:        task_t **task;
                   2000: 
                   2001:        VA_ARGS_VGET(args, task);
                   2002:        return this->inner->enumerate(this->inner, task);
                   2003: }
                   2004: 
                   2005: METHOD(task_manager_t, create_task_enumerator, enumerator_t*,
                   2006:        private_task_manager_t *this, task_queue_t queue)
                   2007: {
                   2008:        task_enumerator_t *enumerator;
                   2009: 
                   2010:        INIT(enumerator,
                   2011:                .public = {
                   2012:                        .enumerate = enumerator_enumerate_default,
                   2013:                        .venumerate = _task_enumerator_enumerate,
                   2014:                        .destroy = _task_enumerator_destroy,
                   2015:                },
                   2016:                .queue = queue,
                   2017:        );
                   2018:        switch (queue)
                   2019:        {
                   2020:                case TASK_QUEUE_ACTIVE:
                   2021:                        enumerator->inner = this->active_tasks->create_enumerator(
                   2022:                                                                                                                this->active_tasks);
                   2023:                        break;
                   2024:                case TASK_QUEUE_PASSIVE:
                   2025:                        enumerator->inner = this->passive_tasks->create_enumerator(
                   2026:                                                                                                                this->passive_tasks);
                   2027:                        break;
                   2028:                case TASK_QUEUE_QUEUED:
                   2029:                        enumerator->inner = this->queued_tasks->create_enumerator(
                   2030:                                                                                                                this->queued_tasks);
                   2031:                        break;
                   2032:                default:
                   2033:                        enumerator->inner = enumerator_create_empty();
                   2034:                        break;
                   2035:        }
                   2036:        return &enumerator->public;
                   2037: }
                   2038: 
                   2039: METHOD(task_manager_t, remove_task, void,
                   2040:        private_task_manager_t *this, enumerator_t *enumerator_public)
                   2041: {
                   2042:        task_enumerator_t *enumerator = (task_enumerator_t*)enumerator_public;
                   2043: 
                   2044:        switch (enumerator->queue)
                   2045:        {
                   2046:                case TASK_QUEUE_ACTIVE:
                   2047:                        this->active_tasks->remove_at(this->active_tasks,
                   2048:                                                                                  enumerator->inner);
                   2049:                        break;
                   2050:                case TASK_QUEUE_PASSIVE:
                   2051:                        this->passive_tasks->remove_at(this->passive_tasks,
                   2052:                                                                                   enumerator->inner);
                   2053:                        break;
                   2054:                case TASK_QUEUE_QUEUED:
                   2055:                        this->queued_tasks->remove_at(this->queued_tasks,
                   2056:                                                                                  enumerator->inner);
                   2057:                        break;
                   2058:                default:
                   2059:                        break;
                   2060:        }
                   2061: }
                   2062: 
                   2063: METHOD(task_manager_t, destroy, void,
                   2064:        private_task_manager_t *this)
                   2065: {
                   2066:        flush(this);
                   2067: 
                   2068:        this->active_tasks->destroy(this->active_tasks);
                   2069:        this->queued_tasks->destroy(this->queued_tasks);
                   2070:        this->passive_tasks->destroy(this->passive_tasks);
                   2071:        DESTROY_IF(this->defrag);
                   2072: 
                   2073:        DESTROY_IF(this->queued);
                   2074:        clear_packets(this->responding.packets);
                   2075:        array_destroy(this->responding.packets);
                   2076:        clear_packets(this->initiating.packets);
                   2077:        array_destroy(this->initiating.packets);
                   2078:        DESTROY_IF(this->rng);
                   2079:        free(this);
                   2080: }
                   2081: 
                   2082: /*
                   2083:  * see header file
                   2084:  */
                   2085: task_manager_v1_t *task_manager_v1_create(ike_sa_t *ike_sa)
                   2086: {
                   2087:        private_task_manager_t *this;
                   2088: 
                   2089:        INIT(this,
                   2090:                .public = {
                   2091:                        .task_manager = {
                   2092:                                .process_message = _process_message,
                   2093:                                .queue_task = _queue_task,
                   2094:                                .queue_task_delayed = _queue_task_delayed,
                   2095:                                .queue_ike = _queue_ike,
                   2096:                                .queue_ike_rekey = _queue_ike_rekey,
                   2097:                                .queue_ike_reauth = _queue_ike_reauth,
                   2098:                                .queue_ike_delete = _queue_ike_delete,
                   2099:                                .queue_mobike = _queue_mobike,
                   2100:                                .queue_child = _queue_child,
                   2101:                                .queue_child_rekey = _queue_child_rekey,
                   2102:                                .queue_child_delete = _queue_child_delete,
                   2103:                                .queue_dpd = _queue_dpd,
                   2104:                                .initiate = _initiate,
                   2105:                                .retransmit = _retransmit,
                   2106:                                .incr_mid = _incr_mid,
                   2107:                                .get_mid = _get_mid,
                   2108:                                .reset = _reset,
                   2109:                                .adopt_tasks = _adopt_tasks,
                   2110:                                .busy = _busy,
                   2111:                                .create_task_enumerator = _create_task_enumerator,
                   2112:                                .remove_task = _remove_task,
                   2113:                                .flush = _flush,
                   2114:                                .flush_queue = _flush_queue,
                   2115:                                .destroy = _destroy,
                   2116:                        },
                   2117:                },
                   2118:                .initiating = {
                   2119:                        .type = EXCHANGE_TYPE_UNDEFINED,
                   2120:                },
                   2121:                .responding = {
                   2122:                        .seqnr = RESPONDING_SEQ,
                   2123:                },
                   2124:                .ike_sa = ike_sa,
                   2125:                .rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK),
                   2126:                .queued_tasks = linked_list_create(),
                   2127:                .active_tasks = linked_list_create(),
                   2128:                .passive_tasks = linked_list_create(),
                   2129:                .retransmit_tries = lib->settings->get_int(lib->settings,
                   2130:                                        "%s.retransmit_tries", RETRANSMIT_TRIES, lib->ns),
                   2131:                .retransmit_timeout = lib->settings->get_double(lib->settings,
                   2132:                                        "%s.retransmit_timeout", RETRANSMIT_TIMEOUT, lib->ns),
                   2133:                .retransmit_base = lib->settings->get_double(lib->settings,
                   2134:                                        "%s.retransmit_base", RETRANSMIT_BASE, lib->ns),
                   2135:                .retransmit_jitter = min(lib->settings->get_int(lib->settings,
                   2136:                                        "%s.retransmit_jitter", 0, lib->ns), RETRANSMIT_JITTER_MAX),
                   2137:                .retransmit_limit = lib->settings->get_int(lib->settings,
                   2138:                                        "%s.retransmit_limit", 0, lib->ns) * 1000,
                   2139:        );
                   2140: 
                   2141:        if (!this->rng)
                   2142:        {
                   2143:                DBG1(DBG_IKE, "no RNG found, unable to create IKE_SA");
                   2144:                destroy(this);
                   2145:                return NULL;
                   2146:        }
                   2147:        if (!this->rng->get_bytes(this->rng, sizeof(this->dpd_send),
                   2148:                                                          (void*)&this->dpd_send))
                   2149:        {
                   2150:                DBG1(DBG_IKE, "failed to allocate message ID, unable to create IKE_SA");
                   2151:                destroy(this);
                   2152:                return NULL;
                   2153:        }
                   2154:        this->dpd_send &= 0x7FFFFFFF;
                   2155: 
1.1.1.2 ! misho    2156:        if (this->retransmit_base > 1)
        !          2157:        {       /* based on 1000 * timeout * base^try */
        !          2158:                this->retransmit_tries_max = log(UINT32_MAX/
        !          2159:                                                                                 (1000.0 * this->retransmit_timeout))/
        !          2160:                                                                         log(this->retransmit_base);
        !          2161:        }
1.1       misho    2162:        return &this->public;
                   2163: }

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