Commit 88d0adb5 authored by Nicolas Dichtel's avatar Nicolas Dichtel Committed by Steffen Klassert
Browse files

xfrm: notify default policy on update



This configuration knob is very sensible, it should be notified when
changing.

Fixes: 2d151d39 ("xfrm: Add possibility to set the default to block if we have no policy")
Signed-off-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent f8d858e6
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -1961,6 +1961,36 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb,
	return skb;
}

static int xfrm_notify_userpolicy(struct net *net)
{
	struct xfrm_userpolicy_default *up;
	int len = NLMSG_ALIGN(sizeof(*up));
	struct nlmsghdr *nlh;
	struct sk_buff *skb;

	skb = nlmsg_new(len, GFP_ATOMIC);
	if (skb == NULL)
		return -ENOMEM;

	nlh = nlmsg_put(skb, 0, 0, XFRM_MSG_GETDEFAULT, sizeof(*up), 0);
	if (nlh == NULL) {
		kfree_skb(skb);
		return -EMSGSIZE;
	}

	up = nlmsg_data(nlh);
	up->in = net->xfrm.policy_default & XFRM_POL_DEFAULT_IN ?
			XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT;
	up->fwd = net->xfrm.policy_default & XFRM_POL_DEFAULT_FWD ?
			XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT;
	up->out = net->xfrm.policy_default & XFRM_POL_DEFAULT_OUT ?
			XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT;

	nlmsg_end(skb, nlh);

	return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_POLICY);
}

static int xfrm_set_default(struct sk_buff *skb, struct nlmsghdr *nlh,
			    struct nlattr **attrs)
{
@@ -1984,6 +2014,7 @@ static int xfrm_set_default(struct sk_buff *skb, struct nlmsghdr *nlh,

	rt_genid_bump_all(net);

	xfrm_notify_userpolicy(net);
	return 0;
}