LCOV - code coverage report
Current view: top level - include/net - xfrm.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 9 137 6.6 %
Date: 2014-04-07 Functions: 0 0 -
Branches: 14 509 2.8 %

           Branch data     Line data    Source code
       1                 :            : #ifndef _NET_XFRM_H
       2                 :            : #define _NET_XFRM_H
       3                 :            : 
       4                 :            : #include <linux/compiler.h>
       5                 :            : #include <linux/xfrm.h>
       6                 :            : #include <linux/spinlock.h>
       7                 :            : #include <linux/list.h>
       8                 :            : #include <linux/skbuff.h>
       9                 :            : #include <linux/socket.h>
      10                 :            : #include <linux/pfkeyv2.h>
      11                 :            : #include <linux/ipsec.h>
      12                 :            : #include <linux/in6.h>
      13                 :            : #include <linux/mutex.h>
      14                 :            : #include <linux/audit.h>
      15                 :            : #include <linux/slab.h>
      16                 :            : 
      17                 :            : #include <net/sock.h>
      18                 :            : #include <net/dst.h>
      19                 :            : #include <net/ip.h>
      20                 :            : #include <net/route.h>
      21                 :            : #include <net/ipv6.h>
      22                 :            : #include <net/ip6_fib.h>
      23                 :            : #include <net/flow.h>
      24                 :            : 
      25                 :            : #include <linux/interrupt.h>
      26                 :            : 
      27                 :            : #ifdef CONFIG_XFRM_STATISTICS
      28                 :            : #include <net/snmp.h>
      29                 :            : #endif
      30                 :            : 
      31                 :            : #define XFRM_PROTO_ESP          50
      32                 :            : #define XFRM_PROTO_AH           51
      33                 :            : #define XFRM_PROTO_COMP         108
      34                 :            : #define XFRM_PROTO_IPIP         4
      35                 :            : #define XFRM_PROTO_IPV6         41
      36                 :            : #define XFRM_PROTO_ROUTING      IPPROTO_ROUTING
      37                 :            : #define XFRM_PROTO_DSTOPTS      IPPROTO_DSTOPTS
      38                 :            : 
      39                 :            : #define XFRM_ALIGN4(len)        (((len) + 3) & ~3)
      40                 :            : #define XFRM_ALIGN8(len)        (((len) + 7) & ~7)
      41                 :            : #define MODULE_ALIAS_XFRM_MODE(family, encap) \
      42                 :            :         MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
      43                 :            : #define MODULE_ALIAS_XFRM_TYPE(family, proto) \
      44                 :            :         MODULE_ALIAS("xfrm-type-" __stringify(family) "-" __stringify(proto))
      45                 :            : 
      46                 :            : #ifdef CONFIG_XFRM_STATISTICS
      47                 :            : #define XFRM_INC_STATS(net, field)      SNMP_INC_STATS((net)->mib.xfrm_statistics, field)
      48                 :            : #define XFRM_INC_STATS_BH(net, field)   SNMP_INC_STATS_BH((net)->mib.xfrm_statistics, field)
      49                 :            : #define XFRM_INC_STATS_USER(net, field) SNMP_INC_STATS_USER((net)-mib.xfrm_statistics, field)
      50                 :            : #else
      51                 :            : #define XFRM_INC_STATS(net, field)      ((void)(net))
      52                 :            : #define XFRM_INC_STATS_BH(net, field)   ((void)(net))
      53                 :            : #define XFRM_INC_STATS_USER(net, field) ((void)(net))
      54                 :            : #endif
      55                 :            : 
      56                 :            : extern struct mutex xfrm_cfg_mutex;
      57                 :            : 
      58                 :            : /* Organization of SPD aka "XFRM rules"
      59                 :            :    ------------------------------------
      60                 :            : 
      61                 :            :    Basic objects:
      62                 :            :    - policy rule, struct xfrm_policy (=SPD entry)
      63                 :            :    - bundle of transformations, struct dst_entry == struct xfrm_dst (=SA bundle)
      64                 :            :    - instance of a transformer, struct xfrm_state (=SA)
      65                 :            :    - template to clone xfrm_state, struct xfrm_tmpl
      66                 :            : 
      67                 :            :    SPD is plain linear list of xfrm_policy rules, ordered by priority.
      68                 :            :    (To be compatible with existing pfkeyv2 implementations,
      69                 :            :    many rules with priority of 0x7fffffff are allowed to exist and
      70                 :            :    such rules are ordered in an unpredictable way, thanks to bsd folks.)
      71                 :            : 
      72                 :            :    Lookup is plain linear search until the first match with selector.
      73                 :            : 
      74                 :            :    If "action" is "block", then we prohibit the flow, otherwise:
      75                 :            :    if "xfrms_nr" is zero, the flow passes untransformed. Otherwise,
      76                 :            :    policy entry has list of up to XFRM_MAX_DEPTH transformations,
      77                 :            :    described by templates xfrm_tmpl. Each template is resolved
      78                 :            :    to a complete xfrm_state (see below) and we pack bundle of transformations
      79                 :            :    to a dst_entry returned to requestor.
      80                 :            : 
      81                 :            :    dst -. xfrm  .-> xfrm_state #1
      82                 :            :     |---. child .-> dst -. xfrm .-> xfrm_state #2
      83                 :            :                      |---. child .-> dst -. xfrm .-> xfrm_state #3
      84                 :            :                                       |---. child .-> NULL
      85                 :            : 
      86                 :            :    Bundles are cached at xrfm_policy struct (field ->bundles).
      87                 :            : 
      88                 :            : 
      89                 :            :    Resolution of xrfm_tmpl
      90                 :            :    -----------------------
      91                 :            :    Template contains:
      92                 :            :    1. ->mode         Mode: transport or tunnel
      93                 :            :    2. ->id.proto     Protocol: AH/ESP/IPCOMP
      94                 :            :    3. ->id.daddr     Remote tunnel endpoint, ignored for transport mode.
      95                 :            :       Q: allow to resolve security gateway?
      96                 :            :    4. ->id.spi          If not zero, static SPI.
      97                 :            :    5. ->saddr                Local tunnel endpoint, ignored for transport mode.
      98                 :            :    6. ->algos                List of allowed algos. Plain bitmask now.
      99                 :            :       Q: ealgos, aalgos, calgos. What a mess...
     100                 :            :    7. ->share                Sharing mode.
     101                 :            :       Q: how to implement private sharing mode? To add struct sock* to
     102                 :            :       flow id?
     103                 :            : 
     104                 :            :    Having this template we search through SAD searching for entries
     105                 :            :    with appropriate mode/proto/algo, permitted by selector.
     106                 :            :    If no appropriate entry found, it is requested from key manager.
     107                 :            : 
     108                 :            :    PROBLEMS:
     109                 :            :    Q: How to find all the bundles referring to a physical path for
     110                 :            :       PMTU discovery? Seems, dst should contain list of all parents...
     111                 :            :       and enter to infinite locking hierarchy disaster.
     112                 :            :       No! It is easier, we will not search for them, let them find us.
     113                 :            :       We add genid to each dst plus pointer to genid of raw IP route,
     114                 :            :       pmtu disc will update pmtu on raw IP route and increase its genid.
     115                 :            :       dst_check() will see this for top level and trigger resyncing
     116                 :            :       metrics. Plus, it will be made via sk->sk_dst_cache. Solved.
     117                 :            :  */
     118                 :            : 
     119                 :            : struct xfrm_state_walk {
     120                 :            :         struct list_head        all;
     121                 :            :         u8                      state;
     122                 :            :         union {
     123                 :            :                 u8              dying;
     124                 :            :                 u8              proto;
     125                 :            :         };
     126                 :            :         u32                     seq;
     127                 :            : };
     128                 :            : 
     129                 :            : /* Full description of state of transformer. */
     130                 :            : struct xfrm_state {
     131                 :            : #ifdef CONFIG_NET_NS
     132                 :            :         struct net              *xs_net;
     133                 :            : #endif
     134                 :            :         union {
     135                 :            :                 struct hlist_node       gclist;
     136                 :            :                 struct hlist_node       bydst;
     137                 :            :         };
     138                 :            :         struct hlist_node       bysrc;
     139                 :            :         struct hlist_node       byspi;
     140                 :            : 
     141                 :            :         atomic_t                refcnt;
     142                 :            :         spinlock_t              lock;
     143                 :            : 
     144                 :            :         struct xfrm_id          id;
     145                 :            :         struct xfrm_selector    sel;
     146                 :            :         struct xfrm_mark        mark;
     147                 :            :         u32                     tfcpad;
     148                 :            : 
     149                 :            :         u32                     genid;
     150                 :            : 
     151                 :            :         /* Key manager bits */
     152                 :            :         struct xfrm_state_walk  km;
     153                 :            : 
     154                 :            :         /* Parameters of this state. */
     155                 :            :         struct {
     156                 :            :                 u32             reqid;
     157                 :            :                 u8              mode;
     158                 :            :                 u8              replay_window;
     159                 :            :                 u8              aalgo, ealgo, calgo;
     160                 :            :                 u8              flags;
     161                 :            :                 u16             family;
     162                 :            :                 xfrm_address_t  saddr;
     163                 :            :                 int             header_len;
     164                 :            :                 int             trailer_len;
     165                 :            :                 u32             extra_flags;
     166                 :            :         } props;
     167                 :            : 
     168                 :            :         struct xfrm_lifetime_cfg lft;
     169                 :            : 
     170                 :            :         /* Data for transformer */
     171                 :            :         struct xfrm_algo_auth   *aalg;
     172                 :            :         struct xfrm_algo        *ealg;
     173                 :            :         struct xfrm_algo        *calg;
     174                 :            :         struct xfrm_algo_aead   *aead;
     175                 :            : 
     176                 :            :         /* Data for encapsulator */
     177                 :            :         struct xfrm_encap_tmpl  *encap;
     178                 :            : 
     179                 :            :         /* Data for care-of address */
     180                 :            :         xfrm_address_t  *coaddr;
     181                 :            : 
     182                 :            :         /* IPComp needs an IPIP tunnel for handling uncompressed packets */
     183                 :            :         struct xfrm_state       *tunnel;
     184                 :            : 
     185                 :            :         /* If a tunnel, number of users + 1 */
     186                 :            :         atomic_t                tunnel_users;
     187                 :            : 
     188                 :            :         /* State for replay detection */
     189                 :            :         struct xfrm_replay_state replay;
     190                 :            :         struct xfrm_replay_state_esn *replay_esn;
     191                 :            : 
     192                 :            :         /* Replay detection state at the time we sent the last notification */
     193                 :            :         struct xfrm_replay_state preplay;
     194                 :            :         struct xfrm_replay_state_esn *preplay_esn;
     195                 :            : 
     196                 :            :         /* The functions for replay detection. */
     197                 :            :         struct xfrm_replay      *repl;
     198                 :            : 
     199                 :            :         /* internal flag that only holds state for delayed aevent at the
     200                 :            :          * moment
     201                 :            :         */
     202                 :            :         u32                     xflags;
     203                 :            : 
     204                 :            :         /* Replay detection notification settings */
     205                 :            :         u32                     replay_maxage;
     206                 :            :         u32                     replay_maxdiff;
     207                 :            : 
     208                 :            :         /* Replay detection notification timer */
     209                 :            :         struct timer_list       rtimer;
     210                 :            : 
     211                 :            :         /* Statistics */
     212                 :            :         struct xfrm_stats       stats;
     213                 :            : 
     214                 :            :         struct xfrm_lifetime_cur curlft;
     215                 :            :         struct tasklet_hrtimer  mtimer;
     216                 :            : 
     217                 :            :         /* used to fix curlft->add_time when changing date */
     218                 :            :         long            saved_tmo;
     219                 :            : 
     220                 :            :         /* Last used time */
     221                 :            :         unsigned long           lastused;
     222                 :            : 
     223                 :            :         /* Reference to data common to all the instances of this
     224                 :            :          * transformer. */
     225                 :            :         const struct xfrm_type  *type;
     226                 :            :         struct xfrm_mode        *inner_mode;
     227                 :            :         struct xfrm_mode        *inner_mode_iaf;
     228                 :            :         struct xfrm_mode        *outer_mode;
     229                 :            : 
     230                 :            :         /* Security context */
     231                 :            :         struct xfrm_sec_ctx     *security;
     232                 :            : 
     233                 :            :         /* Private data of this transformer, format is opaque,
     234                 :            :          * interpreted by xfrm_type methods. */
     235                 :            :         void                    *data;
     236                 :            : };
     237                 :            : 
     238                 :            : static inline struct net *xs_net(struct xfrm_state *x)
     239                 :            : {
     240                 :            :         return read_pnet(&x->xs_net);
     241                 :            : }
     242                 :            : 
     243                 :            : /* xflags - make enum if more show up */
     244                 :            : #define XFRM_TIME_DEFER 1
     245                 :            : #define XFRM_SOFT_EXPIRE 2
     246                 :            : 
     247                 :            : enum {
     248                 :            :         XFRM_STATE_VOID,
     249                 :            :         XFRM_STATE_ACQ,
     250                 :            :         XFRM_STATE_VALID,
     251                 :            :         XFRM_STATE_ERROR,
     252                 :            :         XFRM_STATE_EXPIRED,
     253                 :            :         XFRM_STATE_DEAD
     254                 :            : };
     255                 :            : 
     256                 :            : /* callback structure passed from either netlink or pfkey */
     257                 :            : struct km_event {
     258                 :            :         union {
     259                 :            :                 u32 hard;
     260                 :            :                 u32 proto;
     261                 :            :                 u32 byid;
     262                 :            :                 u32 aevent;
     263                 :            :                 u32 type;
     264                 :            :         } data;
     265                 :            : 
     266                 :            :         u32     seq;
     267                 :            :         u32     portid;
     268                 :            :         u32     event;
     269                 :            :         struct net *net;
     270                 :            : };
     271                 :            : 
     272                 :            : struct xfrm_replay {
     273                 :            :         void    (*advance)(struct xfrm_state *x, __be32 net_seq);
     274                 :            :         int     (*check)(struct xfrm_state *x,
     275                 :            :                          struct sk_buff *skb,
     276                 :            :                          __be32 net_seq);
     277                 :            :         int     (*recheck)(struct xfrm_state *x,
     278                 :            :                            struct sk_buff *skb,
     279                 :            :                            __be32 net_seq);
     280                 :            :         void    (*notify)(struct xfrm_state *x, int event);
     281                 :            :         int     (*overflow)(struct xfrm_state *x, struct sk_buff *skb);
     282                 :            : };
     283                 :            : 
     284                 :            : struct net_device;
     285                 :            : struct xfrm_type;
     286                 :            : struct xfrm_dst;
     287                 :            : struct xfrm_policy_afinfo {
     288                 :            :         unsigned short          family;
     289                 :            :         struct dst_ops          *dst_ops;
     290                 :            :         void                    (*garbage_collect)(struct net *net);
     291                 :            :         struct dst_entry        *(*dst_lookup)(struct net *net, int tos,
     292                 :            :                                                const xfrm_address_t *saddr,
     293                 :            :                                                const xfrm_address_t *daddr);
     294                 :            :         int                     (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr);
     295                 :            :         void                    (*decode_session)(struct sk_buff *skb,
     296                 :            :                                                   struct flowi *fl,
     297                 :            :                                                   int reverse);
     298                 :            :         int                     (*get_tos)(const struct flowi *fl);
     299                 :            :         void                    (*init_dst)(struct net *net,
     300                 :            :                                             struct xfrm_dst *dst);
     301                 :            :         int                     (*init_path)(struct xfrm_dst *path,
     302                 :            :                                              struct dst_entry *dst,
     303                 :            :                                              int nfheader_len);
     304                 :            :         int                     (*fill_dst)(struct xfrm_dst *xdst,
     305                 :            :                                             struct net_device *dev,
     306                 :            :                                             const struct flowi *fl);
     307                 :            :         struct dst_entry        *(*blackhole_route)(struct net *net, struct dst_entry *orig);
     308                 :            : };
     309                 :            : 
     310                 :            : int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
     311                 :            : int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
     312                 :            : void km_policy_notify(struct xfrm_policy *xp, int dir,
     313                 :            :                       const struct km_event *c);
     314                 :            : void km_state_notify(struct xfrm_state *x, const struct km_event *c);
     315                 :            : 
     316                 :            : struct xfrm_tmpl;
     317                 :            : int km_query(struct xfrm_state *x, struct xfrm_tmpl *t,
     318                 :            :              struct xfrm_policy *pol);
     319                 :            : void km_state_expired(struct xfrm_state *x, int hard, u32 portid);
     320                 :            : int __xfrm_state_delete(struct xfrm_state *x);
     321                 :            : 
     322                 :            : struct xfrm_state_afinfo {
     323                 :            :         unsigned int            family;
     324                 :            :         unsigned int            proto;
     325                 :            :         __be16                  eth_proto;
     326                 :            :         struct module           *owner;
     327                 :            :         const struct xfrm_type  *type_map[IPPROTO_MAX];
     328                 :            :         struct xfrm_mode        *mode_map[XFRM_MODE_MAX];
     329                 :            :         int                     (*init_flags)(struct xfrm_state *x);
     330                 :            :         void                    (*init_tempsel)(struct xfrm_selector *sel,
     331                 :            :                                                 const struct flowi *fl);
     332                 :            :         void                    (*init_temprop)(struct xfrm_state *x,
     333                 :            :                                                 const struct xfrm_tmpl *tmpl,
     334                 :            :                                                 const xfrm_address_t *daddr,
     335                 :            :                                                 const xfrm_address_t *saddr);
     336                 :            :         int                     (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n);
     337                 :            :         int                     (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n);
     338                 :            :         int                     (*output)(struct sk_buff *skb);
     339                 :            :         int                     (*output_finish)(struct sk_buff *skb);
     340                 :            :         int                     (*extract_input)(struct xfrm_state *x,
     341                 :            :                                                  struct sk_buff *skb);
     342                 :            :         int                     (*extract_output)(struct xfrm_state *x,
     343                 :            :                                                   struct sk_buff *skb);
     344                 :            :         int                     (*transport_finish)(struct sk_buff *skb,
     345                 :            :                                                     int async);
     346                 :            :         void                    (*local_error)(struct sk_buff *skb, u32 mtu);
     347                 :            : };
     348                 :            : 
     349                 :            : int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo);
     350                 :            : int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo);
     351                 :            : struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family);
     352                 :            : void xfrm_state_put_afinfo(struct xfrm_state_afinfo *afinfo);
     353                 :            : 
     354                 :            : void xfrm_state_delete_tunnel(struct xfrm_state *x);
     355                 :            : 
     356                 :            : struct xfrm_type {
     357                 :            :         char                    *description;
     358                 :            :         struct module           *owner;
     359                 :            :         u8                      proto;
     360                 :            :         u8                      flags;
     361                 :            : #define XFRM_TYPE_NON_FRAGMENT  1
     362                 :            : #define XFRM_TYPE_REPLAY_PROT   2
     363                 :            : #define XFRM_TYPE_LOCAL_COADDR  4
     364                 :            : #define XFRM_TYPE_REMOTE_COADDR 8
     365                 :            : 
     366                 :            :         int                     (*init_state)(struct xfrm_state *x);
     367                 :            :         void                    (*destructor)(struct xfrm_state *);
     368                 :            :         int                     (*input)(struct xfrm_state *, struct sk_buff *skb);
     369                 :            :         int                     (*output)(struct xfrm_state *, struct sk_buff *pskb);
     370                 :            :         int                     (*reject)(struct xfrm_state *, struct sk_buff *,
     371                 :            :                                           const struct flowi *);
     372                 :            :         int                     (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **);
     373                 :            :         /* Estimate maximal size of result of transformation of a dgram */
     374                 :            :         u32                     (*get_mtu)(struct xfrm_state *, int size);
     375                 :            : };
     376                 :            : 
     377                 :            : int xfrm_register_type(const struct xfrm_type *type, unsigned short family);
     378                 :            : int xfrm_unregister_type(const struct xfrm_type *type, unsigned short family);
     379                 :            : 
     380                 :            : struct xfrm_mode {
     381                 :            :         /*
     382                 :            :          * Remove encapsulation header.
     383                 :            :          *
     384                 :            :          * The IP header will be moved over the top of the encapsulation
     385                 :            :          * header.
     386                 :            :          *
     387                 :            :          * On entry, the transport header shall point to where the IP header
     388                 :            :          * should be and the network header shall be set to where the IP
     389                 :            :          * header currently is.  skb->data shall point to the start of the
     390                 :            :          * payload.
     391                 :            :          */
     392                 :            :         int (*input2)(struct xfrm_state *x, struct sk_buff *skb);
     393                 :            : 
     394                 :            :         /*
     395                 :            :          * This is the actual input entry point.
     396                 :            :          *
     397                 :            :          * For transport mode and equivalent this would be identical to
     398                 :            :          * input2 (which does not need to be set).  While tunnel mode
     399                 :            :          * and equivalent would set this to the tunnel encapsulation function
     400                 :            :          * xfrm4_prepare_input that would in turn call input2.
     401                 :            :          */
     402                 :            :         int (*input)(struct xfrm_state *x, struct sk_buff *skb);
     403                 :            : 
     404                 :            :         /*
     405                 :            :          * Add encapsulation header.
     406                 :            :          *
     407                 :            :          * On exit, the transport header will be set to the start of the
     408                 :            :          * encapsulation header to be filled in by x->type->output and
     409                 :            :          * the mac header will be set to the nextheader (protocol for
     410                 :            :          * IPv4) field of the extension header directly preceding the
     411                 :            :          * encapsulation header, or in its absence, that of the top IP
     412                 :            :          * header.  The value of the network header will always point
     413                 :            :          * to the top IP header while skb->data will point to the payload.
     414                 :            :          */
     415                 :            :         int (*output2)(struct xfrm_state *x,struct sk_buff *skb);
     416                 :            : 
     417                 :            :         /*
     418                 :            :          * This is the actual output entry point.
     419                 :            :          *
     420                 :            :          * For transport mode and equivalent this would be identical to
     421                 :            :          * output2 (which does not need to be set).  While tunnel mode
     422                 :            :          * and equivalent would set this to a tunnel encapsulation function
     423                 :            :          * (xfrm4_prepare_output or xfrm6_prepare_output) that would in turn
     424                 :            :          * call output2.
     425                 :            :          */
     426                 :            :         int (*output)(struct xfrm_state *x, struct sk_buff *skb);
     427                 :            : 
     428                 :            :         struct xfrm_state_afinfo *afinfo;
     429                 :            :         struct module *owner;
     430                 :            :         unsigned int encap;
     431                 :            :         int flags;
     432                 :            : };
     433                 :            : 
     434                 :            : /* Flags for xfrm_mode. */
     435                 :            : enum {
     436                 :            :         XFRM_MODE_FLAG_TUNNEL = 1,
     437                 :            : };
     438                 :            : 
     439                 :            : int xfrm_register_mode(struct xfrm_mode *mode, int family);
     440                 :            : int xfrm_unregister_mode(struct xfrm_mode *mode, int family);
     441                 :            : 
     442                 :            : static inline int xfrm_af2proto(unsigned int family)
     443                 :            : {
     444      [ #  #  # ]:          0 :         switch(family) {
     445                 :            :         case AF_INET:
     446                 :            :                 return IPPROTO_IPIP;
     447                 :            :         case AF_INET6:
     448                 :            :                 return IPPROTO_IPV6;
     449                 :            :         default:
     450                 :            :                 return 0;
     451                 :            :         }
     452                 :            : }
     453                 :            : 
     454                 :            : static inline struct xfrm_mode *xfrm_ip2inner_mode(struct xfrm_state *x, int ipproto)
     455                 :            : {
     456 [ #  # ][ #  # ]:          0 :         if ((ipproto == IPPROTO_IPIP && x->props.family == AF_INET) ||
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     457 [ #  # ][ #  # ]:          0 :             (ipproto == IPPROTO_IPV6 && x->props.family == AF_INET6))
     458                 :          0 :                 return x->inner_mode;
     459                 :            :         else
     460                 :          0 :                 return x->inner_mode_iaf;
     461                 :            : }
     462                 :            : 
     463                 :            : struct xfrm_tmpl {
     464                 :            : /* id in template is interpreted as:
     465                 :            :  * daddr - destination of tunnel, may be zero for transport mode.
     466                 :            :  * spi   - zero to acquire spi. Not zero if spi is static, then
     467                 :            :  *         daddr must be fixed too.
     468                 :            :  * proto - AH/ESP/IPCOMP
     469                 :            :  */
     470                 :            :         struct xfrm_id          id;
     471                 :            : 
     472                 :            : /* Source address of tunnel. Ignored, if it is not a tunnel. */
     473                 :            :         xfrm_address_t          saddr;
     474                 :            : 
     475                 :            :         unsigned short          encap_family;
     476                 :            : 
     477                 :            :         u32                     reqid;
     478                 :            : 
     479                 :            : /* Mode: transport, tunnel etc. */
     480                 :            :         u8                      mode;
     481                 :            : 
     482                 :            : /* Sharing mode: unique, this session only, this user only etc. */
     483                 :            :         u8                      share;
     484                 :            : 
     485                 :            : /* May skip this transfomration if no SA is found */
     486                 :            :         u8                      optional;
     487                 :            : 
     488                 :            : /* Skip aalgos/ealgos/calgos checks. */
     489                 :            :         u8                      allalgs;
     490                 :            : 
     491                 :            : /* Bit mask of algos allowed for acquisition */
     492                 :            :         u32                     aalgos;
     493                 :            :         u32                     ealgos;
     494                 :            :         u32                     calgos;
     495                 :            : };
     496                 :            : 
     497                 :            : #define XFRM_MAX_DEPTH          6
     498                 :            : 
     499                 :            : struct xfrm_policy_walk_entry {
     500                 :            :         struct list_head        all;
     501                 :            :         u8                      dead;
     502                 :            : };
     503                 :            : 
     504                 :            : struct xfrm_policy_walk {
     505                 :            :         struct xfrm_policy_walk_entry walk;
     506                 :            :         u8 type;
     507                 :            :         u32 seq;
     508                 :            : };
     509                 :            : 
     510                 :            : struct xfrm_policy_queue {
     511                 :            :         struct sk_buff_head     hold_queue;
     512                 :            :         struct timer_list       hold_timer;
     513                 :            :         unsigned long           timeout;
     514                 :            : };
     515                 :            : 
     516                 :            : struct xfrm_policy {
     517                 :            : #ifdef CONFIG_NET_NS
     518                 :            :         struct net              *xp_net;
     519                 :            : #endif
     520                 :            :         struct hlist_node       bydst;
     521                 :            :         struct hlist_node       byidx;
     522                 :            : 
     523                 :            :         /* This lock only affects elements except for entry. */
     524                 :            :         rwlock_t                lock;
     525                 :            :         atomic_t                refcnt;
     526                 :            :         struct timer_list       timer;
     527                 :            : 
     528                 :            :         struct flow_cache_object flo;
     529                 :            :         atomic_t                genid;
     530                 :            :         u32                     priority;
     531                 :            :         u32                     index;
     532                 :            :         struct xfrm_mark        mark;
     533                 :            :         struct xfrm_selector    selector;
     534                 :            :         struct xfrm_lifetime_cfg lft;
     535                 :            :         struct xfrm_lifetime_cur curlft;
     536                 :            :         struct xfrm_policy_walk_entry walk;
     537                 :            :         struct xfrm_policy_queue polq;
     538                 :            :         u8                      type;
     539                 :            :         u8                      action;
     540                 :            :         u8                      flags;
     541                 :            :         u8                      xfrm_nr;
     542                 :            :         u16                     family;
     543                 :            :         struct xfrm_sec_ctx     *security;
     544                 :            :         struct xfrm_tmpl        xfrm_vec[XFRM_MAX_DEPTH];
     545                 :            : };
     546                 :            : 
     547                 :            : static inline struct net *xp_net(const struct xfrm_policy *xp)
     548                 :            : {
     549                 :            :         return read_pnet(&xp->xp_net);
     550                 :            : }
     551                 :            : 
     552                 :            : struct xfrm_kmaddress {
     553                 :            :         xfrm_address_t          local;
     554                 :            :         xfrm_address_t          remote;
     555                 :            :         u32                     reserved;
     556                 :            :         u16                     family;
     557                 :            : };
     558                 :            : 
     559                 :            : struct xfrm_migrate {
     560                 :            :         xfrm_address_t          old_daddr;
     561                 :            :         xfrm_address_t          old_saddr;
     562                 :            :         xfrm_address_t          new_daddr;
     563                 :            :         xfrm_address_t          new_saddr;
     564                 :            :         u8                      proto;
     565                 :            :         u8                      mode;
     566                 :            :         u16                     reserved;
     567                 :            :         u32                     reqid;
     568                 :            :         u16                     old_family;
     569                 :            :         u16                     new_family;
     570                 :            : };
     571                 :            : 
     572                 :            : #define XFRM_KM_TIMEOUT                30
     573                 :            : /* what happened */
     574                 :            : #define XFRM_REPLAY_UPDATE      XFRM_AE_CR
     575                 :            : #define XFRM_REPLAY_TIMEOUT     XFRM_AE_CE
     576                 :            : 
     577                 :            : /* default aevent timeout in units of 100ms */
     578                 :            : #define XFRM_AE_ETIME                   10
     579                 :            : /* Async Event timer multiplier */
     580                 :            : #define XFRM_AE_ETH_M                   10
     581                 :            : /* default seq threshold size */
     582                 :            : #define XFRM_AE_SEQT_SIZE               2
     583                 :            : 
     584                 :            : struct xfrm_mgr {
     585                 :            :         struct list_head        list;
     586                 :            :         char                    *id;
     587                 :            :         int                     (*notify)(struct xfrm_state *x, const struct km_event *c);
     588                 :            :         int                     (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp);
     589                 :            :         struct xfrm_policy      *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir);
     590                 :            :         int                     (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
     591                 :            :         int                     (*notify_policy)(struct xfrm_policy *x, int dir, const struct km_event *c);
     592                 :            :         int                     (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr);
     593                 :            :         int                     (*migrate)(const struct xfrm_selector *sel,
     594                 :            :                                            u8 dir, u8 type,
     595                 :            :                                            const struct xfrm_migrate *m,
     596                 :            :                                            int num_bundles,
     597                 :            :                                            const struct xfrm_kmaddress *k);
     598                 :            : };
     599                 :            : 
     600                 :            : int xfrm_register_km(struct xfrm_mgr *km);
     601                 :            : int xfrm_unregister_km(struct xfrm_mgr *km);
     602                 :            : 
     603                 :            : /*
     604                 :            :  * This structure is used for the duration where packets are being
     605                 :            :  * transformed by IPsec.  As soon as the packet leaves IPsec the
     606                 :            :  * area beyond the generic IP part may be overwritten.
     607                 :            :  */
     608                 :            : struct xfrm_skb_cb {
     609                 :            :         union {
     610                 :            :                 struct inet_skb_parm h4;
     611                 :            :                 struct inet6_skb_parm h6;
     612                 :            :         } header;
     613                 :            : 
     614                 :            :         /* Sequence number for replay protection. */
     615                 :            :         union {
     616                 :            :                 struct {
     617                 :            :                         __u32 low;
     618                 :            :                         __u32 hi;
     619                 :            :                 } output;
     620                 :            :                 struct {
     621                 :            :                         __be32 low;
     622                 :            :                         __be32 hi;
     623                 :            :                 } input;
     624                 :            :         } seq;
     625                 :            : };
     626                 :            : 
     627                 :            : #define XFRM_SKB_CB(__skb) ((struct xfrm_skb_cb *)&((__skb)->cb[0]))
     628                 :            : 
     629                 :            : /*
     630                 :            :  * This structure is used by the afinfo prepare_input/prepare_output functions
     631                 :            :  * to transmit header information to the mode input/output functions.
     632                 :            :  */
     633                 :            : struct xfrm_mode_skb_cb {
     634                 :            :         union {
     635                 :            :                 struct inet_skb_parm h4;
     636                 :            :                 struct inet6_skb_parm h6;
     637                 :            :         } header;
     638                 :            : 
     639                 :            :         /* Copied from header for IPv4, always set to zero and DF for IPv6. */
     640                 :            :         __be16 id;
     641                 :            :         __be16 frag_off;
     642                 :            : 
     643                 :            :         /* IP header length (excluding options or extension headers). */
     644                 :            :         u8 ihl;
     645                 :            : 
     646                 :            :         /* TOS for IPv4, class for IPv6. */
     647                 :            :         u8 tos;
     648                 :            : 
     649                 :            :         /* TTL for IPv4, hop limitfor IPv6. */
     650                 :            :         u8 ttl;
     651                 :            : 
     652                 :            :         /* Protocol for IPv4, NH for IPv6. */
     653                 :            :         u8 protocol;
     654                 :            : 
     655                 :            :         /* Option length for IPv4, zero for IPv6. */
     656                 :            :         u8 optlen;
     657                 :            : 
     658                 :            :         /* Used by IPv6 only, zero for IPv4. */
     659                 :            :         u8 flow_lbl[3];
     660                 :            : };
     661                 :            : 
     662                 :            : #define XFRM_MODE_SKB_CB(__skb) ((struct xfrm_mode_skb_cb *)&((__skb)->cb[0]))
     663                 :            : 
     664                 :            : /*
     665                 :            :  * This structure is used by the input processing to locate the SPI and
     666                 :            :  * related information.
     667                 :            :  */
     668                 :            : struct xfrm_spi_skb_cb {
     669                 :            :         union {
     670                 :            :                 struct inet_skb_parm h4;
     671                 :            :                 struct inet6_skb_parm h6;
     672                 :            :         } header;
     673                 :            : 
     674                 :            :         unsigned int daddroff;
     675                 :            :         unsigned int family;
     676                 :            : };
     677                 :            : 
     678                 :            : #define XFRM_SPI_SKB_CB(__skb) ((struct xfrm_spi_skb_cb *)&((__skb)->cb[0]))
     679                 :            : 
     680                 :            : /* Audit Information */
     681                 :            : struct xfrm_audit {
     682                 :            :         u32     secid;
     683                 :            :         kuid_t  loginuid;
     684                 :            :         u32     sessionid;
     685                 :            : };
     686                 :            : 
     687                 :            : #ifdef CONFIG_AUDITSYSCALL
     688                 :            : static inline struct audit_buffer *xfrm_audit_start(const char *op)
     689                 :            : {
     690                 :            :         struct audit_buffer *audit_buf = NULL;
     691                 :            : 
     692 [ #  # ][ #  # ]:          0 :         if (audit_enabled == 0)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     693                 :            :                 return NULL;
     694                 :          0 :         audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC,
     695                 :            :                                     AUDIT_MAC_IPSEC_EVENT);
     696   [ #  #  #  #  :          0 :         if (audit_buf == NULL)
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     697                 :            :                 return NULL;
     698                 :          0 :         audit_log_format(audit_buf, "op=%s", op);
     699                 :            :         return audit_buf;
     700                 :            : }
     701                 :            : 
     702                 :            : static inline void xfrm_audit_helper_usrinfo(kuid_t auid, u32 ses, u32 secid,
     703                 :            :                                              struct audit_buffer *audit_buf)
     704                 :            : {
     705                 :            :         char *secctx;
     706                 :            :         u32 secctx_len;
     707                 :            : 
     708                 :          0 :         audit_log_format(audit_buf, " auid=%u ses=%u",
     709                 :            :                          from_kuid(&init_user_ns, auid), ses);
     710   [ #  #  #  #  :          0 :         if (secid != 0 &&
             #  #  #  # ]
     711                 :          0 :             security_secid_to_secctx(secid, &secctx, &secctx_len) == 0) {
     712                 :          0 :                 audit_log_format(audit_buf, " subj=%s", secctx);
     713                 :          0 :                 security_release_secctx(secctx, secctx_len);
     714                 :            :         } else
     715                 :          0 :                 audit_log_task_context(audit_buf);
     716                 :            : }
     717                 :            : 
     718                 :            : void xfrm_audit_policy_add(struct xfrm_policy *xp, int result, kuid_t auid,
     719                 :            :                            u32 ses, u32 secid);
     720                 :            : void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result, kuid_t auid,
     721                 :            :                               u32 ses, u32 secid);
     722                 :            : void xfrm_audit_state_add(struct xfrm_state *x, int result, kuid_t auid,
     723                 :            :                           u32 ses, u32 secid);
     724                 :            : void xfrm_audit_state_delete(struct xfrm_state *x, int result, kuid_t auid,
     725                 :            :                              u32 ses, u32 secid);
     726                 :            : void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
     727                 :            :                                       struct sk_buff *skb);
     728                 :            : void xfrm_audit_state_replay(struct xfrm_state *x, struct sk_buff *skb,
     729                 :            :                              __be32 net_seq);
     730                 :            : void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family);
     731                 :            : void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, __be32 net_spi,
     732                 :            :                                __be32 net_seq);
     733                 :            : void xfrm_audit_state_icvfail(struct xfrm_state *x, struct sk_buff *skb,
     734                 :            :                               u8 proto);
     735                 :            : #else
     736                 :            : 
     737                 :            : static inline void xfrm_audit_policy_add(struct xfrm_policy *xp, int result,
     738                 :            :                                   kuid_t auid, u32 ses, u32 secid)
     739                 :            : {
     740                 :            : }
     741                 :            : 
     742                 :            : static inline void xfrm_audit_policy_delete(struct xfrm_policy *xp, int result,
     743                 :            :                                   kuid_t auid, u32 ses, u32 secid)
     744                 :            : {
     745                 :            : }
     746                 :            : 
     747                 :            : static inline void xfrm_audit_state_add(struct xfrm_state *x, int result,
     748                 :            :                                  kuid_t auid, u32 ses, u32 secid)
     749                 :            : {
     750                 :            : }
     751                 :            : 
     752                 :            : static inline void xfrm_audit_state_delete(struct xfrm_state *x, int result,
     753                 :            :                                     kuid_t auid, u32 ses, u32 secid)
     754                 :            : {
     755                 :            : }
     756                 :            : 
     757                 :            : static inline void xfrm_audit_state_replay_overflow(struct xfrm_state *x,
     758                 :            :                                              struct sk_buff *skb)
     759                 :            : {
     760                 :            : }
     761                 :            : 
     762                 :            : static inline void xfrm_audit_state_replay(struct xfrm_state *x,
     763                 :            :                                            struct sk_buff *skb, __be32 net_seq)
     764                 :            : {
     765                 :            : }
     766                 :            : 
     767                 :            : static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb,
     768                 :            :                                       u16 family)
     769                 :            : {
     770                 :            : }
     771                 :            : 
     772                 :            : static inline void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family,
     773                 :            :                                       __be32 net_spi, __be32 net_seq)
     774                 :            : {
     775                 :            : }
     776                 :            : 
     777                 :            : static inline void xfrm_audit_state_icvfail(struct xfrm_state *x,
     778                 :            :                                      struct sk_buff *skb, u8 proto)
     779                 :            : {
     780                 :            : }
     781                 :            : #endif /* CONFIG_AUDITSYSCALL */
     782                 :            : 
     783                 :            : static inline void xfrm_pol_hold(struct xfrm_policy *policy)
     784                 :            : {
     785 [ #  # ][ #  # ]:          0 :         if (likely(policy != NULL))
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     786                 :          0 :                 atomic_inc(&policy->refcnt);
     787                 :            : }
     788                 :            : 
     789                 :            : void xfrm_policy_destroy(struct xfrm_policy *policy);
     790                 :            : 
     791                 :            : static inline void xfrm_pol_put(struct xfrm_policy *policy)
     792                 :            : {
     793   [ #  #  #  #  :          0 :         if (atomic_dec_and_test(&policy->refcnt))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     794                 :          0 :                 xfrm_policy_destroy(policy);
     795                 :            : }
     796                 :            : 
     797                 :            : static inline void xfrm_pols_put(struct xfrm_policy **pols, int npols)
     798                 :            : {
     799                 :            :         int i;
     800 [ #  # ][ #  # ]:        167 :         for (i = npols - 1; i >= 0; --i)
         [ #  # ][ #  # ]
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
     801                 :          0 :                 xfrm_pol_put(pols[i]);
     802                 :            : }
     803                 :            : 
     804                 :            : void __xfrm_state_destroy(struct xfrm_state *);
     805                 :            : 
     806                 :            : static inline void __xfrm_state_put(struct xfrm_state *x)
     807                 :            : {
     808                 :          0 :         atomic_dec(&x->refcnt);
     809                 :            : }
     810                 :            : 
     811                 :            : static inline void xfrm_state_put(struct xfrm_state *x)
     812                 :            : {
     813   [ #  #  #  #  :          0 :         if (atomic_dec_and_test(&x->refcnt))
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     814                 :          0 :                 __xfrm_state_destroy(x);
     815                 :            : }
     816                 :            : 
     817                 :            : static inline void xfrm_state_hold(struct xfrm_state *x)
     818                 :            : {
     819                 :          0 :         atomic_inc(&x->refcnt);
     820                 :            : }
     821                 :            : 
     822                 :            : static inline bool addr_match(const void *token1, const void *token2,
     823                 :            :                               int prefixlen)
     824                 :            : {
     825                 :            :         const __be32 *a1 = token1;
     826                 :            :         const __be32 *a2 = token2;
     827                 :            :         int pdw;
     828                 :            :         int pbi;
     829                 :            : 
     830                 :          0 :         pdw = prefixlen >> 5;       /* num of whole u32 in prefix */
     831                 :          0 :         pbi = prefixlen &  0x1f;  /* num of bits in incomplete u32 in prefix */
     832                 :            : 
     833 [ #  # ][ #  # ]:          0 :         if (pdw)
     834 [ #  # ][ #  # ]:          0 :                 if (memcmp(a1, a2, pdw << 2))
     835                 :            :                         return false;
     836                 :            : 
     837 [ #  # ][ #  # ]:          0 :         if (pbi) {
     838                 :            :                 __be32 mask;
     839                 :            : 
     840 [ #  # ][ #  # ]:          0 :                 mask = htonl((0xffffffff) << (32 - pbi));
     841                 :            : 
     842 [ #  # ][ #  # ]:          0 :                 if ((a1[pdw] ^ a2[pdw]) & mask)
     843                 :            :                         return false;
     844                 :            :         }
     845                 :            : 
     846                 :            :         return true;
     847                 :            : }
     848                 :            : 
     849                 :            : static inline bool addr4_match(__be32 a1, __be32 a2, u8 prefixlen)
     850                 :            : {
     851                 :            :         /* C99 6.5.7 (3): u32 << 32 is undefined behaviour */
     852 [ #  # ][ #  # ]:          0 :         if (prefixlen == 0)
     853                 :            :                 return true;
     854 [ #  # ][ #  # ]:          0 :         return !((a1 ^ a2) & htonl(0xFFFFFFFFu << (32 - prefixlen)));
     855                 :            : }
     856                 :            : 
     857                 :            : static __inline__
     858                 :            : __be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli)
     859                 :            : {
     860                 :            :         __be16 port;
     861   [ #  #  #  #  :          0 :         switch(fl->flowi_proto) {
           # ][ #  #  #  
                   #  # ]
     862                 :            :         case IPPROTO_TCP:
     863                 :            :         case IPPROTO_UDP:
     864                 :            :         case IPPROTO_UDPLITE:
     865                 :            :         case IPPROTO_SCTP:
     866                 :          0 :                 port = uli->ports.sport;
     867                 :            :                 break;
     868                 :            :         case IPPROTO_ICMP:
     869                 :            :         case IPPROTO_ICMPV6:
     870 [ #  # ][ #  # ]:          0 :                 port = htons(uli->icmpt.type);
     871                 :            :                 break;
     872                 :            :         case IPPROTO_MH:
     873 [ #  # ][ #  # ]:          0 :                 port = htons(uli->mht.type);
     874                 :            :                 break;
     875                 :            :         case IPPROTO_GRE:
     876 [ #  # ][ #  # ]:          0 :                 port = htons(ntohl(uli->gre_key) >> 16);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     877                 :            :                 break;
     878                 :            :         default:
     879                 :            :                 port = 0;       /*XXX*/
     880                 :            :         }
     881                 :            :         return port;
     882                 :            : }
     883                 :            : 
     884                 :            : static __inline__
     885                 :            : __be16 xfrm_flowi_dport(const struct flowi *fl, const union flowi_uli *uli)
     886                 :            : {
     887                 :            :         __be16 port;
     888   [ #  #  #  # ]:          0 :         switch(fl->flowi_proto) {
           [ #  #  #  # ]
     889                 :            :         case IPPROTO_TCP:
     890                 :            :         case IPPROTO_UDP:
     891                 :            :         case IPPROTO_UDPLITE:
     892                 :            :         case IPPROTO_SCTP:
     893                 :          0 :                 port = uli->ports.dport;
     894                 :            :                 break;
     895                 :            :         case IPPROTO_ICMP:
     896                 :            :         case IPPROTO_ICMPV6:
     897 [ #  # ][ #  # ]:          0 :                 port = htons(uli->icmpt.code);
     898                 :            :                 break;
     899                 :            :         case IPPROTO_GRE:
     900 [ #  # ][ #  # ]:          0 :                 port = htons(ntohl(uli->gre_key) & 0xffff);
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
     901                 :            :                 break;
     902                 :            :         default:
     903                 :            :                 port = 0;       /*XXX*/
     904                 :            :         }
     905                 :            :         return port;
     906                 :            : }
     907                 :            : 
     908                 :            : bool xfrm_selector_match(const struct xfrm_selector *sel,
     909                 :            :                          const struct flowi *fl, unsigned short family);
     910                 :            : 
     911                 :            : #ifdef CONFIG_SECURITY_NETWORK_XFRM
     912                 :            : /*      If neither has a context --> match
     913                 :            :  *      Otherwise, both must have a context and the sids, doi, alg must match
     914                 :            :  */
     915                 :            : static inline bool xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
     916                 :            : {
     917                 :            :         return ((!s1 && !s2) ||
     918                 :            :                 (s1 && s2 &&
     919                 :            :                  (s1->ctx_sid == s2->ctx_sid) &&
     920                 :            :                  (s1->ctx_doi == s2->ctx_doi) &&
     921                 :            :                  (s1->ctx_alg == s2->ctx_alg)));
     922                 :            : }
     923                 :            : #else
     924                 :            : static inline bool xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
     925                 :            : {
     926                 :            :         return true;
     927                 :            : }
     928                 :            : #endif
     929                 :            : 
     930                 :            : /* A struct encoding bundle of transformations to apply to some set of flow.
     931                 :            :  *
     932                 :            :  * dst->child points to the next element of bundle.
     933                 :            :  * dst->xfrm  points to an instanse of transformer.
     934                 :            :  *
     935                 :            :  * Due to unfortunate limitations of current routing cache, which we
     936                 :            :  * have no time to fix, it mirrors struct rtable and bound to the same
     937                 :            :  * routing key, including saddr,daddr. However, we can have many of
     938                 :            :  * bundles differing by session id. All the bundles grow from a parent
     939                 :            :  * policy rule.
     940                 :            :  */
     941                 :            : struct xfrm_dst {
     942                 :            :         union {
     943                 :            :                 struct dst_entry        dst;
     944                 :            :                 struct rtable           rt;
     945                 :            :                 struct rt6_info         rt6;
     946                 :            :         } u;
     947                 :            :         struct dst_entry *route;
     948                 :            :         struct flow_cache_object flo;
     949                 :            :         struct xfrm_policy *pols[XFRM_POLICY_TYPE_MAX];
     950                 :            :         int num_pols, num_xfrms;
     951                 :            : #ifdef CONFIG_XFRM_SUB_POLICY
     952                 :            :         struct flowi *origin;
     953                 :            :         struct xfrm_selector *partner;
     954                 :            : #endif
     955                 :            :         u32 xfrm_genid;
     956                 :            :         u32 policy_genid;
     957                 :            :         u32 route_mtu_cached;
     958                 :            :         u32 child_mtu_cached;
     959                 :            :         u32 route_cookie;
     960                 :            :         u32 path_cookie;
     961                 :            : };
     962                 :            : 
     963                 :            : #ifdef CONFIG_XFRM
     964                 :            : static inline void xfrm_dst_destroy(struct xfrm_dst *xdst)
     965                 :            : {
     966                 :          0 :         xfrm_pols_put(xdst->pols, xdst->num_pols);
     967                 :          0 :         dst_release(xdst->route);
     968         [ #  # ]:          0 :         if (likely(xdst->u.dst.xfrm))
     969                 :            :                 xfrm_state_put(xdst->u.dst.xfrm);
     970                 :            : #ifdef CONFIG_XFRM_SUB_POLICY
     971                 :            :         kfree(xdst->origin);
     972                 :            :         xdst->origin = NULL;
     973                 :            :         kfree(xdst->partner);
     974                 :            :         xdst->partner = NULL;
     975                 :            : #endif
     976                 :            : }
     977                 :            : #endif
     978                 :            : 
     979                 :            : void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev);
     980                 :            : 
     981                 :            : struct sec_path {
     982                 :            :         atomic_t                refcnt;
     983                 :            :         int                     len;
     984                 :            :         struct xfrm_state       *xvec[XFRM_MAX_DEPTH];
     985                 :            : };
     986                 :            : 
     987                 :            : static inline int secpath_exists(struct sk_buff *skb)
     988                 :            : {
     989                 :            : #ifdef CONFIG_XFRM
     990                 :            :         return skb->sp != NULL;
     991                 :            : #else
     992                 :            :         return 0;
     993                 :            : #endif
     994                 :            : }
     995                 :            : 
     996                 :            : static inline struct sec_path *
     997                 :            : secpath_get(struct sec_path *sp)
     998                 :            : {
     999         [ -  + ]:     192244 :         if (sp)
    1000                 :          0 :                 atomic_inc(&sp->refcnt);
    1001                 :            :         return sp;
    1002                 :            : }
    1003                 :            : 
    1004                 :            : void __secpath_destroy(struct sec_path *sp);
    1005                 :            : 
    1006                 :            : static inline void
    1007                 :            : secpath_put(struct sec_path *sp)
    1008                 :            : {
    1009   [ #  #  #  # ]:    1435895 :         if (sp && atomic_dec_and_test(&sp->refcnt))
           [ -  +  #  # ]
    1010                 :          0 :                 __secpath_destroy(sp);
    1011                 :            : }
    1012                 :            : 
    1013                 :            : struct sec_path *secpath_dup(struct sec_path *src);
    1014                 :            : 
    1015                 :            : static inline void
    1016                 :            : secpath_reset(struct sk_buff *skb)
    1017                 :            : {
    1018                 :            : #ifdef CONFIG_XFRM
    1019                 :          0 :         secpath_put(skb->sp);
    1020                 :          0 :         skb->sp = NULL;
    1021                 :            : #endif
    1022                 :            : }
    1023                 :            : 
    1024                 :            : static inline int
    1025                 :            : xfrm_addr_any(const xfrm_address_t *addr, unsigned short family)
    1026                 :            : {
    1027      [ #  #  # ]:          0 :         switch (family) {
              [ #  #  # ]
              [ #  #  # ]
    1028                 :            :         case AF_INET:
    1029                 :          0 :                 return addr->a4 == 0;
    1030                 :            :         case AF_INET6:
    1031                 :          0 :                 return ipv6_addr_any((struct in6_addr *)&addr->a6);
    1032                 :            :         }
    1033                 :            :         return 0;
    1034                 :            : }
    1035                 :            : 
    1036                 :            : static inline int
    1037                 :            : __xfrm4_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)
    1038                 :            : {
    1039 [ #  # ][ #  # ]:          0 :         return  (tmpl->saddr.a4 &&
         [ #  # ][ #  # ]
    1040                 :          0 :                  tmpl->saddr.a4 != x->props.saddr.a4);
    1041                 :            : }
    1042                 :            : 
    1043                 :            : static inline int
    1044                 :            : __xfrm6_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x)
    1045                 :            : {
    1046 [ #  # ][ #  # ]:          0 :         return  (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) &&
         [ #  # ][ #  # ]
    1047                 :            :                  !ipv6_addr_equal((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));
    1048                 :            : }
    1049                 :            : 
    1050                 :            : static inline int
    1051                 :          0 : xfrm_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x, unsigned short family)
    1052                 :            : {
    1053      [ #  #  # ]:          0 :         switch (family) {
              [ #  #  # ]
    1054                 :            :         case AF_INET:
    1055                 :            :                 return __xfrm4_state_addr_cmp(tmpl, x);
    1056                 :            :         case AF_INET6:
    1057                 :            :                 return __xfrm6_state_addr_cmp(tmpl, x);
    1058                 :            :         }
    1059                 :            :         return !0;
    1060                 :            : }
    1061                 :            : 
    1062                 :            : #ifdef CONFIG_XFRM
    1063                 :            : int __xfrm_policy_check(struct sock *, int dir, struct sk_buff *skb,
    1064                 :            :                         unsigned short family);
    1065                 :            : 
    1066                 :            : static inline int __xfrm_policy_check2(struct sock *sk, int dir,
    1067                 :          0 :                                        struct sk_buff *skb,
    1068                 :            :                                        unsigned int family, int reverse)
    1069                 :            : {
    1070                 :            :         struct net *net = dev_net(skb->dev);
    1071                 :            :         int ndir = dir | (reverse ? XFRM_POLICY_MASK + 1 : 0);
    1072                 :            : 
    1073 [ +  - ][ -  + ]:      60116 :         if (sk && sk->sk_policy[XFRM_POLICY_IN])
    1074                 :          0 :                 return __xfrm_policy_check(sk, ndir, skb, family);
    1075                 :            : 
    1076 [ +  + ][ #  # ]:      60211 :         return  (!net->xfrm.policy_count[dir] && !skb->sp) ||
         [ -  + ][ #  # ]
         [ #  # ][ #  # ]
    1077   [ +  -  #  # ]:      60211 :                 (skb_dst(skb)->flags & DST_NOPOLICY) ||
           [ +  -  #  # ]
           [ #  #  #  # ]
    1078                 :          0 :                 __xfrm_policy_check(sk, ndir, skb, family);
    1079                 :            : }
    1080                 :            : 
    1081                 :            : static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
    1082                 :            : {
    1083                 :            :         return __xfrm_policy_check2(sk, dir, skb, family, 0);
    1084                 :            : }
    1085                 :            : 
    1086                 :            : static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
    1087                 :            : {
    1088                 :            :         return xfrm_policy_check(sk, dir, skb, AF_INET);
    1089                 :            : }
    1090                 :            : 
    1091                 :            : static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
    1092                 :            : {
    1093                 :            :         return xfrm_policy_check(sk, dir, skb, AF_INET6);
    1094                 :            : }
    1095                 :            : 
    1096                 :            : static inline int xfrm4_policy_check_reverse(struct sock *sk, int dir,
    1097                 :            :                                              struct sk_buff *skb)
    1098                 :            : {
    1099                 :            :         return __xfrm_policy_check2(sk, dir, skb, AF_INET, 1);
    1100                 :            : }
    1101                 :            : 
    1102                 :            : static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
    1103                 :            :                                              struct sk_buff *skb)
    1104                 :            : {
    1105                 :            :         return __xfrm_policy_check2(sk, dir, skb, AF_INET6, 1);
    1106                 :            : }
    1107                 :            : 
    1108                 :            : int __xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
    1109                 :            :                           unsigned int family, int reverse);
    1110                 :            : 
    1111                 :            : static inline int xfrm_decode_session(struct sk_buff *skb, struct flowi *fl,
    1112                 :            :                                       unsigned int family)
    1113                 :            : {
    1114                 :          0 :         return __xfrm_decode_session(skb, fl, family, 0);
    1115                 :            : }
    1116                 :            : 
    1117                 :            : static inline int xfrm_decode_session_reverse(struct sk_buff *skb,
    1118                 :            :                                               struct flowi *fl,
    1119                 :            :                                               unsigned int family)
    1120                 :            : {
    1121                 :          0 :         return __xfrm_decode_session(skb, fl, family, 1);
    1122                 :            : }
    1123                 :            : 
    1124                 :            : int __xfrm_route_forward(struct sk_buff *skb, unsigned short family);
    1125                 :            : 
    1126                 :          0 : static inline int xfrm_route_forward(struct sk_buff *skb, unsigned short family)
    1127                 :            : {
    1128                 :            :         struct net *net = dev_net(skb->dev);
    1129                 :            : 
    1130         [ #  # ]:          0 :         return  !net->xfrm.policy_count[XFRM_POLICY_OUT] ||
    1131   [ #  #  #  # ]:          0 :                 (skb_dst(skb)->flags & DST_NOXFRM) ||
    1132                 :          0 :                 __xfrm_route_forward(skb, family);
    1133                 :            : }
    1134                 :            : 
    1135                 :            : static inline int xfrm4_route_forward(struct sk_buff *skb)
    1136                 :            : {
    1137                 :            :         return xfrm_route_forward(skb, AF_INET);
    1138                 :            : }
    1139                 :            : 
    1140                 :            : static inline int xfrm6_route_forward(struct sk_buff *skb)
    1141                 :            : {
    1142                 :            :         return xfrm_route_forward(skb, AF_INET6);
    1143                 :            : }
    1144                 :            : 
    1145                 :            : int __xfrm_sk_clone_policy(struct sock *sk);
    1146                 :            : 
    1147                 :            : static inline int xfrm_sk_clone_policy(struct sock *sk)
    1148                 :            : {
    1149 [ +  - ][ -  + ]:         28 :         if (unlikely(sk->sk_policy[0] || sk->sk_policy[1]))
    1150                 :          0 :                 return __xfrm_sk_clone_policy(sk);
    1151                 :            :         return 0;
    1152                 :            : }
    1153                 :            : 
    1154                 :            : int xfrm_policy_delete(struct xfrm_policy *pol, int dir);
    1155                 :            : 
    1156                 :            : static inline void xfrm_sk_free_policy(struct sock *sk)
    1157                 :            : {
    1158         [ -  + ]:        186 :         if (unlikely(sk->sk_policy[0] != NULL)) {
    1159                 :          0 :                 xfrm_policy_delete(sk->sk_policy[0], XFRM_POLICY_MAX);
    1160                 :          0 :                 sk->sk_policy[0] = NULL;
    1161                 :            :         }
    1162         [ -  + ]:        186 :         if (unlikely(sk->sk_policy[1] != NULL)) {
    1163                 :          0 :                 xfrm_policy_delete(sk->sk_policy[1], XFRM_POLICY_MAX+1);
    1164                 :          0 :                 sk->sk_policy[1] = NULL;
    1165                 :            :         }
    1166                 :            : }
    1167                 :            : 
    1168                 :            : void xfrm_garbage_collect(struct net *net);
    1169                 :            : 
    1170                 :            : #else
    1171                 :            : 
    1172                 :            : static inline void xfrm_sk_free_policy(struct sock *sk) {}
    1173                 :            : static inline int xfrm_sk_clone_policy(struct sock *sk) { return 0; }
    1174                 :            : static inline int xfrm6_route_forward(struct sk_buff *skb) { return 1; }  
    1175                 :            : static inline int xfrm4_route_forward(struct sk_buff *skb) { return 1; } 
    1176                 :            : static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
    1177                 :            : { 
    1178                 :            :         return 1; 
    1179                 :            : } 
    1180                 :            : static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
    1181                 :            : {
    1182                 :            :         return 1;
    1183                 :            : }
    1184                 :            : static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
    1185                 :            : {
    1186                 :            :         return 1;
    1187                 :            : }
    1188                 :            : static inline int xfrm_decode_session_reverse(struct sk_buff *skb,
    1189                 :            :                                               struct flowi *fl,
    1190                 :            :                                               unsigned int family)
    1191                 :            : {
    1192                 :            :         return -ENOSYS;
    1193                 :            : }
    1194                 :            : static inline int xfrm4_policy_check_reverse(struct sock *sk, int dir,
    1195                 :            :                                              struct sk_buff *skb)
    1196                 :            : {
    1197                 :            :         return 1;
    1198                 :            : }
    1199                 :            : static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,
    1200                 :            :                                              struct sk_buff *skb)
    1201                 :            : {
    1202                 :            :         return 1;
    1203                 :            : }
    1204                 :            : static inline void xfrm_garbage_collect(struct net *net)
    1205                 :            : {
    1206                 :            : }
    1207                 :            : #endif
    1208                 :            : 
    1209                 :            : static __inline__
    1210                 :            : xfrm_address_t *xfrm_flowi_daddr(const struct flowi *fl, unsigned short family)
    1211                 :            : {
    1212      [ #  #  # ]:          0 :         switch (family){
              [ #  #  # ]
    1213                 :            :         case AF_INET:
    1214                 :          0 :                 return (xfrm_address_t *)&fl->u.ip4.daddr;
    1215                 :            :         case AF_INET6:
    1216                 :          0 :                 return (xfrm_address_t *)&fl->u.ip6.daddr;
    1217                 :            :         }
    1218                 :            :         return NULL;
    1219                 :            : }
    1220                 :            : 
    1221                 :            : static __inline__
    1222                 :            : xfrm_address_t *xfrm_flowi_saddr(const struct flowi *fl, unsigned short family)
    1223                 :            : {
    1224      [ #  #  # ]:          0 :         switch (family){
              [ #  #  # ]
    1225                 :            :         case AF_INET:
    1226                 :          0 :                 return (xfrm_address_t *)&fl->u.ip4.saddr;
    1227                 :            :         case AF_INET6:
    1228                 :          0 :                 return (xfrm_address_t *)&fl->u.ip6.saddr;
    1229                 :            :         }
    1230                 :            :         return NULL;
    1231                 :            : }
    1232                 :            : 
    1233                 :            : static __inline__
    1234                 :            : void xfrm_flowi_addr_get(const struct flowi *fl,
    1235                 :            :                          xfrm_address_t *saddr, xfrm_address_t *daddr,
    1236                 :            :                          unsigned short family)
    1237                 :            : {
    1238      [ #  #  # ]:          0 :         switch(family) {
    1239                 :            :         case AF_INET:
    1240                 :          0 :                 memcpy(&saddr->a4, &fl->u.ip4.saddr, sizeof(saddr->a4));
    1241                 :          0 :                 memcpy(&daddr->a4, &fl->u.ip4.daddr, sizeof(daddr->a4));
    1242                 :            :                 break;
    1243                 :            :         case AF_INET6:
    1244                 :          0 :                 *(struct in6_addr *)saddr->a6 = fl->u.ip6.saddr;
    1245                 :          0 :                 *(struct in6_addr *)daddr->a6 = fl->u.ip6.daddr;
    1246                 :            :                 break;
    1247                 :            :         }
    1248                 :            : }
    1249                 :            : 
    1250                 :            : static __inline__ int
    1251                 :            : __xfrm4_state_addr_check(const struct xfrm_state *x,
    1252                 :            :                          const xfrm_address_t *daddr, const xfrm_address_t *saddr)
    1253                 :            : {
    1254 [ #  # ][ #  # ]:          0 :         if (daddr->a4 == x->id.daddr.a4 &&
         [ #  # ][ #  # ]
    1255 [ #  # ][ #  # ]:          0 :             (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4))
         [ #  # ][ #  # ]
    1256                 :            :                 return 1;
    1257                 :            :         return 0;
    1258                 :            : }
    1259                 :            : 
    1260                 :            : static __inline__ int
    1261                 :            : __xfrm6_state_addr_check(const struct xfrm_state *x,
    1262                 :            :                          const xfrm_address_t *daddr, const xfrm_address_t *saddr)
    1263                 :            : {
    1264 [ #  # ][ #  # ]:          0 :         if (ipv6_addr_equal((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) &&
         [ #  # ][ #  # ]
    1265 [ #  # ][ #  # ]:          0 :             (ipv6_addr_equal((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr) ||
    1266 [ #  # ][ #  # ]:          0 :              ipv6_addr_any((struct in6_addr *)saddr) || 
    1267                 :            :              ipv6_addr_any((struct in6_addr *)&x->props.saddr)))
    1268                 :            :                 return 1;
    1269                 :            :         return 0;
    1270                 :            : }
    1271                 :            : 
    1272                 :            : static __inline__ int
    1273                 :          0 : xfrm_state_addr_check(const struct xfrm_state *x,
    1274                 :          0 :                       const xfrm_address_t *daddr, const xfrm_address_t *saddr,
    1275                 :            :                       unsigned short family)
    1276                 :            : {
    1277      [ #  #  # ]:          0 :         switch (family) {
              [ #  #  # ]
    1278                 :            :         case AF_INET:
    1279                 :            :                 return __xfrm4_state_addr_check(x, daddr, saddr);
    1280                 :            :         case AF_INET6:
    1281                 :            :                 return __xfrm6_state_addr_check(x, daddr, saddr);
    1282                 :            :         }
    1283                 :            :         return 0;
    1284                 :            : }
    1285                 :            : 
    1286                 :            : static __inline__ int
    1287                 :            : xfrm_state_addr_flow_check(const struct xfrm_state *x, const struct flowi *fl,
    1288                 :            :                            unsigned short family)
    1289                 :            : {
    1290                 :            :         switch (family) {
    1291                 :            :         case AF_INET:
    1292                 :            :                 return __xfrm4_state_addr_check(x,
    1293                 :            :                                                 (const xfrm_address_t *)&fl->u.ip4.daddr,
    1294                 :            :                                                 (const xfrm_address_t *)&fl->u.ip4.saddr);
    1295                 :            :         case AF_INET6:
    1296                 :            :                 return __xfrm6_state_addr_check(x,
    1297                 :            :                                                 (const xfrm_address_t *)&fl->u.ip6.daddr,
    1298                 :            :                                                 (const xfrm_address_t *)&fl->u.ip6.saddr);
    1299                 :            :         }
    1300                 :            :         return 0;
    1301                 :            : }
    1302                 :            : 
    1303                 :            : static inline int xfrm_state_kern(const struct xfrm_state *x)
    1304                 :            : {
    1305                 :          0 :         return atomic_read(&x->tunnel_users);
    1306                 :            : }
    1307                 :            : 
    1308                 :            : static inline int xfrm_id_proto_match(u8 proto, u8 userproto)
    1309                 :            : {
    1310 [ #  # ][ #  # ]:          0 :         return (!userproto || proto == userproto ||
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1311 [ #  # ][ #  # ]:          0 :                 (userproto == IPSEC_PROTO_ANY && (proto == IPPROTO_AH ||
         [ #  # ][ #  # ]
    1312                 :          0 :                                                   proto == IPPROTO_ESP ||
    1313                 :          0 :                                                   proto == IPPROTO_COMP)));
    1314                 :            : }
    1315                 :            : 
    1316                 :            : /*
    1317                 :            :  * xfrm algorithm information
    1318                 :            :  */
    1319                 :            : struct xfrm_algo_aead_info {
    1320                 :            :         u16 icv_truncbits;
    1321                 :            : };
    1322                 :            : 
    1323                 :            : struct xfrm_algo_auth_info {
    1324                 :            :         u16 icv_truncbits;
    1325                 :            :         u16 icv_fullbits;
    1326                 :            : };
    1327                 :            : 
    1328                 :            : struct xfrm_algo_encr_info {
    1329                 :            :         u16 blockbits;
    1330                 :            :         u16 defkeybits;
    1331                 :            : };
    1332                 :            : 
    1333                 :            : struct xfrm_algo_comp_info {
    1334                 :            :         u16 threshold;
    1335                 :            : };
    1336                 :            : 
    1337                 :            : struct xfrm_algo_desc {
    1338                 :            :         char *name;
    1339                 :            :         char *compat;
    1340                 :            :         u8 available:1;
    1341                 :            :         u8 pfkey_supported:1;
    1342                 :            :         union {
    1343                 :            :                 struct xfrm_algo_aead_info aead;
    1344                 :            :                 struct xfrm_algo_auth_info auth;
    1345                 :            :                 struct xfrm_algo_encr_info encr;
    1346                 :            :                 struct xfrm_algo_comp_info comp;
    1347                 :            :         } uinfo;
    1348                 :            :         struct sadb_alg desc;
    1349                 :            : };
    1350                 :            : 
    1351                 :            : /* XFRM tunnel handlers.  */
    1352                 :            : struct xfrm_tunnel {
    1353                 :            :         int (*handler)(struct sk_buff *skb);
    1354                 :            :         int (*err_handler)(struct sk_buff *skb, u32 info);
    1355                 :            : 
    1356                 :            :         struct xfrm_tunnel __rcu *next;
    1357                 :            :         int priority;
    1358                 :            : };
    1359                 :            : 
    1360                 :            : struct xfrm_tunnel_notifier {
    1361                 :            :         int (*handler)(struct sk_buff *skb);
    1362                 :            :         struct xfrm_tunnel_notifier __rcu *next;
    1363                 :            :         int priority;
    1364                 :            : };
    1365                 :            : 
    1366                 :            : struct xfrm6_tunnel {
    1367                 :            :         int (*handler)(struct sk_buff *skb);
    1368                 :            :         int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,
    1369                 :            :                            u8 type, u8 code, int offset, __be32 info);
    1370                 :            :         struct xfrm6_tunnel __rcu *next;
    1371                 :            :         int priority;
    1372                 :            : };
    1373                 :            : 
    1374                 :            : void xfrm_init(void);
    1375                 :            : void xfrm4_init(void);
    1376                 :            : int xfrm_state_init(struct net *net);
    1377                 :            : void xfrm_state_fini(struct net *net);
    1378                 :            : void xfrm4_state_init(void);
    1379                 :            : #ifdef CONFIG_XFRM
    1380                 :            : int xfrm6_init(void);
    1381                 :            : void xfrm6_fini(void);
    1382                 :            : int xfrm6_state_init(void);
    1383                 :            : void xfrm6_state_fini(void);
    1384                 :            : #else
    1385                 :            : static inline int xfrm6_init(void)
    1386                 :            : {
    1387                 :            :         return 0;
    1388                 :            : }
    1389                 :            : static inline void xfrm6_fini(void)
    1390                 :            : {
    1391                 :            :         ;
    1392                 :            : }
    1393                 :            : #endif
    1394                 :            : 
    1395                 :            : #ifdef CONFIG_XFRM_STATISTICS
    1396                 :            : int xfrm_proc_init(struct net *net);
    1397                 :            : void xfrm_proc_fini(struct net *net);
    1398                 :            : #endif
    1399                 :            : 
    1400                 :            : int xfrm_sysctl_init(struct net *net);
    1401                 :            : #ifdef CONFIG_SYSCTL
    1402                 :            : void xfrm_sysctl_fini(struct net *net);
    1403                 :            : #else
    1404                 :            : static inline void xfrm_sysctl_fini(struct net *net)
    1405                 :            : {
    1406                 :            : }
    1407                 :            : #endif
    1408                 :            : 
    1409                 :            : void xfrm_state_walk_init(struct xfrm_state_walk *walk, u8 proto);
    1410                 :            : int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk,
    1411                 :            :                     int (*func)(struct xfrm_state *, int, void*), void *);
    1412                 :            : void xfrm_state_walk_done(struct xfrm_state_walk *walk);
    1413                 :            : struct xfrm_state *xfrm_state_alloc(struct net *net);
    1414                 :            : struct xfrm_state *xfrm_state_find(const xfrm_address_t *daddr,
    1415                 :            :                                    const xfrm_address_t *saddr,
    1416                 :            :                                    const struct flowi *fl,
    1417                 :            :                                    struct xfrm_tmpl *tmpl,
    1418                 :            :                                    struct xfrm_policy *pol, int *err,
    1419                 :            :                                    unsigned short family);
    1420                 :            : struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark,
    1421                 :            :                                        xfrm_address_t *daddr,
    1422                 :            :                                        xfrm_address_t *saddr,
    1423                 :            :                                        unsigned short family,
    1424                 :            :                                        u8 mode, u8 proto, u32 reqid);
    1425                 :            : int xfrm_state_check_expire(struct xfrm_state *x);
    1426                 :            : void xfrm_state_insert(struct xfrm_state *x);
    1427                 :            : int xfrm_state_add(struct xfrm_state *x);
    1428                 :            : int xfrm_state_update(struct xfrm_state *x);
    1429                 :            : struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark,
    1430                 :            :                                      const xfrm_address_t *daddr, __be32 spi,
    1431                 :            :                                      u8 proto, unsigned short family);
    1432                 :            : struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark,
    1433                 :            :                                             const xfrm_address_t *daddr,
    1434                 :            :                                             const xfrm_address_t *saddr,
    1435                 :            :                                             u8 proto,
    1436                 :            :                                             unsigned short family);
    1437                 :            : #ifdef CONFIG_XFRM_SUB_POLICY
    1438                 :            : int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n,
    1439                 :            :                    unsigned short family);
    1440                 :            : int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src, int n,
    1441                 :            :                     unsigned short family);
    1442                 :            : #else
    1443                 :            : static inline int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src,
    1444                 :            :                                  int n, unsigned short family)
    1445                 :            : {
    1446                 :            :         return -ENOSYS;
    1447                 :            : }
    1448                 :            : 
    1449                 :            : static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **src,
    1450                 :            :                                   int n, unsigned short family)
    1451                 :            : {
    1452                 :            :         return -ENOSYS;
    1453                 :            : }
    1454                 :            : #endif
    1455                 :            : 
    1456                 :            : struct xfrmk_sadinfo {
    1457                 :            :         u32 sadhcnt; /* current hash bkts */
    1458                 :            :         u32 sadhmcnt; /* max allowed hash bkts */
    1459                 :            :         u32 sadcnt; /* current running count */
    1460                 :            : };
    1461                 :            : 
    1462                 :            : struct xfrmk_spdinfo {
    1463                 :            :         u32 incnt;
    1464                 :            :         u32 outcnt;
    1465                 :            :         u32 fwdcnt;
    1466                 :            :         u32 inscnt;
    1467                 :            :         u32 outscnt;
    1468                 :            :         u32 fwdscnt;
    1469                 :            :         u32 spdhcnt;
    1470                 :            :         u32 spdhmcnt;
    1471                 :            : };
    1472                 :            : 
    1473                 :            : struct xfrm_state *xfrm_find_acq_byseq(struct net *net, u32 mark, u32 seq);
    1474                 :            : int xfrm_state_delete(struct xfrm_state *x);
    1475                 :            : int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info);
    1476                 :            : void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si);
    1477                 :            : void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
    1478                 :            : u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
    1479                 :            : int xfrm_init_replay(struct xfrm_state *x);
    1480                 :            : int xfrm_state_mtu(struct xfrm_state *x, int mtu);
    1481                 :            : int __xfrm_init_state(struct xfrm_state *x, bool init_replay);
    1482                 :            : int xfrm_init_state(struct xfrm_state *x);
    1483                 :            : int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb);
    1484                 :            : int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type);
    1485                 :            : int xfrm_input_resume(struct sk_buff *skb, int nexthdr);
    1486                 :            : int xfrm_output_resume(struct sk_buff *skb, int err);
    1487                 :            : int xfrm_output(struct sk_buff *skb);
    1488                 :            : int xfrm_inner_extract_output(struct xfrm_state *x, struct sk_buff *skb);
    1489                 :            : void xfrm_local_error(struct sk_buff *skb, int mtu);
    1490                 :            : int xfrm4_extract_header(struct sk_buff *skb);
    1491                 :            : int xfrm4_extract_input(struct xfrm_state *x, struct sk_buff *skb);
    1492                 :            : int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
    1493                 :            :                     int encap_type);
    1494                 :            : int xfrm4_transport_finish(struct sk_buff *skb, int async);
    1495                 :            : int xfrm4_rcv(struct sk_buff *skb);
    1496                 :            : 
    1497                 :            : static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi)
    1498                 :            : {
    1499                 :          0 :         return xfrm4_rcv_encap(skb, nexthdr, spi, 0);
    1500                 :            : }
    1501                 :            : 
    1502                 :            : int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
    1503                 :            : int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
    1504                 :            : int xfrm4_output(struct sk_buff *skb);
    1505                 :            : int xfrm4_output_finish(struct sk_buff *skb);
    1506                 :            : int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
    1507                 :            : int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
    1508                 :            : void xfrm4_local_error(struct sk_buff *skb, u32 mtu);
    1509                 :            : int xfrm4_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler);
    1510                 :            : int xfrm4_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler);
    1511                 :            : int xfrm6_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler);
    1512                 :            : int xfrm6_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler);
    1513                 :            : int xfrm6_extract_header(struct sk_buff *skb);
    1514                 :            : int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb);
    1515                 :            : int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi);
    1516                 :            : int xfrm6_transport_finish(struct sk_buff *skb, int async);
    1517                 :            : int xfrm6_rcv(struct sk_buff *skb);
    1518                 :            : int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
    1519                 :            :                      xfrm_address_t *saddr, u8 proto);
    1520                 :            : void xfrm6_local_error(struct sk_buff *skb, u32 mtu);
    1521                 :            : int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
    1522                 :            : int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family);
    1523                 :            : __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
    1524                 :            : __be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
    1525                 :            : int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
    1526                 :            : int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
    1527                 :            : int xfrm6_output(struct sk_buff *skb);
    1528                 :            : int xfrm6_output_finish(struct sk_buff *skb);
    1529                 :            : int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
    1530                 :            :                           u8 **prevhdr);
    1531                 :            : 
    1532                 :            : #ifdef CONFIG_XFRM
    1533                 :            : int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb);
    1534                 :            : int xfrm_user_policy(struct sock *sk, int optname,
    1535                 :            :                      u8 __user *optval, int optlen);
    1536                 :            : #else
    1537                 :            : static inline int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
    1538                 :            : {
    1539                 :            :         return -ENOPROTOOPT;
    1540                 :            : } 
    1541                 :            : 
    1542                 :            : static inline int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
    1543                 :            : {
    1544                 :            :         /* should not happen */
    1545                 :            :         kfree_skb(skb);
    1546                 :            :         return 0;
    1547                 :            : }
    1548                 :            : #endif
    1549                 :            : 
    1550                 :            : struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp);
    1551                 :            : 
    1552                 :            : void xfrm_policy_walk_init(struct xfrm_policy_walk *walk, u8 type);
    1553                 :            : int xfrm_policy_walk(struct net *net, struct xfrm_policy_walk *walk,
    1554                 :            :                      int (*func)(struct xfrm_policy *, int, int, void*),
    1555                 :            :                      void *);
    1556                 :            : void xfrm_policy_walk_done(struct xfrm_policy_walk *walk);
    1557                 :            : int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
    1558                 :            : struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u32 mark,
    1559                 :            :                                           u8 type, int dir,
    1560                 :            :                                           struct xfrm_selector *sel,
    1561                 :            :                                           struct xfrm_sec_ctx *ctx, int delete,
    1562                 :            :                                           int *err);
    1563                 :            : struct xfrm_policy *xfrm_policy_byid(struct net *net, u32 mark, u8, int dir,
    1564                 :            :                                      u32 id, int delete, int *err);
    1565                 :            : int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info);
    1566                 :            : u32 xfrm_get_acqseq(void);
    1567                 :            : int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
    1568                 :            : struct xfrm_state *xfrm_find_acq(struct net *net, const struct xfrm_mark *mark,
    1569                 :            :                                  u8 mode, u32 reqid, u8 proto,
    1570                 :            :                                  const xfrm_address_t *daddr,
    1571                 :            :                                  const xfrm_address_t *saddr, int create,
    1572                 :            :                                  unsigned short family);
    1573                 :            : int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
    1574                 :            : 
    1575                 :            : #ifdef CONFIG_XFRM_MIGRATE
    1576                 :            : int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
    1577                 :            :                const struct xfrm_migrate *m, int num_bundles,
    1578                 :            :                const struct xfrm_kmaddress *k);
    1579                 :            : struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m);
    1580                 :            : struct xfrm_state *xfrm_state_migrate(struct xfrm_state *x,
    1581                 :            :                                       struct xfrm_migrate *m);
    1582                 :            : int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type,
    1583                 :            :                  struct xfrm_migrate *m, int num_bundles,
    1584                 :            :                  struct xfrm_kmaddress *k);
    1585                 :            : #endif
    1586                 :            : 
    1587                 :            : int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport);
    1588                 :            : void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 portid);
    1589                 :            : int km_report(struct net *net, u8 proto, struct xfrm_selector *sel,
    1590                 :            :               xfrm_address_t *addr);
    1591                 :            : 
    1592                 :            : void xfrm_input_init(void);
    1593                 :            : int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq);
    1594                 :            : 
    1595                 :            : void xfrm_probe_algs(void);
    1596                 :            : int xfrm_count_pfkey_auth_supported(void);
    1597                 :            : int xfrm_count_pfkey_enc_supported(void);
    1598                 :            : struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);
    1599                 :            : struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);
    1600                 :            : struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);
    1601                 :            : struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id);
    1602                 :            : struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id);
    1603                 :            : struct xfrm_algo_desc *xfrm_aalg_get_byname(const char *name, int probe);
    1604                 :            : struct xfrm_algo_desc *xfrm_ealg_get_byname(const char *name, int probe);
    1605                 :            : struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe);
    1606                 :            : struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len,
    1607                 :            :                                             int probe);
    1608                 :            : 
    1609                 :            : static inline bool xfrm6_addr_equal(const xfrm_address_t *a,
    1610                 :            :                                     const xfrm_address_t *b)
    1611                 :            : {
    1612                 :            :         return ipv6_addr_equal((const struct in6_addr *)a,
    1613                 :            :                                (const struct in6_addr *)b);
    1614                 :            : }
    1615                 :            : 
    1616                 :            : static inline bool xfrm_addr_equal(const xfrm_address_t *a,
    1617                 :            :                                    const xfrm_address_t *b,
    1618                 :            :                                    sa_family_t family)
    1619                 :            : {
    1620 [ #  # ][ #  # ]:          0 :         switch (family) {
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1621                 :            :         default:
    1622                 :            :         case AF_INET:
    1623                 :          0 :                 return ((__force u32)a->a4 ^ (__force u32)b->a4) == 0;
    1624                 :            :         case AF_INET6:
    1625                 :            :                 return xfrm6_addr_equal(a, b);
    1626                 :            :         }
    1627                 :            : }
    1628                 :            : 
    1629                 :            : static inline int xfrm_policy_id2dir(u32 index)
    1630                 :            : {
    1631                 :          0 :         return index & 7;
    1632                 :            : }
    1633                 :            : 
    1634                 :            : #ifdef CONFIG_XFRM
    1635                 :            : static inline int xfrm_aevent_is_on(struct net *net)
    1636                 :            : {
    1637                 :            :         struct sock *nlsk;
    1638                 :            :         int ret = 0;
    1639                 :            : 
    1640                 :            :         rcu_read_lock();
    1641                 :          0 :         nlsk = rcu_dereference(net->xfrm.nlsk);
    1642   [ #  #  #  #  :          0 :         if (nlsk)
          #  #  #  #  #  
                #  #  # ]
    1643                 :          0 :                 ret = netlink_has_listeners(nlsk, XFRMNLGRP_AEVENTS);
    1644                 :            :         rcu_read_unlock();
    1645                 :            :         return ret;
    1646                 :            : }
    1647                 :            : #endif
    1648                 :            : 
    1649                 :            : static inline int xfrm_alg_len(const struct xfrm_algo *alg)
    1650                 :            : {
    1651                 :          0 :         return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
    1652                 :            : }
    1653                 :            : 
    1654                 :            : static inline int xfrm_alg_auth_len(const struct xfrm_algo_auth *alg)
    1655                 :            : {
    1656                 :          0 :         return sizeof(*alg) + ((alg->alg_key_len + 7) / 8);
    1657                 :            : }
    1658                 :            : 
    1659                 :            : static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn)
    1660                 :            : {
    1661                 :          0 :         return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32);
    1662                 :            : }
    1663                 :            : 
    1664                 :            : #ifdef CONFIG_XFRM_MIGRATE
    1665                 :            : static inline int xfrm_replay_clone(struct xfrm_state *x,
    1666                 :            :                                      struct xfrm_state *orig)
    1667                 :            : {
    1668                 :          0 :         x->replay_esn = kzalloc(xfrm_replay_state_esn_len(orig->replay_esn),
    1669                 :            :                                 GFP_KERNEL);
    1670         [ #  # ]:          0 :         if (!x->replay_esn)
    1671                 :            :                 return -ENOMEM;
    1672                 :            : 
    1673                 :          0 :         x->replay_esn->bmp_len = orig->replay_esn->bmp_len;
    1674                 :          0 :         x->replay_esn->replay_window = orig->replay_esn->replay_window;
    1675                 :            : 
    1676                 :          0 :         x->preplay_esn = kmemdup(x->replay_esn,
    1677                 :          0 :                                  xfrm_replay_state_esn_len(x->replay_esn),
    1678                 :            :                                  GFP_KERNEL);
    1679         [ #  # ]:          0 :         if (!x->preplay_esn) {
    1680                 :          0 :                 kfree(x->replay_esn);
    1681                 :            :                 return -ENOMEM;
    1682                 :            :         }
    1683                 :            : 
    1684                 :            :         return 0;
    1685                 :            : }
    1686                 :            : 
    1687                 :          0 : static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig)
    1688                 :            : {
    1689                 :          0 :         return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL);
    1690                 :            : }
    1691                 :            : 
    1692                 :          0 : static inline struct xfrm_algo_auth *xfrm_algo_auth_clone(struct xfrm_algo_auth *orig)
    1693                 :            : {
    1694                 :          0 :         return kmemdup(orig, xfrm_alg_auth_len(orig), GFP_KERNEL);
    1695                 :            : }
    1696                 :            : 
    1697                 :            : static inline void xfrm_states_put(struct xfrm_state **states, int n)
    1698                 :            : {
    1699                 :            :         int i;
    1700 [ #  # ][ #  # ]:          0 :         for (i = 0; i < n; i++)
    1701                 :          0 :                 xfrm_state_put(*(states + i));
    1702                 :            : }
    1703                 :            : 
    1704                 :            : static inline void xfrm_states_delete(struct xfrm_state **states, int n)
    1705                 :            : {
    1706                 :            :         int i;
    1707 [ #  # ][ #  # ]:          0 :         for (i = 0; i < n; i++)
    1708                 :          0 :                 xfrm_state_delete(*(states + i));
    1709                 :            : }
    1710                 :            : #endif
    1711                 :            : 
    1712                 :            : #ifdef CONFIG_XFRM
    1713                 :            : static inline struct xfrm_state *xfrm_input_state(struct sk_buff *skb)
    1714                 :            : {
    1715                 :          0 :         return skb->sp->xvec[skb->sp->len - 1];
    1716                 :            : }
    1717                 :            : #endif
    1718                 :            : 
    1719                 :            : static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m)
    1720                 :            : {
    1721 [ #  # ][ #  # ]:          0 :         if (attrs[XFRMA_MARK])
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
    1722                 :          0 :                 memcpy(m, nla_data(attrs[XFRMA_MARK]), sizeof(struct xfrm_mark));
    1723                 :            :         else
    1724                 :          0 :                 m->v = m->m = 0;
    1725                 :            : 
    1726                 :          0 :         return m->v & m->m;
    1727                 :            : }
    1728                 :            : 
    1729                 :            : static inline int xfrm_mark_put(struct sk_buff *skb, const struct xfrm_mark *m)
    1730                 :            : {
    1731                 :            :         int ret = 0;
    1732                 :            : 
    1733   [ #  #  #  # ]:          0 :         if (m->m | m->v)
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
    1734                 :          0 :                 ret = nla_put(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m);
    1735                 :            :         return ret;
    1736                 :            : }
    1737                 :            : 
    1738                 :            : #endif  /* _NET_XFRM_H */

Generated by: LCOV version 1.9