Annotation of embedaddon/strongswan/src/libcharon/processing/jobs/process_message_job.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2005-2007 Martin Willi
                      3:  * Copyright (C) 2005 Jan Hutter
                      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 "process_message_job.h"
                     18: 
                     19: #include <daemon.h>
                     20: 
                     21: typedef struct private_process_message_job_t private_process_message_job_t;
                     22: 
                     23: /**
                     24:  * Private data of an process_message_job_t Object
                     25:  */
                     26: struct private_process_message_job_t {
                     27:        /**
                     28:         * public process_message_job_t interface
                     29:         */
                     30:        process_message_job_t public;
                     31: 
                     32:        /**
                     33:         * Message associated with this job
                     34:         */
                     35:        message_t *message;
                     36: };
                     37: 
                     38: METHOD(job_t, destroy, void,
                     39:        private_process_message_job_t *this)
                     40: {
                     41:        this->message->destroy(this->message);
                     42:        free(this);
                     43: }
                     44: 
                     45: METHOD(job_t, execute, job_requeue_t,
                     46:        private_process_message_job_t *this)
                     47: {
                     48:        ike_sa_t *ike_sa;
                     49: 
                     50: #ifdef ME
                     51:        /* if this is an unencrypted INFORMATIONAL exchange it is likely a
                     52:         * connectivity check. */
                     53:        if (this->message->get_exchange_type(this->message) == INFORMATIONAL &&
                     54:                this->message->get_first_payload_type(this->message) != PLV2_ENCRYPTED)
                     55:        {
                     56:                /* theoretically this could also be an error message
                     57:                 * see RFC 4306, section 1.5. */
                     58:                DBG1(DBG_NET, "received unencrypted informational: from %#H to %#H",
                     59:                         this->message->get_source(this->message),
                     60:                         this->message->get_destination(this->message));
                     61:                charon->connect_manager->process_check(charon->connect_manager, this->message);
                     62:                return JOB_REQUEUE_NONE;
                     63:        }
                     64: #endif /* ME */
                     65: 
                     66:        ike_sa = charon->ike_sa_manager->checkout_by_message(charon->ike_sa_manager,
                     67:                                                                                                                 this->message);
                     68:        if (ike_sa)
                     69:        {
                     70:                DBG1(DBG_NET, "received packet: from %#H to %#H (%zu bytes)",
                     71:                         this->message->get_source(this->message),
                     72:                         this->message->get_destination(this->message),
                     73:                         this->message->get_packet_data(this->message).len);
                     74:                if (ike_sa->process_message(ike_sa, this->message) == DESTROY_ME)
                     75:                {
                     76:                        charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager,
                     77:                                                                                                                ike_sa);
                     78:                }
                     79:                else
                     80:                {
                     81:                        charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
                     82:                }
                     83:        }
                     84:        return JOB_REQUEUE_NONE;
                     85: }
                     86: 
                     87: METHOD(job_t, get_priority, job_priority_t,
                     88:        private_process_message_job_t *this)
                     89: {
                     90:        switch (this->message->get_exchange_type(this->message))
                     91:        {
                     92:                case IKE_AUTH:
                     93:                        /* IKE auth is rather expensive and often blocking, low priority */
                     94:                case AGGRESSIVE:
                     95:                case ID_PROT:
                     96:                        /* AM is basically IKE_SA_INIT/IKE_AUTH combined (without EAP/XAuth)
                     97:                         * MM is similar, but stretched out more */
                     98:                        return JOB_PRIO_LOW;
                     99:                case INFORMATIONAL:
                    100:                case INFORMATIONAL_V1:
                    101:                        /* INFORMATIONALs are inexpensive, for DPD we should have low
                    102:                         * reaction times */
                    103:                        return JOB_PRIO_HIGH;
                    104:                case IKE_SA_INIT:
                    105:                        /* IKE_SA_INIT is expensive, but we will drop them in the receiver
                    106:                         * if we are overloaded */
                    107:                case CREATE_CHILD_SA:
                    108:                case QUICK_MODE:
                    109:                        /* these may require DH, but if not they are relatively cheap */
                    110:                case TRANSACTION:
                    111:                        /* these are mostly cheap, however, if XAuth via RADIUS is used
                    112:                         * they may block */
                    113:                default:
                    114:                        return JOB_PRIO_MEDIUM;
                    115:        }
                    116: }
                    117: 
                    118: /*
                    119:  * Described in header
                    120:  */
                    121: process_message_job_t *process_message_job_create(message_t *message)
                    122: {
                    123:        private_process_message_job_t *this;
                    124: 
                    125:        INIT(this,
                    126:                .public = {
                    127:                        .job_interface = {
                    128:                                .execute = _execute,
                    129:                                .get_priority = _get_priority,
                    130:                                .destroy = _destroy,
                    131:                        },
                    132:                },
                    133:                .message = message,
                    134:        );
                    135: 
                    136:        return &(this->public);
                    137: }

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