#include <linux/ctype.h>
#include <linux/dns_resolver.h>
#include <linux/sched.h>
+#include <linux/inet.h>
#include <keys/rxrpc-type.h>
#include "internal.h"
delimiter = ',';
} else {
+ if (strchr(vllist, ',') || !strchr(vllist, '.'))
+ delimiter = ',';
_vllist = vllist;
}
/* fill in the VL server list from the rest of the string */
do {
struct sockaddr_rxrpc *srx = &cell->vl_addrs[cell->vl_naddrs];
- unsigned a, b, c, d;
+ const char *end;
next = strchr(_vllist, delimiter);
if (next)
*next++ = 0;
- if (sscanf(_vllist, "%u.%u.%u.%u", &a, &b, &c, &d) != 4)
- goto bad_address;
-
- if (a > 255 || b > 255 || c > 255 || d > 255)
+ if (in4_pton(_vllist, -1, (u8 *)&srx->transport.sin6.sin6_addr.s6_addr32[3],
+ -1, &end)) {
+ srx->transport_len = sizeof(struct sockaddr_in6);
+ srx->transport.sin6.sin6_family = AF_INET6;
+ srx->transport.sin6.sin6_flowinfo = 0;
+ srx->transport.sin6.sin6_scope_id = 0;
+ srx->transport.sin6.sin6_addr.s6_addr32[0] = 0;
+ srx->transport.sin6.sin6_addr.s6_addr32[1] = 0;
+ srx->transport.sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
+ } else if (in6_pton(_vllist, -1, srx->transport.sin6.sin6_addr.s6_addr,
+ -1, &end)) {
+ srx->transport_len = sizeof(struct sockaddr_in6);
+ srx->transport.sin6.sin6_family = AF_INET6;
+ srx->transport.sin6.sin6_flowinfo = 0;
+ srx->transport.sin6.sin6_scope_id = 0;
+ } else {
goto bad_address;
-
- srx->transport_len = sizeof(struct sockaddr_in);
- srx->transport.sin.sin_family = AF_INET;
- srx->transport.sin.sin_addr.s_addr =
- htonl((a << 24) | (b << 16) | (c << 8) | d);
+ }
} while (cell->vl_naddrs++,
cell->vl_naddrs < AFS_CELL_MAX_ADDRS && (_vllist = next));
/* display one cell per line on subsequent lines */
sprintf(ipaddr, "%pISp", &server->addr.transport);
- seq_printf(m, "%3d %-15.15s %5d\n",
+ seq_printf(m, "%3d %-15s %5d\n",
atomic_read(&server->usage), ipaddr, server->fs_state);
return 0;
_enter("");
- ret = sock_create_kern(&init_net, AF_RXRPC, SOCK_DGRAM, PF_INET, &socket);
+ ret = sock_create_kern(&init_net, AF_RXRPC, SOCK_DGRAM, PF_INET6, &socket);
if (ret < 0)
goto error_1;
socket->sk->sk_allocation = GFP_NOFS;
/* bind the callback manager's address to make this a server socket */
+ memset(&srx, 0, sizeof(srx));
srx.srx_family = AF_RXRPC;
srx.srx_service = CM_SERVICE;
srx.transport_type = SOCK_DGRAM;
- srx.transport_len = sizeof(srx.transport.sin);
- srx.transport.sin.sin_family = AF_INET;
- srx.transport.sin.sin_port = htons(AFS_CM_PORT);
- memset(&srx.transport.sin.sin_addr, 0,
- sizeof(srx.transport.sin.sin_addr));
+ srx.transport_len = sizeof(srx.transport.sin6);
+ srx.transport.sin6.sin6_family = AF_INET6;
+ srx.transport.sin6.sin6_port = htons(AFS_CM_PORT);
ret = kernel_bind(socket, (struct sockaddr *) &srx, sizeof(srx));
if (ret < 0)
_enter("{%d,%pIS}", srx->transport.family, &srx->transport);
- if (srx->transport.family != AF_INET) {
- WARN(true, "AFS does not yes support non-IPv4 addresses\n");
- return NULL;
- }
-
read_lock(&net->servers_lock);
p = net->servers.rb_node;
entry->servers[loop].srx_family = AF_RXRPC;
entry->servers[loop].srx_service = FS_SERVICE;
entry->servers[loop].transport_type = SOCK_DGRAM;
- entry->servers[loop].transport_len = sizeof(entry->servers[loop].transport.sin);
- entry->servers[loop].transport.sin.sin_family = AF_INET;
- entry->servers[loop].transport.sin.sin_port = htons(AFS_FS_PORT);
- entry->servers[loop].transport.sin.sin_addr.s_addr = *bp++;
+ entry->servers[loop].transport_len = sizeof(entry->servers[loop].transport.sin6);
+ entry->servers[loop].transport.sin6.sin6_family = AF_INET6;
+ entry->servers[loop].transport.sin6.sin6_port = htons(AFS_FS_PORT);
+ entry->servers[loop].transport.sin6.sin6_flowinfo = 0;
+ entry->servers[loop].transport.sin6.sin6_scope_id = 0;
+ entry->servers[loop].transport.sin6.sin6_addr.s6_addr32[0] = 0;
+ entry->servers[loop].transport.sin6.sin6_addr.s6_addr32[1] = 0;
+ entry->servers[loop].transport.sin6.sin6_addr.s6_addr32[2] = htonl(0xffff);
+ entry->servers[loop].transport.sin6.sin6_addr.s6_addr32[3] = *bp++;
}
bp += 8; /* partition IDs */