]> git.karo-electronics.de Git - mv-sheeva.git/blob - include/net/xfrm.h
[XFRM] STATE: Add source address list.
[mv-sheeva.git] / include / net / xfrm.h
1 #ifndef _NET_XFRM_H
2 #define _NET_XFRM_H
3
4 #include <linux/compiler.h>
5 #include <linux/in.h>
6 #include <linux/xfrm.h>
7 #include <linux/spinlock.h>
8 #include <linux/list.h>
9 #include <linux/skbuff.h>
10 #include <linux/socket.h>
11 #include <linux/pfkeyv2.h>
12 #include <linux/ipsec.h>
13 #include <linux/in6.h>
14 #include <linux/mutex.h>
15
16 #include <net/sock.h>
17 #include <net/dst.h>
18 #include <net/route.h>
19 #include <net/ipv6.h>
20 #include <net/ip6_fib.h>
21
22 #define XFRM_ALIGN8(len)        (((len) + 7) & ~7)
23 #define MODULE_ALIAS_XFRM_MODE(family, encap) \
24         MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap))
25
26 extern struct sock *xfrm_nl;
27 extern u32 sysctl_xfrm_aevent_etime;
28 extern u32 sysctl_xfrm_aevent_rseqth;
29
30 extern struct mutex xfrm_cfg_mutex;
31
32 /* Organization of SPD aka "XFRM rules"
33    ------------------------------------
34
35    Basic objects:
36    - policy rule, struct xfrm_policy (=SPD entry)
37    - bundle of transformations, struct dst_entry == struct xfrm_dst (=SA bundle)
38    - instance of a transformer, struct xfrm_state (=SA)
39    - template to clone xfrm_state, struct xfrm_tmpl
40
41    SPD is plain linear list of xfrm_policy rules, ordered by priority.
42    (To be compatible with existing pfkeyv2 implementations,
43    many rules with priority of 0x7fffffff are allowed to exist and
44    such rules are ordered in an unpredictable way, thanks to bsd folks.)
45
46    Lookup is plain linear search until the first match with selector.
47
48    If "action" is "block", then we prohibit the flow, otherwise:
49    if "xfrms_nr" is zero, the flow passes untransformed. Otherwise,
50    policy entry has list of up to XFRM_MAX_DEPTH transformations,
51    described by templates xfrm_tmpl. Each template is resolved
52    to a complete xfrm_state (see below) and we pack bundle of transformations
53    to a dst_entry returned to requestor.
54
55    dst -. xfrm  .-> xfrm_state #1
56     |---. child .-> dst -. xfrm .-> xfrm_state #2
57                      |---. child .-> dst -. xfrm .-> xfrm_state #3
58                                       |---. child .-> NULL
59
60    Bundles are cached at xrfm_policy struct (field ->bundles).
61
62
63    Resolution of xrfm_tmpl
64    -----------------------
65    Template contains:
66    1. ->mode            Mode: transport or tunnel
67    2. ->id.proto        Protocol: AH/ESP/IPCOMP
68    3. ->id.daddr        Remote tunnel endpoint, ignored for transport mode.
69       Q: allow to resolve security gateway?
70    4. ->id.spi          If not zero, static SPI.
71    5. ->saddr           Local tunnel endpoint, ignored for transport mode.
72    6. ->algos           List of allowed algos. Plain bitmask now.
73       Q: ealgos, aalgos, calgos. What a mess...
74    7. ->share           Sharing mode.
75       Q: how to implement private sharing mode? To add struct sock* to
76       flow id?
77
78    Having this template we search through SAD searching for entries
79    with appropriate mode/proto/algo, permitted by selector.
80    If no appropriate entry found, it is requested from key manager.
81
82    PROBLEMS:
83    Q: How to find all the bundles referring to a physical path for
84       PMTU discovery? Seems, dst should contain list of all parents...
85       and enter to infinite locking hierarchy disaster.
86       No! It is easier, we will not search for them, let them find us.
87       We add genid to each dst plus pointer to genid of raw IP route,
88       pmtu disc will update pmtu on raw IP route and increase its genid.
89       dst_check() will see this for top level and trigger resyncing
90       metrics. Plus, it will be made via sk->sk_dst_cache. Solved.
91  */
92
93 /* Full description of state of transformer. */
94 struct xfrm_state
95 {
96         /* Note: bydst is re-used during gc */
97         struct list_head        bydst;
98         struct list_head        bysrc;
99         struct list_head        byspi;
100
101         atomic_t                refcnt;
102         spinlock_t              lock;
103
104         struct xfrm_id          id;
105         struct xfrm_selector    sel;
106
107         /* Key manger bits */
108         struct {
109                 u8              state;
110                 u8              dying;
111                 u32             seq;
112         } km;
113
114         /* Parameters of this state. */
115         struct {
116                 u32             reqid;
117                 u8              mode;
118                 u8              replay_window;
119                 u8              aalgo, ealgo, calgo;
120                 u8              flags;
121                 u16             family;
122                 xfrm_address_t  saddr;
123                 int             header_len;
124                 int             trailer_len;
125         } props;
126
127         struct xfrm_lifetime_cfg lft;
128
129         /* Data for transformer */
130         struct xfrm_algo        *aalg;
131         struct xfrm_algo        *ealg;
132         struct xfrm_algo        *calg;
133
134         /* Data for encapsulator */
135         struct xfrm_encap_tmpl  *encap;
136
137         /* IPComp needs an IPIP tunnel for handling uncompressed packets */
138         struct xfrm_state       *tunnel;
139
140         /* If a tunnel, number of users + 1 */
141         atomic_t                tunnel_users;
142
143         /* State for replay detection */
144         struct xfrm_replay_state replay;
145
146         /* Replay detection state at the time we sent the last notification */
147         struct xfrm_replay_state preplay;
148
149         /* internal flag that only holds state for delayed aevent at the
150          * moment
151         */
152         u32                     xflags;
153
154         /* Replay detection notification settings */
155         u32                     replay_maxage;
156         u32                     replay_maxdiff;
157
158         /* Replay detection notification timer */
159         struct timer_list       rtimer;
160
161         /* Statistics */
162         struct xfrm_stats       stats;
163
164         struct xfrm_lifetime_cur curlft;
165         struct timer_list       timer;
166
167         /* Reference to data common to all the instances of this
168          * transformer. */
169         struct xfrm_type        *type;
170         struct xfrm_mode        *mode;
171
172         /* Security context */
173         struct xfrm_sec_ctx     *security;
174
175         /* Private data of this transformer, format is opaque,
176          * interpreted by xfrm_type methods. */
177         void                    *data;
178 };
179
180 /* xflags - make enum if more show up */
181 #define XFRM_TIME_DEFER 1
182
183 enum {
184         XFRM_STATE_VOID,
185         XFRM_STATE_ACQ,
186         XFRM_STATE_VALID,
187         XFRM_STATE_ERROR,
188         XFRM_STATE_EXPIRED,
189         XFRM_STATE_DEAD
190 };
191
192 /* callback structure passed from either netlink or pfkey */
193 struct km_event
194 {
195         union {
196                 u32 hard;
197                 u32 proto;
198                 u32 byid;
199                 u32 aevent;
200         } data;
201
202         u32     seq;
203         u32     pid;
204         u32     event;
205 };
206
207 struct xfrm_type;
208 struct xfrm_dst;
209 struct xfrm_policy_afinfo {
210         unsigned short          family;
211         struct xfrm_type        *type_map[IPPROTO_MAX];
212         struct xfrm_mode        *mode_map[XFRM_MODE_MAX];
213         struct dst_ops          *dst_ops;
214         void                    (*garbage_collect)(void);
215         int                     (*dst_lookup)(struct xfrm_dst **dst, struct flowi *fl);
216         struct dst_entry        *(*find_bundle)(struct flowi *fl, struct xfrm_policy *policy);
217         int                     (*bundle_create)(struct xfrm_policy *policy, 
218                                                  struct xfrm_state **xfrm, 
219                                                  int nx,
220                                                  struct flowi *fl, 
221                                                  struct dst_entry **dst_p);
222         void                    (*decode_session)(struct sk_buff *skb,
223                                                   struct flowi *fl);
224 };
225
226 extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo);
227 extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo);
228 extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c);
229 extern void km_state_notify(struct xfrm_state *x, struct km_event *c);
230 #define XFRM_ACQ_EXPIRES        30
231
232 struct xfrm_tmpl;
233 extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol);
234 extern void km_state_expired(struct xfrm_state *x, int hard, u32 pid);
235 extern int __xfrm_state_delete(struct xfrm_state *x);
236
237 struct xfrm_state_afinfo {
238         unsigned short          family;
239         struct list_head        *state_bydst;
240         struct list_head        *state_bysrc;
241         struct list_head        *state_byspi;
242         int                     (*init_flags)(struct xfrm_state *x);
243         void                    (*init_tempsel)(struct xfrm_state *x, struct flowi *fl,
244                                                 struct xfrm_tmpl *tmpl,
245                                                 xfrm_address_t *daddr, xfrm_address_t *saddr);
246         struct xfrm_state       *(*state_lookup)(xfrm_address_t *daddr, u32 spi, u8 proto);
247         struct xfrm_state       *(*find_acq)(u8 mode, u32 reqid, u8 proto, 
248                                              xfrm_address_t *daddr, xfrm_address_t *saddr, 
249                                              int create);
250 };
251
252 extern int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo);
253 extern int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo);
254
255 extern void xfrm_state_delete_tunnel(struct xfrm_state *x);
256
257 struct xfrm_type
258 {
259         char                    *description;
260         struct module           *owner;
261         __u8                    proto;
262
263         int                     (*init_state)(struct xfrm_state *x);
264         void                    (*destructor)(struct xfrm_state *);
265         int                     (*input)(struct xfrm_state *, struct sk_buff *skb);
266         int                     (*output)(struct xfrm_state *, struct sk_buff *pskb);
267         /* Estimate maximal size of result of transformation of a dgram */
268         u32                     (*get_max_size)(struct xfrm_state *, int size);
269 };
270
271 extern int xfrm_register_type(struct xfrm_type *type, unsigned short family);
272 extern int xfrm_unregister_type(struct xfrm_type *type, unsigned short family);
273 extern struct xfrm_type *xfrm_get_type(u8 proto, unsigned short family);
274 extern void xfrm_put_type(struct xfrm_type *type);
275
276 struct xfrm_mode {
277         int (*input)(struct xfrm_state *x, struct sk_buff *skb);
278         int (*output)(struct sk_buff *skb);
279
280         struct module *owner;
281         unsigned int encap;
282 };
283
284 extern int xfrm_register_mode(struct xfrm_mode *mode, int family);
285 extern int xfrm_unregister_mode(struct xfrm_mode *mode, int family);
286 extern struct xfrm_mode *xfrm_get_mode(unsigned int encap, int family);
287 extern void xfrm_put_mode(struct xfrm_mode *mode);
288
289 struct xfrm_tmpl
290 {
291 /* id in template is interpreted as:
292  * daddr - destination of tunnel, may be zero for transport mode.
293  * spi   - zero to acquire spi. Not zero if spi is static, then
294  *         daddr must be fixed too.
295  * proto - AH/ESP/IPCOMP
296  */
297         struct xfrm_id          id;
298
299 /* Source address of tunnel. Ignored, if it is not a tunnel. */
300         xfrm_address_t          saddr;
301
302         __u32                   reqid;
303
304 /* Mode: transport, tunnel etc. */
305         __u8                    mode;
306
307 /* Sharing mode: unique, this session only, this user only etc. */
308         __u8                    share;
309
310 /* May skip this transfomration if no SA is found */
311         __u8                    optional;
312
313 /* Bit mask of algos allowed for acquisition */
314         __u32                   aalgos;
315         __u32                   ealgos;
316         __u32                   calgos;
317 };
318
319 #define XFRM_MAX_DEPTH          6
320
321 struct xfrm_policy
322 {
323         struct xfrm_policy      *next;
324         struct list_head        list;
325
326         /* This lock only affects elements except for entry. */
327         rwlock_t                lock;
328         atomic_t                refcnt;
329         struct timer_list       timer;
330
331         u32                     priority;
332         u32                     index;
333         struct xfrm_selector    selector;
334         struct xfrm_lifetime_cfg lft;
335         struct xfrm_lifetime_cur curlft;
336         struct dst_entry       *bundles;
337         __u16                   family;
338         __u8                    action;
339         __u8                    flags;
340         __u8                    dead;
341         __u8                    xfrm_nr;
342         struct xfrm_sec_ctx     *security;
343         struct xfrm_tmpl        xfrm_vec[XFRM_MAX_DEPTH];
344 };
345
346 #define XFRM_KM_TIMEOUT                30
347 /* which seqno */
348 #define XFRM_REPLAY_SEQ         1
349 #define XFRM_REPLAY_OSEQ        2
350 #define XFRM_REPLAY_SEQ_MASK    3
351 /* what happened */
352 #define XFRM_REPLAY_UPDATE      XFRM_AE_CR
353 #define XFRM_REPLAY_TIMEOUT     XFRM_AE_CE
354
355 /* default aevent timeout in units of 100ms */
356 #define XFRM_AE_ETIME                   10
357 /* Async Event timer multiplier */
358 #define XFRM_AE_ETH_M                   10
359 /* default seq threshold size */
360 #define XFRM_AE_SEQT_SIZE               2
361
362 struct xfrm_mgr
363 {
364         struct list_head        list;
365         char                    *id;
366         int                     (*notify)(struct xfrm_state *x, struct km_event *c);
367         int                     (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir);
368         struct xfrm_policy      *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir);
369         int                     (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport);
370         int                     (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c);
371 };
372
373 extern int xfrm_register_km(struct xfrm_mgr *km);
374 extern int xfrm_unregister_km(struct xfrm_mgr *km);
375
376
377 extern struct xfrm_policy *xfrm_policy_list[XFRM_POLICY_MAX*2];
378
379 static inline void xfrm_pol_hold(struct xfrm_policy *policy)
380 {
381         if (likely(policy != NULL))
382                 atomic_inc(&policy->refcnt);
383 }
384
385 extern void __xfrm_policy_destroy(struct xfrm_policy *policy);
386
387 static inline void xfrm_pol_put(struct xfrm_policy *policy)
388 {
389         if (atomic_dec_and_test(&policy->refcnt))
390                 __xfrm_policy_destroy(policy);
391 }
392
393 #define XFRM_DST_HSIZE          1024
394
395 static __inline__
396 unsigned __xfrm4_dst_hash(xfrm_address_t *addr)
397 {
398         unsigned h;
399         h = ntohl(addr->a4);
400         h = (h ^ (h>>16)) % XFRM_DST_HSIZE;
401         return h;
402 }
403
404 static __inline__
405 unsigned __xfrm6_dst_hash(xfrm_address_t *addr)
406 {
407         unsigned h;
408         h = ntohl(addr->a6[2]^addr->a6[3]);
409         h = (h ^ (h>>16)) % XFRM_DST_HSIZE;
410         return h;
411 }
412
413 static __inline__
414 unsigned xfrm_dst_hash(xfrm_address_t *addr, unsigned short family)
415 {
416         switch (family) {
417         case AF_INET:
418                 return __xfrm4_dst_hash(addr);
419         case AF_INET6:
420                 return __xfrm6_dst_hash(addr);
421         }
422         return 0;
423 }
424
425 static __inline__
426 unsigned __xfrm4_src_hash(xfrm_address_t *addr)
427 {
428         return __xfrm4_dst_hash(addr);
429 }
430
431 static __inline__
432 unsigned __xfrm6_src_hash(xfrm_address_t *addr)
433 {
434         return __xfrm6_dst_hash(addr);
435 }
436
437 static __inline__
438 unsigned xfrm_src_hash(xfrm_address_t *addr, unsigned short family)
439 {
440         switch (family) {
441         case AF_INET:
442                 return __xfrm4_src_hash(addr);
443         case AF_INET6:
444                 return __xfrm6_src_hash(addr);
445         }
446         return 0;
447 }
448
449 static __inline__
450 unsigned __xfrm4_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto)
451 {
452         unsigned h;
453         h = ntohl(addr->a4^spi^proto);
454         h = (h ^ (h>>10) ^ (h>>20)) % XFRM_DST_HSIZE;
455         return h;
456 }
457
458 static __inline__
459 unsigned __xfrm6_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto)
460 {
461         unsigned h;
462         h = ntohl(addr->a6[2]^addr->a6[3]^spi^proto);
463         h = (h ^ (h>>10) ^ (h>>20)) % XFRM_DST_HSIZE;
464         return h;
465 }
466
467 static __inline__
468 unsigned xfrm_spi_hash(xfrm_address_t *addr, u32 spi, u8 proto, unsigned short family)
469 {
470         switch (family) {
471         case AF_INET:
472                 return __xfrm4_spi_hash(addr, spi, proto);
473         case AF_INET6:
474                 return __xfrm6_spi_hash(addr, spi, proto);
475         }
476         return 0;       /*XXX*/
477 }
478
479 extern void __xfrm_state_destroy(struct xfrm_state *);
480
481 static inline void __xfrm_state_put(struct xfrm_state *x)
482 {
483         atomic_dec(&x->refcnt);
484 }
485
486 static inline void xfrm_state_put(struct xfrm_state *x)
487 {
488         if (atomic_dec_and_test(&x->refcnt))
489                 __xfrm_state_destroy(x);
490 }
491
492 static inline void xfrm_state_hold(struct xfrm_state *x)
493 {
494         atomic_inc(&x->refcnt);
495 }
496
497 static __inline__ int addr_match(void *token1, void *token2, int prefixlen)
498 {
499         __u32 *a1 = token1;
500         __u32 *a2 = token2;
501         int pdw;
502         int pbi;
503
504         pdw = prefixlen >> 5;     /* num of whole __u32 in prefix */
505         pbi = prefixlen &  0x1f;  /* num of bits in incomplete u32 in prefix */
506
507         if (pdw)
508                 if (memcmp(a1, a2, pdw << 2))
509                         return 0;
510
511         if (pbi) {
512                 __u32 mask;
513
514                 mask = htonl((0xffffffff) << (32 - pbi));
515
516                 if ((a1[pdw] ^ a2[pdw]) & mask)
517                         return 0;
518         }
519
520         return 1;
521 }
522
523 static __inline__
524 u16 xfrm_flowi_sport(struct flowi *fl)
525 {
526         u16 port;
527         switch(fl->proto) {
528         case IPPROTO_TCP:
529         case IPPROTO_UDP:
530         case IPPROTO_SCTP:
531                 port = fl->fl_ip_sport;
532                 break;
533         case IPPROTO_ICMP:
534         case IPPROTO_ICMPV6:
535                 port = htons(fl->fl_icmp_type);
536                 break;
537         default:
538                 port = 0;       /*XXX*/
539         }
540         return port;
541 }
542
543 static __inline__
544 u16 xfrm_flowi_dport(struct flowi *fl)
545 {
546         u16 port;
547         switch(fl->proto) {
548         case IPPROTO_TCP:
549         case IPPROTO_UDP:
550         case IPPROTO_SCTP:
551                 port = fl->fl_ip_dport;
552                 break;
553         case IPPROTO_ICMP:
554         case IPPROTO_ICMPV6:
555                 port = htons(fl->fl_icmp_code);
556                 break;
557         default:
558                 port = 0;       /*XXX*/
559         }
560         return port;
561 }
562
563 static inline int
564 __xfrm4_selector_match(struct xfrm_selector *sel, struct flowi *fl)
565 {
566         return  addr_match(&fl->fl4_dst, &sel->daddr, sel->prefixlen_d) &&
567                 addr_match(&fl->fl4_src, &sel->saddr, sel->prefixlen_s) &&
568                 !((xfrm_flowi_dport(fl) ^ sel->dport) & sel->dport_mask) &&
569                 !((xfrm_flowi_sport(fl) ^ sel->sport) & sel->sport_mask) &&
570                 (fl->proto == sel->proto || !sel->proto) &&
571                 (fl->oif == sel->ifindex || !sel->ifindex);
572 }
573
574 static inline int
575 __xfrm6_selector_match(struct xfrm_selector *sel, struct flowi *fl)
576 {
577         return  addr_match(&fl->fl6_dst, &sel->daddr, sel->prefixlen_d) &&
578                 addr_match(&fl->fl6_src, &sel->saddr, sel->prefixlen_s) &&
579                 !((xfrm_flowi_dport(fl) ^ sel->dport) & sel->dport_mask) &&
580                 !((xfrm_flowi_sport(fl) ^ sel->sport) & sel->sport_mask) &&
581                 (fl->proto == sel->proto || !sel->proto) &&
582                 (fl->oif == sel->ifindex || !sel->ifindex);
583 }
584
585 static inline int
586 xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl,
587                     unsigned short family)
588 {
589         switch (family) {
590         case AF_INET:
591                 return __xfrm4_selector_match(sel, fl);
592         case AF_INET6:
593                 return __xfrm6_selector_match(sel, fl);
594         }
595         return 0;
596 }
597
598 #ifdef CONFIG_SECURITY_NETWORK_XFRM
599 /*      If neither has a context --> match
600  *      Otherwise, both must have a context and the sids, doi, alg must match
601  */
602 static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
603 {
604         return ((!s1 && !s2) ||
605                 (s1 && s2 &&
606                  (s1->ctx_sid == s2->ctx_sid) &&
607                  (s1->ctx_doi == s2->ctx_doi) &&
608                  (s1->ctx_alg == s2->ctx_alg)));
609 }
610 #else
611 static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ctx *s2)
612 {
613         return 1;
614 }
615 #endif
616
617 /* A struct encoding bundle of transformations to apply to some set of flow.
618  *
619  * dst->child points to the next element of bundle.
620  * dst->xfrm  points to an instanse of transformer.
621  *
622  * Due to unfortunate limitations of current routing cache, which we
623  * have no time to fix, it mirrors struct rtable and bound to the same
624  * routing key, including saddr,daddr. However, we can have many of
625  * bundles differing by session id. All the bundles grow from a parent
626  * policy rule.
627  */
628 struct xfrm_dst
629 {
630         union {
631                 struct xfrm_dst         *next;
632                 struct dst_entry        dst;
633                 struct rtable           rt;
634                 struct rt6_info         rt6;
635         } u;
636         struct dst_entry *route;
637         u32 route_mtu_cached;
638         u32 child_mtu_cached;
639         u32 route_cookie;
640         u32 path_cookie;
641 };
642
643 static inline void xfrm_dst_destroy(struct xfrm_dst *xdst)
644 {
645         dst_release(xdst->route);
646         if (likely(xdst->u.dst.xfrm))
647                 xfrm_state_put(xdst->u.dst.xfrm);
648 }
649
650 extern void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev);
651
652 struct sec_path
653 {
654         atomic_t                refcnt;
655         int                     len;
656         struct xfrm_state       *xvec[XFRM_MAX_DEPTH];
657 };
658
659 static inline struct sec_path *
660 secpath_get(struct sec_path *sp)
661 {
662         if (sp)
663                 atomic_inc(&sp->refcnt);
664         return sp;
665 }
666
667 extern void __secpath_destroy(struct sec_path *sp);
668
669 static inline void
670 secpath_put(struct sec_path *sp)
671 {
672         if (sp && atomic_dec_and_test(&sp->refcnt))
673                 __secpath_destroy(sp);
674 }
675
676 extern struct sec_path *secpath_dup(struct sec_path *src);
677
678 static inline void
679 secpath_reset(struct sk_buff *skb)
680 {
681 #ifdef CONFIG_XFRM
682         secpath_put(skb->sp);
683         skb->sp = NULL;
684 #endif
685 }
686
687 static inline int
688 __xfrm4_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x)
689 {
690         return  (tmpl->saddr.a4 &&
691                  tmpl->saddr.a4 != x->props.saddr.a4);
692 }
693
694 static inline int
695 __xfrm6_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x)
696 {
697         return  (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) &&
698                  ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr));
699 }
700
701 static inline int
702 xfrm_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x, unsigned short family)
703 {
704         switch (family) {
705         case AF_INET:
706                 return __xfrm4_state_addr_cmp(tmpl, x);
707         case AF_INET6:
708                 return __xfrm6_state_addr_cmp(tmpl, x);
709         }
710         return !0;
711 }
712
713 #ifdef CONFIG_XFRM
714
715 extern int __xfrm_policy_check(struct sock *, int dir, struct sk_buff *skb, unsigned short family);
716
717 static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
718 {
719         if (sk && sk->sk_policy[XFRM_POLICY_IN])
720                 return __xfrm_policy_check(sk, dir, skb, family);
721                 
722         return  (!xfrm_policy_list[dir] && !skb->sp) ||
723                 (skb->dst->flags & DST_NOPOLICY) ||
724                 __xfrm_policy_check(sk, dir, skb, family);
725 }
726
727 static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
728 {
729         return xfrm_policy_check(sk, dir, skb, AF_INET);
730 }
731
732 static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
733 {
734         return xfrm_policy_check(sk, dir, skb, AF_INET6);
735 }
736
737 extern int xfrm_decode_session(struct sk_buff *skb, struct flowi *fl, unsigned short family);
738 extern int __xfrm_route_forward(struct sk_buff *skb, unsigned short family);
739
740 static inline int xfrm_route_forward(struct sk_buff *skb, unsigned short family)
741 {
742         return  !xfrm_policy_list[XFRM_POLICY_OUT] ||
743                 (skb->dst->flags & DST_NOXFRM) ||
744                 __xfrm_route_forward(skb, family);
745 }
746
747 static inline int xfrm4_route_forward(struct sk_buff *skb)
748 {
749         return xfrm_route_forward(skb, AF_INET);
750 }
751
752 static inline int xfrm6_route_forward(struct sk_buff *skb)
753 {
754         return xfrm_route_forward(skb, AF_INET6);
755 }
756
757 extern int __xfrm_sk_clone_policy(struct sock *sk);
758
759 static inline int xfrm_sk_clone_policy(struct sock *sk)
760 {
761         if (unlikely(sk->sk_policy[0] || sk->sk_policy[1]))
762                 return __xfrm_sk_clone_policy(sk);
763         return 0;
764 }
765
766 extern int xfrm_policy_delete(struct xfrm_policy *pol, int dir);
767
768 static inline void xfrm_sk_free_policy(struct sock *sk)
769 {
770         if (unlikely(sk->sk_policy[0] != NULL)) {
771                 xfrm_policy_delete(sk->sk_policy[0], XFRM_POLICY_MAX);
772                 sk->sk_policy[0] = NULL;
773         }
774         if (unlikely(sk->sk_policy[1] != NULL)) {
775                 xfrm_policy_delete(sk->sk_policy[1], XFRM_POLICY_MAX+1);
776                 sk->sk_policy[1] = NULL;
777         }
778 }
779
780 #else
781
782 static inline void xfrm_sk_free_policy(struct sock *sk) {}
783 static inline int xfrm_sk_clone_policy(struct sock *sk) { return 0; }
784 static inline int xfrm6_route_forward(struct sk_buff *skb) { return 1; }  
785 static inline int xfrm4_route_forward(struct sk_buff *skb) { return 1; } 
786 static inline int xfrm6_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
787
788         return 1; 
789
790 static inline int xfrm4_policy_check(struct sock *sk, int dir, struct sk_buff *skb)
791 {
792         return 1;
793 }
794 static inline int xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, unsigned short family)
795 {
796         return 1;
797 }
798 #endif
799
800 static __inline__
801 xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family)
802 {
803         switch (family){
804         case AF_INET:
805                 return (xfrm_address_t *)&fl->fl4_dst;
806         case AF_INET6:
807                 return (xfrm_address_t *)&fl->fl6_dst;
808         }
809         return NULL;
810 }
811
812 static __inline__
813 xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family)
814 {
815         switch (family){
816         case AF_INET:
817                 return (xfrm_address_t *)&fl->fl4_src;
818         case AF_INET6:
819                 return (xfrm_address_t *)&fl->fl6_src;
820         }
821         return NULL;
822 }
823
824 static __inline__ int
825 __xfrm4_state_addr_check(struct xfrm_state *x,
826                          xfrm_address_t *daddr, xfrm_address_t *saddr)
827 {
828         if (daddr->a4 == x->id.daddr.a4 &&
829             (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4))
830                 return 1;
831         return 0;
832 }
833
834 static __inline__ int
835 __xfrm6_state_addr_check(struct xfrm_state *x,
836                          xfrm_address_t *daddr, xfrm_address_t *saddr)
837 {
838         if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) &&
839             (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| 
840              ipv6_addr_any((struct in6_addr *)saddr) || 
841              ipv6_addr_any((struct in6_addr *)&x->props.saddr)))
842                 return 1;
843         return 0;
844 }
845
846 static __inline__ int
847 xfrm_state_addr_check(struct xfrm_state *x,
848                       xfrm_address_t *daddr, xfrm_address_t *saddr,
849                       unsigned short family)
850 {
851         switch (family) {
852         case AF_INET:
853                 return __xfrm4_state_addr_check(x, daddr, saddr);
854         case AF_INET6:
855                 return __xfrm6_state_addr_check(x, daddr, saddr);
856         }
857         return 0;
858 }
859
860 static inline int xfrm_state_kern(struct xfrm_state *x)
861 {
862         return atomic_read(&x->tunnel_users);
863 }
864
865 static inline int xfrm_id_proto_match(u8 proto, u8 userproto)
866 {
867         return (!userproto || proto == userproto ||
868                 (userproto == IPSEC_PROTO_ANY && (proto == IPPROTO_AH ||
869                                                   proto == IPPROTO_ESP ||
870                                                   proto == IPPROTO_COMP)));
871 }
872
873 /*
874  * xfrm algorithm information
875  */
876 struct xfrm_algo_auth_info {
877         u16 icv_truncbits;
878         u16 icv_fullbits;
879 };
880
881 struct xfrm_algo_encr_info {
882         u16 blockbits;
883         u16 defkeybits;
884 };
885
886 struct xfrm_algo_comp_info {
887         u16 threshold;
888 };
889
890 struct xfrm_algo_desc {
891         char *name;
892         char *compat;
893         u8 available:1;
894         union {
895                 struct xfrm_algo_auth_info auth;
896                 struct xfrm_algo_encr_info encr;
897                 struct xfrm_algo_comp_info comp;
898         } uinfo;
899         struct sadb_alg desc;
900 };
901
902 /* XFRM tunnel handlers.  */
903 struct xfrm_tunnel {
904         int (*handler)(struct sk_buff *skb);
905         int (*err_handler)(struct sk_buff *skb, __u32 info);
906
907         struct xfrm_tunnel *next;
908         int priority;
909 };
910
911 struct xfrm6_tunnel {
912         int (*handler)(struct sk_buff *skb);
913         int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt,
914                            int type, int code, int offset, __u32 info);
915
916         struct xfrm6_tunnel *next;
917         int priority;
918 };
919
920 extern void xfrm_init(void);
921 extern void xfrm4_init(void);
922 extern void xfrm6_init(void);
923 extern void xfrm6_fini(void);
924 extern void xfrm_state_init(void);
925 extern void xfrm4_state_init(void);
926 extern void xfrm6_state_init(void);
927 extern void xfrm6_state_fini(void);
928
929 extern int xfrm_state_walk(u8 proto, int (*func)(struct xfrm_state *, int, void*), void *);
930 extern struct xfrm_state *xfrm_state_alloc(void);
931 extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, 
932                                           struct flowi *fl, struct xfrm_tmpl *tmpl,
933                                           struct xfrm_policy *pol, int *err,
934                                           unsigned short family);
935 extern int xfrm_state_check_expire(struct xfrm_state *x);
936 extern void xfrm_state_insert(struct xfrm_state *x);
937 extern int xfrm_state_add(struct xfrm_state *x);
938 extern int xfrm_state_update(struct xfrm_state *x);
939 extern struct xfrm_state *xfrm_state_lookup(xfrm_address_t *daddr, u32 spi, u8 proto, unsigned short family);
940 extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
941 extern int xfrm_state_delete(struct xfrm_state *x);
942 extern void xfrm_state_flush(u8 proto);
943 extern int xfrm_replay_check(struct xfrm_state *x, u32 seq);
944 extern void xfrm_replay_advance(struct xfrm_state *x, u32 seq);
945 extern void xfrm_replay_notify(struct xfrm_state *x, int event);
946 extern int xfrm_state_check(struct xfrm_state *x, struct sk_buff *skb);
947 extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
948 extern int xfrm_init_state(struct xfrm_state *x);
949 extern int xfrm4_rcv(struct sk_buff *skb);
950 extern int xfrm4_output(struct sk_buff *skb);
951 extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler);
952 extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler);
953 extern int xfrm6_rcv_spi(struct sk_buff *skb, u32 spi);
954 extern int xfrm6_rcv(struct sk_buff **pskb);
955 extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler);
956 extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler);
957 extern u32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr);
958 extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr);
959 extern u32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr);
960 extern int xfrm6_output(struct sk_buff *skb);
961
962 #ifdef CONFIG_XFRM
963 extern int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type);
964 extern int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen);
965 extern int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsigned short family);
966 #else
967 static inline int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
968 {
969         return -ENOPROTOOPT;
970
971
972 static inline int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
973 {
974         /* should not happen */
975         kfree_skb(skb);
976         return 0;
977 }
978 static inline int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, unsigned short family)
979 {
980         return -EINVAL;
981
982 #endif
983
984 struct xfrm_policy *xfrm_policy_alloc(gfp_t gfp);
985 extern int xfrm_policy_walk(int (*func)(struct xfrm_policy *, int, int, void*), void *);
986 int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl);
987 struct xfrm_policy *xfrm_policy_bysel_ctx(int dir, struct xfrm_selector *sel,
988                                           struct xfrm_sec_ctx *ctx, int delete);
989 struct xfrm_policy *xfrm_policy_byid(int dir, u32 id, int delete);
990 void xfrm_policy_flush(void);
991 u32 xfrm_get_acqseq(void);
992 void xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi);
993 struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto, 
994                                   xfrm_address_t *daddr, xfrm_address_t *saddr, 
995                                   int create, unsigned short family);
996 extern void xfrm_policy_flush(void);
997 extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
998 extern int xfrm_flush_bundles(void);
999 extern void xfrm_flush_all_bundles(void);
1000 extern int xfrm_bundle_ok(struct xfrm_dst *xdst, struct flowi *fl, int family);
1001 extern void xfrm_init_pmtu(struct dst_entry *dst);
1002
1003 extern wait_queue_head_t km_waitq;
1004 extern int km_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, u16 sport);
1005 extern void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 pid);
1006
1007 extern void xfrm_input_init(void);
1008 extern int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, u32 *spi, u32 *seq);
1009
1010 extern void xfrm_probe_algs(void);
1011 extern int xfrm_count_auth_supported(void);
1012 extern int xfrm_count_enc_supported(void);
1013 extern struct xfrm_algo_desc *xfrm_aalg_get_byidx(unsigned int idx);
1014 extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx);
1015 extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id);
1016 extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id);
1017 extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id);
1018 extern struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe);
1019 extern struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe);
1020 extern struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe);
1021
1022 struct hash_desc;
1023 struct scatterlist;
1024 typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *,
1025                               unsigned int);
1026
1027 extern int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *tfm,
1028                         int offset, int len, icv_update_fn_t icv_update);
1029
1030 static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b,
1031                                 int family)
1032 {
1033         switch (family) {
1034         default:
1035         case AF_INET:
1036                 return a->a4 - b->a4;
1037         case AF_INET6:
1038                 return ipv6_addr_cmp((struct in6_addr *)a,
1039                                      (struct in6_addr *)b);
1040         }
1041 }
1042
1043 static inline int xfrm_policy_id2dir(u32 index)
1044 {
1045         return index & 7;
1046 }
1047
1048 static inline int xfrm_aevent_is_on(void)
1049 {
1050         struct sock *nlsk;
1051         int ret = 0;
1052
1053         rcu_read_lock();
1054         nlsk = rcu_dereference(xfrm_nl);
1055         if (nlsk)
1056                 ret = netlink_has_listeners(nlsk, XFRMNLGRP_AEVENTS);
1057         rcu_read_unlock();
1058         return ret;
1059 }
1060
1061 static inline void xfrm_aevent_doreplay(struct xfrm_state *x)
1062 {
1063         if (xfrm_aevent_is_on())
1064                 xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);
1065 }
1066
1067
1068 #endif  /* _NET_XFRM_H */