Annotation of embedaddon/strongswan/src/libipsec/ipsec_policy.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2012 Tobias Brunner
        !             3:  * Copyright (C) 2012 Giuliano Grassi
        !             4:  * Copyright (C) 2012 Ralf Sager
        !             5:  * HSR Hochschule fuer Technik Rapperswil
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or modify it
        !             8:  * under the terms of the GNU General Public License as published by the
        !             9:  * Free Software Foundation; either version 2 of the License, or (at your
        !            10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            15:  * for more details.
        !            16:  */
        !            17: 
        !            18: #include "ipsec_policy.h"
        !            19: 
        !            20: #include <utils/debug.h>
        !            21: 
        !            22: typedef struct private_ipsec_policy_t private_ipsec_policy_t;
        !            23: 
        !            24: /**
        !            25:  * Private additions to ipsec_policy_t.
        !            26:  */
        !            27: struct private_ipsec_policy_t {
        !            28: 
        !            29:        /**
        !            30:         * Public members
        !            31:         */
        !            32:        ipsec_policy_t public;
        !            33: 
        !            34:        /**
        !            35:         * SA source address
        !            36:         */
        !            37:        host_t *src;
        !            38: 
        !            39:        /**
        !            40:         * SA destination address
        !            41:         */
        !            42:        host_t *dst;
        !            43: 
        !            44:        /**
        !            45:         * Source traffic selector
        !            46:         */
        !            47:        traffic_selector_t *src_ts;
        !            48: 
        !            49:        /**
        !            50:         * Destination traffic selector
        !            51:         */
        !            52:        traffic_selector_t *dst_ts;
        !            53: 
        !            54:        /**
        !            55:         * If any of the two TS has a protocol selector we cache it here
        !            56:         */
        !            57:        uint8_t protocol;
        !            58: 
        !            59:        /**
        !            60:         * Traffic direction
        !            61:         */
        !            62:        policy_dir_t direction;
        !            63: 
        !            64:        /**
        !            65:         * Policy type
        !            66:         */
        !            67:        policy_type_t type;
        !            68: 
        !            69:        /**
        !            70:         * SA configuration
        !            71:         */
        !            72:        ipsec_sa_cfg_t sa;
        !            73: 
        !            74:        /**
        !            75:         * Mark
        !            76:         */
        !            77:        mark_t mark;
        !            78: 
        !            79:        /**
        !            80:         * Policy priority
        !            81:         */
        !            82:        policy_priority_t priority;
        !            83: 
        !            84:        /**
        !            85:         * Reference counter
        !            86:         */
        !            87:        refcount_t refcount;
        !            88: 
        !            89: };
        !            90: 
        !            91: METHOD(ipsec_policy_t, match, bool,
        !            92:        private_ipsec_policy_t *this, traffic_selector_t *src_ts,
        !            93:        traffic_selector_t *dst_ts, policy_dir_t direction, uint32_t reqid,
        !            94:        mark_t mark, policy_priority_t priority)
        !            95: {
        !            96:        return (this->direction == direction &&
        !            97:                        this->priority == priority &&
        !            98:                        this->sa.reqid == reqid &&
        !            99:                        memeq(&this->mark, &mark, sizeof(mark_t)) &&
        !           100:                        this->src_ts->equals(this->src_ts, src_ts) &&
        !           101:                        this->dst_ts->equals(this->dst_ts, dst_ts));
        !           102: }
        !           103: 
        !           104: /**
        !           105:  * Match the port of the given host against the given traffic selector.
        !           106:  */
        !           107: static inline bool match_port(traffic_selector_t *ts, host_t *host)
        !           108: {
        !           109:        uint16_t from, to, port;
        !           110: 
        !           111:        from = ts->get_from_port(ts);
        !           112:        to = ts->get_to_port(ts);
        !           113:        if ((from == 0 && to == 0xffff) ||
        !           114:                (from == 0xffff && to == 0))
        !           115:        {
        !           116:                return TRUE;
        !           117:        }
        !           118:        port = host->get_port(host);
        !           119:        return from <= port && port <= to;
        !           120: }
        !           121: 
        !           122: METHOD(ipsec_policy_t, match_packet, bool,
        !           123:        private_ipsec_policy_t *this, ip_packet_t *packet)
        !           124: {
        !           125:        uint8_t proto = packet->get_next_header(packet);
        !           126:        host_t *src = packet->get_source(packet),
        !           127:                   *dst = packet->get_destination(packet);
        !           128: 
        !           129:        return (!this->protocol || this->protocol == proto) &&
        !           130:                   this->src_ts->includes(this->src_ts, src) &&
        !           131:                   match_port(this->src_ts, src) &&
        !           132:                   this->dst_ts->includes(this->dst_ts, dst) &&
        !           133:                   match_port(this->dst_ts, dst);
        !           134: }
        !           135: 
        !           136: METHOD(ipsec_policy_t, get_source_ts, traffic_selector_t*,
        !           137:        private_ipsec_policy_t *this)
        !           138: {
        !           139:        return this->src_ts;
        !           140: }
        !           141: 
        !           142: METHOD(ipsec_policy_t, get_destination_ts, traffic_selector_t*,
        !           143:        private_ipsec_policy_t *this)
        !           144: {
        !           145:        return this->dst_ts;
        !           146: }
        !           147: 
        !           148: METHOD(ipsec_policy_t, get_reqid, uint32_t,
        !           149:        private_ipsec_policy_t *this)
        !           150: {
        !           151:        return this->sa.reqid;
        !           152: }
        !           153: 
        !           154: METHOD(ipsec_policy_t, get_direction, policy_dir_t,
        !           155:        private_ipsec_policy_t *this)
        !           156: {
        !           157:        return this->direction;
        !           158: }
        !           159: 
        !           160: METHOD(ipsec_policy_t, get_priority, policy_priority_t,
        !           161:        private_ipsec_policy_t *this)
        !           162: {
        !           163:        return this->priority;
        !           164: }
        !           165: 
        !           166: METHOD(ipsec_policy_t, get_type, policy_type_t,
        !           167:        private_ipsec_policy_t *this)
        !           168: {
        !           169:        return this->type;
        !           170: }
        !           171: 
        !           172: METHOD(ipsec_policy_t, get_ref, ipsec_policy_t*,
        !           173:        private_ipsec_policy_t *this)
        !           174: {
        !           175:        ref_get(&this->refcount);
        !           176:        return &this->public;
        !           177: }
        !           178: 
        !           179: METHOD(ipsec_policy_t, destroy, void,
        !           180:                private_ipsec_policy_t *this)
        !           181: {
        !           182:        if (ref_put(&this->refcount))
        !           183:        {
        !           184:                this->src->destroy(this->src);
        !           185:                this->dst->destroy(this->dst);
        !           186:                this->src_ts->destroy(this->src_ts);
        !           187:                this->dst_ts->destroy(this->dst_ts);
        !           188:                free(this);
        !           189:        }
        !           190: }
        !           191: 
        !           192: /**
        !           193:  * Described in header.
        !           194:  */
        !           195: ipsec_policy_t *ipsec_policy_create(host_t *src, host_t *dst,
        !           196:                                                                        traffic_selector_t *src_ts,
        !           197:                                                                        traffic_selector_t *dst_ts,
        !           198:                                                                        policy_dir_t direction, policy_type_t type,
        !           199:                                                                        ipsec_sa_cfg_t *sa, mark_t mark,
        !           200:                                                                        policy_priority_t priority)
        !           201: {
        !           202:        private_ipsec_policy_t *this;
        !           203: 
        !           204:        INIT(this,
        !           205:                .public = {
        !           206:                        .match = _match,
        !           207:                        .match_packet = _match_packet,
        !           208:                        .get_source_ts = _get_source_ts,
        !           209:                        .get_destination_ts = _get_destination_ts,
        !           210:                        .get_direction = _get_direction,
        !           211:                        .get_priority = _get_priority,
        !           212:                        .get_reqid = _get_reqid,
        !           213:                        .get_type = _get_type,
        !           214:                        .get_ref = _get_ref,
        !           215:                        .destroy = _destroy,
        !           216:                },
        !           217:                .src = src->clone(src),
        !           218:                .dst = dst->clone(dst),
        !           219:                .src_ts = src_ts->clone(src_ts),
        !           220:                .dst_ts = dst_ts->clone(dst_ts),
        !           221:                .protocol = max(src_ts->get_protocol(src_ts),
        !           222:                                                dst_ts->get_protocol(dst_ts)),
        !           223:                .direction = direction,
        !           224:                .type = type,
        !           225:                .sa = *sa,
        !           226:                .mark = mark,
        !           227:                .priority = priority,
        !           228:                .refcount = 1,
        !           229:        );
        !           230: 
        !           231:        return &this->public;
        !           232: }

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