[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>
This commit is contained in:
Родитель
224711df5c
Коммит
af11e31609
|
@ -243,17 +243,6 @@ enum xfrm_ae_ftype_t {
|
|||
#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 {
|
||||
__u8 type;
|
||||
__u16 reserved1;
|
||||
|
@ -287,14 +276,18 @@ enum xfrm_attr_type_t {
|
|||
|
||||
enum xfrm_sadattr_type_t {
|
||||
XFRMA_SAD_UNSPEC,
|
||||
XFRMA_SADHMASK,
|
||||
XFRMA_SADHMAX,
|
||||
XFRMA_SADCNT,
|
||||
XFRMA_SAD_CNT,
|
||||
XFRMA_SAD_HINFO,
|
||||
__XFRMA_SAD_MAX
|
||||
|
||||
#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 */
|
||||
enum xfrm_spd_ftype_t {
|
||||
XFRM_SPD_UNSPEC,
|
||||
|
|
|
@ -416,14 +416,6 @@ struct xfrm_audit
|
|||
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
|
||||
{
|
||||
u32 incnt;
|
||||
|
@ -964,10 +956,17 @@ static inline int xfrm_state_sort(struct xfrm_state **dst, struct xfrm_state **s
|
|||
return -ENOSYS;
|
||||
}
|
||||
#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 int xfrm_state_delete(struct xfrm_state *x);
|
||||
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 int xfrm_replay_check(struct xfrm_state *x, __be32 seq);
|
||||
extern void xfrm_replay_advance(struct xfrm_state *x, __be32 seq);
|
||||
|
|
|
@ -421,7 +421,7 @@ restart:
|
|||
}
|
||||
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);
|
||||
si->sadcnt = xfrm_state_num;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
struct xfrm_sadinfo si;
|
||||
struct xfrmk_sadinfo si;
|
||||
struct xfrmu_sadhinfo sh;
|
||||
struct nlmsghdr *nlh;
|
||||
u32 *f;
|
||||
|
||||
|
@ -761,12 +762,11 @@ static int build_sadinfo(struct sk_buff *skb, u32 pid, u32 seq, u32 flags)
|
|||
*f = flags;
|
||||
xfrm_sad_getinfo(&si);
|
||||
|
||||
if (flags & XFRM_SAD_HMASK)
|
||||
NLA_PUT_U32(skb, XFRMA_SADHMASK, si.sadhcnt);
|
||||
if (flags & XFRM_SAD_HMAX)
|
||||
NLA_PUT_U32(skb, XFRMA_SADHMAX, si.sadhmcnt);
|
||||
if (flags & XFRM_SAD_CNT)
|
||||
NLA_PUT_U32(skb, XFRMA_SADCNT, si.sadcnt);
|
||||
sh.sadhmcnt = si.sadhmcnt;
|
||||
sh.sadhcnt = si.sadhcnt;
|
||||
|
||||
NLA_PUT_U32(skb, XFRMA_SAD_CNT, si.sadcnt);
|
||||
NLA_PUT(skb, XFRMA_SAD_HINFO, sizeof(sh), &sh);
|
||||
|
||||
return nlmsg_end(skb, nlh);
|
||||
|
||||
|
@ -784,12 +784,8 @@ static int xfrm_get_sadinfo(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
u32 seq = nlh->nlmsg_seq;
|
||||
int len = NLMSG_LENGTH(sizeof(u32));
|
||||
|
||||
if (*flags & XFRM_SAD_HMASK)
|
||||
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));
|
||||
len += RTA_SPACE(sizeof(struct xfrmu_sadhinfo));
|
||||
len += RTA_SPACE(sizeof(u32));
|
||||
|
||||
r_skb = alloc_skb(len, GFP_ATOMIC);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче