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

Commit 960fdfde authored by Florian Westphal's avatar Florian Westphal Committed by Steffen Klassert
Browse files

xfrm: input: constify xfrm_input_afinfo



Nothing writes to these structures (the module owner was not used).

While at it, size xfrm_input_afinfo[] by the highest existing xfrm family
(INET6), not AF_MAX.

Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 152bff37
Loading
Loading
Loading
Loading
+2 −3
Original line number Original line Diff line number Diff line
@@ -349,13 +349,12 @@ struct xfrm_state_afinfo *xfrm_state_afinfo_get_rcu(unsigned int family);


struct xfrm_input_afinfo {
struct xfrm_input_afinfo {
	unsigned int		family;
	unsigned int		family;
	struct module		*owner;
	int			(*callback)(struct sk_buff *skb, u8 protocol,
	int			(*callback)(struct sk_buff *skb, u8 protocol,
					    int err);
					    int err);
};
};


int xfrm_input_register_afinfo(struct xfrm_input_afinfo *afinfo);
int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo);
int xfrm_input_unregister_afinfo(struct xfrm_input_afinfo *afinfo);
int xfrm_input_unregister_afinfo(const struct xfrm_input_afinfo *afinfo);


void xfrm_state_delete_tunnel(struct xfrm_state *x);
void xfrm_state_delete_tunnel(struct xfrm_state *x);


+1 −2
Original line number Original line Diff line number Diff line
@@ -188,9 +188,8 @@ static const struct net_protocol ipcomp4_protocol = {
	.netns_ok	=	1,
	.netns_ok	=	1,
};
};


static struct xfrm_input_afinfo xfrm4_input_afinfo = {
static const struct xfrm_input_afinfo xfrm4_input_afinfo = {
	.family		=	AF_INET,
	.family		=	AF_INET,
	.owner		=	THIS_MODULE,
	.callback	=	xfrm4_rcv_cb,
	.callback	=	xfrm4_rcv_cb,
};
};


+1 −2
Original line number Original line Diff line number Diff line
@@ -162,9 +162,8 @@ static const struct inet6_protocol ipcomp6_protocol = {
	.flags		=	INET6_PROTO_NOPOLICY,
	.flags		=	INET6_PROTO_NOPOLICY,
};
};


static struct xfrm_input_afinfo xfrm6_input_afinfo = {
static const struct xfrm_input_afinfo xfrm6_input_afinfo = {
	.family		=	AF_INET6,
	.family		=	AF_INET6,
	.owner		=	THIS_MODULE,
	.callback	=	xfrm6_rcv_cb,
	.callback	=	xfrm6_rcv_cb,
};
};


+11 −20
Original line number Original line Diff line number Diff line
@@ -19,19 +19,18 @@
static struct kmem_cache *secpath_cachep __read_mostly;
static struct kmem_cache *secpath_cachep __read_mostly;


static DEFINE_SPINLOCK(xfrm_input_afinfo_lock);
static DEFINE_SPINLOCK(xfrm_input_afinfo_lock);
static struct xfrm_input_afinfo __rcu *xfrm_input_afinfo[NPROTO];
static struct xfrm_input_afinfo const __rcu *xfrm_input_afinfo[AF_INET6 + 1];


static struct gro_cells gro_cells;
static struct gro_cells gro_cells;
static struct net_device xfrm_napi_dev;
static struct net_device xfrm_napi_dev;


int xfrm_input_register_afinfo(struct xfrm_input_afinfo *afinfo)
int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo)
{
{
	int err = 0;
	int err = 0;


	if (unlikely(afinfo == NULL))
	if (WARN_ON(afinfo->family >= ARRAY_SIZE(xfrm_input_afinfo)))
		return -EINVAL;
	if (unlikely(afinfo->family >= NPROTO))
		return -EAFNOSUPPORT;
		return -EAFNOSUPPORT;

	spin_lock_bh(&xfrm_input_afinfo_lock);
	spin_lock_bh(&xfrm_input_afinfo_lock);
	if (unlikely(xfrm_input_afinfo[afinfo->family] != NULL))
	if (unlikely(xfrm_input_afinfo[afinfo->family] != NULL))
		err = -EEXIST;
		err = -EEXIST;
@@ -42,14 +41,10 @@ int xfrm_input_register_afinfo(struct xfrm_input_afinfo *afinfo)
}
}
EXPORT_SYMBOL(xfrm_input_register_afinfo);
EXPORT_SYMBOL(xfrm_input_register_afinfo);


int xfrm_input_unregister_afinfo(struct xfrm_input_afinfo *afinfo)
int xfrm_input_unregister_afinfo(const struct xfrm_input_afinfo *afinfo)
{
{
	int err = 0;
	int err = 0;


	if (unlikely(afinfo == NULL))
		return -EINVAL;
	if (unlikely(afinfo->family >= NPROTO))
		return -EAFNOSUPPORT;
	spin_lock_bh(&xfrm_input_afinfo_lock);
	spin_lock_bh(&xfrm_input_afinfo_lock);
	if (likely(xfrm_input_afinfo[afinfo->family] != NULL)) {
	if (likely(xfrm_input_afinfo[afinfo->family] != NULL)) {
		if (unlikely(xfrm_input_afinfo[afinfo->family] != afinfo))
		if (unlikely(xfrm_input_afinfo[afinfo->family] != afinfo))
@@ -63,12 +58,13 @@ int xfrm_input_unregister_afinfo(struct xfrm_input_afinfo *afinfo)
}
}
EXPORT_SYMBOL(xfrm_input_unregister_afinfo);
EXPORT_SYMBOL(xfrm_input_unregister_afinfo);


static struct xfrm_input_afinfo *xfrm_input_get_afinfo(unsigned int family)
static const struct xfrm_input_afinfo *xfrm_input_get_afinfo(unsigned int family)
{
{
	struct xfrm_input_afinfo *afinfo;
	const struct xfrm_input_afinfo *afinfo;


	if (unlikely(family >= NPROTO))
	if (WARN_ON_ONCE(family >= ARRAY_SIZE(xfrm_input_afinfo)))
		return NULL;
		return NULL;

	rcu_read_lock();
	rcu_read_lock();
	afinfo = rcu_dereference(xfrm_input_afinfo[family]);
	afinfo = rcu_dereference(xfrm_input_afinfo[family]);
	if (unlikely(!afinfo))
	if (unlikely(!afinfo))
@@ -76,22 +72,17 @@ static struct xfrm_input_afinfo *xfrm_input_get_afinfo(unsigned int family)
	return afinfo;
	return afinfo;
}
}


static void xfrm_input_put_afinfo(struct xfrm_input_afinfo *afinfo)
{
	rcu_read_unlock();
}

static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol,
static int xfrm_rcv_cb(struct sk_buff *skb, unsigned int family, u8 protocol,
		       int err)
		       int err)
{
{
	int ret;
	int ret;
	struct xfrm_input_afinfo *afinfo = xfrm_input_get_afinfo(family);
	const struct xfrm_input_afinfo *afinfo = xfrm_input_get_afinfo(family);


	if (!afinfo)
	if (!afinfo)
		return -EAFNOSUPPORT;
		return -EAFNOSUPPORT;


	ret = afinfo->callback(skb, protocol, err);
	ret = afinfo->callback(skb, protocol, err);
	xfrm_input_put_afinfo(afinfo);
	rcu_read_unlock();


	return ret;
	return ret;
}
}