Annotation of embedaddon/strongswan/src/libstrongswan/selectors/traffic_selector.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2007-2017 Tobias Brunner
        !             3:  * Copyright (C) 2005-2006 Martin Willi
        !             4:  * Copyright (C) 2005 Jan Hutter
        !             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: /**
        !            19:  * @defgroup traffic_selector traffic_selector
        !            20:  * @{ @ingroup selectors
        !            21:  */
        !            22: 
        !            23: #ifndef TRAFFIC_SELECTOR_H_
        !            24: #define TRAFFIC_SELECTOR_H_
        !            25: 
        !            26: typedef enum ts_type_t ts_type_t;
        !            27: typedef struct traffic_selector_t traffic_selector_t;
        !            28: 
        !            29: #include <library.h>
        !            30: #include <networking/host.h>
        !            31: 
        !            32: /**
        !            33:  * Traffic selector types.
        !            34:  */
        !            35: enum ts_type_t {
        !            36: 
        !            37:        /**
        !            38:         * A range of IPv4 addresses, represented by two four (4) octet
        !            39:         * values.  The first value is the beginning IPv4 address
        !            40:         * (inclusive) and the second value is the ending IPv4 address
        !            41:         * (inclusive). All addresses falling between the two specified
        !            42:         * addresses are considered to be within the list.
        !            43:         */
        !            44:        TS_IPV4_ADDR_RANGE = 7,
        !            45: 
        !            46:        /**
        !            47:         * A range of IPv6 addresses, represented by two sixteen (16)
        !            48:         * octet values.  The first value is the beginning IPv6 address
        !            49:         * (inclusive) and the second value is the ending IPv6 address
        !            50:         * (inclusive). All addresses falling between the two specified
        !            51:         *  addresses are considered to be within the list.
        !            52:         */
        !            53:        TS_IPV6_ADDR_RANGE = 8
        !            54: };
        !            55: 
        !            56: /**
        !            57:  * enum names for ts_type_t
        !            58:  */
        !            59: extern enum_name_t *ts_type_name;
        !            60: 
        !            61: /**
        !            62:  * Object representing a traffic selector entry.
        !            63:  *
        !            64:  * A traffic selector defines an range of addresses
        !            65:  * and a range of ports.
        !            66:  *
        !            67:  * If the protocol is ICMP or ICMPv6 the ICMP type and code are stored in the
        !            68:  * port field as follows:  The message type is placed in the most significant
        !            69:  * 8 bits and the code in the least significant 8 bits.  Utility functions are
        !            70:  * provided to extract the individual values.
        !            71:  */
        !            72: struct traffic_selector_t {
        !            73: 
        !            74:        /**
        !            75:         * Compare two traffic selectors, and create a new one
        !            76:         * which is the largest subset of both (subnet & port).
        !            77:         *
        !            78:         * Resulting traffic_selector is newly created and must be destroyed.
        !            79:         *
        !            80:         * @param other         traffic selector to compare
        !            81:         * @return
        !            82:         *                                      - created subset of them
        !            83:         *                                      - or NULL if no match between this and other
        !            84:         */
        !            85:        traffic_selector_t *(*get_subset)(traffic_selector_t *this,
        !            86:                                                                          traffic_selector_t *other);
        !            87: 
        !            88:        /**
        !            89:         * Clone a traffic selector.
        !            90:         *
        !            91:         * @return                      clone of it
        !            92:         */
        !            93:        traffic_selector_t *(*clone)(traffic_selector_t *this);
        !            94: 
        !            95:        /**
        !            96:         * Get starting address of this ts as a chunk.
        !            97:         *
        !            98:         * Chunk is in network order and points to internal data.
        !            99:         *
        !           100:         * @return                      chunk containing the address
        !           101:         */
        !           102:        chunk_t (*get_from_address)(traffic_selector_t *this);
        !           103: 
        !           104:        /**
        !           105:         * Get ending address of this ts as a chunk.
        !           106:         *
        !           107:         * Chunk is in network order and points to internal data.
        !           108:         *
        !           109:         * @return                      chunk containing the address
        !           110:         */
        !           111:        chunk_t (*get_to_address)(traffic_selector_t *this);
        !           112: 
        !           113:        /**
        !           114:         * Get starting port of this ts.
        !           115:         *
        !           116:         * Port is in host order, since the parser converts it.
        !           117:         *
        !           118:         * If the protocol is ICMP/ICMPv6 the ICMP type and code are stored in this
        !           119:         * field as follows:  The message type is placed in the most significant
        !           120:         * 8 bits and the code in the least significant 8 bits.  Use the utility
        !           121:         * functions to extract them.
        !           122:         *
        !           123:         * @return                      port
        !           124:         */
        !           125:        uint16_t (*get_from_port)(traffic_selector_t *this);
        !           126: 
        !           127:        /**
        !           128:         * Get ending port of this ts.
        !           129:         *
        !           130:         * Port is in host order, since the parser converts it.
        !           131:         *
        !           132:         * If the protocol is ICMP/ICMPv6 the ICMP type and code are stored in this
        !           133:         * field as follows:  The message type is placed in the most significant
        !           134:         * 8 bits and the code in the least significant 8 bits.  Use the utility
        !           135:         * functions to extract them.
        !           136:         *
        !           137:         * @return                      port
        !           138:         */
        !           139:        uint16_t (*get_to_port)(traffic_selector_t *this);
        !           140: 
        !           141:        /**
        !           142:         * Get the type of the traffic selector.
        !           143:         *
        !           144:         * @return                      ts_type_t specifying the type
        !           145:         */
        !           146:        ts_type_t (*get_type)(traffic_selector_t *this);
        !           147: 
        !           148:        /**
        !           149:         * Get the protocol id of this ts.
        !           150:         *
        !           151:         * @return                      protocol id
        !           152:         */
        !           153:        uint8_t (*get_protocol)(traffic_selector_t *this);
        !           154: 
        !           155:        /**
        !           156:         * Check if the traffic selector is for a single host.
        !           157:         *
        !           158:         * Traffic selector may describe the end of *-to-host tunnel. In this
        !           159:         * case, the address range is a single address equal to the hosts
        !           160:         * peer address.
        !           161:         *
        !           162:         * If host is specified, the traffic selector must equal that specific
        !           163:         * IP address.  If it is not specified, TRUE is also returned for dynamic
        !           164:         * traffic selectors.
        !           165:         *
        !           166:         * @param host          IP address to check for, or NULL
        !           167:         * @return                      TRUE if TS is for a single host
        !           168:         */
        !           169:        bool (*is_host)(traffic_selector_t *this, host_t* host);
        !           170: 
        !           171:        /**
        !           172:         * Check if this traffic selector was created by
        !           173:         * traffic_selector_create_dynamic() but no address has yet been set with
        !           174:         * set_address().
        !           175:         *
        !           176:         * @return                      TRUE if TS is dynamic
        !           177:         */
        !           178:        bool (*is_dynamic)(traffic_selector_t *this);
        !           179: 
        !           180:        /**
        !           181:         * Set the traffic selector to the given IP address.
        !           182:         *
        !           183:         * If host is %any or %any6 the traffic selector gets set to 0.0.0.0/0 or
        !           184:         * ::/0, respectively.
        !           185:         *
        !           186:         * Checking is_host(), is_dynamic() or includes() might be appropriate
        !           187:         * before calling this.
        !           188:         *
        !           189:         * is_dynamic() will return FALSE after calling this.
        !           190:         *
        !           191:         * @param host          target IP address
        !           192:         */
        !           193:        void (*set_address)(traffic_selector_t *this, host_t* host);
        !           194: 
        !           195:        /**
        !           196:         * Compare two traffic selectors for equality.
        !           197:         *
        !           198:         * @param other         ts to compare with this
        !           199:         * @return                      TRUE if equal, FALSE otherwise
        !           200:         */
        !           201:        bool (*equals)(traffic_selector_t *this, traffic_selector_t *other);
        !           202: 
        !           203:        /**
        !           204:         * Check if a traffic selector is contained completely in another.
        !           205:         *
        !           206:         * contains() allows to check if multiple traffic selectors are redundant.
        !           207:         *
        !           208:         * @param other         ts that contains this
        !           209:         * @return                      TRUE if other contains this completely, FALSE otherwise
        !           210:         */
        !           211:        bool (*is_contained_in)(traffic_selector_t *this, traffic_selector_t *other);
        !           212: 
        !           213:        /**
        !           214:         * Check if a specific host is included in the address range of
        !           215:         * this traffic selector.
        !           216:         *
        !           217:         * @param host          the host to check
        !           218:         */
        !           219:        bool (*includes)(traffic_selector_t *this, host_t *host);
        !           220: 
        !           221:        /**
        !           222:         * Convert a traffic selector address range to a subnet
        !           223:         * and its net mask.
        !           224:         * If from and to ports of this traffic selector are equal,
        !           225:         * the port of the returned host_t is set to that port.
        !           226:         *
        !           227:         * @param net           converted subnet (has to be freed)
        !           228:         * @param mask          converted net mask
        !           229:         * @return                      TRUE if traffic selector matches exactly to the subnet
        !           230:         */
        !           231:        bool (*to_subnet)(traffic_selector_t *this, host_t **net, uint8_t *mask);
        !           232: 
        !           233:        /**
        !           234:         * Create a hash value for the traffic selector.
        !           235:         *
        !           236:         * @param inc           optional value for incremental hashing
        !           237:         * @return                      calculated hash value for the traffic selector
        !           238:         */
        !           239:        u_int (*hash)(traffic_selector_t *this, u_int inc);
        !           240: 
        !           241:        /**
        !           242:         * Destroys the ts object
        !           243:         */
        !           244:        void (*destroy)(traffic_selector_t *this);
        !           245: };
        !           246: 
        !           247: /**
        !           248:  * Extract the ICMP/ICMPv6 message type from a port in host order
        !           249:  *
        !           250:  * @param port                 port number in host order
        !           251:  * @return                             ICMP/ICMPv6 message type
        !           252:  */
        !           253: static inline uint8_t traffic_selector_icmp_type(uint16_t port)
        !           254: {
        !           255:        return port >> 8;
        !           256: }
        !           257: 
        !           258: /**
        !           259:  * Extract the ICMP/ICMPv6 message code from a port in host order
        !           260:  *
        !           261:  * @param port                 port number in host order
        !           262:  * @return                             ICMP/ICMPv6 message code
        !           263:  */
        !           264: static inline uint8_t traffic_selector_icmp_code(uint16_t port)
        !           265: {
        !           266:        return port & 0xff;
        !           267: }
        !           268: 
        !           269: /**
        !           270:  * Compare two traffic selectors, usable as sort function
        !           271:  *
        !           272:  * @param a                            first selector to compare
        !           273:  * @param b                            second selector to compare
        !           274:  * @param opts                 optional sort options, currently unused
        !           275:  * @return                             > 0 if a > b, 0 if a == b, < 0 if a < b
        !           276:  */
        !           277: int traffic_selector_cmp(traffic_selector_t *a, traffic_selector_t *b,
        !           278:                                                 void *opts);
        !           279: 
        !           280: /**
        !           281:  * Create a new traffic selector using human readable params.
        !           282:  *
        !           283:  * If protocol is ICMP or ICMPv6 the ports are interpreted as follows:  If they
        !           284:  * are less than 256 the value is assumed to be a message type, if they are
        !           285:  * greater or equal to 256 they are assumed to be type and code as defined
        !           286:  * for traffic_selector_t.
        !           287:  *
        !           288:  * @param protocol             protocol for this ts, such as TCP or UDP
        !           289:  * @param type                 type of following addresses, such as TS_IPV4_ADDR_RANGE
        !           290:  * @param from_addr            start of address range as string
        !           291:  * @param from_port            port number in host order
        !           292:  * @param to_addr              end of address range as string
        !           293:  * @param to_port              port number in host order
        !           294:  * @return
        !           295:  *                                             - traffic_selector_t object
        !           296:  *                                             - NULL if invalid address strings/protocol
        !           297:  */
        !           298: traffic_selector_t *traffic_selector_create_from_string(
        !           299:                                                                        uint8_t protocol, ts_type_t type,
        !           300:                                                                        char *from_addr, uint16_t from_port,
        !           301:                                                                        char *to_addr, uint16_t to_port);
        !           302: 
        !           303: 
        !           304: 
        !           305: /**
        !           306:  * Create a traffic selector from a CIDR string.
        !           307:  *
        !           308:  * If protocol is ICMP or ICMPv6 the ports are interpreted as follows:  If they
        !           309:  * are less than 256 the value is assumed to be a message type, if they are
        !           310:  * greater or equal to 256 they are assumed to be type and code as defined
        !           311:  * for traffic_selector_t.
        !           312:  *
        !           313:  * @param string               CIDR string, such as 10.1.0.0/16
        !           314:  * @param protocol             protocol for this ts, such as TCP or UDP
        !           315:  * @param from_port            start of allowed port range
        !           316:  * @param to_port              end of port range
        !           317:  * @return                             traffic selector, NULL if string invalid
        !           318:  */
        !           319: traffic_selector_t *traffic_selector_create_from_cidr(
        !           320:                                                                                char *string, uint8_t protocol,
        !           321:                                                                                uint16_t from_port, uint16_t to_port);
        !           322: 
        !           323: /**
        !           324:  * Create a new traffic selector using data read from the net.
        !           325:  *
        !           326:  * There exists a mix of network and host order in the params.
        !           327:  * But the parser gives us this data in this format, so we
        !           328:  * don't have to convert twice.
        !           329:  *
        !           330:  * If protocol is ICMP or ICMPv6 the ports are interpreted as follows:  If they
        !           331:  * are less than 256 the value is assumed to be a message type, if they are
        !           332:  * greater or equal to 256 they are assumed to be type and code as defined
        !           333:  * for traffic_selector_t.
        !           334:  *
        !           335:  * @param protocol             protocol for this ts, such as TCP or UDP
        !           336:  * @param type                 type of following addresses, such as TS_IPV4_ADDR_RANGE
        !           337:  * @param from_address start of address range, network order
        !           338:  * @param from_port            port number, host order
        !           339:  * @param to_address   end of address range, network order
        !           340:  * @param to_port              port number, host order
        !           341:  * @return                             traffic_selector_t object
        !           342:  */
        !           343: traffic_selector_t *traffic_selector_create_from_bytes(
        !           344:                                                                uint8_t protocol, ts_type_t type,
        !           345:                                                                chunk_t from_address, uint16_t from_port,
        !           346:                                                                chunk_t to_address, uint16_t to_port);
        !           347: 
        !           348: /**
        !           349:  * Create a new traffic selector using the RFC 3779 ASN.1 min/max address format
        !           350:  *
        !           351:  * @param type                 type of following addresses, such as TS_IPV4_ADDR_RANGE
        !           352:  * @param from_addr            start of address range in RFC 3779 ASN.1 BIT STRING format
        !           353:  * @param to_addr              end of address range in RFC 3779 ASN.1 BIT STRING format
        !           354:  * @return                             traffic_selector_t object
        !           355:  */
        !           356: traffic_selector_t *traffic_selector_create_from_rfc3779_format(ts_type_t type,
        !           357:                                                                chunk_t from_addr, chunk_t to_addr);
        !           358: 
        !           359: /**
        !           360:  * Create a new traffic selector defining a whole subnet.
        !           361:  *
        !           362:  * In most cases, definition of a traffic selector for full subnets
        !           363:  * is sufficient. This constructor creates a traffic selector for
        !           364:  * all protocols, all ports and the address range specified by the
        !           365:  * subnet.
        !           366:  * Additionally, a protocol and ports may be specified.
        !           367:  *
        !           368:  * If protocol is ICMP or ICMPv6 the ports are interpreted as follows:  If they
        !           369:  * are less than 256 the value is assumed to be a message type, if they are
        !           370:  * greater or equal to 256 they are assumed to be type and code as defined
        !           371:  * for traffic_selector_t.
        !           372:  *
        !           373:  * @param net                  subnet to use
        !           374:  * @param netbits              size of the subnet, as used in e.g. 192.168.0.0/24 notation
        !           375:  * @param protocol             protocol for this ts, such as TCP or UDP
        !           376:  * @param from_port            start of allowed port range
        !           377:  * @param to_port              end of port range
        !           378:  * @return
        !           379:  *                                             - traffic_selector_t object
        !           380:  *                                             - NULL if address family of net not supported
        !           381:  */
        !           382: traffic_selector_t *traffic_selector_create_from_subnet(
        !           383:                                                        host_t *net, uint8_t netbits, uint8_t protocol,
        !           384:                                                        uint16_t from_port, uint16_t to_port);
        !           385: 
        !           386: /**
        !           387:  * Create a traffic selector for host-to-host cases.
        !           388:  *
        !           389:  * For host2host or virtual IP setups, the traffic selectors gets
        !           390:  * created at runtime using the external/virtual IP. Using this constructor,
        !           391:  * a call to set_address() sets this traffic selector to the supplied host.
        !           392:  *
        !           393:  * If protocol is ICMP or ICMPv6 the ports are interpreted as follows:  If they
        !           394:  * are less than 256 the value is assumed to be a message type, if they are
        !           395:  * greater or equal to 256 they are assumed to be type and code as defined
        !           396:  * for traffic_selector_t.
        !           397:  *
        !           398:  * @param protocol             upper layer protocol to allow
        !           399:  * @param from_port            start of allowed port range
        !           400:  * @param to_port              end of range
        !           401:  * @return
        !           402:  *                                             - traffic_selector_t object
        !           403:  *                                             - NULL if type not supported
        !           404:  */
        !           405: traffic_selector_t *traffic_selector_create_dynamic(uint8_t protocol,
        !           406:                                                                        uint16_t from_port, uint16_t to_port);
        !           407: 
        !           408: /**
        !           409:  * printf hook function for traffic_selector_t.
        !           410:  *
        !           411:  * Arguments are:
        !           412:  *     traffic_selector_t *ts
        !           413:  * With the #-specifier, arguments are:
        !           414:  *     linked_list_t *list containing traffic_selector_t*
        !           415:  */
        !           416: int traffic_selector_printf_hook(printf_hook_data_t *data,
        !           417:                                                        printf_hook_spec_t *spec, const void *const *args);
        !           418: 
        !           419: #endif /** TRAFFIC_SELECTOR_H_ @}*/

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