Annotation of embedaddon/strongswan/src/libcharon/kernel/kernel_ipsec.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2016 Andreas Steffen
                      3:  * Copyright (C) 2006-2018 Tobias Brunner
                      4:  * Copyright (C) 2006 Daniel Roethlisberger
                      5:  * Copyright (C) 2005-2006 Martin Willi
                      6:  * Copyright (C) 2005 Jan Hutter
                      7:  * HSR Hochschule fuer Technik Rapperswil
                      8:  *
                      9:  * This program is free software; you can redistribute it and/or modify it
                     10:  * under the terms of the GNU General Public License as published by the
                     11:  * Free Software Foundation; either version 2 of the License, or (at your
                     12:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     13:  *
                     14:  * This program is distributed in the hope that it will be useful, but
                     15:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     16:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     17:  * for more details.
                     18:  */
                     19: 
                     20: /**
                     21:  * @defgroup kernel_ipsec kernel_ipsec
                     22:  * @{ @ingroup kernel
                     23:  */
                     24: 
                     25: #ifndef KERNEL_IPSEC_H_
                     26: #define KERNEL_IPSEC_H_
                     27: 
                     28: typedef struct kernel_ipsec_t kernel_ipsec_t;
                     29: typedef struct kernel_ipsec_sa_id_t kernel_ipsec_sa_id_t;
                     30: typedef struct kernel_ipsec_add_sa_t kernel_ipsec_add_sa_t;
                     31: typedef struct kernel_ipsec_update_sa_t kernel_ipsec_update_sa_t;
                     32: typedef struct kernel_ipsec_query_sa_t kernel_ipsec_query_sa_t;
                     33: typedef struct kernel_ipsec_del_sa_t kernel_ipsec_del_sa_t;
                     34: typedef struct kernel_ipsec_policy_id_t kernel_ipsec_policy_id_t;
                     35: typedef struct kernel_ipsec_manage_policy_t kernel_ipsec_manage_policy_t;
                     36: typedef struct kernel_ipsec_query_policy_t kernel_ipsec_query_policy_t;
                     37: 
                     38: #include <networking/host.h>
                     39: #include <ipsec/ipsec_types.h>
                     40: #include <selectors/traffic_selector.h>
                     41: #include <plugins/plugin.h>
                     42: #include <kernel/kernel_interface.h>
                     43: 
                     44: /**
                     45:  * Data required to identify an SA in the kernel
                     46:  */
                     47: struct kernel_ipsec_sa_id_t {
                     48:        /** Source address */
                     49:        host_t *src;
                     50:        /** Destination address */
                     51:        host_t *dst;
                     52:        /** SPI */
                     53:        uint32_t spi;
                     54:        /** Protocol (ESP/AH) */
                     55:        uint8_t proto;
                     56:        /** Optional mark */
                     57:        mark_t mark;
                     58:        /** Optional interface ID */
                     59:        uint32_t if_id;
                     60: };
                     61: 
                     62: /**
                     63:  * Data required to add an SA to the kernel
                     64:  */
                     65: struct kernel_ipsec_add_sa_t {
                     66:        /** Reqid */
                     67:        uint32_t reqid;
                     68:        /** Mode (tunnel, transport...) */
                     69:        ipsec_mode_t mode;
                     70:        /** List of source traffic selectors */
                     71:        linked_list_t *src_ts;
                     72:        /** List of destination traffic selectors */
                     73:        linked_list_t *dst_ts;
                     74:        /** Network interface restricting policy */
                     75:        char *interface;
                     76:        /** Lifetime configuration */
                     77:        lifetime_cfg_t *lifetime;
                     78:        /** Encryption algorithm */
                     79:        uint16_t enc_alg;
                     80:        /** Encryption key */
                     81:        chunk_t enc_key;
                     82:        /** Integrity protection algorithm */
                     83:        uint16_t int_alg;
                     84:        /** Integrity protection key */
                     85:        chunk_t int_key;
                     86:        /** Anti-replay window size */
                     87:        uint32_t replay_window;
                     88:        /** Traffic Flow Confidentiality padding */
                     89:        uint32_t tfc;
                     90:        /** IPComp transform */
                     91:        uint16_t ipcomp;
                     92:        /** CPI for IPComp */
                     93:        uint16_t cpi;
                     94:        /** TRUE to enable UDP encapsulation for NAT traversal */
                     95:        bool encap;
                     96:        /** no (disabled), yes (enabled), auto (enabled if supported) */
                     97:        hw_offload_t hw_offload;
                     98:        /** Mark the SA should apply to packets after processing */
                     99:        mark_t mark;
                    100:        /** TRUE to use Extended Sequence Numbers */
                    101:        bool esn;
                    102:        /** TRUE to copy the DF bit to the outer IPv4 header in tunnel mode */
                    103:        bool copy_df;
                    104:        /** TRUE to copy the ECN header field to/from the outer header */
                    105:        bool copy_ecn;
                    106:        /** Whether to copy the DSCP header field to/from the outer header */
                    107:        dscp_copy_t copy_dscp;
                    108:        /** TRUE if initiator of the exchange creating the SA */
                    109:        bool initiator;
                    110:        /** TRUE if this is an inbound SA */
                    111:        bool inbound;
                    112:        /** TRUE if an SPI has already been allocated for this SA */
                    113:        bool update;
                    114: };
                    115: 
                    116: /**
                    117:  * Data required to update the hosts of an SA in the kernel
                    118:  */
                    119: struct kernel_ipsec_update_sa_t {
                    120:        /** CPI in case IPComp is used */
                    121:        uint16_t cpi;
                    122:        /** New source address */
                    123:        host_t *new_src;
                    124:        /** New destination address */
                    125:        host_t *new_dst;
                    126:        /** TRUE if UDP encapsulation is currently enabled */
                    127:        bool encap;
                    128:        /** TRUE to enable UDP encapsulation */
                    129:        bool new_encap;
                    130: };
                    131: 
                    132: /**
                    133:  * Data required to query an SA in the kernel
                    134:  */
                    135: struct kernel_ipsec_query_sa_t {
                    136:        uint16_t cpi;
                    137: };
                    138: 
                    139: /**
                    140:  * Data required to delete an SA in the kernel
                    141:  */
                    142: struct kernel_ipsec_del_sa_t {
                    143:        /** CPI in case IPComp is used */
                    144:        uint16_t cpi;
                    145: };
                    146: 
                    147: /**
                    148:  * Data identifying a policy in the kernel
                    149:  */
                    150: struct kernel_ipsec_policy_id_t {
                    151:        /** Direction of traffic */
                    152:        policy_dir_t dir;
                    153:        /** Source traffic selector */
                    154:        traffic_selector_t *src_ts;
                    155:        /** Destination traffic selector */
                    156:        traffic_selector_t *dst_ts;
                    157:        /** Optional mark */
                    158:        mark_t mark;
                    159:        /** Optional interface ID */
                    160:        uint32_t if_id;
                    161:        /** Network interface restricting policy */
                    162:        char *interface;
                    163: };
                    164: 
                    165: /**
                    166:  * Data required to add/delete a policy to/from the kernel
                    167:  */
                    168: struct kernel_ipsec_manage_policy_t {
                    169:        /** Type of policy */
                    170:        policy_type_t type;
                    171:        /** Priority class */
                    172:        policy_priority_t prio;
                    173:        /** Manually-set priority (automatic if set to 0) */
                    174:        uint32_t manual_prio;
                    175:        /** Source address of the SA(s) tied to this policy */
                    176:        host_t *src;
                    177:        /** Destination address of the SA(s) tied to this policy */
                    178:        host_t *dst;
                    179:        /** Details about the SA(s) tied to this policy */
                    180:        ipsec_sa_cfg_t *sa;
                    181: };
                    182: 
                    183: /**
                    184:  * Data required to query a policy in the kernel
                    185:  */
                    186: struct kernel_ipsec_query_policy_t {
                    187: };
                    188: 
                    189: /**
                    190:  * Interface to the ipsec subsystem of the kernel.
                    191:  *
                    192:  * The kernel ipsec interface handles the communication with the kernel
                    193:  * for SA and policy management. It allows setup of these, and provides
                    194:  * further the handling of kernel events.
                    195:  * Policy information are cached in the interface. This is necessary to do
                    196:  * reference counting. The Linux kernel does not allow the same policy
                    197:  * installed twice, but we need this as CHILD_SA exist multiple times
                    198:  * when rekeying. That's why we do reference counting of policies.
                    199:  */
                    200: struct kernel_ipsec_t {
                    201: 
                    202:        /**
                    203:         * Get the feature set supported by this kernel backend.
                    204:         *
                    205:         * @return                              ORed feature-set of backend
                    206:         */
                    207:        kernel_feature_t (*get_features)(kernel_ipsec_t *this);
                    208: 
                    209:        /**
                    210:         * Get a SPI from the kernel.
                    211:         *
                    212:         * @param src           source address of SA
                    213:         * @param dst           destination address of SA
                    214:         * @param protocol      protocol for SA (ESP/AH)
                    215:         * @param spi           allocated spi
                    216:         * @return                      SUCCESS if operation completed
                    217:         */
                    218:        status_t (*get_spi)(kernel_ipsec_t *this, host_t *src, host_t *dst,
                    219:                                                uint8_t protocol, uint32_t *spi);
                    220: 
                    221:        /**
                    222:         * Get a Compression Parameter Index (CPI) from the kernel.
                    223:         *
                    224:         * @param src           source address of SA
                    225:         * @param dst           destination address of SA
                    226:         * @param cpi           allocated cpi
                    227:         * @return                      SUCCESS if operation completed
                    228:         */
                    229:        status_t (*get_cpi)(kernel_ipsec_t *this, host_t *src, host_t *dst,
                    230:                                                uint16_t *cpi);
                    231: 
                    232:        /**
                    233:         * Add an SA to the SAD.
                    234:         *
                    235:         * This function does install a single SA for a single protocol in one
                    236:         * direction.
                    237:         *
                    238:         * @param id                    data identifying this SA
                    239:         * @param data                  data for this SA
                    240:         * @return                              SUCCESS if operation completed
                    241:         */
                    242:        status_t (*add_sa)(kernel_ipsec_t *this, kernel_ipsec_sa_id_t *id,
                    243:                                           kernel_ipsec_add_sa_t *data);
                    244: 
                    245:        /**
                    246:         * Update the hosts on an installed SA.
                    247:         *
                    248:         * We cannot directly update the destination address as the kernel
                    249:         * requires the spi, the protocol AND the destination address (and family)
                    250:         * to identify SAs. Therefore if the destination address changed we
                    251:         * create a new SA and delete the old one.
                    252:         *
                    253:         * @param id                    data identifying this SA
                    254:         * @param data                  updated data for this SA
                    255:         * @return                              SUCCESS if operation completed, NOT_SUPPORTED if
                    256:         *                                              the kernel interface can't update the SA
                    257:         */
                    258:        status_t (*update_sa)(kernel_ipsec_t *this, kernel_ipsec_sa_id_t *id,
                    259:                                                  kernel_ipsec_update_sa_t *data);
                    260: 
                    261:        /**
                    262:         * Query the number of bytes processed by an SA from the SAD.
                    263:         *
                    264:         * @param id                    data identifying this SA
                    265:         * @param data                  data to query the SA
                    266:         * @param[out] bytes    the number of bytes processed by SA
                    267:         * @param[out] packets  number of packets processed by SA
                    268:         * @param[out] time             last (monotonic) time of SA use
                    269:         * @return                              SUCCESS if operation completed
                    270:         */
                    271:        status_t (*query_sa)(kernel_ipsec_t *this, kernel_ipsec_sa_id_t *id,
                    272:                                                 kernel_ipsec_query_sa_t *data, uint64_t *bytes,
                    273:                                                 uint64_t *packets, time_t *time);
                    274: 
                    275:        /**
                    276:         * Delete a previously installed SA from the SAD.
                    277:         *
                    278:         * @param id                    data identifying this SA
                    279:         * @param data                  data to delete the SA
                    280:         * @return                              SUCCESS if operation completed
                    281:         */
                    282:        status_t (*del_sa)(kernel_ipsec_t *this, kernel_ipsec_sa_id_t *id,
                    283:                                           kernel_ipsec_del_sa_t *data);
                    284: 
                    285:        /**
                    286:         * Flush all SAs from the SAD.
                    287:         *
                    288:         * @return                              SUCCESS if operation completed
                    289:         */
                    290:        status_t (*flush_sas)(kernel_ipsec_t *this);
                    291: 
                    292:        /**
                    293:         * Add a policy to the SPD.
                    294:         *
                    295:         * @param id                    data identifying this policy
                    296:         * @param data                  data for this policy
                    297:         * @return                              SUCCESS if operation completed
                    298:         */
                    299:        status_t (*add_policy)(kernel_ipsec_t *this,
                    300:                                                   kernel_ipsec_policy_id_t *id,
                    301:                                                   kernel_ipsec_manage_policy_t *data);
                    302: 
                    303:        /**
                    304:         * Query the use time of a policy.
                    305:         *
                    306:         * The use time of a policy is the time the policy was used for the last
                    307:         * time. It is not the system time, but a monotonic timestamp as returned
                    308:         * by time_monotonic.
                    309:         *
                    310:         * @param id                    data identifying this policy
                    311:         * @param data                  data to query the policy
                    312:         * @param[out] use_time the monotonic timestamp of this SA's last use
                    313:         * @return                              SUCCESS if operation completed
                    314:         */
                    315:        status_t (*query_policy)(kernel_ipsec_t *this,
                    316:                                                         kernel_ipsec_policy_id_t *id,
                    317:                                                         kernel_ipsec_query_policy_t *data,
                    318:                                                         time_t *use_time);
                    319: 
                    320:        /**
                    321:         * Remove a policy from the SPD.
                    322:         *
                    323:         * @param id                    data identifying this policy
                    324:         * @param data                  data for this policy
                    325:         * @return                              SUCCESS if operation completed
                    326:         */
                    327:        status_t (*del_policy)(kernel_ipsec_t *this,
                    328:                                                   kernel_ipsec_policy_id_t *id,
                    329:                                                   kernel_ipsec_manage_policy_t *data);
                    330: 
                    331:        /**
                    332:         * Flush all policies from the SPD.
                    333:         *
                    334:         * @return                              SUCCESS if operation completed
                    335:         */
                    336:        status_t (*flush_policies)(kernel_ipsec_t *this);
                    337: 
                    338:        /**
                    339:         * Install a bypass policy for the given socket.
                    340:         *
                    341:         * @param fd                    socket file descriptor to setup policy for
                    342:         * @param family                protocol family of the socket
                    343:         * @return                              TRUE of policy set up successfully
                    344:         */
                    345:        bool (*bypass_socket)(kernel_ipsec_t *this, int fd, int family);
                    346: 
                    347:        /**
                    348:         * Enable decapsulation of ESP-in-UDP packets for the given port/socket.
                    349:         *
                    350:         * @param fd                    socket file descriptor
                    351:         * @param family                protocol family of the socket
                    352:         * @param port                  the UDP port
                    353:         * @return                              TRUE if UDP decapsulation was enabled successfully
                    354:         */
                    355:        bool (*enable_udp_decap)(kernel_ipsec_t *this, int fd, int family,
                    356:                                                         uint16_t port);
                    357: 
                    358:        /**
                    359:         * Destroy the implementation.
                    360:         */
                    361:        void (*destroy)(kernel_ipsec_t *this);
                    362: };
                    363: 
                    364: /**
                    365:  * Helper function to (un-)register IPsec kernel interfaces from plugin features.
                    366:  *
                    367:  * This function is a plugin_feature_callback_t and can be used with the
                    368:  * PLUGIN_CALLBACK macro to register an IPsec kernel interface constructor.
                    369:  *
                    370:  * @param plugin               plugin registering the kernel interface
                    371:  * @param feature              associated plugin feature
                    372:  * @param reg                  TRUE to register, FALSE to unregister
                    373:  * @param data                 data passed to callback, an kernel_ipsec_constructor_t
                    374:  */
                    375: bool kernel_ipsec_register(plugin_t *plugin, plugin_feature_t *feature,
                    376:                                                   bool reg, void *data);
                    377: 
                    378: #endif /** KERNEL_IPSEC_H_ @}*/

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