@@ -1557,15 +1557,17 @@ static inline int ipv6_saddr_preferred(int type)
15571557 return 0 ;
15581558}
15591559
1560- static bool ipv6_use_optimistic_addr (struct net * net ,
1561- struct inet6_dev * idev )
1560+ static bool ipv6_use_optimistic_addr (const struct net * net ,
1561+ const struct inet6_dev * idev )
15621562{
15631563#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
15641564 if (!idev )
15651565 return false;
1566- if (!net -> ipv6 .devconf_all -> optimistic_dad && !idev -> cnf .optimistic_dad )
1566+ if (!READ_ONCE (net -> ipv6 .devconf_all -> optimistic_dad ) &&
1567+ !READ_ONCE (idev -> cnf .optimistic_dad ))
15671568 return false;
1568- if (!net -> ipv6 .devconf_all -> use_optimistic && !idev -> cnf .use_optimistic )
1569+ if (!READ_ONCE (net -> ipv6 .devconf_all -> use_optimistic ) &&
1570+ !READ_ONCE (idev -> cnf .use_optimistic ))
15691571 return false;
15701572
15711573 return true;
@@ -1574,13 +1576,14 @@ static bool ipv6_use_optimistic_addr(struct net *net,
15741576#endif
15751577}
15761578
1577- static bool ipv6_allow_optimistic_dad (struct net * net ,
1578- struct inet6_dev * idev )
1579+ static bool ipv6_allow_optimistic_dad (const struct net * net ,
1580+ const struct inet6_dev * idev )
15791581{
15801582#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
15811583 if (!idev )
15821584 return false;
1583- if (!net -> ipv6 .devconf_all -> optimistic_dad && !idev -> cnf .optimistic_dad )
1585+ if (!READ_ONCE (net -> ipv6 .devconf_all -> optimistic_dad ) &&
1586+ !READ_ONCE (idev -> cnf .optimistic_dad ))
15841587 return false;
15851588
15861589 return true;
@@ -1862,7 +1865,7 @@ int ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev,
18621865 idev = __in6_dev_get (dst_dev );
18631866 if ((dst_type & IPV6_ADDR_MULTICAST ) ||
18641867 dst .scope <= IPV6_ADDR_SCOPE_LINKLOCAL ||
1865- (idev && idev -> cnf .use_oif_addrs_only )) {
1868+ (idev && READ_ONCE ( idev -> cnf .use_oif_addrs_only ) )) {
18661869 use_oif_addr = true;
18671870 }
18681871 }
@@ -2683,8 +2686,8 @@ int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
26832686 };
26842687
26852688#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
2686- if ((net -> ipv6 .devconf_all -> optimistic_dad ||
2687- in6_dev -> cnf .optimistic_dad ) &&
2689+ if ((READ_ONCE ( net -> ipv6 .devconf_all -> optimistic_dad ) ||
2690+ READ_ONCE ( in6_dev -> cnf .optimistic_dad ) ) &&
26882691 !net -> ipv6 .devconf_all -> forwarding && sllao )
26892692 cfg .ifa_flags |= IFA_F_OPTIMISTIC ;
26902693#endif
@@ -2733,7 +2736,7 @@ int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
27332736 */
27342737 update_lft = !create && stored_lft ;
27352738
2736- if (update_lft && !in6_dev -> cnf .ra_honor_pio_life ) {
2739+ if (update_lft && !READ_ONCE ( in6_dev -> cnf .ra_honor_pio_life ) ) {
27372740 const u32 minimum_lft = min_t (u32 ,
27382741 stored_lft , MIN_VALID_LIFETIME );
27392742 valid_lft = max (valid_lft , minimum_lft );
@@ -3317,8 +3320,8 @@ void addrconf_add_linklocal(struct inet6_dev *idev,
33173320 struct inet6_ifaddr * ifp ;
33183321
33193322#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
3320- if ((dev_net (idev -> dev )-> ipv6 .devconf_all -> optimistic_dad ||
3321- idev -> cnf .optimistic_dad ) &&
3323+ if ((READ_ONCE ( dev_net (idev -> dev )-> ipv6 .devconf_all -> optimistic_dad ) ||
3324+ READ_ONCE ( idev -> cnf .optimistic_dad ) ) &&
33223325 !dev_net (idev -> dev )-> ipv6 .devconf_all -> forwarding )
33233326 cfg .ifa_flags |= IFA_F_OPTIMISTIC ;
33243327#endif
@@ -3890,10 +3893,10 @@ static int addrconf_ifdown(struct net_device *dev, bool unregister)
38903893 */
38913894 if (!unregister && !idev -> cnf .disable_ipv6 ) {
38923895 /* aggregate the system setting and interface setting */
3893- int _keep_addr = net -> ipv6 .devconf_all -> keep_addr_on_down ;
3896+ int _keep_addr = READ_ONCE ( net -> ipv6 .devconf_all -> keep_addr_on_down ) ;
38943897
38953898 if (!_keep_addr )
3896- _keep_addr = idev -> cnf .keep_addr_on_down ;
3899+ _keep_addr = READ_ONCE ( idev -> cnf .keep_addr_on_down ) ;
38973900
38983901 keep_addr = (_keep_addr > 0 );
38993902 }
@@ -4119,8 +4122,8 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
41194122
41204123 net = dev_net (dev );
41214124 if (dev -> flags & (IFF_NOARP |IFF_LOOPBACK ) ||
4122- (net -> ipv6 .devconf_all -> accept_dad < 1 &&
4123- idev -> cnf .accept_dad < 1 ) ||
4125+ (READ_ONCE ( net -> ipv6 .devconf_all -> accept_dad ) < 1 &&
4126+ READ_ONCE ( idev -> cnf .accept_dad ) < 1 ) ||
41244127 !(ifp -> flags & IFA_F_TENTATIVE ) ||
41254128 ifp -> flags & IFA_F_NODAD ) {
41264129 bool send_na = false;
@@ -4212,8 +4215,8 @@ static void addrconf_dad_work(struct work_struct *w)
42124215 action = DAD_ABORT ;
42134216 ifp -> state = INET6_IFADDR_STATE_POSTDAD ;
42144217
4215- if ((dev_net (idev -> dev )-> ipv6 .devconf_all -> accept_dad > 1 ||
4216- idev -> cnf .accept_dad > 1 ) &&
4218+ if ((READ_ONCE ( dev_net (idev -> dev )-> ipv6 .devconf_all -> accept_dad ) > 1 ||
4219+ READ_ONCE ( idev -> cnf .accept_dad ) > 1 ) &&
42174220 !idev -> cnf .disable_ipv6 &&
42184221 !(ifp -> flags & IFA_F_STABLE_PRIVACY )) {
42194222 struct in6_addr addr ;
@@ -4352,8 +4355,8 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id,
43524355
43534356 /* send unsolicited NA if enabled */
43544357 if (send_na &&
4355- (ifp -> idev -> cnf .ndisc_notify ||
4356- dev_net (dev )-> ipv6 .devconf_all -> ndisc_notify )) {
4358+ (READ_ONCE ( ifp -> idev -> cnf .ndisc_notify ) ||
4359+ READ_ONCE ( dev_net (dev )-> ipv6 .devconf_all -> ndisc_notify ) )) {
43574360 ndisc_send_na (dev , & in6addr_linklocal_allnodes , & ifp -> addr ,
43584361 /*router=*/ !!ifp -> idev -> cnf .forwarding ,
43594362 /*solicited=*/ false, /*override=*/ true,
@@ -6541,7 +6544,7 @@ static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write,
65416544 } else if (& net -> ipv6 .devconf_all -> addr_gen_mode == ctl -> data ) {
65426545 struct net_device * dev ;
65436546
6544- net -> ipv6 .devconf_dflt -> addr_gen_mode = new_val ;
6547+ WRITE_ONCE ( net -> ipv6 .devconf_dflt -> addr_gen_mode , new_val ) ;
65456548 for_each_netdev (net , dev ) {
65466549 idev = __in6_dev_get (dev );
65476550 if (idev &&
@@ -6553,7 +6556,7 @@ static int addrconf_sysctl_addr_gen_mode(struct ctl_table *ctl, int write,
65536556 }
65546557 }
65556558
6556- * ((u32 * )ctl -> data ) = new_val ;
6559+ WRITE_ONCE ( * ((u32 * )ctl -> data ), new_val ) ;
65576560 }
65586561
65596562out :
0 commit comments