Skip to content

Commit 08b457b

Browse files
committed
Basic support for IPv6 sockets
In enough of the APIs to support unfs3.
1 parent 29f7295 commit 08b457b

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

librpc/svc_tcp.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ svc_vc_create(sock, sendsize, recvsize)
194194
{
195195
register SVCXPRT *xprt;
196196
register struct tcp_rendezvous *r;
197-
struct sockaddr_in addr;
198-
int len = sizeof(struct sockaddr_in);
197+
struct sockaddr_storage addr;
198+
int len = sizeof(struct sockaddr_storage);
199199

200200
if ((getsockname(sock, (struct sockaddr *)&addr, &len) != 0) ||
201201
(listen(sock, 2) != 0)) {
@@ -226,7 +226,12 @@ svc_vc_create(sock, sendsize, recvsize)
226226
xprt->xp_p1 = (caddr_t)r;
227227
xprt->xp_verf = _null_auth;
228228
xprt->xp_ops = &svctcp_rendezvous_op;
229-
xprt->xp_port = ntohs(addr.sin_port);
229+
if (addr.ss_family == AF_INET)
230+
xprt->xp_port = ntohs(((struct sockaddr_in *)&addr)->sin_port);
231+
else if (addr.ss_family == AF_INET6)
232+
xprt->xp_port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port);
233+
else
234+
xprt->xp_port = 0;
230235
xprt->xp_fd = sock;
231236
xprt_register(xprt);
232237
return (xprt);
@@ -298,12 +303,12 @@ rendezvous_request(xprt)
298303
{
299304
int sock;
300305
struct tcp_rendezvous *r;
301-
struct sockaddr_in addr;
306+
struct sockaddr_storage addr;
302307
int len;
303308

304309
r = (struct tcp_rendezvous *)xprt->xp_p1;
305310
again:
306-
len = sizeof(struct sockaddr_in);
311+
len = sizeof(struct sockaddr_storage);
307312
if ((sock = accept(xprt->xp_fd, (struct sockaddr *)&addr,
308313
&len)) < 0) {
309314
#ifdef WIN32

librpc/svc_udp.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,8 @@ svc_dg_create(sock, sendsz, recvsz)
165165
{
166166
register SVCXPRT *xprt;
167167
register struct svcudp_data *su;
168-
struct sockaddr_in addr;
169-
int len = sizeof(struct sockaddr_in);
168+
struct sockaddr_storage addr;
169+
int len = sizeof(struct sockaddr_storage);
170170

171171
if (getsockname(sock, (struct sockaddr *)&addr, &len) != 0) {
172172
perror("svcudp_create - cannot getsockname");
@@ -211,7 +211,12 @@ svc_dg_create(sock, sendsz, recvsz)
211211
xprt->xp_ltaddr.buf = mem_alloc(xprt->xp_ltaddr.maxlen);
212212
getsockname(xprt->xp_fd, xprt->xp_ltaddr.buf, &xprt->xp_ltaddr.len);
213213
xprt->xp_ops = &svcudp_op;
214-
xprt->xp_port = ntohs(addr.sin_port);
214+
if (addr.ss_family == AF_INET)
215+
xprt->xp_port = ntohs(((struct sockaddr_in *)&addr)->sin_port);
216+
else if (addr.ss_family == AF_INET6)
217+
xprt->xp_port = ntohs(((struct sockaddr_in6 *)&addr)->sin6_port);
218+
else
219+
xprt->xp_port = 0;
215220
xprt->xp_fd = sock;
216221
xprt_register(xprt);
217222
return (xprt);
@@ -237,7 +242,7 @@ svcudp_recv(xprt, msg)
237242
u_long replylen;
238243

239244
again:
240-
xprt->xp_addrlen = sizeof(struct sockaddr_in);
245+
xprt->xp_addrlen = sizeof(struct sockaddr_storage);
241246
rlen = recvfrom(xprt->xp_fd, rpc_buffer(xprt), (int) su->su_iosz,
242247
0, (struct sockaddr *)&(xprt->xp_raddr), &(xprt->xp_addrlen));
243248
#ifdef WIN32
@@ -378,7 +383,7 @@ struct cache_node {
378383
u_long cache_proc;
379384
u_long cache_vers;
380385
u_long cache_prog;
381-
struct sockaddr_in cache_addr;
386+
struct sockaddr_storage cache_addr;
382387
/*
383388
* The cached reply and length
384389
*/
@@ -403,7 +408,7 @@ struct udp_cache {
403408
u_long uc_prog; /* saved program number */
404409
u_long uc_vers; /* saved version number */
405410
u_long uc_proc; /* saved procedure number */
406-
struct sockaddr_in uc_addr; /* saved caller's address */
411+
struct sockaddr_storage uc_addr; /* saved caller's address */
407412
};
408413

409414

rpc/rpc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#ifdef WIN32
5252
#include <stdlib.h>
5353
#include <winsock2.h>
54+
#include <ws2tcpip.h>
5455
#include <rpc/types.h> /* some typedefs */
5556
#include <process.h>
5657

rpc/svc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ typedef struct {
100100
void (*xp_destroy)(DOTS); /* destroy this struct */
101101
} *xp_ops;
102102
int xp_addrlen; /* length of remote address */
103-
struct sockaddr_in xp_raddr; /* remote address */
103+
struct sockaddr_storage xp_raddr; /* remote address */
104104
struct netbuf xp_ltaddr; /* local transport address */
105105
struct netbuf xp_rtaddr; /* remote transport address */
106106
struct opaque_auth xp_verf; /* raw response verifier */

0 commit comments

Comments
 (0)