diff options
Diffstat (limited to 'include/net/xfrm.h')
| -rw-r--r-- | include/net/xfrm.h | 137 |
1 files changed, 86 insertions, 51 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 223e90a44824..ac52f33f3e4a 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/in6.h> | 12 | #include <linux/in6.h> |
| 13 | #include <linux/mutex.h> | 13 | #include <linux/mutex.h> |
| 14 | #include <linux/audit.h> | 14 | #include <linux/audit.h> |
| 15 | #include <linux/slab.h> | ||
| 15 | 16 | ||
| 16 | #include <net/sock.h> | 17 | #include <net/sock.h> |
| 17 | #include <net/dst.h> | 18 | #include <net/dst.h> |
| @@ -19,6 +20,9 @@ | |||
| 19 | #include <net/route.h> | 20 | #include <net/route.h> |
| 20 | #include <net/ipv6.h> | 21 | #include <net/ipv6.h> |
| 21 | #include <net/ip6_fib.h> | 22 | #include <net/ip6_fib.h> |
| 23 | |||
| 24 | #include <linux/interrupt.h> | ||
| 25 | |||
| 22 | #ifdef CONFIG_XFRM_STATISTICS | 26 | #ifdef CONFIG_XFRM_STATISTICS |
| 23 | #include <net/snmp.h> | 27 | #include <net/snmp.h> |
| 24 | #endif | 28 | #endif |
| @@ -121,8 +125,7 @@ struct xfrm_state_walk { | |||
| 121 | }; | 125 | }; |
| 122 | 126 | ||
| 123 | /* Full description of state of transformer. */ | 127 | /* Full description of state of transformer. */ |
| 124 | struct xfrm_state | 128 | struct xfrm_state { |
| 125 | { | ||
| 126 | #ifdef CONFIG_NET_NS | 129 | #ifdef CONFIG_NET_NS |
| 127 | struct net *xs_net; | 130 | struct net *xs_net; |
| 128 | #endif | 131 | #endif |
| @@ -138,6 +141,7 @@ struct xfrm_state | |||
| 138 | 141 | ||
| 139 | struct xfrm_id id; | 142 | struct xfrm_id id; |
| 140 | struct xfrm_selector sel; | 143 | struct xfrm_selector sel; |
| 144 | struct xfrm_mark mark; | ||
| 141 | 145 | ||
| 142 | u32 genid; | 146 | u32 genid; |
| 143 | 147 | ||
| @@ -160,7 +164,7 @@ struct xfrm_state | |||
| 160 | struct xfrm_lifetime_cfg lft; | 164 | struct xfrm_lifetime_cfg lft; |
| 161 | 165 | ||
| 162 | /* Data for transformer */ | 166 | /* Data for transformer */ |
| 163 | struct xfrm_algo *aalg; | 167 | struct xfrm_algo_auth *aalg; |
| 164 | struct xfrm_algo *ealg; | 168 | struct xfrm_algo *ealg; |
| 165 | struct xfrm_algo *calg; | 169 | struct xfrm_algo *calg; |
| 166 | struct xfrm_algo_aead *aead; | 170 | struct xfrm_algo_aead *aead; |
| @@ -199,7 +203,7 @@ struct xfrm_state | |||
| 199 | struct xfrm_stats stats; | 203 | struct xfrm_stats stats; |
| 200 | 204 | ||
| 201 | struct xfrm_lifetime_cur curlft; | 205 | struct xfrm_lifetime_cur curlft; |
| 202 | struct timer_list timer; | 206 | struct tasklet_hrtimer mtimer; |
| 203 | 207 | ||
| 204 | /* Last used time */ | 208 | /* Last used time */ |
| 205 | unsigned long lastused; | 209 | unsigned long lastused; |
| @@ -237,8 +241,7 @@ enum { | |||
| 237 | }; | 241 | }; |
| 238 | 242 | ||
| 239 | /* callback structure passed from either netlink or pfkey */ | 243 | /* callback structure passed from either netlink or pfkey */ |
| 240 | struct km_event | 244 | struct km_event { |
| 241 | { | ||
| 242 | union { | 245 | union { |
| 243 | u32 hard; | 246 | u32 hard; |
| 244 | u32 proto; | 247 | u32 proto; |
| @@ -273,7 +276,8 @@ struct xfrm_policy_afinfo { | |||
| 273 | struct dst_entry *dst, | 276 | struct dst_entry *dst, |
| 274 | int nfheader_len); | 277 | int nfheader_len); |
| 275 | int (*fill_dst)(struct xfrm_dst *xdst, | 278 | int (*fill_dst)(struct xfrm_dst *xdst, |
| 276 | struct net_device *dev); | 279 | struct net_device *dev, |
| 280 | struct flowi *fl); | ||
| 277 | }; | 281 | }; |
| 278 | 282 | ||
| 279 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); | 283 | extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); |
| @@ -313,12 +317,11 @@ extern int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo); | |||
| 313 | 317 | ||
| 314 | extern void xfrm_state_delete_tunnel(struct xfrm_state *x); | 318 | extern void xfrm_state_delete_tunnel(struct xfrm_state *x); |
| 315 | 319 | ||
| 316 | struct xfrm_type | 320 | struct xfrm_type { |
| 317 | { | ||
| 318 | char *description; | 321 | char *description; |
| 319 | struct module *owner; | 322 | struct module *owner; |
| 320 | __u8 proto; | 323 | u8 proto; |
| 321 | __u8 flags; | 324 | u8 flags; |
| 322 | #define XFRM_TYPE_NON_FRAGMENT 1 | 325 | #define XFRM_TYPE_NON_FRAGMENT 1 |
| 323 | #define XFRM_TYPE_REPLAY_PROT 2 | 326 | #define XFRM_TYPE_REPLAY_PROT 2 |
| 324 | #define XFRM_TYPE_LOCAL_COADDR 4 | 327 | #define XFRM_TYPE_LOCAL_COADDR 4 |
| @@ -420,8 +423,7 @@ static inline struct xfrm_mode *xfrm_ip2inner_mode(struct xfrm_state *x, int ipp | |||
| 420 | return x->inner_mode_iaf; | 423 | return x->inner_mode_iaf; |
| 421 | } | 424 | } |
| 422 | 425 | ||
| 423 | struct xfrm_tmpl | 426 | struct xfrm_tmpl { |
| 424 | { | ||
| 425 | /* id in template is interpreted as: | 427 | /* id in template is interpreted as: |
| 426 | * daddr - destination of tunnel, may be zero for transport mode. | 428 | * daddr - destination of tunnel, may be zero for transport mode. |
| 427 | * spi - zero to acquire spi. Not zero if spi is static, then | 429 | * spi - zero to acquire spi. Not zero if spi is static, then |
| @@ -435,24 +437,24 @@ struct xfrm_tmpl | |||
| 435 | 437 | ||
| 436 | unsigned short encap_family; | 438 | unsigned short encap_family; |
| 437 | 439 | ||
| 438 | __u32 reqid; | 440 | u32 reqid; |
| 439 | 441 | ||
| 440 | /* Mode: transport, tunnel etc. */ | 442 | /* Mode: transport, tunnel etc. */ |
| 441 | __u8 mode; | 443 | u8 mode; |
| 442 | 444 | ||
| 443 | /* Sharing mode: unique, this session only, this user only etc. */ | 445 | /* Sharing mode: unique, this session only, this user only etc. */ |
| 444 | __u8 share; | 446 | u8 share; |
| 445 | 447 | ||
| 446 | /* May skip this transfomration if no SA is found */ | 448 | /* May skip this transfomration if no SA is found */ |
| 447 | __u8 optional; | 449 | u8 optional; |
| 448 | 450 | ||
| 449 | /* Skip aalgos/ealgos/calgos checks. */ | 451 | /* Skip aalgos/ealgos/calgos checks. */ |
| 450 | __u8 allalgs; | 452 | u8 allalgs; |
| 451 | 453 | ||
| 452 | /* Bit mask of algos allowed for acquisition */ | 454 | /* Bit mask of algos allowed for acquisition */ |
| 453 | __u32 aalgos; | 455 | u32 aalgos; |
| 454 | __u32 ealgos; | 456 | u32 ealgos; |
| 455 | __u32 calgos; | 457 | u32 calgos; |
| 456 | }; | 458 | }; |
| 457 | 459 | ||
| 458 | #define XFRM_MAX_DEPTH 6 | 460 | #define XFRM_MAX_DEPTH 6 |
| @@ -468,8 +470,7 @@ struct xfrm_policy_walk { | |||
| 468 | u32 seq; | 470 | u32 seq; |
| 469 | }; | 471 | }; |
| 470 | 472 | ||
| 471 | struct xfrm_policy | 473 | struct xfrm_policy { |
| 472 | { | ||
| 473 | #ifdef CONFIG_NET_NS | 474 | #ifdef CONFIG_NET_NS |
| 474 | struct net *xp_net; | 475 | struct net *xp_net; |
| 475 | #endif | 476 | #endif |
| @@ -483,6 +484,7 @@ struct xfrm_policy | |||
| 483 | 484 | ||
| 484 | u32 priority; | 485 | u32 priority; |
| 485 | u32 index; | 486 | u32 index; |
| 487 | struct xfrm_mark mark; | ||
| 486 | struct xfrm_selector selector; | 488 | struct xfrm_selector selector; |
| 487 | struct xfrm_lifetime_cfg lft; | 489 | struct xfrm_lifetime_cfg lft; |
| 488 | struct xfrm_lifetime_cur curlft; | 490 | struct xfrm_lifetime_cur curlft; |
| @@ -538,8 +540,7 @@ struct xfrm_migrate { | |||
| 538 | /* default seq threshold size */ | 540 | /* default seq threshold size */ |
| 539 | #define XFRM_AE_SEQT_SIZE 2 | 541 | #define XFRM_AE_SEQT_SIZE 2 |
| 540 | 542 | ||
| 541 | struct xfrm_mgr | 543 | struct xfrm_mgr { |
| 542 | { | ||
| 543 | struct list_head list; | 544 | struct list_head list; |
| 544 | char *id; | 545 | char *id; |
| 545 | int (*notify)(struct xfrm_state *x, struct km_event *c); | 546 | int (*notify)(struct xfrm_state *x, struct km_event *c); |
| @@ -626,8 +627,7 @@ struct xfrm_spi_skb_cb { | |||
| 626 | #define XFRM_SPI_SKB_CB(__skb) ((struct xfrm_spi_skb_cb *)&((__skb)->cb[0])) | 627 | #define XFRM_SPI_SKB_CB(__skb) ((struct xfrm_spi_skb_cb *)&((__skb)->cb[0])) |
| 627 | 628 | ||
| 628 | /* Audit Information */ | 629 | /* Audit Information */ |
| 629 | struct xfrm_audit | 630 | struct xfrm_audit { |
| 630 | { | ||
| 631 | u32 secid; | 631 | u32 secid; |
| 632 | uid_t loginuid; | 632 | uid_t loginuid; |
| 633 | u32 sessionid; | 633 | u32 sessionid; |
| @@ -774,7 +774,7 @@ static __inline__ int addr_match(void *token1, void *token2, int prefixlen) | |||
| 774 | int pdw; | 774 | int pdw; |
| 775 | int pbi; | 775 | int pbi; |
| 776 | 776 | ||
| 777 | pdw = prefixlen >> 5; /* num of whole __u32 in prefix */ | 777 | pdw = prefixlen >> 5; /* num of whole u32 in prefix */ |
| 778 | pbi = prefixlen & 0x1f; /* num of bits in incomplete u32 in prefix */ | 778 | pbi = prefixlen & 0x1f; /* num of bits in incomplete u32 in prefix */ |
| 779 | 779 | ||
| 780 | if (pdw) | 780 | if (pdw) |
| @@ -871,8 +871,7 @@ static inline int xfrm_sec_ctx_match(struct xfrm_sec_ctx *s1, struct xfrm_sec_ct | |||
| 871 | * bundles differing by session id. All the bundles grow from a parent | 871 | * bundles differing by session id. All the bundles grow from a parent |
| 872 | * policy rule. | 872 | * policy rule. |
| 873 | */ | 873 | */ |
| 874 | struct xfrm_dst | 874 | struct xfrm_dst { |
| 875 | { | ||
| 876 | union { | 875 | union { |
| 877 | struct dst_entry dst; | 876 | struct dst_entry dst; |
| 878 | struct rtable rt; | 877 | struct rtable rt; |
| @@ -907,8 +906,7 @@ static inline void xfrm_dst_destroy(struct xfrm_dst *xdst) | |||
| 907 | 906 | ||
| 908 | extern void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev); | 907 | extern void xfrm_dst_ifdown(struct dst_entry *dst, struct net_device *dev); |
| 909 | 908 | ||
| 910 | struct sec_path | 909 | struct sec_path { |
| 911 | { | ||
| 912 | atomic_t refcnt; | 910 | atomic_t refcnt; |
| 913 | int len; | 911 | int len; |
| 914 | struct xfrm_state *xvec[XFRM_MAX_DEPTH]; | 912 | struct xfrm_state *xvec[XFRM_MAX_DEPTH]; |
| @@ -1265,7 +1263,7 @@ struct xfrm_algo_desc { | |||
| 1265 | /* XFRM tunnel handlers. */ | 1263 | /* XFRM tunnel handlers. */ |
| 1266 | struct xfrm_tunnel { | 1264 | struct xfrm_tunnel { |
| 1267 | int (*handler)(struct sk_buff *skb); | 1265 | int (*handler)(struct sk_buff *skb); |
| 1268 | int (*err_handler)(struct sk_buff *skb, __u32 info); | 1266 | int (*err_handler)(struct sk_buff *skb, u32 info); |
| 1269 | 1267 | ||
| 1270 | struct xfrm_tunnel *next; | 1268 | struct xfrm_tunnel *next; |
| 1271 | int priority; | 1269 | int priority; |
| @@ -1323,7 +1321,7 @@ extern struct xfrm_state *xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t | |||
| 1323 | struct flowi *fl, struct xfrm_tmpl *tmpl, | 1321 | struct flowi *fl, struct xfrm_tmpl *tmpl, |
| 1324 | struct xfrm_policy *pol, int *err, | 1322 | struct xfrm_policy *pol, int *err, |
| 1325 | unsigned short family); | 1323 | unsigned short family); |
| 1326 | extern struct xfrm_state * xfrm_stateonly_find(struct net *net, | 1324 | extern struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, |
| 1327 | xfrm_address_t *daddr, | 1325 | xfrm_address_t *daddr, |
| 1328 | xfrm_address_t *saddr, | 1326 | xfrm_address_t *saddr, |
| 1329 | unsigned short family, | 1327 | unsigned short family, |
| @@ -1332,8 +1330,14 @@ extern int xfrm_state_check_expire(struct xfrm_state *x); | |||
| 1332 | extern void xfrm_state_insert(struct xfrm_state *x); | 1330 | extern void xfrm_state_insert(struct xfrm_state *x); |
| 1333 | extern int xfrm_state_add(struct xfrm_state *x); | 1331 | extern int xfrm_state_add(struct xfrm_state *x); |
| 1334 | extern int xfrm_state_update(struct xfrm_state *x); | 1332 | extern int xfrm_state_update(struct xfrm_state *x); |
| 1335 | extern struct xfrm_state *xfrm_state_lookup(struct net *net, xfrm_address_t *daddr, __be32 spi, u8 proto, unsigned short family); | 1333 | extern struct xfrm_state *xfrm_state_lookup(struct net *net, u32 mark, |
| 1336 | extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, xfrm_address_t *daddr, xfrm_address_t *saddr, u8 proto, unsigned short family); | 1334 | xfrm_address_t *daddr, __be32 spi, |
| 1335 | u8 proto, unsigned short family); | ||
| 1336 | extern struct xfrm_state *xfrm_state_lookup_byaddr(struct net *net, u32 mark, | ||
| 1337 | xfrm_address_t *daddr, | ||
| 1338 | xfrm_address_t *saddr, | ||
| 1339 | u8 proto, | ||
| 1340 | unsigned short family); | ||
| 1337 | #ifdef CONFIG_XFRM_SUB_POLICY | 1341 | #ifdef CONFIG_XFRM_SUB_POLICY |
| 1338 | extern int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, | 1342 | extern int xfrm_tmpl_sort(struct xfrm_tmpl **dst, struct xfrm_tmpl **src, |
| 1339 | int n, unsigned short family); | 1343 | int n, unsigned short family); |
| @@ -1370,11 +1374,12 @@ struct xfrmk_spdinfo { | |||
| 1370 | u32 spdhmcnt; | 1374 | u32 spdhmcnt; |
| 1371 | }; | 1375 | }; |
| 1372 | 1376 | ||
| 1373 | extern struct xfrm_state *xfrm_find_acq_byseq(struct net *net, u32 seq); | 1377 | extern struct xfrm_state *xfrm_find_acq_byseq(struct net *net, u32 mark, |
| 1378 | u32 seq); | ||
| 1374 | extern int xfrm_state_delete(struct xfrm_state *x); | 1379 | extern int xfrm_state_delete(struct xfrm_state *x); |
| 1375 | extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); | 1380 | extern int xfrm_state_flush(struct net *net, u8 proto, struct xfrm_audit *audit_info); |
| 1376 | extern void xfrm_sad_getinfo(struct xfrmk_sadinfo *si); | 1381 | extern void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si); |
| 1377 | extern void xfrm_spd_getinfo(struct xfrmk_spdinfo *si); | 1382 | extern void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si); |
| 1378 | extern int xfrm_replay_check(struct xfrm_state *x, | 1383 | extern int xfrm_replay_check(struct xfrm_state *x, |
| 1379 | struct sk_buff *skb, __be32 seq); | 1384 | struct sk_buff *skb, __be32 seq); |
| 1380 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); | 1385 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); |
| @@ -1414,9 +1419,9 @@ extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, | |||
| 1414 | xfrm_address_t *saddr, u8 proto); | 1419 | xfrm_address_t *saddr, u8 proto); |
| 1415 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); | 1420 | extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family); |
| 1416 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); | 1421 | extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family); |
| 1417 | extern __be32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr); | 1422 | extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr); |
| 1418 | extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr); | 1423 | extern void xfrm6_tunnel_free_spi(struct net *net, xfrm_address_t *saddr); |
| 1419 | extern __be32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr); | 1424 | extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, xfrm_address_t *saddr); |
| 1420 | extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); | 1425 | extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb); |
| 1421 | extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); | 1426 | extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb); |
| 1422 | extern int xfrm6_output(struct sk_buff *skb); | 1427 | extern int xfrm6_output(struct sk_buff *skb); |
| @@ -1447,17 +1452,20 @@ extern int xfrm_policy_walk(struct net *net, struct xfrm_policy_walk *walk, | |||
| 1447 | int (*func)(struct xfrm_policy *, int, int, void*), void *); | 1452 | int (*func)(struct xfrm_policy *, int, int, void*), void *); |
| 1448 | extern void xfrm_policy_walk_done(struct xfrm_policy_walk *walk); | 1453 | extern void xfrm_policy_walk_done(struct xfrm_policy_walk *walk); |
| 1449 | int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl); | 1454 | int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl); |
| 1450 | struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u8 type, int dir, | 1455 | struct xfrm_policy *xfrm_policy_bysel_ctx(struct net *net, u32 mark, |
| 1456 | u8 type, int dir, | ||
| 1451 | struct xfrm_selector *sel, | 1457 | struct xfrm_selector *sel, |
| 1452 | struct xfrm_sec_ctx *ctx, int delete, | 1458 | struct xfrm_sec_ctx *ctx, int delete, |
| 1453 | int *err); | 1459 | int *err); |
| 1454 | struct xfrm_policy *xfrm_policy_byid(struct net *net, u8, int dir, u32 id, int delete, int *err); | 1460 | struct xfrm_policy *xfrm_policy_byid(struct net *net, u32 mark, u8, int dir, u32 id, int delete, int *err); |
| 1455 | int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info); | 1461 | int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info); |
| 1456 | u32 xfrm_get_acqseq(void); | 1462 | u32 xfrm_get_acqseq(void); |
| 1457 | extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); | 1463 | extern int xfrm_alloc_spi(struct xfrm_state *x, u32 minspi, u32 maxspi); |
| 1458 | struct xfrm_state * xfrm_find_acq(struct net *net, u8 mode, u32 reqid, u8 proto, | 1464 | struct xfrm_state *xfrm_find_acq(struct net *net, struct xfrm_mark *mark, |
| 1459 | xfrm_address_t *daddr, xfrm_address_t *saddr, | 1465 | u8 mode, u32 reqid, u8 proto, |
| 1460 | int create, unsigned short family); | 1466 | xfrm_address_t *daddr, |
| 1467 | xfrm_address_t *saddr, int create, | ||
| 1468 | unsigned short family); | ||
| 1461 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); | 1469 | extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol); |
| 1462 | extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst, | 1470 | extern int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *xdst, |
| 1463 | struct flowi *fl, int family, int strict); | 1471 | struct flowi *fl, int family, int strict); |
| @@ -1500,16 +1508,13 @@ struct scatterlist; | |||
| 1500 | typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, | 1508 | typedef int (icv_update_fn_t)(struct hash_desc *, struct scatterlist *, |
| 1501 | unsigned int); | 1509 | unsigned int); |
| 1502 | 1510 | ||
| 1503 | extern int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *tfm, | ||
| 1504 | int offset, int len, icv_update_fn_t icv_update); | ||
| 1505 | |||
| 1506 | static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b, | 1511 | static inline int xfrm_addr_cmp(xfrm_address_t *a, xfrm_address_t *b, |
| 1507 | int family) | 1512 | int family) |
| 1508 | { | 1513 | { |
| 1509 | switch (family) { | 1514 | switch (family) { |
| 1510 | default: | 1515 | default: |
| 1511 | case AF_INET: | 1516 | case AF_INET: |
| 1512 | return (__force __u32)a->a4 - (__force __u32)b->a4; | 1517 | return (__force u32)a->a4 - (__force u32)b->a4; |
| 1513 | case AF_INET6: | 1518 | case AF_INET6: |
| 1514 | return ipv6_addr_cmp((struct in6_addr *)a, | 1519 | return ipv6_addr_cmp((struct in6_addr *)a, |
| 1515 | (struct in6_addr *)b); | 1520 | (struct in6_addr *)b); |
| @@ -1541,12 +1546,22 @@ static inline int xfrm_alg_len(struct xfrm_algo *alg) | |||
| 1541 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | 1546 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); |
| 1542 | } | 1547 | } |
| 1543 | 1548 | ||
| 1549 | static inline int xfrm_alg_auth_len(struct xfrm_algo_auth *alg) | ||
| 1550 | { | ||
| 1551 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | ||
| 1552 | } | ||
| 1553 | |||
| 1544 | #ifdef CONFIG_XFRM_MIGRATE | 1554 | #ifdef CONFIG_XFRM_MIGRATE |
| 1545 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) | 1555 | static inline struct xfrm_algo *xfrm_algo_clone(struct xfrm_algo *orig) |
| 1546 | { | 1556 | { |
| 1547 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); | 1557 | return kmemdup(orig, xfrm_alg_len(orig), GFP_KERNEL); |
| 1548 | } | 1558 | } |
| 1549 | 1559 | ||
| 1560 | static inline struct xfrm_algo_auth *xfrm_algo_auth_clone(struct xfrm_algo_auth *orig) | ||
| 1561 | { | ||
| 1562 | return kmemdup(orig, xfrm_alg_auth_len(orig), GFP_KERNEL); | ||
| 1563 | } | ||
| 1564 | |||
| 1550 | static inline void xfrm_states_put(struct xfrm_state **states, int n) | 1565 | static inline void xfrm_states_put(struct xfrm_state **states, int n) |
| 1551 | { | 1566 | { |
| 1552 | int i; | 1567 | int i; |
| @@ -1569,4 +1584,24 @@ static inline struct xfrm_state *xfrm_input_state(struct sk_buff *skb) | |||
| 1569 | } | 1584 | } |
| 1570 | #endif | 1585 | #endif |
| 1571 | 1586 | ||
| 1587 | static inline int xfrm_mark_get(struct nlattr **attrs, struct xfrm_mark *m) | ||
| 1588 | { | ||
| 1589 | if (attrs[XFRMA_MARK]) | ||
| 1590 | memcpy(m, nla_data(attrs[XFRMA_MARK]), sizeof(m)); | ||
| 1591 | else | ||
| 1592 | m->v = m->m = 0; | ||
| 1593 | |||
| 1594 | return m->v & m->m; | ||
| 1595 | } | ||
| 1596 | |||
| 1597 | static inline int xfrm_mark_put(struct sk_buff *skb, struct xfrm_mark *m) | ||
| 1598 | { | ||
| 1599 | if (m->m | m->v) | ||
| 1600 | NLA_PUT(skb, XFRMA_MARK, sizeof(struct xfrm_mark), m); | ||
| 1601 | return 0; | ||
| 1602 | |||
| 1603 | nla_put_failure: | ||
| 1604 | return -1; | ||
| 1605 | } | ||
| 1606 | |||
| 1572 | #endif /* _NET_XFRM_H */ | 1607 | #endif /* _NET_XFRM_H */ |
