@@ -3007,13 +3007,12 @@ static int ipv6_mc_config(struct sock *sk, bool join,
3007
3007
/*
3008
3008
* Manual configuration of address on an interface
3009
3009
*/
3010
- static int inet6_addr_add (struct net * net , int ifindex ,
3010
+ static int inet6_addr_add (struct net * net , struct net_device * dev ,
3011
3011
struct ifa6_config * cfg ,
3012
3012
struct netlink_ext_ack * extack )
3013
3013
{
3014
3014
struct inet6_ifaddr * ifp ;
3015
3015
struct inet6_dev * idev ;
3016
- struct net_device * dev ;
3017
3016
unsigned long timeout ;
3018
3017
clock_t expires ;
3019
3018
u32 flags ;
@@ -3036,10 +3035,6 @@ static int inet6_addr_add(struct net *net, int ifindex,
3036
3035
return - EINVAL ;
3037
3036
}
3038
3037
3039
- dev = __dev_get_by_index (net , ifindex );
3040
- if (!dev )
3041
- return - ENODEV ;
3042
-
3043
3038
idev = addrconf_add_dev (dev );
3044
3039
if (IS_ERR (idev )) {
3045
3040
NL_SET_ERR_MSG_MOD (extack , "IPv6 is disabled on this device" );
@@ -3048,7 +3043,7 @@ static int inet6_addr_add(struct net *net, int ifindex,
3048
3043
3049
3044
if (cfg -> ifa_flags & IFA_F_MCAUTOJOIN ) {
3050
3045
int ret = ipv6_mc_config (net -> ipv6 .mc_autojoin_sk ,
3051
- true, cfg -> pfx , ifindex );
3046
+ true, cfg -> pfx , dev -> ifindex );
3052
3047
3053
3048
if (ret < 0 ) {
3054
3049
NL_SET_ERR_MSG_MOD (extack , "Multicast auto join failed" );
@@ -3103,7 +3098,7 @@ static int inet6_addr_add(struct net *net, int ifindex,
3103
3098
return 0 ;
3104
3099
} else if (cfg -> ifa_flags & IFA_F_MCAUTOJOIN ) {
3105
3100
ipv6_mc_config (net -> ipv6 .mc_autojoin_sk , false,
3106
- cfg -> pfx , ifindex );
3101
+ cfg -> pfx , dev -> ifindex );
3107
3102
}
3108
3103
3109
3104
return PTR_ERR (ifp );
@@ -3169,6 +3164,7 @@ int addrconf_add_ifaddr(struct net *net, void __user *arg)
3169
3164
.preferred_lft = INFINITY_LIFE_TIME ,
3170
3165
.valid_lft = INFINITY_LIFE_TIME ,
3171
3166
};
3167
+ struct net_device * dev ;
3172
3168
struct in6_ifreq ireq ;
3173
3169
int err ;
3174
3170
@@ -3182,7 +3178,11 @@ int addrconf_add_ifaddr(struct net *net, void __user *arg)
3182
3178
cfg .plen = ireq .ifr6_prefixlen ;
3183
3179
3184
3180
rtnl_net_lock (net );
3185
- err = inet6_addr_add (net , ireq .ifr6_ifindex , & cfg , NULL );
3181
+ dev = __dev_get_by_index (net , ireq .ifr6_ifindex );
3182
+ if (dev )
3183
+ err = inet6_addr_add (net , dev , & cfg , NULL );
3184
+ else
3185
+ err = - ENODEV ;
3186
3186
rtnl_net_unlock (net );
3187
3187
return err ;
3188
3188
}
@@ -5064,7 +5064,7 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
5064
5064
* It would be best to check for !NLM_F_CREATE here but
5065
5065
* userspace already relies on not having to provide this.
5066
5066
*/
5067
- return inet6_addr_add (net , ifm -> ifa_index , & cfg , extack );
5067
+ return inet6_addr_add (net , dev , & cfg , extack );
5068
5068
}
5069
5069
5070
5070
if (nlh -> nlmsg_flags & NLM_F_EXCL ||
0 commit comments