aboutsummaryrefslogtreecommitdiffstats
path: root/fs/afs
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2018-10-04 04:32:28 -0400
committerDavid Howells <dhowells@redhat.com>2018-10-04 04:32:28 -0400
commit46894a13599a977ac35411b536fb3e0b2feefa95 (patch)
tree7900ce31700b2b9c23528fd844f65c10c6010bb6 /fs/afs
parent66be646bd9a7d50961afbf48c1d0df148e37d416 (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.c29
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 */
233void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port) 233void 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 */
273void afs_merge_fs_addr6(struct afs_addr_list *alist, __be32 *xdr, u16 port) 272void 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