diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /include/net/xfrm.h | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'include/net/xfrm.h')
-rw-r--r-- | include/net/xfrm.h | 264 |
1 files changed, 174 insertions, 90 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 4f53532d4c2f..b203e14d26b7 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -36,6 +36,7 @@ | |||
36 | #define XFRM_PROTO_ROUTING IPPROTO_ROUTING | 36 | #define XFRM_PROTO_ROUTING IPPROTO_ROUTING |
37 | #define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS | 37 | #define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS |
38 | 38 | ||
39 | #define XFRM_ALIGN4(len) (((len) + 3) & ~3) | ||
39 | #define XFRM_ALIGN8(len) (((len) + 7) & ~7) | 40 | #define XFRM_ALIGN8(len) (((len) + 7) & ~7) |
40 | #define MODULE_ALIAS_XFRM_MODE(family, encap) \ | 41 | #define MODULE_ALIAS_XFRM_MODE(family, encap) \ |
41 | MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) | 42 | MODULE_ALIAS("xfrm-mode-" __stringify(family) "-" __stringify(encap)) |
@@ -143,6 +144,7 @@ struct xfrm_state { | |||
143 | struct xfrm_id id; | 144 | struct xfrm_id id; |
144 | struct xfrm_selector sel; | 145 | struct xfrm_selector sel; |
145 | struct xfrm_mark mark; | 146 | struct xfrm_mark mark; |
147 | u32 tfcpad; | ||
146 | 148 | ||
147 | u32 genid; | 149 | u32 genid; |
148 | 150 | ||
@@ -184,9 +186,14 @@ struct xfrm_state { | |||
184 | 186 | ||
185 | /* State for replay detection */ | 187 | /* State for replay detection */ |
186 | struct xfrm_replay_state replay; | 188 | struct xfrm_replay_state replay; |
189 | struct xfrm_replay_state_esn *replay_esn; | ||
187 | 190 | ||
188 | /* Replay detection state at the time we sent the last notification */ | 191 | /* Replay detection state at the time we sent the last notification */ |
189 | struct xfrm_replay_state preplay; | 192 | struct xfrm_replay_state preplay; |
193 | struct xfrm_replay_state_esn *preplay_esn; | ||
194 | |||
195 | /* The functions for replay detection. */ | ||
196 | struct xfrm_replay *repl; | ||
190 | 197 | ||
191 | /* internal flag that only holds state for delayed aevent at the | 198 | /* internal flag that only holds state for delayed aevent at the |
192 | * moment | 199 | * moment |
@@ -257,6 +264,15 @@ struct km_event { | |||
257 | struct net *net; | 264 | struct net *net; |
258 | }; | 265 | }; |
259 | 266 | ||
267 | struct xfrm_replay { | ||
268 | void (*advance)(struct xfrm_state *x, __be32 net_seq); | ||
269 | int (*check)(struct xfrm_state *x, | ||
270 | struct sk_buff *skb, | ||
271 | __be32 net_seq); | ||
272 | void (*notify)(struct xfrm_state *x, int event); | ||
273 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); | ||
274 | }; | ||
275 | |||
260 | struct net_device; | 276 | struct net_device; |
261 | struct xfrm_type; | 277 | struct xfrm_type; |
262 | struct xfrm_dst; | 278 | struct xfrm_dst; |
@@ -265,25 +281,26 @@ struct xfrm_policy_afinfo { | |||
265 | struct dst_ops *dst_ops; | 281 | struct dst_ops *dst_ops; |
266 | void (*garbage_collect)(struct net *net); | 282 | void (*garbage_collect)(struct net *net); |
267 | struct dst_entry *(*dst_lookup)(struct net *net, int tos, | 283 | struct dst_entry *(*dst_lookup)(struct net *net, int tos, |
268 | xfrm_address_t *saddr, | 284 | const xfrm_address_t *saddr, |
269 | xfrm_address_t *daddr); | 285 | const xfrm_address_t *daddr); |
270 | int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); | 286 | int (*get_saddr)(struct net *net, xfrm_address_t *saddr, xfrm_address_t *daddr); |
271 | void (*decode_session)(struct sk_buff *skb, | 287 | void (*decode_session)(struct sk_buff *skb, |
272 | struct flowi *fl, | 288 | struct flowi *fl, |
273 | int reverse); | 289 | int reverse); |
274 | int (*get_tos)(struct flowi *fl); | 290 | int (*get_tos)(const struct flowi *fl); |
275 | int (*init_path)(struct xfrm_dst *path, | 291 | int (*init_path)(struct xfrm_dst *path, |
276 | struct dst_entry *dst, | 292 | struct dst_entry *dst, |
277 | int nfheader_len); | 293 | int nfheader_len); |
278 | int (*fill_dst)(struct xfrm_dst *xdst, | 294 | int (*fill_dst)(struct xfrm_dst *xdst, |
279 | struct net_device *dev, | 295 | struct net_device *dev, |
280 | struct flowi *fl); | 296 | const struct flowi *fl); |
297 | struct dst_entry *(*blackhole_route)(struct net *net, struct dst_entry *orig); | ||
281 | }; | 298 | }; |
282 | 299 | ||
283 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); | 300 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); |
284 | extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); | 301 | extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); |
285 | extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c); | 302 | extern void km_policy_notify(struct xfrm_policy *xp, int dir, const struct km_event *c); |
286 | extern void km_state_notify(struct xfrm_state *x, struct km_event *c); | 303 | extern void km_state_notify(struct xfrm_state *x, const struct km_event *c); |
287 | 304 | ||
288 | struct xfrm_tmpl; | 305 | struct xfrm_tmpl; |
289 | extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); | 306 | extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); |
@@ -298,12 +315,16 @@ struct xfrm_state_afinfo { | |||
298 | const struct xfrm_type *type_map[IPPROTO_MAX]; | 315 | const struct xfrm_type *type_map[IPPROTO_MAX]; |
299 | struct xfrm_mode *mode_map[XFRM_MODE_MAX]; | 316 | struct xfrm_mode *mode_map[XFRM_MODE_MAX]; |
300 | int (*init_flags)(struct xfrm_state *x); | 317 | int (*init_flags)(struct xfrm_state *x); |
301 | void (*init_tempsel)(struct xfrm_selector *sel, struct flowi *fl); | 318 | void (*init_tempsel)(struct xfrm_selector *sel, |
302 | void (*init_temprop)(struct xfrm_state *x, struct xfrm_tmpl *tmpl, | 319 | const struct flowi *fl); |
303 | xfrm_address_t *daddr, xfrm_address_t *saddr); | 320 | void (*init_temprop)(struct xfrm_state *x, |
321 | const struct xfrm_tmpl *tmpl, | ||
322 | const xfrm_address_t *daddr, | ||
323 | const xfrm_address_t *saddr); | ||
304 | int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n); | 324 | int (*tmpl_sort)(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, int n); |
305 | int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n); | 325 | int (*state_sort)(struct xfrm_state **dst, struct xfrm_state **src, int n); |
306 | int (*output)(struct sk_buff *skb); | 326 | int (*output)(struct sk_buff *skb); |
327 | int (*output_finish)(struct sk_buff *skb); | ||
307 | int (*extract_input)(struct xfrm_state *x, | 328 | int (*extract_input)(struct xfrm_state *x, |
308 | struct sk_buff *skb); | 329 | struct sk_buff *skb); |
309 | int (*extract_output)(struct xfrm_state *x, | 330 | int (*extract_output)(struct xfrm_state *x, |
@@ -331,7 +352,8 @@ struct xfrm_type { | |||
331 | void (*destructor)(struct xfrm_state *); | 352 | void (*destructor)(struct xfrm_state *); |
332 | int (*input)(struct xfrm_state *, struct sk_buff *skb); | 353 | int (*input)(struct xfrm_state *, struct sk_buff *skb); |
333 | int (*output)(struct xfrm_state *, struct sk_buff *pskb); | 354 | int (*output)(struct xfrm_state *, struct sk_buff *pskb); |
334 | int (*reject)(struct xfrm_state *, struct sk_buff *, struct flowi *); | 355 | int (*reject)(struct xfrm_state *, struct sk_buff *, |
356 | const struct flowi *); | ||
335 | int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **); | 357 | int (*hdr_offset)(struct xfrm_state *, struct sk_buff *, u8 **); |
336 | /* Estimate maximal size of result of transformation of a dgram */ | 358 | /* Estimate maximal size of result of transformation of a dgram */ |
337 | u32 (*get_mtu)(struct xfrm_state *, int size); | 359 | u32 (*get_mtu)(struct xfrm_state *, int size); |
@@ -500,7 +522,7 @@ struct xfrm_policy { | |||
500 | struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH]; | 522 | struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH]; |
501 | }; | 523 | }; |
502 | 524 | ||
503 | static inline struct net *xp_net(struct xfrm_policy *xp) | 525 | static inline struct net *xp_net(const struct xfrm_policy *xp) |
504 | { | 526 | { |
505 | return read_pnet(&xp->xp_net); | 527 | return read_pnet(&xp->xp_net); |
506 | } | 528 | } |
@@ -544,13 +566,17 @@ struct xfrm_migrate { | |||
544 | struct xfrm_mgr { | 566 | struct xfrm_mgr { |
545 | struct list_head list; | 567 | struct list_head list; |
546 | char *id; | 568 | char *id; |
547 | int (*notify)(struct xfrm_state *x, struct km_event *c); | 569 | int (*notify)(struct xfrm_state *x, const struct km_event *c); |
548 | int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir); | 570 | int (*acquire)(struct xfrm_state *x, struct xfrm_tmpl *, struct xfrm_policy *xp, int dir); |
549 | struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir); | 571 | struct xfrm_policy *(*compile_policy)(struct sock *sk, int opt, u8 *data, int len, int *dir); |
550 | int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport); | 572 | int (*new_mapping)(struct xfrm_state *x, xfrm_address_t *ipaddr, __be16 sport); |
551 | int (*notify_policy)(struct xfrm_policy *x, int dir, struct km_event *c); | 573 | int (*notify_policy)(struct xfrm_policy *x, int dir, const struct km_event *c); |
552 | int (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr); | 574 | int (*report)(struct net *net, u8 proto, struct xfrm_selector *sel, xfrm_address_t *addr); |
553 | int (*migrate)(struct xfrm_selector *sel, u8 dir, u8 type, struct xfrm_migrate *m, int num_bundles, struct xfrm_kmaddress *k); | 575 | int (*migrate)(const struct xfrm_selector *sel, |
576 | u8 dir, u8 type, | ||
577 | const struct xfrm_migrate *m, | ||
578 | int num_bundles, | ||
579 | const struct xfrm_kmaddress *k); | ||
554 | }; | 580 | }; |
555 | 581 | ||
556 | extern int xfrm_register_km(struct xfrm_mgr *km); | 582 | extern int xfrm_register_km(struct xfrm_mgr *km); |
@@ -569,8 +595,14 @@ struct xfrm_skb_cb { | |||
569 | 595 | ||
570 | /* Sequence number for replay protection. */ | 596 | /* Sequence number for replay protection. */ |
571 | union { | 597 | union { |
572 | u64 output; | 598 | struct { |
573 | __be32 input; | 599 | __u32 low; |
600 | __u32 hi; | ||
601 | } output; | ||
602 | struct { | ||
603 | __be32 low; | ||
604 | __be32 hi; | ||
605 | } input; | ||
574 | } seq; | 606 | } seq; |
575 | }; | 607 | }; |
576 | 608 | ||
@@ -674,6 +706,8 @@ extern void xfrm_audit_state_delete(struct xfrm_state *x, int result, | |||
674 | u32 auid, u32 ses, u32 secid); | 706 | u32 auid, u32 ses, u32 secid); |
675 | extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x, | 707 | extern void xfrm_audit_state_replay_overflow(struct xfrm_state *x, |
676 | struct sk_buff *skb); | 708 | struct sk_buff *skb); |
709 | extern void xfrm_audit_state_replay(struct xfrm_state *x, | ||
710 | struct sk_buff *skb, __be32 net_seq); | ||
677 | extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family); | 711 | extern void xfrm_audit_state_notfound_simple(struct sk_buff *skb, u16 family); |
678 | extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, | 712 | extern void xfrm_audit_state_notfound(struct sk_buff *skb, u16 family, |
679 | __be32 net_spi, __be32 net_seq); | 713 | __be32 net_spi, __be32 net_seq); |
@@ -706,6 +740,11 @@ static inline void xfrm_audit_state_replay_overflow(struct xfrm_state *x, | |||
706 | { | 740 | { |
707 | } | 741 | } |
708 | 742 | ||
743 | static inline void xfrm_audit_state_replay(struct xfrm_state *x, | ||
744 | struct sk_buff *skb, __be32 net_seq) | ||
745 | { | ||
746 | } | ||
747 | |||
709 | static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb, | 748 | static inline void xfrm_audit_state_notfound_simple(struct sk_buff *skb, |
710 | u16 family) | 749 | u16 family) |
711 | { | 750 | { |
@@ -761,10 +800,11 @@ static inline void xfrm_state_hold(struct xfrm_state *x) | |||
761 | atomic_inc(&x->refcnt); | 800 | atomic_inc(&x->refcnt); |
762 | } | 801 | } |
763 | 802 | ||
764 | static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | 803 | static inline bool addr_match(const void *token1, const void *token2, |
804 | int prefixlen) | ||
765 | { | 805 | { |
766 | __be32 *a1 = token1; | 806 | const __be32 *a1 = token1; |
767 | __be32 *a2 = token2; | 807 | const __be32 *a2 = token2; |
768 | int pdw; | 808 | int pdw; |
769 | int pbi; | 809 | int pbi; |
770 | 810 | ||
@@ -773,7 +813,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | |||
773 | 813 | ||
774 | if (pdw) | 814 | if (pdw) |
775 | if (memcmp(a1, a2, pdw << 2)) | 815 | if (memcmp(a1, a2, pdw << 2)) |
776 | return 0; | 816 | return false; |
777 | 817 | ||
778 | if (pbi) { | 818 | if (pbi) { |
779 | __be32 mask; | 819 | __be32 mask; |
@@ -781,29 +821,32 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | |||
781 | mask = htonl((0xffffffff) << (32 - pbi)); | 821 | mask = htonl((0xffffffff) << (32 - pbi)); |
782 | 822 | ||
783 | if ((a1[pdw] ^ a2[pdw]) & mask) | 823 | if ((a1[pdw] ^ a2[pdw]) & mask) |
784 | return 0; | 824 | return false; |
785 | } | 825 | } |
786 | 826 | ||
787 | return 1; | 827 | return true; |
788 | } | 828 | } |
789 | 829 | ||
790 | static __inline__ | 830 | static __inline__ |
791 | __be16 xfrm_flowi_sport(struct flowi *fl) | 831 | __be16 xfrm_flowi_sport(const struct flowi *fl, const union flowi_uli *uli) |
792 | { | 832 | { |
793 | __be16 port; | 833 | __be16 port; |
794 | switch(fl->proto) { | 834 | switch(fl->flowi_proto) { |
795 | case IPPROTO_TCP: | 835 | case IPPROTO_TCP: |
796 | case IPPROTO_UDP: | 836 | case IPPROTO_UDP: |
797 | case IPPROTO_UDPLITE: | 837 | case IPPROTO_UDPLITE: |
798 | case IPPROTO_SCTP: | 838 | case IPPROTO_SCTP: |
799 | port = fl->fl_ip_sport; | 839 | port = uli->ports.sport; |
800 | break; | 840 | break; |
801 | case IPPROTO_ICMP: | 841 | case IPPROTO_ICMP: |
802 | case IPPROTO_ICMPV6: | 842 | case IPPROTO_ICMPV6: |
803 | port = htons(fl->fl_icmp_type); | 843 | port = htons(uli->icmpt.type); |
804 | break; | 844 | break; |
805 | case IPPROTO_MH: | 845 | case IPPROTO_MH: |
806 | port = htons(fl->fl_mh_type); | 846 | port = htons(uli->mht.type); |
847 | break; | ||
848 | case IPPROTO_GRE: | ||
849 | port = htons(ntohl(uli->gre_key) >> 16); | ||
807 | break; | 850 | break; |
808 | default: | 851 | default: |
809 | port = 0; /*XXX*/ | 852 | port = 0; /*XXX*/ |
@@ -812,19 +855,22 @@ __be16 xfrm_flowi_sport(struct flowi *fl) | |||
812 | } | 855 | } |
813 | 856 | ||
814 | static __inline__ | 857 | static __inline__ |
815 | __be16 xfrm_flowi_dport(struct flowi *fl) | 858 | __be16 xfrm_flowi_dport(const struct flowi *fl, const union flowi_uli *uli) |
816 | { | 859 | { |
817 | __be16 port; | 860 | __be16 port; |
818 | switch(fl->proto) { | 861 | switch(fl->flowi_proto) { |
819 | case IPPROTO_TCP: | 862 | case IPPROTO_TCP: |
820 | case IPPROTO_UDP: | 863 | case IPPROTO_UDP: |
821 | case IPPROTO_UDPLITE: | 864 | case IPPROTO_UDPLITE: |
822 | case IPPROTO_SCTP: | 865 | case IPPROTO_SCTP: |
823 | port = fl->fl_ip_dport; | 866 | port = uli->ports.dport; |
824 | break; | 867 | break; |
825 | case IPPROTO_ICMP: | 868 | case IPPROTO_ICMP: |
826 | case IPPROTO_ICMPV6: | 869 | case IPPROTO_ICMPV6: |
827 | port = htons(fl->fl_icmp_code); | 870 | port = htons(uli->icmpt.code); |
871 | break; | ||
872 | case IPPROTO_GRE: | ||
873 | port = htons(ntohl(uli->gre_key) & 0xffff); | ||
828 | break; | 874 | break; |
829 | default: | 875 | default: |
830 | port = 0; /*XXX*/ | 876 | port = 0; /*XXX*/ |
@@ -832,7 +878,8 @@ __be16 xfrm_flowi_dport(struct flowi *fl) | |||
832 | return port; | 878 | return port; |
833 | } | 879 | } |
834 | 880 | ||
835 | extern int xfrm_selector_match(struct xfrm_selector *sel, struct flowi *fl, | 881 | extern int xfrm_selector_match(const struct xfrm_selector *sel, |
882 | const struct flowi *fl, | ||
836 | unsigned short family); | 883 | unsigned short family); |
837 | 884 | ||
838 | #ifdef CONFIG_SECURITY_NETWORK_XFRM | 885 | #ifdef CONFIG_SECURITY_NETWORK_XFRM |
@@ -911,6 +958,15 @@ struct sec_path { | |||
911 | struct xfrm_state *xvec[XFRM_MAX_DEPTH]; | 958 | struct xfrm_state *xvec[XFRM_MAX_DEPTH]; |
912 | }; | 959 | }; |
913 | 960 | ||
961 | static inline int secpath_exists(struct sk_buff *skb) | ||
962 | { | ||
963 | #ifdef CONFIG_XFRM | ||
964 | return skb->sp != NULL; | ||
965 | #else | ||
966 | return 0; | ||
967 | #endif | ||
968 | } | ||
969 | |||
914 | static inline struct sec_path * | 970 | static inline struct sec_path * |
915 | secpath_get(struct sec_path *sp) | 971 | secpath_get(struct sec_path *sp) |
916 | { | 972 | { |
@@ -940,7 +996,7 @@ secpath_reset(struct sk_buff *skb) | |||
940 | } | 996 | } |
941 | 997 | ||
942 | static inline int | 998 | static inline int |
943 | xfrm_addr_any(xfrm_address_t *addr, unsigned short family) | 999 | xfrm_addr_any(const xfrm_address_t *addr, unsigned short family) |
944 | { | 1000 | { |
945 | switch (family) { | 1001 | switch (family) { |
946 | case AF_INET: | 1002 | case AF_INET: |
@@ -952,21 +1008,21 @@ xfrm_addr_any(xfrm_address_t *addr, unsigned short family) | |||
952 | } | 1008 | } |
953 | 1009 | ||
954 | static inline int | 1010 | static inline int |
955 | __xfrm4_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x) | 1011 | __xfrm4_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x) |
956 | { | 1012 | { |
957 | return (tmpl->saddr.a4 && | 1013 | return (tmpl->saddr.a4 && |
958 | tmpl->saddr.a4 != x->props.saddr.a4); | 1014 | tmpl->saddr.a4 != x->props.saddr.a4); |
959 | } | 1015 | } |
960 | 1016 | ||
961 | static inline int | 1017 | static inline int |
962 | __xfrm6_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x) | 1018 | __xfrm6_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x) |
963 | { | 1019 | { |
964 | return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) && | 1020 | return (!ipv6_addr_any((struct in6_addr*)&tmpl->saddr) && |
965 | ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr)); | 1021 | ipv6_addr_cmp((struct in6_addr *)&tmpl->saddr, (struct in6_addr*)&x->props.saddr)); |
966 | } | 1022 | } |
967 | 1023 | ||
968 | static inline int | 1024 | static inline int |
969 | xfrm_state_addr_cmp(struct xfrm_tmpl *tmpl, struct xfrm_state *x, unsigned short family) | 1025 | xfrm_state_addr_cmp(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x, unsigned short family) |
970 | { | 1026 | { |
971 | switch (family) { | 1027 | switch (family) { |
972 | case AF_INET: | 1028 | case AF_INET: |
@@ -1119,49 +1175,49 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir, | |||
1119 | #endif | 1175 | #endif |
1120 | 1176 | ||
1121 | static __inline__ | 1177 | static __inline__ |
1122 | xfrm_address_t *xfrm_flowi_daddr(struct flowi *fl, unsigned short family) | 1178 | xfrm_address_t *xfrm_flowi_daddr(const struct flowi *fl, unsigned short family) |
1123 | { | 1179 | { |
1124 | switch (family){ | 1180 | switch (family){ |
1125 | case AF_INET: | 1181 | case AF_INET: |
1126 | return (xfrm_address_t *)&fl->fl4_dst; | 1182 | return (xfrm_address_t *)&fl->u.ip4.daddr; |
1127 | case AF_INET6: | 1183 | case AF_INET6: |
1128 | return (xfrm_address_t *)&fl->fl6_dst; | 1184 | return (xfrm_address_t *)&fl->u.ip6.daddr; |
1129 | } | 1185 | } |
1130 | return NULL; | 1186 | return NULL; |
1131 | } | 1187 | } |
1132 | 1188 | ||
1133 | static __inline__ | 1189 | static __inline__ |
1134 | xfrm_address_t *xfrm_flowi_saddr(struct flowi *fl, unsigned short family) | 1190 | xfrm_address_t *xfrm_flowi_saddr(const struct flowi *fl, unsigned short family) |
1135 | { | 1191 | { |
1136 | switch (family){ | 1192 | switch (family){ |
1137 | case AF_INET: | 1193 | case AF_INET: |
1138 | return (xfrm_address_t *)&fl->fl4_src; | 1194 | return (xfrm_address_t *)&fl->u.ip4.saddr; |
1139 | case AF_INET6: | 1195 | case AF_INET6: |
1140 | return (xfrm_address_t *)&fl->fl6_src; | 1196 | return (xfrm_address_t *)&fl->u.ip6.saddr; |
1141 | } | 1197 | } |
1142 | return NULL; | 1198 | return NULL; |
1143 | } | 1199 | } |
1144 | 1200 | ||
1145 | static __inline__ | 1201 | static __inline__ |
1146 | void xfrm_flowi_addr_get(struct flowi *fl, | 1202 | void xfrm_flowi_addr_get(const struct flowi *fl, |
1147 | xfrm_address_t *saddr, xfrm_address_t *daddr, | 1203 | xfrm_address_t *saddr, xfrm_address_t *daddr, |
1148 | unsigned short family) | 1204 | unsigned short family) |
1149 | { | 1205 | { |
1150 | switch(family) { | 1206 | switch(family) { |
1151 | case AF_INET: | 1207 | case AF_INET: |
1152 | memcpy(&saddr->a4, &fl->fl4_src, sizeof(saddr->a4)); | 1208 | memcpy(&saddr->a4, &fl->u.ip4.saddr, sizeof(saddr->a4)); |
1153 | memcpy(&daddr->a4, &fl->fl4_dst, sizeof(daddr->a4)); | 1209 | memcpy(&daddr->a4, &fl->u.ip4.daddr, sizeof(daddr->a4)); |
1154 | break; | 1210 | break; |
1155 | case AF_INET6: | 1211 | case AF_INET6: |
1156 | ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->fl6_src); | 1212 | ipv6_addr_copy((struct in6_addr *)&saddr->a6, &fl->u.ip6.saddr); |
1157 | ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->fl6_dst); | 1213 | ipv6_addr_copy((struct in6_addr *)&daddr->a6, &fl->u.ip6.daddr); |
1158 | break; | 1214 | break; |
1159 | } | 1215 | } |
1160 | } | 1216 | } |
1161 | 1217 | ||
1162 | static __inline__ int | 1218 | static __inline__ int |
1163 | __xfrm4_state_addr_check(struct xfrm_state *x, | 1219 | __xfrm4_state_addr_check(const struct xfrm_state *x, |
1164 | xfrm_address_t *daddr, xfrm_address_t *saddr) | 1220 | const xfrm_address_t *daddr, const xfrm_address_t *saddr) |
1165 | { | 1221 | { |
1166 | if (daddr->a4 == x->id.daddr.a4 && | 1222 | if (daddr->a4 == x->id.daddr.a4 && |
1167 | (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4)) | 1223 | (saddr->a4 == x->props.saddr.a4 || !saddr->a4 || !x->props.saddr.a4)) |
@@ -1170,8 +1226,8 @@ __xfrm4_state_addr_check(struct xfrm_state *x, | |||
1170 | } | 1226 | } |
1171 | 1227 | ||
1172 | static __inline__ int | 1228 | static __inline__ int |
1173 | __xfrm6_state_addr_check(struct xfrm_state *x, | 1229 | __xfrm6_state_addr_check(const struct xfrm_state *x, |
1174 | xfrm_address_t *daddr, xfrm_address_t *saddr) | 1230 | const xfrm_address_t *daddr, const xfrm_address_t *saddr) |
1175 | { | 1231 | { |
1176 | if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && | 1232 | if (!ipv6_addr_cmp((struct in6_addr *)daddr, (struct in6_addr *)&x->id.daddr) && |
1177 | (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| | 1233 | (!ipv6_addr_cmp((struct in6_addr *)saddr, (struct in6_addr *)&x->props.saddr)|| |
@@ -1182,8 +1238,8 @@ __xfrm6_state_addr_check(struct xfrm_state *x, | |||
1182 | } | 1238 | } |
1183 | 1239 | ||
1184 | static __inline__ int | 1240 | static __inline__ int |
1185 | xfrm_state_addr_check(struct xfrm_state *x, | 1241 | xfrm_state_addr_check(const struct xfrm_state *x, |
1186 | xfrm_address_t *daddr, xfrm_address_t *saddr, | 1242 | const xfrm_address_t *daddr, const xfrm_address_t *saddr, |
1187 | unsigned short family) | 1243 | unsigned short family) |
1188 | { | 1244 | { |
1189 | switch (family) { | 1245 | switch (family) { |
@@ -1196,23 +1252,23 @@ xfrm_state_addr_check(struct xfrm_state *x, | |||
1196 | } | 1252 | } |
1197 | 1253 | ||
1198 | static __inline__ int | 1254 | static __inline__ int |
1199 | xfrm_state_addr_flow_check(struct xfrm_state *x, struct flowi *fl, | 1255 | xfrm_state_addr_flow_check(const struct xfrm_state *x, const struct flowi *fl, |
1200 | unsigned short family) | 1256 | unsigned short family) |
1201 | { | 1257 | { |
1202 | switch (family) { | 1258 | switch (family) { |
1203 | case AF_INET: | 1259 | case AF_INET: |
1204 | return __xfrm4_state_addr_check(x, | 1260 | return __xfrm4_state_addr_check(x, |
1205 | (xfrm_address_t *)&fl->fl4_dst, | 1261 | (const xfrm_address_t *)&fl->u.ip4.daddr, |
1206 | (xfrm_address_t *)&fl->fl4_src); | 1262 | (const xfrm_address_t *)&fl->u.ip4.saddr); |
1207 | case AF_INET6: | 1263 | case AF_INET6: |
1208 | return __xfrm6_state_addr_check(x, | 1264 | return __xfrm6_state_addr_check(x, |
1209 | (xfrm_address_t *)&fl->fl6_dst, | 1265 | (const xfrm_address_t *)&fl->u.ip6.daddr, |
1210 | (xfrm_address_t *)&fl->fl6_src); | 1266 | (const xfrm_address_t *)&fl->u.ip6.saddr); |
1211 | } | 1267 | } |
1212 | return 0; | 1268 | return 0; |
1213 | } | 1269 | } |
1214 | 1270 | ||
1215 | static inline int xfrm_state_kern(struct xfrm_state *x) | 1271 | static inline int xfrm_state_kern(const struct xfrm_state *x) |
1216 | { | 1272 | { |
1217 | return atomic_read(&x->tunnel_users); | 1273 | return atomic_read(&x->tunnel_users); |
1218 | } | 1274 | } |
@@ -1264,7 +1320,7 @@ struct xfrm_tunnel { | |||
1264 | int (*handler)(struct sk_buff *skb); | 1320 | int (*handler)(struct sk_buff *skb); |
1265 | int (*err_handler)(struct sk_buff *skb, u32 info); | 1321 | int (*err_handler)(struct sk_buff *skb, u32 info); |
1266 | 1322 | ||
1267 | struct xfrm_tunnel *next; | 1323 | struct xfrm_tunnel __rcu *next; |
1268 | int priority; | 1324 | int priority; |
1269 | }; | 1325 | }; |
1270 | 1326 | ||
@@ -1272,7 +1328,7 @@ struct xfrm6_tunnel { | |||
1272 | int (*handler)(struct sk_buff *skb); | 1328 | int (*handler)(struct sk_buff *skb); |
1273 | int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, | 1329 | int (*err_handler)(struct sk_buff *skb, struct inet6_skb_parm *opt, |
1274 | u8 type, u8 code, int offset, __be32 info); | 1330 | u8 type, u8 code, int offset, __be32 info); |
1275 | struct xfrm6_tunnel *next; | 1331 | struct xfrm6_tunnel __rcu *next; |
1276 | int priority; | 1332 | int priority; |
1277 | }; | 1333 | }; |
1278 | 1334 | ||
@@ -1316,8 +1372,10 @@ extern int xfrm_state_walk(struct net *net, struct xfrm_state_walk *walk, | |||
1316 | int (*func)(struct xfrm_state *, int, void*), void *); | 1372 | int (*func)(struct xfrm_state *, int, void*), void *); |
1317 | extern void xfrm_state_walk_done(struct xfrm_state_walk *walk); | 1373 | extern void xfrm_state_walk_done(struct xfrm_state_walk *walk); |
1318 | extern struct xfrm_state *xfrm_state_alloc(struct net *net); | 1374 | extern struct xfrm_state *xfrm_state_alloc(struct net *net); |
1319 | extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | 1375 | extern struct xfrm_state *xfrm_state_find(const xfrm_address_t *daddr, |
1320 | struct flowi *fl, struct xfrm_tmpl *tmpl, | 1376 | const xfrm_address_t *saddr, |
1377 | const struct flowi *fl, | ||
1378 | struct xfrm_tmpl *tmpl, | ||
1321 | struct xfrm_policy *pol, int *err, | 1379 | struct xfrm_policy *pol, int *err, |
1322 | unsigned short family); | 1380 | unsigned short family); |
1323 | extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, | 1381 | extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, |
@@ -1330,11 +1388,11 @@ extern void xfrm_state_insert(struct xfrm_state *x); | |||
1330 | extern int xfrm_state_add(struct xfrm_state *x); | 1388 | extern int xfrm_state_add(struct xfrm_state *x); |
1331 | extern int xfrm_state_update(struct xfrm_state *x); | 1389 | extern int xfrm_state_update(struct xfrm_state *x); |
1332 | extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark, | 1390 | extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark, |
1333 | xfrm_address_t *daddr, __be32 spi, | 1391 | const xfrm_address_t *daddr, __be32 spi, |
1334 | u8 proto, unsigned short family); | 1392 | u8 proto, unsigned short family); |
1335 | extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark, | 1393 | extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark, |
1336 | xfrm_address_t *daddr, | 1394 | const xfrm_address_t *daddr, |
1337 | xfrm_address_t *saddr, | 1395 | const xfrm_address_t *saddr, |
1338 | u8 proto, | 1396 | u8 proto, |
1339 | unsigned short family); | 1397 | unsigned short family); |
1340 | #ifdef CONFIG_XFRM_SUB_POLICY | 1398 | #ifdef CONFIG_XFRM_SUB_POLICY |
@@ -1379,11 +1437,10 @@ extern int xfrm_state_delete(struct xfrm_state *x); | |||
1379 | extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); | 1437 | extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); |
1380 | extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si); | 1438 | extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si); |
1381 | extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si); | 1439 | extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si); |
1382 | extern int xfrm_replay_check(struct xfrm_state *x, | 1440 | extern u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq); |
1383 | struct sk_buff *skb, __be32 seq); | 1441 | extern int xfrm_init_replay(struct xfrm_state *x); |
1384 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); | ||
1385 | extern void xfrm_replay_notify(struct xfrm_state *x, int event); | ||
1386 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); | 1442 | extern int xfrm_state_mtu(struct xfrm_state *x, int mtu); |
1443 | extern int __xfrm_init_state(struct xfrm_state *x, bool init_replay); | ||
1387 | extern int xfrm_init_state(struct xfrm_state *x); | 1444 | extern int xfrm_init_state(struct xfrm_state *x); |
1388 | extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb); | 1445 | extern int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb); |
1389 | extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, | 1446 | extern int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, |
@@ -1407,6 +1464,7 @@ static inline int xfrm4_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi) | |||
1407 | extern int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb); | 1464 | extern int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb); |
1408 | extern int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb); | 1465 | extern int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb); |
1409 | extern int xfrm4_output(struct sk_buff *skb); | 1466 | extern int xfrm4_output(struct sk_buff *skb); |
1467 | extern int xfrm4_output_finish(struct sk_buff *skb); | ||
1410 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); | 1468 | extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family); |
1411 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); | 1469 | extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family); |
1412 | extern int xfrm6_extract_header(struct sk_buff *skb); | 1470 | extern int xfrm6_extract_header(struct sk_buff *skb); |
@@ -1419,11 +1477,11 @@ extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, | |||
1419 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); | 1477 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); |
1420 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); | 1478 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); |
1421 | extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); | 1479 | extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); |
1422 | extern void xfrm6_tunnel_free_spi(struct net *net, xfrm_address_t *saddr); | 1480 | extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr); |
1423 | extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr); | ||
1424 | extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); | 1481 | extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); |
1425 | extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); | 1482 | extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); |
1426 | extern int xfrm6_output(struct sk_buff *skb); | 1483 | extern int xfrm6_output(struct sk_buff *skb); |
1484 | extern int xfrm6_output_finish(struct sk_buff *skb); | ||
1427 | extern int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb, | 1485 | extern int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb, |
1428 | u8 **prevhdr); | 1486 | u8 **prevhdr); |
1429 | 1487 | ||
@@ -1462,21 +1520,19 @@ u32 xfrm_get_acqseq(void); | |||
1462 | extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); | 1520 | extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); |
1463 | struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, | 1521 | struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, |
1464 | u8 mode, u32 reqid, u8 proto, | 1522 | u8 mode, u32 reqid, u8 proto, |
1465 | xfrm_address_t *daddr, | 1523 | const xfrm_address_t *daddr, |
1466 | xfrm_address_t *saddr, int create, | 1524 | const xfrm_address_t *saddr, int create, |
1467 | unsigned short family); | 1525 | unsigned short family); |
1468 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); | 1526 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); |
1469 | extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst, | ||
1470 | struct flowi *fl, int family, int strict); | ||
1471 | 1527 | ||
1472 | #ifdef CONFIG_XFRM_MIGRATE | 1528 | #ifdef CONFIG_XFRM_MIGRATE |
1473 | extern int km_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | 1529 | extern int km_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, |
1474 | struct xfrm_migrate *m, int num_bundles, | 1530 | const struct xfrm_migrate *m, int num_bundles, |
1475 | struct xfrm_kmaddress *k); | 1531 | const struct xfrm_kmaddress *k); |
1476 | extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m); | 1532 | extern struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m); |
1477 | extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x, | 1533 | extern struct xfrm_state * xfrm_state_migrate(struct xfrm_state *x, |
1478 | struct xfrm_migrate *m); | 1534 | struct xfrm_migrate *m); |
1479 | extern int xfrm_migrate(struct xfrm_selector *sel, u8 dir, u8 type, | 1535 | extern int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, |
1480 | struct xfrm_migrate *m, int num_bundles, | 1536 | struct xfrm_migrate *m, int num_bundles, |
1481 | struct xfrm_kmaddress *k); | 1537 | struct xfrm_kmaddress *k); |
1482 | #endif | 1538 | #endif |
@@ -1496,10 +1552,10 @@ extern struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx); | |||
1496 | extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); | 1552 | extern struct xfrm_algo_desc *xfrm_aalg_get_byid(int alg_id); |
1497 | extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id); | 1553 | extern struct xfrm_algo_desc *xfrm_ealg_get_byid(int alg_id); |
1498 | extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id); | 1554 | extern struct xfrm_algo_desc *xfrm_calg_get_byid(int alg_id); |
1499 | extern struct xfrm_algo_desc *xfrm_aalg_get_byname(char *name, int probe); | 1555 | extern struct xfrm_algo_desc *xfrm_aalg_get_byname(const char *name, int probe); |
1500 | extern struct xfrm_algo_desc *xfrm_ealg_get_byname(char *name, int probe); | 1556 | extern struct xfrm_algo_desc *xfrm_ealg_get_byname(const char *name, int probe); |
1501 | extern struct xfrm_algo_desc *xfrm_calg_get_byname(char *name, int probe); | 1557 | extern struct xfrm_algo_desc *xfrm_calg_get_byname(const char *name, int probe); |
1502 | extern struct xfrm_algo_desc *xfrm_aead_get_byname(char *name, int icv_len, | 1558 | extern struct xfrm_algo_desc *xfrm_aead_get_byname(const char *name, int icv_len, |
1503 | int probe); | 1559 | int probe); |
1504 | 1560 | ||
1505 | struct hash_desc; | 1561 | struct hash_desc; |
@@ -1507,7 +1563,8 @@ struct scatterlist; | |||
1507 | typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, | 1563 | typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, |
1508 | unsigned int); | 1564 | unsigned int); |
1509 | 1565 | ||
1510 | static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b, | 1566 | static inline int xfrm_addr_cmp(const xfrm_address_t *a, |
1567 | const xfrm_address_t *b, | ||
1511 | int family) | 1568 | int family) |
1512 | { | 1569 | { |
1513 | switch (family) { | 1570 | switch (family) { |
@@ -1515,8 +1572,8 @@ static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b, | |||
1515 | case AF_INET: | 1572 | case AF_INET: |
1516 | return (__force u32)a->a4 - (__force u32)b->a4; | 1573 | return (__force u32)a->a4 - (__force u32)b->a4; |
1517 | case AF_INET6: | 1574 | case AF_INET6: |
1518 | return ipv6_addr_cmp((struct in6_addr *)a, | 1575 | return ipv6_addr_cmp((const struct in6_addr *)a, |
1519 | (struct in6_addr *)b); | 1576 | (const struct in6_addr *)b); |
1520 | } | 1577 | } |
1521 | } | 1578 | } |
1522 | 1579 | ||
@@ -1540,17 +1597,44 @@ static inline int xfrm_aevent_is_on(struct net *net) | |||
1540 | } | 1597 | } |
1541 | #endif | 1598 | #endif |
1542 | 1599 | ||
1543 | static inline int xfrm_alg_len(struct xfrm_algo *alg) | 1600 | static inline int xfrm_alg_len(const struct xfrm_algo *alg) |
1544 | { | 1601 | { |
1545 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | 1602 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); |
1546 | } | 1603 | } |
1547 | 1604 | ||
1548 | static inline int xfrm_alg_auth_len(struct xfrm_algo_auth *alg) | 1605 | static inline int xfrm_alg_auth_len(const struct xfrm_algo_auth *alg) |
1549 | { | 1606 | { |
1550 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | 1607 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); |
1551 | } | 1608 | } |
1552 | 1609 | ||
1610 | static inline int xfrm_replay_state_esn_len(struct xfrm_replay_state_esn *replay_esn) | ||
1611 | { | ||
1612 | return sizeof(*replay_esn) + replay_esn->bmp_len * sizeof(__u32); | ||
1613 | } | ||
1614 | |||
1553 | #ifdef CONFIG_XFRM_MIGRATE | 1615 | #ifdef CONFIG_XFRM_MIGRATE |
1616 | static inline int xfrm_replay_clone(struct xfrm_state *x, | ||
1617 | struct xfrm_state *orig) | ||
1618 | { | ||
1619 | x->replay_esn = kzalloc(xfrm_replay_state_esn_len(orig->replay_esn), | ||
1620 | GFP_KERNEL); | ||
1621 | if (!x->replay_esn) | ||
1622 | return -ENOMEM; | ||
1623 | |||
1624 | x->replay_esn->bmp_len = orig->replay_esn->bmp_len; | ||
1625 | x->replay_esn->replay_window = orig->replay_esn->replay_window; | ||
1626 | |||
1627 | x->preplay_esn = kmemdup(x->replay_esn, | ||
1628 | xfrm_replay_state_esn_len(x->replay_esn), | ||
1629 | GFP_KERNEL); | ||
1630 | if (!x->preplay_esn) { | ||
1631 | kfree(x->replay_esn); | ||
1632 | return -ENOMEM; | ||
1633 | } | ||
1634 | |||
1635 | return 0; | ||
1636 | } | ||
1637 | |||
1554 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) | 1638 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) |
1555 | { | 1639 | { |
1556 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); | 1640 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); |
@@ -1593,7 +1677,7 @@ static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m) | |||
1593 | return m->v & m->m; | 1677 | return m->v & m->m; |
1594 | } | 1678 | } |
1595 | 1679 | ||
1596 | static inline int xfrm_mark_put(struct sk_buff *skb, struct xfrm_mark *m) | 1680 | static inline int xfrm_mark_put(struct sk_buff *skb, const struct xfrm_mark *m) |
1597 | { | 1681 | { |
1598 | if (m->m | m->v) | 1682 | if (m->m | m->v) |
1599 | NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m); | 1683 | NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m); |