@@ -4793,12 +4793,19 @@ static inline int inet6_ifaddr_msgsize(void)
4793
4793
+ nla_total_size (4 ) /* IFA_RT_PRIORITY */ ;
4794
4794
}
4795
4795
4796
+ enum addr_type_t {
4797
+ UNICAST_ADDR ,
4798
+ MULTICAST_ADDR ,
4799
+ ANYCAST_ADDR ,
4800
+ };
4801
+
4796
4802
struct inet6_fill_args {
4797
4803
u32 portid ;
4798
4804
u32 seq ;
4799
4805
int event ;
4800
4806
unsigned int flags ;
4801
4807
int netnsid ;
4808
+ enum addr_type_t type ;
4802
4809
};
4803
4810
4804
4811
static int inet6_fill_ifaddr (struct sk_buff * skb , struct inet6_ifaddr * ifa ,
@@ -4930,66 +4937,55 @@ static int inet6_fill_ifacaddr(struct sk_buff *skb, struct ifacaddr6 *ifaca,
4930
4937
return 0 ;
4931
4938
}
4932
4939
4933
- enum addr_type_t {
4934
- UNICAST_ADDR ,
4935
- MULTICAST_ADDR ,
4936
- ANYCAST_ADDR ,
4937
- };
4938
-
4939
4940
/* called with rcu_read_lock() */
4940
4941
static int in6_dump_addrs (struct inet6_dev * idev , struct sk_buff * skb ,
4941
- struct netlink_callback * cb , enum addr_type_t type ,
4942
- int s_ip_idx , int * p_ip_idx , int netnsid )
4942
+ struct netlink_callback * cb ,
4943
+ int s_ip_idx , int * p_ip_idx ,
4944
+ struct inet6_fill_args * fillargs )
4943
4945
{
4944
- struct inet6_fill_args fillargs = {
4945
- .portid = NETLINK_CB (cb -> skb ).portid ,
4946
- .seq = cb -> nlh -> nlmsg_seq ,
4947
- .flags = NLM_F_MULTI ,
4948
- .netnsid = netnsid ,
4949
- };
4950
4946
struct ifmcaddr6 * ifmca ;
4951
4947
struct ifacaddr6 * ifaca ;
4952
4948
int err = 1 ;
4953
4949
int ip_idx = * p_ip_idx ;
4954
4950
4955
4951
read_lock_bh (& idev -> lock );
4956
- switch (type ) {
4952
+ switch (fillargs -> type ) {
4957
4953
case UNICAST_ADDR : {
4958
4954
struct inet6_ifaddr * ifa ;
4959
- fillargs . event = RTM_NEWADDR ;
4955
+ fillargs -> event = RTM_NEWADDR ;
4960
4956
4961
4957
/* unicast address incl. temp addr */
4962
4958
list_for_each_entry (ifa , & idev -> addr_list , if_list ) {
4963
4959
if (++ ip_idx < s_ip_idx )
4964
4960
continue ;
4965
- err = inet6_fill_ifaddr (skb , ifa , & fillargs );
4961
+ err = inet6_fill_ifaddr (skb , ifa , fillargs );
4966
4962
if (err < 0 )
4967
4963
break ;
4968
4964
nl_dump_check_consistent (cb , nlmsg_hdr (skb ));
4969
4965
}
4970
4966
break ;
4971
4967
}
4972
4968
case MULTICAST_ADDR :
4973
- fillargs . event = RTM_GETMULTICAST ;
4969
+ fillargs -> event = RTM_GETMULTICAST ;
4974
4970
4975
4971
/* multicast address */
4976
4972
for (ifmca = idev -> mc_list ; ifmca ;
4977
4973
ifmca = ifmca -> next , ip_idx ++ ) {
4978
4974
if (ip_idx < s_ip_idx )
4979
4975
continue ;
4980
- err = inet6_fill_ifmcaddr (skb , ifmca , & fillargs );
4976
+ err = inet6_fill_ifmcaddr (skb , ifmca , fillargs );
4981
4977
if (err < 0 )
4982
4978
break ;
4983
4979
}
4984
4980
break ;
4985
4981
case ANYCAST_ADDR :
4986
- fillargs . event = RTM_GETANYCAST ;
4982
+ fillargs -> event = RTM_GETANYCAST ;
4987
4983
/* anycast address */
4988
4984
for (ifaca = idev -> ac_list ; ifaca ;
4989
4985
ifaca = ifaca -> aca_next , ip_idx ++ ) {
4990
4986
if (ip_idx < s_ip_idx )
4991
4987
continue ;
4992
- err = inet6_fill_ifacaddr (skb , ifaca , & fillargs );
4988
+ err = inet6_fill_ifacaddr (skb , ifaca , fillargs );
4993
4989
if (err < 0 )
4994
4990
break ;
4995
4991
}
@@ -5005,10 +5001,16 @@ static int in6_dump_addrs(struct inet6_dev *idev, struct sk_buff *skb,
5005
5001
static int inet6_dump_addr (struct sk_buff * skb , struct netlink_callback * cb ,
5006
5002
enum addr_type_t type )
5007
5003
{
5004
+ struct inet6_fill_args fillargs = {
5005
+ .portid = NETLINK_CB (cb -> skb ).portid ,
5006
+ .seq = cb -> nlh -> nlmsg_seq ,
5007
+ .flags = NLM_F_MULTI ,
5008
+ .netnsid = -1 ,
5009
+ .type = type ,
5010
+ };
5008
5011
struct net * net = sock_net (skb -> sk );
5009
5012
struct nlattr * tb [IFA_MAX + 1 ];
5010
5013
struct net * tgt_net = net ;
5011
- int netnsid = -1 ;
5012
5014
int h , s_h ;
5013
5015
int idx , ip_idx ;
5014
5016
int s_idx , s_ip_idx ;
@@ -5023,9 +5025,10 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
5023
5025
if (nlmsg_parse (cb -> nlh , sizeof (struct ifaddrmsg ), tb , IFA_MAX ,
5024
5026
ifa_ipv6_policy , cb -> extack ) >= 0 ) {
5025
5027
if (tb [IFA_TARGET_NETNSID ]) {
5026
- netnsid = nla_get_s32 (tb [IFA_TARGET_NETNSID ]);
5028
+ fillargs . netnsid = nla_get_s32 (tb [IFA_TARGET_NETNSID ]);
5027
5029
5028
- tgt_net = rtnl_get_net_ns_capable (skb -> sk , netnsid );
5030
+ tgt_net = rtnl_get_net_ns_capable (skb -> sk ,
5031
+ fillargs .netnsid );
5029
5032
if (IS_ERR (tgt_net ))
5030
5033
return PTR_ERR (tgt_net );
5031
5034
}
@@ -5046,8 +5049,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
5046
5049
if (!idev )
5047
5050
goto cont ;
5048
5051
5049
- if (in6_dump_addrs (idev , skb , cb , type ,
5050
- s_ip_idx , & ip_idx , netnsid ) < 0 )
5052
+ if (in6_dump_addrs (idev , skb , cb , s_ip_idx , & ip_idx ,
5053
+ & fillargs ) < 0 )
5051
5054
goto done ;
5052
5055
cont :
5053
5056
idx ++ ;
@@ -5058,7 +5061,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
5058
5061
cb -> args [0 ] = h ;
5059
5062
cb -> args [1 ] = idx ;
5060
5063
cb -> args [2 ] = ip_idx ;
5061
- if (netnsid >= 0 )
5064
+ if (fillargs . netnsid >= 0 )
5062
5065
put_net (tgt_net );
5063
5066
5064
5067
return skb -> len ;
0 commit comments