The XFRM_STATE_AF_UNSPEC flag added to xfrm.h allows IPv4-over-IPv6 and IPv6-over...
[strongswan.git] / src / include / linux / xfrm.h
index 9c0c528..d4e9e50 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef _LINUX_XFRM_H
 #define _LINUX_XFRM_H
 
-#include <stdint.h>
+#include <linux/types.h>
 
 /* All of the structures in this file may not change size as they are
  * passed into the kernel from userspace via netlink sockets.
@@ -12,8 +12,8 @@
  */
 typedef union
 {
-       uint32_t        a4;
-       uint32_t        a6[4];
+       __be32          a4;
+       __be32          a6[4];
 } xfrm_address_t;
 
 /* Ident of a specific xfrm_state. It is used on input to lookup
@@ -23,16 +23,16 @@ typedef union
 struct xfrm_id
 {
        xfrm_address_t  daddr;
-       uint32_t        spi;
-       uint8_t         proto;
+       __be32          spi;
+       __u8            proto;
 };
 
 struct xfrm_sec_ctx {
-       uint8_t         ctx_doi;
-       uint8_t         ctx_alg;
-       uint16_t        ctx_len;
-       uint32_t        ctx_sid;
-       char            ctx_str[0];
+       __u8    ctx_doi;
+       __u8    ctx_alg;
+       __u16   ctx_len;
+       __u32   ctx_sid;
+       char    ctx_str[0];
 };
 
 /* Security Context Domains of Interpretation */
@@ -49,57 +49,71 @@ struct xfrm_selector
 {
        xfrm_address_t  daddr;
        xfrm_address_t  saddr;
-       uint16_t        dport;
-       uint16_t        dport_mask;
-       uint16_t        sport;
-       uint16_t        sport_mask;
-       uint16_t        family;
-       uint8_t prefixlen_d;
-       uint8_t prefixlen_s;
-       uint8_t proto;
+       __be16  dport;
+       __be16  dport_mask;
+       __be16  sport;
+       __be16  sport_mask;
+       __u16   family;
+       __u8    prefixlen_d;
+       __u8    prefixlen_s;
+       __u8    proto;
        int     ifindex;
        uid_t   user;
 };
 
-#define XFRM_INF (~(uint64_t)0)
+#define XFRM_INF (~(__u64)0)
 
 struct xfrm_lifetime_cfg
 {
-       uint64_t        soft_byte_limit;
-       uint64_t        hard_byte_limit;
-       uint64_t        soft_packet_limit;
-       uint64_t        hard_packet_limit;
-       uint64_t        soft_add_expires_seconds;
-       uint64_t        hard_add_expires_seconds;
-       uint64_t        soft_use_expires_seconds;
-       uint64_t        hard_use_expires_seconds;
+       __u64   soft_byte_limit;
+       __u64   hard_byte_limit;
+       __u64   soft_packet_limit;
+       __u64   hard_packet_limit;
+       __u64   soft_add_expires_seconds;
+       __u64   hard_add_expires_seconds;
+       __u64   soft_use_expires_seconds;
+       __u64   hard_use_expires_seconds;
 };
 
 struct xfrm_lifetime_cur
 {
-       uint64_t        bytes;
-       uint64_t        packets;
-       uint64_t        add_time;
-       uint64_t        use_time;
+       __u64   bytes;
+       __u64   packets;
+       __u64   add_time;
+       __u64   use_time;
 };
 
 struct xfrm_replay_state
 {
-       uint32_t        oseq;
-       uint32_t        seq;
-       uint32_t        bitmap;
+       __u32   oseq;
+       __u32   seq;
+       __u32   bitmap;
 };
 
 struct xfrm_algo {
+       char            alg_name[64];
+       unsigned int    alg_key_len;    /* in bits */
+       char            alg_key[0];
+};
+
+struct xfrm_algo_aead {
        char    alg_name[64];
-       int             alg_key_len;    /* in bits */
+       int     alg_key_len;    /* in bits */
+       int     alg_icv_len;    /* in bits */
        char    alg_key[0];
 };
 
 struct xfrm_stats {
-       uint32_t        replay_window;
-       uint32_t        replay;
-       uint32_t        integrity_failed;
+       __u32   replay_window;
+       __u32   replay;
+       __u32   integrity_failed;
+};
+
+enum
+{
+       XFRM_POLICY_TYPE_MAIN   = 0,
+       XFRM_POLICY_TYPE_SUB    = 1,
+       XFRM_POLICY_TYPE_MAX    = 2
 };
 
 enum
@@ -107,6 +121,7 @@ enum
        XFRM_POLICY_IN  = 0,
        XFRM_POLICY_OUT = 1,
        XFRM_POLICY_FWD = 2,
+       XFRM_POLICY_MASK = 3,
        XFRM_POLICY_MAX = 3
 };
 
@@ -118,6 +133,13 @@ enum
        XFRM_SHARE_UNIQUE       /* Use once */
 };
 
+#define XFRM_MODE_TRANSPORT 0
+#define XFRM_MODE_TUNNEL 1
+#define XFRM_MODE_ROUTEOPTIMIZATION 2
+#define XFRM_MODE_IN_TRIGGER 3
+#define XFRM_MODE_BEET 4
+#define XFRM_MODE_MAX 5
+
 /* Netlink configuration messages.  */
 enum {
        XFRM_MSG_BASE = 0x10,
@@ -160,6 +182,22 @@ enum {
 #define XFRM_MSG_NEWAE XFRM_MSG_NEWAE
        XFRM_MSG_GETAE,
 #define XFRM_MSG_GETAE XFRM_MSG_GETAE
+
+       XFRM_MSG_REPORT,
+#define XFRM_MSG_REPORT XFRM_MSG_REPORT
+
+       XFRM_MSG_MIGRATE,
+#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE
+
+       XFRM_MSG_NEWSADINFO,
+#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO
+       XFRM_MSG_GETSADINFO,
+#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO
+
+       XFRM_MSG_NEWSPDINFO,
+#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO
+       XFRM_MSG_GETSPDINFO,
+#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO
        __XFRM_MSG_MAX
 };
 #define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
@@ -171,30 +209,30 @@ enum {
  * NOTE: Same format as sadb_x_sec_ctx
  */
 struct xfrm_user_sec_ctx {
-       uint16_t                len;
-       uint16_t                exttype;
-       uint8_t                 ctx_alg;  /* LSMs: e.g., selinux == 1 */
-       uint8_t                 ctx_doi;
-       uint16_t                ctx_len;
+       __u16                   len;
+       __u16                   exttype;
+       __u8                    ctx_alg;  /* LSMs: e.g., selinux == 1 */
+       __u8                    ctx_doi;
+       __u16                   ctx_len;
 };
 
 struct xfrm_user_tmpl {
-       struct xfrm_id  id;
-       uint16_t                family;
-       xfrm_address_t  saddr;
-       uint32_t                reqid;
-       uint8_t                 mode;
-       uint8_t                 share;
-       uint8_t                 optional;
-       uint32_t                aalgos;
-       uint32_t                ealgos;
-       uint32_t                calgos;
+       struct xfrm_id          id;
+       __u16                   family;
+       xfrm_address_t          saddr;
+       __u32                   reqid;
+       __u8                    mode;
+       __u8                    share;
+       __u8                    optional;
+       __u32                   aalgos;
+       __u32                   ealgos;
+       __u32                   calgos;
 };
 
 struct xfrm_encap_tmpl {
-       uint16_t                encap_type;
-       uint16_t                encap_sport;
-       uint16_t                encap_dport;
+       __u16           encap_type;
+       __be16          encap_sport;
+       __be16          encap_dport;
        xfrm_address_t  encap_oa;
 };
 
@@ -213,6 +251,12 @@ enum xfrm_ae_ftype_t {
 #define XFRM_AE_MAX (__XFRM_AE_MAX - 1)
 };
 
+struct xfrm_userpolicy_type {
+       __u8            type;
+       __u16           reserved1;
+       __u8            reserved2;
+};
+
 /* Netlink message attributes.  */
 enum xfrm_attr_type_t {
        XFRMA_UNSPEC,
@@ -228,98 +272,169 @@ enum xfrm_attr_type_t {
        XFRMA_REPLAY_VAL,
        XFRMA_REPLAY_THRESH,
        XFRMA_ETIMER_THRESH,
+       XFRMA_SRCADDR,          /* xfrm_address_t */
+       XFRMA_COADDR,           /* xfrm_address_t */
+       XFRMA_LASTUSED,
+       XFRMA_POLICY_TYPE,      /* struct xfrm_userpolicy_type */
+       XFRMA_MIGRATE,
+       XFRMA_ALG_AEAD,         /* struct xfrm_algo_aead */
        __XFRMA_MAX
 
 #define XFRMA_MAX (__XFRMA_MAX - 1)
 };
 
+enum xfrm_sadattr_type_t {
+       XFRMA_SAD_UNSPEC,
+       XFRMA_SAD_CNT,
+       XFRMA_SAD_HINFO,
+       __XFRMA_SAD_MAX
+
+#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
+};
+
+struct xfrmu_sadhinfo {
+       __u32 sadhcnt; /* current hash bkts */
+       __u32 sadhmcnt; /* max allowed hash bkts */
+};
+
+enum xfrm_spdattr_type_t {
+       XFRMA_SPD_UNSPEC,
+       XFRMA_SPD_INFO,
+       XFRMA_SPD_HINFO,
+       __XFRMA_SPD_MAX
+
+#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1)
+};
+
+struct xfrmu_spdinfo {
+       __u32 incnt;
+       __u32 outcnt;
+       __u32 fwdcnt;
+       __u32 inscnt;
+       __u32 outscnt;
+       __u32 fwdscnt;
+};
+
+struct xfrmu_spdhinfo {
+       __u32 spdhcnt;
+       __u32 spdhmcnt;
+};
+
 struct xfrm_usersa_info {
        struct xfrm_selector            sel;
-       struct xfrm_id                          id;
-       xfrm_address_t                          saddr;
+       struct xfrm_id                  id;
+       xfrm_address_t                  saddr;
        struct xfrm_lifetime_cfg        lft;
        struct xfrm_lifetime_cur        curlft;
-       struct xfrm_stats                       stats;
-       uint32_t                                        seq;
-       uint32_t                                        reqid;
-       uint16_t                                        family;
-       uint8_t                                         mode; /* 0=transport,1=tunnel */
-       uint8_t                                         replay_window;
-       uint8_t                                         flags;
+       struct xfrm_stats               stats;
+       __u32                           seq;
+       __u32                           reqid;
+       __u16                           family;
+       __u8                            mode;           /* XFRM_MODE_xxx */
+       __u8                            replay_window;
+       __u8                            flags;
 #define XFRM_STATE_NOECN       1
 #define XFRM_STATE_DECAP_DSCP  2
 #define XFRM_STATE_NOPMTUDISC  4
+#define XFRM_STATE_WILDRECV    8
+#define XFRM_STATE_ICMP                16
+#define XFRM_STATE_AF_UNSPEC   32
 };
 
 struct xfrm_usersa_id {
-       xfrm_address_t  daddr;
-       uint32_t                spi;
-       uint16_t                family;
-       uint8_t                 proto;
+       xfrm_address_t                  daddr;
+       __be32                          spi;
+       __u16                           family;
+       __u8                            proto;
 };
 
 struct xfrm_aevent_id {
-       struct xfrm_usersa_id   sa_id;
-       uint32_t                                flags;
+       struct xfrm_usersa_id           sa_id;
+       xfrm_address_t                  saddr;
+       __u32                           flags;
+       __u32                           reqid;
 };
 
 struct xfrm_userspi_info {
-       struct xfrm_usersa_info info;
-       uint32_t                                min;
-       uint32_t                                max;
+       struct xfrm_usersa_info         info;
+       __u32                           min;
+       __u32                           max;
 };
 
 struct xfrm_userpolicy_info {
        struct xfrm_selector            sel;
        struct xfrm_lifetime_cfg        lft;
        struct xfrm_lifetime_cur        curlft;
-       uint32_t                                        priority;
-       uint32_t                                        index;
-       uint8_t                                         dir;
-       uint8_t                                         action;
+       __u32                           priority;
+       __u32                           index;
+       __u8                            dir;
+       __u8                            action;
 #define XFRM_POLICY_ALLOW      0
 #define XFRM_POLICY_BLOCK      1
-       uint8_t                                         flags;
+       __u8                            flags;
 #define XFRM_POLICY_LOCALOK    1       /* Allow user to override global policy */
-       uint8_t                                         share;
+       /* Automatically expand selector to include matching ICMP payloads. */
+#define XFRM_POLICY_ICMP       2
+       __u8                            share;
 };
 
 struct xfrm_userpolicy_id {
-       struct xfrm_selector    sel;
-       uint32_t                                index;
-       uint8_t                                 dir;
+       struct xfrm_selector            sel;
+       __u32                           index;
+       __u8                            dir;
 };
 
 struct xfrm_user_acquire {
-       struct xfrm_id                          id;
-       xfrm_address_t                          saddr;
+       struct xfrm_id                  id;
+       xfrm_address_t                  saddr;
        struct xfrm_selector            sel;
        struct xfrm_userpolicy_info     policy;
-       uint32_t                                        aalgos;
-       uint32_t                                        ealgos;
-       uint32_t                                        calgos;
-       uint32_t                                        seq;
+       __u32                           aalgos;
+       __u32                           ealgos;
+       __u32                           calgos;
+       __u32                           seq;
 };
 
 struct xfrm_user_expire {
        struct xfrm_usersa_info         state;
-       uint8_t                                         hard;
+       __u8                            hard;
 };
 
 struct xfrm_user_polexpire {
        struct xfrm_userpolicy_info     pol;
-       uint8_t                         hard;
+       __u8                            hard;
 };
 
 struct xfrm_usersa_flush {
-       uint8_t                         proto;
+       __u8                            proto;
+};
+
+struct xfrm_user_report {
+       __u8                            proto;
+       struct xfrm_selector            sel;
+};
+
+struct xfrm_user_migrate {
+       xfrm_address_t                  old_daddr;
+       xfrm_address_t                  old_saddr;
+       xfrm_address_t                  new_daddr;
+       xfrm_address_t                  new_saddr;
+       __u8                            proto;
+       __u8                            mode;
+       __u16                           reserved;
+       __u32                           reqid;
+       __u16                           old_family;
+       __u16                           new_family;
 };
 
+#ifndef __KERNEL__
 /* backwards compatibility for userspace */
 #define XFRMGRP_ACQUIRE                1
 #define XFRMGRP_EXPIRE         2
-#define XFRMGRP_SA                     4
+#define XFRMGRP_SA             4
 #define XFRMGRP_POLICY         8
+#define XFRMGRP_REPORT         0x20
+#endif
 
 enum xfrm_nlgroups {
        XFRMNLGRP_NONE,
@@ -334,6 +449,10 @@ enum xfrm_nlgroups {
 #define XFRMNLGRP_POLICY       XFRMNLGRP_POLICY
        XFRMNLGRP_AEVENTS,
 #define XFRMNLGRP_AEVENTS      XFRMNLGRP_AEVENTS
+       XFRMNLGRP_REPORT,
+#define XFRMNLGRP_REPORT       XFRMNLGRP_REPORT
+       XFRMNLGRP_MIGRATE,
+#define XFRMNLGRP_MIGRATE      XFRMNLGRP_MIGRATE
        __XFRMNLGRP_MAX
 };
 #define XFRMNLGRP_MAX  (__XFRMNLGRP_MAX - 1)