diff options
author | David Howells <dhowells@redhat.com> | 2018-10-04 04:32:28 -0400 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2018-10-04 04:32:28 -0400 |
commit | 46894a13599a977ac35411b536fb3e0b2feefa95 (patch) | |
tree | 7900ce31700b2b9c23528fd844f65c10c6010bb6 /fs/afs | |
parent | 66be646bd9a7d50961afbf48c1d0df148e37d416 (diff) |
rxrpc: Use IPv4 addresses throught the IPv6
AF_RXRPC opens an IPv6 socket through which to send and receive network
packets, both IPv6 and IPv4. It currently turns AF_INET addresses into
AF_INET-as-AF_INET6 addresses based on an assumption that this was
necessary; on further inspection of the code, however, it turns out that
the IPv6 code just farms packets aimed at AF_INET addresses out to the IPv4
code.
Fix AF_RXRPC to use AF_INET addresses directly when given them.
Fixes: 7b674e390e51 ("rxrpc: Fix IPv6 support")
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs')
-rw-r--r-- | fs/afs/addr_list.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/fs/afs/addr_list.c b/fs/afs/addr_list.c index 89374de4785c..55a756c60746 100644 --- a/fs/afs/addr_list.c +++ b/fs/afs/addr_list.c | |||
@@ -232,7 +232,7 @@ struct afs_addr_list *afs_dns_query(struct afs_cell *cell, time64_t *_expiry) | |||
232 | */ | 232 | */ |
233 | void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port) | 233 | void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port) |
234 | { | 234 | { |
235 | struct sockaddr_in6 *p; | 235 | struct sockaddr_rxrpc *srx; |
236 | u32 addr = ntohl(xdr); | 236 | u32 addr = ntohl(xdr); |
237 | int i; | 237 | int i; |
238 | 238 | ||
@@ -240,9 +240,9 @@ void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port) | |||
240 | return; | 240 | return; |
241 | 241 | ||
242 | for (i = 0; i < alist->nr_ipv4; i++) { | 242 | for (i = 0; i < alist->nr_ipv4; i++) { |
243 | struct sockaddr_in6 *a = &alist->addrs[i].transport.sin6; | 243 | struct sockaddr_in *a = &alist->addrs[i].transport.sin; |
244 | u32 a_addr = ntohl(a->sin6_addr.s6_addr32[3]); | 244 | u32 a_addr = ntohl(a->sin_addr.s_addr); |
245 | u16 a_port = ntohs(a->sin6_port); | 245 | u16 a_port = ntohs(a->sin_port); |
246 | 246 | ||
247 | if (addr == a_addr && port == a_port) | 247 | if (addr == a_addr && port == a_port) |
248 | return; | 248 | return; |
@@ -257,12 +257,11 @@ void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port) | |||
257 | alist->addrs + i, | 257 | alist->addrs + i, |
258 | sizeof(alist->addrs[0]) * (alist->nr_addrs - i)); | 258 | sizeof(alist->addrs[0]) * (alist->nr_addrs - i)); |
259 | 259 | ||
260 | p = &alist->addrs[i].transport.sin6; | 260 | srx = &alist->addrs[i]; |
261 | p->sin6_port = htons(port); | 261 | srx->transport_len = sizeof(srx->transport.sin); |
262 | p->sin6_addr.s6_addr32[0] = 0; | 262 | srx->transport.sin.sin_family = AF_INET; |
263 | p->sin6_addr.s6_addr32[1] = 0; | 263 | srx->transport.sin.sin_port = htons(port); |
264 | p->sin6_addr.s6_addr32[2] = htonl(0xffff); | 264 | srx->transport.sin.sin_addr.s_addr = xdr; |
265 | p->sin6_addr.s6_addr32[3] = xdr; | ||
266 | alist->nr_ipv4++; | 265 | alist->nr_ipv4++; |
267 | alist->nr_addrs++; | 266 | alist->nr_addrs++; |
268 | } | 267 | } |
@@ -272,7 +271,7 @@ void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port) | |||
272 | */ | 271 | */ |
273 | void afs_merge_fs_addr6(struct afs_addr_list *alist, __be32 *xdr, u16 port) | 272 | void afs_merge_fs_addr6(struct afs_addr_list *alist, __be32 *xdr, u16 port) |
274 | { | 273 | { |
275 | struct sockaddr_in6 *p; | 274 | struct sockaddr_rxrpc *srx; |
276 | int i, diff; | 275 | int i, diff; |
277 | 276 | ||
278 | if (alist->nr_addrs >= alist->max_addrs) | 277 | if (alist->nr_addrs >= alist->max_addrs) |
@@ -296,9 +295,11 @@ void afs_merge_fs_addr6(struct afs_addr_list *alist, __be32 *xdr, u16 port) | |||
296 | alist->addrs + i, | 295 | alist->addrs + i, |
297 | sizeof(alist->addrs[0]) * (alist->nr_addrs - i)); | 296 | sizeof(alist->addrs[0]) * (alist->nr_addrs - i)); |
298 | 297 | ||
299 | p = &alist->addrs[i].transport.sin6; | 298 | srx = &alist->addrs[i]; |
300 | p->sin6_port = htons(port); | 299 | srx->transport_len = sizeof(srx->transport.sin6); |
301 | memcpy(&p->sin6_addr, xdr, 16); | 300 | srx->transport.sin6.sin6_family = AF_INET6; |
301 | srx->transport.sin6.sin6_port = htons(port); | ||
302 | memcpy(&srx->transport.sin6.sin6_addr, xdr, 16); | ||
302 | alist->nr_addrs++; | 303 | alist->nr_addrs++; |
303 | } | 304 | } |
304 | 305 | ||