提交 af11e316 编写于 作者: J Jamal Hadi Salim 提交者: David S. Miller

[XFRM] SAD info TLV aggregationx

Aggregate the SAD info TLVs.
Signed-off-by: NJamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: NPatrick McHardy <kaber@trash.net>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 224711df
...@@ -243,17 +243,6 @@ enum xfrm_ae_ftype_t { ...@@ -243,17 +243,6 @@ enum xfrm_ae_ftype_t {
#define XFRM_AE_MAX (__XFRM_AE_MAX - 1) #define XFRM_AE_MAX (__XFRM_AE_MAX - 1)
}; };
/* SAD Table filter flags */
enum xfrm_sad_ftype_t {
XFRM_SAD_UNSPEC,
XFRM_SAD_HMASK=1,
XFRM_SAD_HMAX=2,
XFRM_SAD_CNT=4,
__XFRM_SAD_MAX
#define XFRM_SAD_MAX (__XFRM_SAD_MAX - 1)
};
struct xfrm_userpolicy_type { struct xfrm_userpolicy_type {
__u8 type; __u8 type;
__u16 reserved1; __u16 reserved1;
...@@ -287,14 +276,18 @@ enum xfrm_attr_type_t { ...@@ -287,14 +276,18 @@ enum xfrm_attr_type_t {
enum xfrm_sadattr_type_t { enum xfrm_sadattr_type_t {
XFRMA_SAD_UNSPEC, XFRMA_SAD_UNSPEC,
XFRMA_SADHMASK, XFRMA_SAD_CNT,
XFRMA_SADHMAX, XFRMA_SAD_HINFO,
XFRMA_SADCNT,
__XFRMA_SAD_MAX __XFRMA_SAD_MAX
#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1) #define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
}; };
struct xfrmu_sadhinfo {
__u32 sadhcnt; /* current hash bkts */
__u32 sadhmcnt; /* max allowed hash bkts */
};
/* SPD Table filter flags */ /* SPD Table filter flags */
enum xfrm_spd_ftype_t { enum xfrm_spd_ftype_t {
XFRM_SPD_UNSPEC, XFRM_SPD_UNSPEC,
......
...@@ -416,14 +416,6 @@ struct xfrm_audit ...@@ -416,14 +416,6 @@ struct xfrm_audit
u32 secid; u32 secid;
}; };
/* SAD metadata, add more later */
struct xfrm_sadinfo
{
u32 sadhcnt; /* current hash bkts */
u32 sadhmcnt; /* max allowed hash bkts */
u32 sadcnt; /* current running count */
};
struct xfrm_spdinfo struct xfrm_spdinfo
{ {
u32 incnt; u32 incnt;
...@@ -964,10 +956,17 @@ static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **s ...@@ -964,10 +956,17 @@ static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **s
return -ENOSYS; return -ENOSYS;
} }
#endif #endif
struct xfrmk_sadinfo {
u32 sadhcnt; /* current hash bkts */
u32 sadhmcnt; /* max allowed hash bkts */
u32 sadcnt; /* current running count */
};
extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq); extern struct xfrm_state *xfrm_find_acq_byseq(u32 seq);
extern int xfrm_state_delete(struct xfrm_state *x); extern int xfrm_state_delete(struct xfrm_state *x);
extern void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info); extern void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info);
extern void xfrm_sad_getinfo(struct xfrm_sadinfo *si); extern void xfrm_sad_getinfo(struct xfrmk_sadinfo *si);
extern void xfrm_spd_getinfo(struct xfrm_spdinfo *si); extern void xfrm_spd_getinfo(struct xfrm_spdinfo *si);
extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq); extern int xfrm_replay_check(struct xfrm_state *x, __be32 seq);
extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq); extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq);
......
...@@ -421,7 +421,7 @@ void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info) ...@@ -421,7 +421,7 @@ void xfrm_state_flush(u8 proto, struct xfrm_audit *audit_info)
} }
EXPORT_SYMBOL(xfrm_state_flush); EXPORT_SYMBOL(xfrm_state_flush);
void xfrm_sad_getinfo(struct xfrm_sadinfo *si) void xfrm_sad_getinfo(struct xfrmk_sadinfo *si)
{ {
spin_lock_bh(&xfrm_state_lock); spin_lock_bh(&xfrm_state_lock);
si->sadcnt = xfrm_state_num; si->sadcnt = xfrm_state_num;
......
...@@ -749,7 +749,8 @@ static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -749,7 +749,8 @@ static int xfrm_get_spdinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
{ {
struct xfrm_sadinfo si; struct xfrmk_sadinfo si;
struct xfrmu_sadhinfo sh;
struct nlmsghdr *nlh; struct nlmsghdr *nlh;
u32 *f; u32 *f;
...@@ -761,12 +762,11 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags) ...@@ -761,12 +762,11 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
*f = flags; *f = flags;
xfrm_sad_getinfo(&si); xfrm_sad_getinfo(&si);
if (flags & XFRM_SAD_HMASK) sh.sadhmcnt = si.sadhmcnt;
NLA_PUT_U32(skb, XFRMA_SADHMASK, si.sadhcnt); sh.sadhcnt = si.sadhcnt;
if (flags & XFRM_SAD_HMAX)
NLA_PUT_U32(skb, XFRMA_SADHMAX, si.sadhmcnt); NLA_PUT_U32(skb, XFRMA_SAD_CNT, si.sadcnt);
if (flags & XFRM_SAD_CNT) NLA_PUT(skb, XFRMA_SAD_HINFO, sizeof(sh), &sh);
NLA_PUT_U32(skb, XFRMA_SADCNT, si.sadcnt);
return nlmsg_end(skb, nlh); return nlmsg_end(skb, nlh);
...@@ -784,12 +784,8 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh, ...@@ -784,12 +784,8 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
u32 seq = nlh->nlmsg_seq; u32 seq = nlh->nlmsg_seq;
int len = NLMSG_LENGTH(sizeof(u32)); int len = NLMSG_LENGTH(sizeof(u32));
if (*flags & XFRM_SAD_HMASK) len += RTA_SPACE(sizeof(struct xfrmu_sadhinfo));
len += RTA_SPACE(sizeof(u32)); len += RTA_SPACE(sizeof(u32));
if (*flags & XFRM_SAD_HMAX)
len += RTA_SPACE(sizeof(u32));
if (*flags & XFRM_SAD_CNT)
len += RTA_SPACE(sizeof(u32));
r_skb = alloc_skb(len, GFP_ATOMIC); r_skb = alloc_skb(len, GFP_ATOMIC);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册