Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af11e316 authored by Jamal Hadi Salim's avatar Jamal Hadi Salim Committed by David S. Miller
Browse files

[XFRM] SAD info TLV aggregationx



Aggregate the SAD info TLVs.

Signed-off-by: default avatarJamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 224711df
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -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,
+8 −9
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;
+9 −13
Original line number Diff line number Diff line
@@ -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,11 +784,7 @@ 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(struct xfrmu_sadhinfo));
	len += RTA_SPACE(sizeof(u32));

	r_skb = alloc_skb(len, GFP_ATOMIC);