@@ -1961,24 +1961,60 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb,
1961
1961
return skb ;
1962
1962
}
1963
1963
1964
+ static int xfrm_notify_userpolicy (struct net * net )
1965
+ {
1966
+ struct xfrm_userpolicy_default * up ;
1967
+ int len = NLMSG_ALIGN (sizeof (* up ));
1968
+ struct nlmsghdr * nlh ;
1969
+ struct sk_buff * skb ;
1970
+
1971
+ skb = nlmsg_new (len , GFP_ATOMIC );
1972
+ if (skb == NULL )
1973
+ return - ENOMEM ;
1974
+
1975
+ nlh = nlmsg_put (skb , 0 , 0 , XFRM_MSG_GETDEFAULT , sizeof (* up ), 0 );
1976
+ if (nlh == NULL ) {
1977
+ kfree_skb (skb );
1978
+ return - EMSGSIZE ;
1979
+ }
1980
+
1981
+ up = nlmsg_data (nlh );
1982
+ up -> in = net -> xfrm .policy_default & XFRM_POL_DEFAULT_IN ?
1983
+ XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT ;
1984
+ up -> fwd = net -> xfrm .policy_default & XFRM_POL_DEFAULT_FWD ?
1985
+ XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT ;
1986
+ up -> out = net -> xfrm .policy_default & XFRM_POL_DEFAULT_OUT ?
1987
+ XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT ;
1988
+
1989
+ nlmsg_end (skb , nlh );
1990
+
1991
+ return xfrm_nlmsg_multicast (net , skb , 0 , XFRMNLGRP_POLICY );
1992
+ }
1993
+
1964
1994
static int xfrm_set_default (struct sk_buff * skb , struct nlmsghdr * nlh ,
1965
1995
struct nlattr * * attrs )
1966
1996
{
1967
1997
struct net * net = sock_net (skb -> sk );
1968
1998
struct xfrm_userpolicy_default * up = nlmsg_data (nlh );
1969
- u8 dirmask ;
1970
- u8 old_default = net -> xfrm .policy_default ;
1971
1999
1972
- if (up -> dirmask >= XFRM_USERPOLICY_DIRMASK_MAX )
1973
- return - EINVAL ;
2000
+ if (up -> in == XFRM_USERPOLICY_BLOCK )
2001
+ net -> xfrm .policy_default |= XFRM_POL_DEFAULT_IN ;
2002
+ else if (up -> in == XFRM_USERPOLICY_ACCEPT )
2003
+ net -> xfrm .policy_default &= ~XFRM_POL_DEFAULT_IN ;
1974
2004
1975
- dirmask = (1 << up -> dirmask ) & XFRM_POL_DEFAULT_MASK ;
2005
+ if (up -> fwd == XFRM_USERPOLICY_BLOCK )
2006
+ net -> xfrm .policy_default |= XFRM_POL_DEFAULT_FWD ;
2007
+ else if (up -> fwd == XFRM_USERPOLICY_ACCEPT )
2008
+ net -> xfrm .policy_default &= ~XFRM_POL_DEFAULT_FWD ;
1976
2009
1977
- net -> xfrm .policy_default = (old_default & (0xff ^ dirmask ))
1978
- | (up -> action << up -> dirmask );
2010
+ if (up -> out == XFRM_USERPOLICY_BLOCK )
2011
+ net -> xfrm .policy_default |= XFRM_POL_DEFAULT_OUT ;
2012
+ else if (up -> out == XFRM_USERPOLICY_ACCEPT )
2013
+ net -> xfrm .policy_default &= ~XFRM_POL_DEFAULT_OUT ;
1979
2014
1980
2015
rt_genid_bump_all (net );
1981
2016
2017
+ xfrm_notify_userpolicy (net );
1982
2018
return 0 ;
1983
2019
}
1984
2020
@@ -1988,13 +2024,11 @@ static int xfrm_get_default(struct sk_buff *skb, struct nlmsghdr *nlh,
1988
2024
struct sk_buff * r_skb ;
1989
2025
struct nlmsghdr * r_nlh ;
1990
2026
struct net * net = sock_net (skb -> sk );
1991
- struct xfrm_userpolicy_default * r_up , * up ;
2027
+ struct xfrm_userpolicy_default * r_up ;
1992
2028
int len = NLMSG_ALIGN (sizeof (struct xfrm_userpolicy_default ));
1993
2029
u32 portid = NETLINK_CB (skb ).portid ;
1994
2030
u32 seq = nlh -> nlmsg_seq ;
1995
2031
1996
- up = nlmsg_data (nlh );
1997
-
1998
2032
r_skb = nlmsg_new (len , GFP_ATOMIC );
1999
2033
if (!r_skb )
2000
2034
return - ENOMEM ;
@@ -2005,15 +2039,14 @@ static int xfrm_get_default(struct sk_buff *skb, struct nlmsghdr *nlh,
2005
2039
return - EMSGSIZE ;
2006
2040
}
2007
2041
2008
- if (up -> dirmask >= XFRM_USERPOLICY_DIRMASK_MAX ) {
2009
- kfree_skb (r_skb );
2010
- return - EINVAL ;
2011
- }
2012
-
2013
2042
r_up = nlmsg_data (r_nlh );
2014
2043
2015
- r_up -> action = ((net -> xfrm .policy_default & (1 << up -> dirmask )) >> up -> dirmask );
2016
- r_up -> dirmask = up -> dirmask ;
2044
+ r_up -> in = net -> xfrm .policy_default & XFRM_POL_DEFAULT_IN ?
2045
+ XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT ;
2046
+ r_up -> fwd = net -> xfrm .policy_default & XFRM_POL_DEFAULT_FWD ?
2047
+ XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT ;
2048
+ r_up -> out = net -> xfrm .policy_default & XFRM_POL_DEFAULT_OUT ?
2049
+ XFRM_USERPOLICY_BLOCK : XFRM_USERPOLICY_ACCEPT ;
2017
2050
nlmsg_end (r_skb , r_nlh );
2018
2051
2019
2052
return nlmsg_unicast (net -> xfrm .nlsk , r_skb , portid );
0 commit comments