.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
---|
1 | 2 | /* |
---|
2 | 3 | * inet6 interface/address list definitions |
---|
3 | 4 | * Linux INET6 implementation |
---|
4 | 5 | * |
---|
5 | 6 | * Authors: |
---|
6 | 7 | * Pedro Roque <roque@di.fc.ul.pt> |
---|
7 | | - * |
---|
8 | | - * |
---|
9 | | - * This program is free software; you can redistribute it and/or |
---|
10 | | - * modify it under the terms of the GNU General Public License |
---|
11 | | - * as published by the Free Software Foundation; either version |
---|
12 | | - * 2 of the License, or (at your option) any later version. |
---|
13 | 8 | */ |
---|
14 | 9 | |
---|
15 | 10 | #ifndef _NET_IF_INET6_H |
---|
.. | .. |
---|
69 | 64 | |
---|
70 | 65 | struct hlist_node addr_lst; |
---|
71 | 66 | struct list_head if_list; |
---|
| 67 | + /* |
---|
| 68 | + * Used to safely traverse idev->addr_list in process context |
---|
| 69 | + * if the idev->lock needed to protect idev->addr_list cannot be held. |
---|
| 70 | + * In that case, add the items to this list temporarily and iterate |
---|
| 71 | + * without holding idev->lock. |
---|
| 72 | + * See addrconf_ifdown and dev_forward_change. |
---|
| 73 | + */ |
---|
| 74 | + struct list_head if_list_aux; |
---|
72 | 75 | |
---|
73 | 76 | struct list_head tmp_list; |
---|
74 | 77 | struct inet6_ifaddr *ifpub; |
---|
.. | .. |
---|
83 | 86 | struct ip6_sf_socklist { |
---|
84 | 87 | unsigned int sl_max; |
---|
85 | 88 | unsigned int sl_count; |
---|
86 | | - struct in6_addr sl_addr[0]; |
---|
| 89 | + struct in6_addr sl_addr[]; |
---|
87 | 90 | }; |
---|
88 | 91 | |
---|
89 | 92 | #define IP6_SFLSIZE(count) (sizeof(struct ip6_sf_socklist) + \ |
---|
.. | .. |
---|
94 | 97 | struct ipv6_mc_socklist { |
---|
95 | 98 | struct in6_addr addr; |
---|
96 | 99 | int ifindex; |
---|
| 100 | + unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */ |
---|
97 | 101 | struct ipv6_mc_socklist __rcu *next; |
---|
98 | 102 | rwlock_t sflock; |
---|
99 | | - unsigned int sfmode; /* MCAST_{INCLUDE,EXCLUDE} */ |
---|
100 | 103 | struct ip6_sf_socklist *sflist; |
---|
101 | 104 | struct rcu_head rcu; |
---|
102 | 105 | }; |
---|
.. | .. |
---|
146 | 149 | struct in6_addr aca_addr; |
---|
147 | 150 | struct fib6_info *aca_rt; |
---|
148 | 151 | struct ifacaddr6 *aca_next; |
---|
| 152 | + struct hlist_node aca_addr_lst; |
---|
149 | 153 | int aca_users; |
---|
150 | 154 | refcount_t aca_refcnt; |
---|
151 | 155 | unsigned long aca_cstamp; |
---|
152 | 156 | unsigned long aca_tstamp; |
---|
| 157 | + struct rcu_head rcu; |
---|
153 | 158 | }; |
---|
154 | 159 | |
---|
155 | 160 | #define IFA_HOST IPV6_ADDR_LOOPBACK |
---|
.. | .. |
---|
193 | 198 | int dead; |
---|
194 | 199 | |
---|
195 | 200 | u32 desync_factor; |
---|
196 | | - u8 rndid[8]; |
---|
197 | 201 | struct list_head tempaddr_list; |
---|
198 | 202 | |
---|
199 | 203 | struct in6_addr token; |
---|