diff options
author | Jamal Hadi Salim <hadi@cyberus.ca> | 2007-05-04 15:55:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-05-04 15:55:13 -0400 |
commit | af11e31609d93765c1b22611592543e028f7aa54 (patch) | |
tree | f8a915dc7d98844667308f7c234d00f59113ff3f | |
parent | 224711df5c00f7540b89f32a8225866031977f17 (diff) |
[XFRM] SAD info TLV aggregationx
Aggregate the SAD info TLVs.
Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/xfrm.h | 21 | ||||
-rw-r--r-- | include/net/xfrm.h | 17 | ||||
-rw-r--r-- | net/xfrm/xfrm_state.c | 2 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 22 |
4 files changed, 25 insertions, 37 deletions
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index a5d53e0fe152..c237fe3af8ce 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h | |||
@@ -243,17 +243,6 @@ enum xfrm_ae_ftype_t { | |||
243 | #define XFRM_AE_MAX (__XFRM_AE_MAX - 1) | 243 | #define XFRM_AE_MAX (__XFRM_AE_MAX - 1) |
244 | }; | 244 | }; |
245 | 245 | ||
246 | /* SAD Table filter flags */ | ||
247 | enum xfrm_sad_ftype_t { | ||
248 | XFRM_SAD_UNSPEC, | ||
249 | XFRM_SAD_HMASK=1, | ||
250 | XFRM_SAD_HMAX=2, | ||
251 | XFRM_SAD_CNT=4, | ||
252 | __XFRM_SAD_MAX | ||
253 | |||
254 | #define XFRM_SAD_MAX (__XFRM_SAD_MAX - 1) | ||
255 | }; | ||
256 | |||
257 | struct xfrm_userpolicy_type { | 246 | struct xfrm_userpolicy_type { |
258 | __u8 type; | 247 | __u8 type; |
259 | __u16 reserved1; | 248 | __u16 reserved1; |
@@ -287,14 +276,18 @@ enum xfrm_attr_type_t { | |||
287 | 276 | ||
288 | enum xfrm_sadattr_type_t { | 277 | enum xfrm_sadattr_type_t { |
289 | XFRMA_SAD_UNSPEC, | 278 | XFRMA_SAD_UNSPEC, |
290 | XFRMA_SADHMASK, | 279 | XFRMA_SAD_CNT, |
291 | XFRMA_SADHMAX, | 280 | XFRMA_SAD_HINFO, |
292 | XFRMA_SADCNT, | ||
293 | __XFRMA_SAD_MAX | 281 | __XFRMA_SAD_MAX |
294 | 282 | ||
295 | #define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1) | 283 | #define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1) |
296 | }; | 284 | }; |
297 | 285 | ||
286 | struct xfrmu_sadhinfo { | ||
287 | __u32 sadhcnt; /* current hash bkts */ | ||
288 | __u32 sadhmcnt; /* max allowed hash bkts */ | ||
289 | }; | ||
290 | |||
298 | /* SPD Table filter flags */ | 291 | /* SPD Table filter flags */ |
299 | enum xfrm_spd_ftype_t { | 292 | enum xfrm_spd_ftype_t { |
300 | XFRM_SPD_UNSPEC, | 293 | XFRM_SPD_UNSPEC, |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 66c2d3eec03c..d0d7db51d3fc 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -416,14 +416,6 @@ struct xfrm_audit | |||
416 | u32 secid; | 416 | u32 secid; |
417 | }; | 417 | }; |
418 | 418 | ||
419 | /* SAD metadata, add more later */ | ||
420 | struct xfrm_sadinfo | ||
421 | { | ||
422 | u32 sadhcnt; /* current hash bkts */ | ||
423 | u32 sadhmcnt; /* max allowed hash bkts */ | ||
424 | u32 sadcnt; /* current running count */ | ||
425 | }; | ||
426 | |||
427 | struct xfrm_spdinfo | 419 | struct xfrm_spdinfo |
428 | { | 420 | { |
429 | u32 incnt; | 421 | u32 incnt; |
@@ -964,10 +956,17 @@ static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **s | |||
964 | return -ENOSYS; | 956 | return -ENOSYS; |
965 | } | 957 | } |
966 | #endif | 958 | #endif |
959 | |||
960 | struct xfrmk_sadinfo { | ||
961 | u32 sadhcnt; /* current hash bkts */ | ||
962 | u32 sadhmcnt; /* max allowed hash bkts */ | ||
963 | u32 sadcnt; /* current running count */ | ||
964 | }; | ||
965 | |||
967 | extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq); | 966 | extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq); |
968 | extern int xfrm_state_delete(struct xfrm_state *x); | 967 | extern int xfrm_state_delete(struct xfrm_state *x); |
969 | extern void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info); | 968 | extern void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info); |
970 | extern void xfrm_sad_getinfo(struct xfrm_sadinfo *si); | 969 | extern void xfrm_sad_getinfo(struct xfrmk_sadinfo *si); |
971 | extern void xfrm_spd_getinfo(struct xfrm_spdinfo *si); | 970 | extern void xfrm_spd_getinfo(struct xfrm_spdinfo *si); |
972 | extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq); | 971 | extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq); |
973 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); | 972 | extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index f3a61ebd8d65..9955ff4da0a2 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -421,7 +421,7 @@ restart: | |||
421 | } | 421 | } |
422 | EXPORT_SYMBOL(xfrm_state_flush); | 422 | EXPORT_SYMBOL(xfrm_state_flush); |
423 | 423 | ||
424 | void xfrm_sad_getinfo(struct xfrm_sadinfo *si) | 424 | void xfrm_sad_getinfo(struct xfrmk_sadinfo *si) |
425 | { | 425 | { |
426 | spin_lock_bh(&xfrm_state_lock); | 426 | spin_lock_bh(&xfrm_state_lock); |
427 | si->sadcnt = xfrm_state_num; | 427 | si->sadcnt = xfrm_state_num; |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 4210d91624cd..c35b9ea3b62b 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -749,7 +749,8 @@ static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
749 | 749 | ||
750 | static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) | 750 | static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) |
751 | { | 751 | { |
752 | struct xfrm_sadinfo si; | 752 | struct xfrmk_sadinfo si; |
753 | struct xfrmu_sadhinfo sh; | ||
753 | struct nlmsghdr *nlh; | 754 | struct nlmsghdr *nlh; |
754 | u32 *f; | 755 | u32 *f; |
755 | 756 | ||
@@ -761,12 +762,11 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) | |||
761 | *f = flags; | 762 | *f = flags; |
762 | xfrm_sad_getinfo(&si); | 763 | xfrm_sad_getinfo(&si); |
763 | 764 | ||
764 | if (flags & XFRM_SAD_HMASK) | 765 | sh.sadhmcnt = si.sadhmcnt; |
765 | NLA_PUT_U32(skb, XFRMA_SADHMASK, si.sadhcnt); | 766 | sh.sadhcnt = si.sadhcnt; |
766 | if (flags & XFRM_SAD_HMAX) | 767 | |
767 | NLA_PUT_U32(skb, XFRMA_SADHMAX, si.sadhmcnt); | 768 | NLA_PUT_U32(skb, XFRMA_SAD_CNT, si.sadcnt); |
768 | if (flags & XFRM_SAD_CNT) | 769 | NLA_PUT(skb, XFRMA_SAD_HINFO, sizeof(sh), &sh); |
769 | NLA_PUT_U32(skb, XFRMA_SADCNT, si.sadcnt); | ||
770 | 770 | ||
771 | return nlmsg_end(skb, nlh); | 771 | return nlmsg_end(skb, nlh); |
772 | 772 | ||
@@ -784,12 +784,8 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
784 | u32 seq = nlh->nlmsg_seq; | 784 | u32 seq = nlh->nlmsg_seq; |
785 | int len = NLMSG_LENGTH(sizeof(u32)); | 785 | int len = NLMSG_LENGTH(sizeof(u32)); |
786 | 786 | ||
787 | if (*flags & XFRM_SAD_HMASK) | 787 | len += RTA_SPACE(sizeof(struct xfrmu_sadhinfo)); |
788 | len += RTA_SPACE(sizeof(u32)); | 788 | len += RTA_SPACE(sizeof(u32)); |
789 | if (*flags & XFRM_SAD_HMAX) | ||
790 | len += RTA_SPACE(sizeof(u32)); | ||
791 | if (*flags & XFRM_SAD_CNT) | ||
792 | len += RTA_SPACE(sizeof(u32)); | ||
793 | 789 | ||
794 | r_skb = alloc_skb(len, GFP_ATOMIC); | 790 | r_skb = alloc_skb(len, GFP_ATOMIC); |
795 | 791 | ||