1 /* 2 * linux/net/sunrpc/xprtsock.c 3 * 4 * Client-side transport implementation for sockets. 5 * 6 * TCP callback races fixes (C) 1998 Red Hat Software <alan@redhat.com> 7 * TCP send fixes (C) 1998 Red Hat Software <alan@redhat.com> 8 * TCP NFS related read + write fixes 9 * (C) 1999 Dave Airlie, University of Limerick, Ireland <airlied@linux.ie> 10 * 11 * Rewrite of larges part of the code in order to stabilize TCP stuff. 12 * Fix behaviour when socket buffer is full. 13 * (C) 1999 Trond Myklebust <trond.myklebust@fys.uio.no> 14 * 15 * IP socket transport implementation, (C) 2005 Chuck Lever <cel@netapp.com> 16 * 17 * IPv6 support contributed by Gilles Quillard, Bull Open Source, 2005. 18 * <gilles.quillard@bull.net> 19 */ 20 21 #include <linux/types.h> 22 #include <linux/slab.h> 23 #include <linux/module.h> 24 #include <linux/capability.h> 25 #include <linux/pagemap.h> 26 #include <linux/errno.h> 27 #include <linux/socket.h> 28 #include <linux/in.h> 29 #include <linux/net.h> 30 #include <linux/mm.h> 31 #include <linux/udp.h> 32 #include <linux/tcp.h> 33 #include <linux/sunrpc/clnt.h> 34 #include <linux/sunrpc/sched.h> 35 #include <linux/sunrpc/xprtsock.h> 36 #include <linux/file.h> 37 38 #include <net/sock.h> 39 #include <net/checksum.h> 40 #include <net/udp.h> 41 #include <net/tcp.h> 42 43 /* 44 * xprtsock tunables 45 */ 46 unsigned int xprt_udp_slot_table_entries = RPC_DEF_SLOT_TABLE; 47 unsigned int xprt_tcp_slot_table_entries = RPC_DEF_SLOT_TABLE; 48 49 unsigned int xprt_min_resvport = RPC_DEF_MIN_RESVPORT; 50 unsigned int xprt_max_resvport = RPC_DEF_MAX_RESVPORT; 51 52 /* 53 * We can register our own files under /proc/sys/sunrpc by 54 * calling register_sysctl_table() again. The files in that 55 * directory become the union of all files registered there. 56 * 57 * We simply need to make sure that we don't collide with 58 * someone else's file names! 59 */ 60 61 #ifdef RPC_DEBUG 62 63 static unsigned int min_slot_table_size = RPC_MIN_SLOT_TABLE; 64 static unsigned int max_slot_table_size = RPC_MAX_SLOT_TABLE; 65 static unsigned int xprt_min_resvport_limit = RPC_MIN_RESVPORT; 66 static unsigned int xprt_max_resvport_limit = RPC_MAX_RESVPORT; 67 68 static struct ctl_table_header *sunrpc_table_header; 69 70 /* 71 * FIXME: changing the UDP slot table size should also resize the UDP 72 * socket buffers for existing UDP transports 73 */ 74 static ctl_table xs_tunables_table[] = { 75 { 76 .ctl_name = CTL_SLOTTABLE_UDP, 77 .procname = "udp_slot_table_entries", 78 .data = &xprt_udp_slot_table_entries, 79 .maxlen = sizeof(unsigned int), 80 .mode = 0644, 81 .proc_handler = &proc_dointvec_minmax, 82 .strategy = &sysctl_intvec, 83 .extra1 = &min_slot_table_size, 84 .extra2 = &max_slot_table_size 85 }, 86 { 87 .ctl_name = CTL_SLOTTABLE_TCP, 88 .procname = "tcp_slot_table_entries", 89 .data = &xprt_tcp_slot_table_entries, 90 .maxlen = sizeof(unsigned int), 91 .mode = 0644, 92 .proc_handler = &proc_dointvec_minmax, 93 .strategy = &sysctl_intvec, 94 .extra1 = &min_slot_table_size, 95 .extra2 = &max_slot_table_size 96 }, 97 { 98 .ctl_name = CTL_MIN_RESVPORT, 99 .procname = "min_resvport", 100 .data = &xprt_min_resvport, 101 .maxlen = sizeof(unsigned int), 102 .mode = 0644, 103 .proc_handler = &proc_dointvec_minmax, 104 .strategy = &sysctl_intvec, 105 .extra1 = &xprt_min_resvport_limit, 106 .extra2 = &xprt_max_resvport_limit 107 }, 108 { 109 .ctl_name = CTL_MAX_RESVPORT, 110 .procname = "max_resvport", 111 .data = &xprt_max_resvport, 112 .maxlen = sizeof(unsigned int), 113 .mode = 0644, 114 .proc_handler = &proc_dointvec_minmax, 115 .strategy = &sysctl_intvec, 116 .extra1 = &xprt_min_resvport_limit, 117 .extra2 = &xprt_max_resvport_limit 118 }, 119 { 120 .ctl_name = 0, 121 }, 122 }; 123 124 static ctl_table sunrpc_table[] = { 125 { 126 .ctl_name = CTL_SUNRPC, 127 .procname = "sunrpc", 128 .mode = 0555, 129 .child = xs_tunables_table 130 }, 131 { 132 .ctl_name = 0, 133 }, 134 }; 135 136 #endif 137 138 /* 139 * How many times to try sending a request on a socket before waiting 140 * for the socket buffer to clear. 141 */ 142 #define XS_SENDMSG_RETRY (10U) 143 144 /* 145 * Time out for an RPC UDP socket connect. UDP socket connects are 146 * synchronous, but we set a timeout anyway in case of resource 147 * exhaustion on the local host. 148 */ 149 #define XS_UDP_CONN_TO (5U * HZ) 150 151 /* 152 * Wait duration for an RPC TCP connection to be established. Solaris 153 * NFS over TCP uses 60 seconds, for example, which is in line with how 154 * long a server takes to reboot. 155 */ 156 #define XS_TCP_CONN_TO (60U * HZ) 157 158 /* 159 * Wait duration for a reply from the RPC portmapper. 160 */ 161 #define XS_BIND_TO (60U * HZ) 162 163 /* 164 * Delay if a UDP socket connect error occurs. This is most likely some 165 * kind of resource problem on the local host. 166 */ 167 #define XS_UDP_REEST_TO (2U * HZ) 168 169 /* 170 * The reestablish timeout allows clients to delay for a bit before attempting 171 * to reconnect to a server that just dropped our connection. 172 * 173 * We implement an exponential backoff when trying to reestablish a TCP 174 * transport connection with the server. Some servers like to drop a TCP 175 * connection when they are overworked, so we start with a short timeout and 176 * increase over time if the server is down or not responding. 177 */ 178 #define XS_TCP_INIT_REEST_TO (3U * HZ) 179 #define XS_TCP_MAX_REEST_TO (5U * 60 * HZ) 180 181 /* 182 * TCP idle timeout; client drops the transport socket if it is idle 183 * for this long. Note that we also timeout UDP sockets to prevent 184 * holding port numbers when there is no RPC traffic. 185 */ 186 #define XS_IDLE_DISC_TO (5U * 60 * HZ) 187 188 #ifdef RPC_DEBUG 189 # undef RPC_DEBUG_DATA 190 # define RPCDBG_FACILITY RPCDBG_TRANS 191 #endif 192 193 #ifdef RPC_DEBUG_DATA 194 static void xs_pktdump(char *msg, u32 *packet, unsigned int count) 195 { 196 u8 *buf = (u8 *) packet; 197 int j; 198 199 dprintk("RPC: %s\n", msg); 200 for (j = 0; j < count && j < 128; j += 4) { 201 if (!(j & 31)) { 202 if (j) 203 dprintk("\n"); 204 dprintk("0x%04x ", j); 205 } 206 dprintk("%02x%02x%02x%02x ", 207 buf[j], buf[j+1], buf[j+2], buf[j+3]); 208 } 209 dprintk("\n"); 210 } 211 #else 212 static inline void xs_pktdump(char *msg, u32 *packet, unsigned int count) 213 { 214 /* NOP */ 215 } 216 #endif 217 218 struct sock_xprt { 219 struct rpc_xprt xprt; 220 221 /* 222 * Network layer 223 */ 224 struct socket * sock; 225 struct sock * inet; 226 227 /* 228 * State of TCP reply receive 229 */ 230 __be32 tcp_fraghdr, 231 tcp_xid; 232 233 u32 tcp_offset, 234 tcp_reclen; 235 236 unsigned long tcp_copied, 237 tcp_flags; 238 239 /* 240 * Connection of transports 241 */ 242 struct delayed_work connect_worker; 243 struct sockaddr_storage addr; 244 unsigned short port; 245 246 /* 247 * UDP socket buffer size parameters 248 */ 249 size_t rcvsize, 250 sndsize; 251 252 /* 253 * Saved socket callback addresses 254 */ 255 void (*old_data_ready)(struct sock *, int); 256 void (*old_state_change)(struct sock *); 257 void (*old_write_space)(struct sock *); 258 }; 259 260 /* 261 * TCP receive state flags 262 */ 263 #define TCP_RCV_LAST_FRAG (1UL << 0) 264 #define TCP_RCV_COPY_FRAGHDR (1UL << 1) 265 #define TCP_RCV_COPY_XID (1UL << 2) 266 #define TCP_RCV_COPY_DATA (1UL << 3) 267 268 static inline struct sockaddr *xs_addr(struct rpc_xprt *xprt) 269 { 270 return (struct sockaddr *) &xprt->addr; 271 } 272 273 static inline struct sockaddr_in *xs_addr_in(struct rpc_xprt *xprt) 274 { 275 return (struct sockaddr_in *) &xprt->addr; 276 } 277 278 static inline struct sockaddr_in6 *xs_addr_in6(struct rpc_xprt *xprt) 279 { 280 return (struct sockaddr_in6 *) &xprt->addr; 281 } 282 283 static void xs_format_ipv4_peer_addresses(struct rpc_xprt *xprt) 284 { 285 struct sockaddr_in *addr = xs_addr_in(xprt); 286 char *buf; 287 288 buf = kzalloc(20, GFP_KERNEL); 289 if (buf) { 290 snprintf(buf, 20, NIPQUAD_FMT, 291 NIPQUAD(addr->sin_addr.s_addr)); 292 } 293 xprt->address_strings[RPC_DISPLAY_ADDR] = buf; 294 295 buf = kzalloc(8, GFP_KERNEL); 296 if (buf) { 297 snprintf(buf, 8, "%u", 298 ntohs(addr->sin_port)); 299 } 300 xprt->address_strings[RPC_DISPLAY_PORT] = buf; 301 302 buf = kzalloc(8, GFP_KERNEL); 303 if (buf) { 304 if (xprt->prot == IPPROTO_UDP) 305 snprintf(buf, 8, "udp"); 306 else 307 snprintf(buf, 8, "tcp"); 308 } 309 xprt->address_strings[RPC_DISPLAY_PROTO] = buf; 310 311 buf = kzalloc(48, GFP_KERNEL); 312 if (buf) { 313 snprintf(buf, 48, "addr="NIPQUAD_FMT" port=%u proto=%s", 314 NIPQUAD(addr->sin_addr.s_addr), 315 ntohs(addr->sin_port), 316 xprt->prot == IPPROTO_UDP ? "udp" : "tcp"); 317 } 318 xprt->address_strings[RPC_DISPLAY_ALL] = buf; 319 320 buf = kzalloc(10, GFP_KERNEL); 321 if (buf) { 322 snprintf(buf, 10, "%02x%02x%02x%02x", 323 NIPQUAD(addr->sin_addr.s_addr)); 324 } 325 xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = buf; 326 327 buf = kzalloc(8, GFP_KERNEL); 328 if (buf) { 329 snprintf(buf, 8, "%4hx", 330 ntohs(addr->sin_port)); 331 } 332 xprt->address_strings[RPC_DISPLAY_HEX_PORT] = buf; 333 334 buf = kzalloc(30, GFP_KERNEL); 335 if (buf) { 336 snprintf(buf, 30, NIPQUAD_FMT".%u.%u", 337 NIPQUAD(addr->sin_addr.s_addr), 338 ntohs(addr->sin_port) >> 8, 339 ntohs(addr->sin_port) & 0xff); 340 } 341 xprt->address_strings[RPC_DISPLAY_UNIVERSAL_ADDR] = buf; 342 343 xprt->address_strings[RPC_DISPLAY_NETID] = 344 kstrdup(xprt->prot == IPPROTO_UDP ? 345 RPCBIND_NETID_UDP : RPCBIND_NETID_TCP, GFP_KERNEL); 346 } 347 348 static void xs_format_ipv6_peer_addresses(struct rpc_xprt *xprt) 349 { 350 struct sockaddr_in6 *addr = xs_addr_in6(xprt); 351 char *buf; 352 353 buf = kzalloc(40, GFP_KERNEL); 354 if (buf) { 355 snprintf(buf, 40, NIP6_FMT, 356 NIP6(addr->sin6_addr)); 357 } 358 xprt->address_strings[RPC_DISPLAY_ADDR] = buf; 359 360 buf = kzalloc(8, GFP_KERNEL); 361 if (buf) { 362 snprintf(buf, 8, "%u", 363 ntohs(addr->sin6_port)); 364 } 365 xprt->address_strings[RPC_DISPLAY_PORT] = buf; 366 367 buf = kzalloc(8, GFP_KERNEL); 368 if (buf) { 369 if (xprt->prot == IPPROTO_UDP) 370 snprintf(buf, 8, "udp"); 371 else 372 snprintf(buf, 8, "tcp"); 373 } 374 xprt->address_strings[RPC_DISPLAY_PROTO] = buf; 375 376 buf = kzalloc(64, GFP_KERNEL); 377 if (buf) { 378 snprintf(buf, 64, "addr="NIP6_FMT" port=%u proto=%s", 379 NIP6(addr->sin6_addr), 380 ntohs(addr->sin6_port), 381 xprt->prot == IPPROTO_UDP ? "udp" : "tcp"); 382 } 383 xprt->address_strings[RPC_DISPLAY_ALL] = buf; 384 385 buf = kzalloc(36, GFP_KERNEL); 386 if (buf) { 387 snprintf(buf, 36, NIP6_SEQFMT, 388 NIP6(addr->sin6_addr)); 389 } 390 xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = buf; 391 392 buf = kzalloc(8, GFP_KERNEL); 393 if (buf) { 394 snprintf(buf, 8, "%4hx", 395 ntohs(addr->sin6_port)); 396 } 397 xprt->address_strings[RPC_DISPLAY_HEX_PORT] = buf; 398 399 buf = kzalloc(50, GFP_KERNEL); 400 if (buf) { 401 snprintf(buf, 50, NIP6_FMT".%u.%u", 402 NIP6(addr->sin6_addr), 403 ntohs(addr->sin6_port) >> 8, 404 ntohs(addr->sin6_port) & 0xff); 405 } 406 xprt->address_strings[RPC_DISPLAY_UNIVERSAL_ADDR] = buf; 407 408 xprt->address_strings[RPC_DISPLAY_NETID] = 409 kstrdup(xprt->prot == IPPROTO_UDP ? 410 RPCBIND_NETID_UDP6 : RPCBIND_NETID_TCP6, GFP_KERNEL); 411 } 412 413 static void xs_free_peer_addresses(struct rpc_xprt *xprt) 414 { 415 int i; 416 417 for (i = 0; i < RPC_DISPLAY_MAX; i++) 418 kfree(xprt->address_strings[i]); 419 } 420 421 #define XS_SENDMSG_FLAGS (MSG_DONTWAIT | MSG_NOSIGNAL) 422 423 static int xs_send_kvec(struct socket *sock, struct sockaddr *addr, int addrlen, struct kvec *vec, unsigned int base, int more) 424 { 425 struct msghdr msg = { 426 .msg_name = addr, 427 .msg_namelen = addrlen, 428 .msg_flags = XS_SENDMSG_FLAGS | (more ? MSG_MORE : 0), 429 }; 430 struct kvec iov = { 431 .iov_base = vec->iov_base + base, 432 .iov_len = vec->iov_len - base, 433 }; 434 435 if (iov.iov_len != 0) 436 return kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len); 437 return kernel_sendmsg(sock, &msg, NULL, 0, 0); 438 } 439 440 static int xs_send_pagedata(struct socket *sock, struct xdr_buf *xdr, unsigned int base, int more) 441 { 442 struct page **ppage; 443 unsigned int remainder; 444 int err, sent = 0; 445 446 remainder = xdr->page_len - base; 447 base += xdr->page_base; 448 ppage = xdr->pages + (base >> PAGE_SHIFT); 449 base &= ~PAGE_MASK; 450 for(;;) { 451 unsigned int len = min_t(unsigned int, PAGE_SIZE - base, remainder); 452 int flags = XS_SENDMSG_FLAGS; 453 454 remainder -= len; 455 if (remainder != 0 || more) 456 flags |= MSG_MORE; 457 err = sock->ops->sendpage(sock, *ppage, base, len, flags); 458 if (remainder == 0 || err != len) 459 break; 460 sent += err; 461 ppage++; 462 base = 0; 463 } 464 if (sent == 0) 465 return err; 466 if (err > 0) 467 sent += err; 468 return sent; 469 } 470 471 /** 472 * xs_sendpages - write pages directly to a socket 473 * @sock: socket to send on 474 * @addr: UDP only -- address of destination 475 * @addrlen: UDP only -- length of destination address 476 * @xdr: buffer containing this request 477 * @base: starting position in the buffer 478 * 479 */ 480 static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen, struct xdr_buf *xdr, unsigned int base) 481 { 482 unsigned int remainder = xdr->len - base; 483 int err, sent = 0; 484 485 if (unlikely(!sock)) 486 return -ENOTCONN; 487 488 clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags); 489 if (base != 0) { 490 addr = NULL; 491 addrlen = 0; 492 } 493 494 if (base < xdr->head[0].iov_len || addr != NULL) { 495 unsigned int len = xdr->head[0].iov_len - base; 496 remainder -= len; 497 err = xs_send_kvec(sock, addr, addrlen, &xdr->head[0], base, remainder != 0); 498 if (remainder == 0 || err != len) 499 goto out; 500 sent += err; 501 base = 0; 502 } else 503 base -= xdr->head[0].iov_len; 504 505 if (base < xdr->page_len) { 506 unsigned int len = xdr->page_len - base; 507 remainder -= len; 508 err = xs_send_pagedata(sock, xdr, base, remainder != 0); 509 if (remainder == 0 || err != len) 510 goto out; 511 sent += err; 512 base = 0; 513 } else 514 base -= xdr->page_len; 515 516 if (base >= xdr->tail[0].iov_len) 517 return sent; 518 err = xs_send_kvec(sock, NULL, 0, &xdr->tail[0], base, 0); 519 out: 520 if (sent == 0) 521 return err; 522 if (err > 0) 523 sent += err; 524 return sent; 525 } 526 527 /** 528 * xs_nospace - place task on wait queue if transmit was incomplete 529 * @task: task to put to sleep 530 * 531 */ 532 static void xs_nospace(struct rpc_task *task) 533 { 534 struct rpc_rqst *req = task->tk_rqstp; 535 struct rpc_xprt *xprt = req->rq_xprt; 536 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 537 538 dprintk("RPC: %5u xmit incomplete (%u left of %u)\n", 539 task->tk_pid, req->rq_slen - req->rq_bytes_sent, 540 req->rq_slen); 541 542 if (test_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags)) { 543 /* Protect against races with write_space */ 544 spin_lock_bh(&xprt->transport_lock); 545 546 /* Don't race with disconnect */ 547 if (!xprt_connected(xprt)) 548 task->tk_status = -ENOTCONN; 549 else if (test_bit(SOCK_NOSPACE, &transport->sock->flags)) 550 xprt_wait_for_buffer_space(task); 551 552 spin_unlock_bh(&xprt->transport_lock); 553 } else 554 /* Keep holding the socket if it is blocked */ 555 rpc_delay(task, HZ>>4); 556 } 557 558 /** 559 * xs_udp_send_request - write an RPC request to a UDP socket 560 * @task: address of RPC task that manages the state of an RPC request 561 * 562 * Return values: 563 * 0: The request has been sent 564 * EAGAIN: The socket was blocked, please call again later to 565 * complete the request 566 * ENOTCONN: Caller needs to invoke connect logic then call again 567 * other: Some other error occured, the request was not sent 568 */ 569 static int xs_udp_send_request(struct rpc_task *task) 570 { 571 struct rpc_rqst *req = task->tk_rqstp; 572 struct rpc_xprt *xprt = req->rq_xprt; 573 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 574 struct xdr_buf *xdr = &req->rq_snd_buf; 575 int status; 576 577 xs_pktdump("packet data:", 578 req->rq_svec->iov_base, 579 req->rq_svec->iov_len); 580 581 req->rq_xtime = jiffies; 582 status = xs_sendpages(transport->sock, 583 xs_addr(xprt), 584 xprt->addrlen, xdr, 585 req->rq_bytes_sent); 586 587 dprintk("RPC: xs_udp_send_request(%u) = %d\n", 588 xdr->len - req->rq_bytes_sent, status); 589 590 if (likely(status >= (int) req->rq_slen)) 591 return 0; 592 593 /* Still some bytes left; set up for a retry later. */ 594 if (status > 0) 595 status = -EAGAIN; 596 597 switch (status) { 598 case -ENETUNREACH: 599 case -EPIPE: 600 case -ECONNREFUSED: 601 /* When the server has died, an ICMP port unreachable message 602 * prompts ECONNREFUSED. */ 603 break; 604 case -EAGAIN: 605 xs_nospace(task); 606 break; 607 default: 608 dprintk("RPC: sendmsg returned unrecognized error %d\n", 609 -status); 610 break; 611 } 612 613 return status; 614 } 615 616 static inline void xs_encode_tcp_record_marker(struct xdr_buf *buf) 617 { 618 u32 reclen = buf->len - sizeof(rpc_fraghdr); 619 rpc_fraghdr *base = buf->head[0].iov_base; 620 *base = htonl(RPC_LAST_STREAM_FRAGMENT | reclen); 621 } 622 623 /** 624 * xs_tcp_send_request - write an RPC request to a TCP socket 625 * @task: address of RPC task that manages the state of an RPC request 626 * 627 * Return values: 628 * 0: The request has been sent 629 * EAGAIN: The socket was blocked, please call again later to 630 * complete the request 631 * ENOTCONN: Caller needs to invoke connect logic then call again 632 * other: Some other error occured, the request was not sent 633 * 634 * XXX: In the case of soft timeouts, should we eventually give up 635 * if sendmsg is not able to make progress? 636 */ 637 static int xs_tcp_send_request(struct rpc_task *task) 638 { 639 struct rpc_rqst *req = task->tk_rqstp; 640 struct rpc_xprt *xprt = req->rq_xprt; 641 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 642 struct xdr_buf *xdr = &req->rq_snd_buf; 643 int status; 644 unsigned int retry = 0; 645 646 xs_encode_tcp_record_marker(&req->rq_snd_buf); 647 648 xs_pktdump("packet data:", 649 req->rq_svec->iov_base, 650 req->rq_svec->iov_len); 651 652 /* Continue transmitting the packet/record. We must be careful 653 * to cope with writespace callbacks arriving _after_ we have 654 * called sendmsg(). */ 655 while (1) { 656 req->rq_xtime = jiffies; 657 status = xs_sendpages(transport->sock, 658 NULL, 0, xdr, req->rq_bytes_sent); 659 660 dprintk("RPC: xs_tcp_send_request(%u) = %d\n", 661 xdr->len - req->rq_bytes_sent, status); 662 663 if (unlikely(status < 0)) 664 break; 665 666 /* If we've sent the entire packet, immediately 667 * reset the count of bytes sent. */ 668 req->rq_bytes_sent += status; 669 task->tk_bytes_sent += status; 670 if (likely(req->rq_bytes_sent >= req->rq_slen)) { 671 req->rq_bytes_sent = 0; 672 return 0; 673 } 674 675 status = -EAGAIN; 676 if (retry++ > XS_SENDMSG_RETRY) 677 break; 678 } 679 680 switch (status) { 681 case -EAGAIN: 682 xs_nospace(task); 683 break; 684 case -ECONNREFUSED: 685 case -ECONNRESET: 686 case -ENOTCONN: 687 case -EPIPE: 688 status = -ENOTCONN; 689 break; 690 default: 691 dprintk("RPC: sendmsg returned unrecognized error %d\n", 692 -status); 693 xprt_disconnect(xprt); 694 break; 695 } 696 697 return status; 698 } 699 700 /** 701 * xs_tcp_release_xprt - clean up after a tcp transmission 702 * @xprt: transport 703 * @task: rpc task 704 * 705 * This cleans up if an error causes us to abort the transmission of a request. 706 * In this case, the socket may need to be reset in order to avoid confusing 707 * the server. 708 */ 709 static void xs_tcp_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task) 710 { 711 struct rpc_rqst *req; 712 713 if (task != xprt->snd_task) 714 return; 715 if (task == NULL) 716 goto out_release; 717 req = task->tk_rqstp; 718 if (req->rq_bytes_sent == 0) 719 goto out_release; 720 if (req->rq_bytes_sent == req->rq_snd_buf.len) 721 goto out_release; 722 set_bit(XPRT_CLOSE_WAIT, &task->tk_xprt->state); 723 out_release: 724 xprt_release_xprt(xprt, task); 725 } 726 727 /** 728 * xs_close - close a socket 729 * @xprt: transport 730 * 731 * This is used when all requests are complete; ie, no DRC state remains 732 * on the server we want to save. 733 */ 734 static void xs_close(struct rpc_xprt *xprt) 735 { 736 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 737 struct socket *sock = transport->sock; 738 struct sock *sk = transport->inet; 739 740 if (!sk) 741 goto clear_close_wait; 742 743 dprintk("RPC: xs_close xprt %p\n", xprt); 744 745 write_lock_bh(&sk->sk_callback_lock); 746 transport->inet = NULL; 747 transport->sock = NULL; 748 749 sk->sk_user_data = NULL; 750 sk->sk_data_ready = transport->old_data_ready; 751 sk->sk_state_change = transport->old_state_change; 752 sk->sk_write_space = transport->old_write_space; 753 write_unlock_bh(&sk->sk_callback_lock); 754 755 sk->sk_no_check = 0; 756 757 sock_release(sock); 758 clear_close_wait: 759 smp_mb__before_clear_bit(); 760 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); 761 smp_mb__after_clear_bit(); 762 } 763 764 /** 765 * xs_destroy - prepare to shutdown a transport 766 * @xprt: doomed transport 767 * 768 */ 769 static void xs_destroy(struct rpc_xprt *xprt) 770 { 771 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 772 773 dprintk("RPC: xs_destroy xprt %p\n", xprt); 774 775 cancel_rearming_delayed_work(&transport->connect_worker); 776 777 xprt_disconnect(xprt); 778 xs_close(xprt); 779 xs_free_peer_addresses(xprt); 780 kfree(xprt->slot); 781 kfree(xprt); 782 module_put(THIS_MODULE); 783 } 784 785 static inline struct rpc_xprt *xprt_from_sock(struct sock *sk) 786 { 787 return (struct rpc_xprt *) sk->sk_user_data; 788 } 789 790 /** 791 * xs_udp_data_ready - "data ready" callback for UDP sockets 792 * @sk: socket with data to read 793 * @len: how much data to read 794 * 795 */ 796 static void xs_udp_data_ready(struct sock *sk, int len) 797 { 798 struct rpc_task *task; 799 struct rpc_xprt *xprt; 800 struct rpc_rqst *rovr; 801 struct sk_buff *skb; 802 int err, repsize, copied; 803 u32 _xid; 804 __be32 *xp; 805 806 read_lock(&sk->sk_callback_lock); 807 dprintk("RPC: xs_udp_data_ready...\n"); 808 if (!(xprt = xprt_from_sock(sk))) 809 goto out; 810 811 if ((skb = skb_recv_datagram(sk, 0, 1, &err)) == NULL) 812 goto out; 813 814 if (xprt->shutdown) 815 goto dropit; 816 817 repsize = skb->len - sizeof(struct udphdr); 818 if (repsize < 4) { 819 dprintk("RPC: impossible RPC reply size %d!\n", repsize); 820 goto dropit; 821 } 822 823 /* Copy the XID from the skb... */ 824 xp = skb_header_pointer(skb, sizeof(struct udphdr), 825 sizeof(_xid), &_xid); 826 if (xp == NULL) 827 goto dropit; 828 829 /* Look up and lock the request corresponding to the given XID */ 830 spin_lock(&xprt->transport_lock); 831 rovr = xprt_lookup_rqst(xprt, *xp); 832 if (!rovr) 833 goto out_unlock; 834 task = rovr->rq_task; 835 836 if ((copied = rovr->rq_private_buf.buflen) > repsize) 837 copied = repsize; 838 839 /* Suck it into the iovec, verify checksum if not done by hw. */ 840 if (csum_partial_copy_to_xdr(&rovr->rq_private_buf, skb)) 841 goto out_unlock; 842 843 /* Something worked... */ 844 dst_confirm(skb->dst); 845 846 xprt_adjust_cwnd(task, copied); 847 xprt_update_rtt(task); 848 xprt_complete_rqst(task, copied); 849 850 out_unlock: 851 spin_unlock(&xprt->transport_lock); 852 dropit: 853 skb_free_datagram(sk, skb); 854 out: 855 read_unlock(&sk->sk_callback_lock); 856 } 857 858 static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_reader *desc) 859 { 860 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 861 size_t len, used; 862 char *p; 863 864 p = ((char *) &transport->tcp_fraghdr) + transport->tcp_offset; 865 len = sizeof(transport->tcp_fraghdr) - transport->tcp_offset; 866 used = xdr_skb_read_bits(desc, p, len); 867 transport->tcp_offset += used; 868 if (used != len) 869 return; 870 871 transport->tcp_reclen = ntohl(transport->tcp_fraghdr); 872 if (transport->tcp_reclen & RPC_LAST_STREAM_FRAGMENT) 873 transport->tcp_flags |= TCP_RCV_LAST_FRAG; 874 else 875 transport->tcp_flags &= ~TCP_RCV_LAST_FRAG; 876 transport->tcp_reclen &= RPC_FRAGMENT_SIZE_MASK; 877 878 transport->tcp_flags &= ~TCP_RCV_COPY_FRAGHDR; 879 transport->tcp_offset = 0; 880 881 /* Sanity check of the record length */ 882 if (unlikely(transport->tcp_reclen < 4)) { 883 dprintk("RPC: invalid TCP record fragment length\n"); 884 xprt_disconnect(xprt); 885 return; 886 } 887 dprintk("RPC: reading TCP record fragment of length %d\n", 888 transport->tcp_reclen); 889 } 890 891 static void xs_tcp_check_fraghdr(struct sock_xprt *transport) 892 { 893 if (transport->tcp_offset == transport->tcp_reclen) { 894 transport->tcp_flags |= TCP_RCV_COPY_FRAGHDR; 895 transport->tcp_offset = 0; 896 if (transport->tcp_flags & TCP_RCV_LAST_FRAG) { 897 transport->tcp_flags &= ~TCP_RCV_COPY_DATA; 898 transport->tcp_flags |= TCP_RCV_COPY_XID; 899 transport->tcp_copied = 0; 900 } 901 } 902 } 903 904 static inline void xs_tcp_read_xid(struct sock_xprt *transport, struct xdr_skb_reader *desc) 905 { 906 size_t len, used; 907 char *p; 908 909 len = sizeof(transport->tcp_xid) - transport->tcp_offset; 910 dprintk("RPC: reading XID (%Zu bytes)\n", len); 911 p = ((char *) &transport->tcp_xid) + transport->tcp_offset; 912 used = xdr_skb_read_bits(desc, p, len); 913 transport->tcp_offset += used; 914 if (used != len) 915 return; 916 transport->tcp_flags &= ~TCP_RCV_COPY_XID; 917 transport->tcp_flags |= TCP_RCV_COPY_DATA; 918 transport->tcp_copied = 4; 919 dprintk("RPC: reading reply for XID %08x\n", 920 ntohl(transport->tcp_xid)); 921 xs_tcp_check_fraghdr(transport); 922 } 923 924 static inline void xs_tcp_read_request(struct rpc_xprt *xprt, struct xdr_skb_reader *desc) 925 { 926 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 927 struct rpc_rqst *req; 928 struct xdr_buf *rcvbuf; 929 size_t len; 930 ssize_t r; 931 932 /* Find and lock the request corresponding to this xid */ 933 spin_lock(&xprt->transport_lock); 934 req = xprt_lookup_rqst(xprt, transport->tcp_xid); 935 if (!req) { 936 transport->tcp_flags &= ~TCP_RCV_COPY_DATA; 937 dprintk("RPC: XID %08x request not found!\n", 938 ntohl(transport->tcp_xid)); 939 spin_unlock(&xprt->transport_lock); 940 return; 941 } 942 943 rcvbuf = &req->rq_private_buf; 944 len = desc->count; 945 if (len > transport->tcp_reclen - transport->tcp_offset) { 946 struct xdr_skb_reader my_desc; 947 948 len = transport->tcp_reclen - transport->tcp_offset; 949 memcpy(&my_desc, desc, sizeof(my_desc)); 950 my_desc.count = len; 951 r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied, 952 &my_desc, xdr_skb_read_bits); 953 desc->count -= r; 954 desc->offset += r; 955 } else 956 r = xdr_partial_copy_from_skb(rcvbuf, transport->tcp_copied, 957 desc, xdr_skb_read_bits); 958 959 if (r > 0) { 960 transport->tcp_copied += r; 961 transport->tcp_offset += r; 962 } 963 if (r != len) { 964 /* Error when copying to the receive buffer, 965 * usually because we weren't able to allocate 966 * additional buffer pages. All we can do now 967 * is turn off TCP_RCV_COPY_DATA, so the request 968 * will not receive any additional updates, 969 * and time out. 970 * Any remaining data from this record will 971 * be discarded. 972 */ 973 transport->tcp_flags &= ~TCP_RCV_COPY_DATA; 974 dprintk("RPC: XID %08x truncated request\n", 975 ntohl(transport->tcp_xid)); 976 dprintk("RPC: xprt = %p, tcp_copied = %lu, " 977 "tcp_offset = %u, tcp_reclen = %u\n", 978 xprt, transport->tcp_copied, 979 transport->tcp_offset, transport->tcp_reclen); 980 goto out; 981 } 982 983 dprintk("RPC: XID %08x read %Zd bytes\n", 984 ntohl(transport->tcp_xid), r); 985 dprintk("RPC: xprt = %p, tcp_copied = %lu, tcp_offset = %u, " 986 "tcp_reclen = %u\n", xprt, transport->tcp_copied, 987 transport->tcp_offset, transport->tcp_reclen); 988 989 if (transport->tcp_copied == req->rq_private_buf.buflen) 990 transport->tcp_flags &= ~TCP_RCV_COPY_DATA; 991 else if (transport->tcp_offset == transport->tcp_reclen) { 992 if (transport->tcp_flags & TCP_RCV_LAST_FRAG) 993 transport->tcp_flags &= ~TCP_RCV_COPY_DATA; 994 } 995 996 out: 997 if (!(transport->tcp_flags & TCP_RCV_COPY_DATA)) 998 xprt_complete_rqst(req->rq_task, transport->tcp_copied); 999 spin_unlock(&xprt->transport_lock); 1000 xs_tcp_check_fraghdr(transport); 1001 } 1002 1003 static inline void xs_tcp_read_discard(struct sock_xprt *transport, struct xdr_skb_reader *desc) 1004 { 1005 size_t len; 1006 1007 len = transport->tcp_reclen - transport->tcp_offset; 1008 if (len > desc->count) 1009 len = desc->count; 1010 desc->count -= len; 1011 desc->offset += len; 1012 transport->tcp_offset += len; 1013 dprintk("RPC: discarded %Zu bytes\n", len); 1014 xs_tcp_check_fraghdr(transport); 1015 } 1016 1017 static int xs_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, unsigned int offset, size_t len) 1018 { 1019 struct rpc_xprt *xprt = rd_desc->arg.data; 1020 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1021 struct xdr_skb_reader desc = { 1022 .skb = skb, 1023 .offset = offset, 1024 .count = len, 1025 }; 1026 1027 dprintk("RPC: xs_tcp_data_recv started\n"); 1028 do { 1029 /* Read in a new fragment marker if necessary */ 1030 /* Can we ever really expect to get completely empty fragments? */ 1031 if (transport->tcp_flags & TCP_RCV_COPY_FRAGHDR) { 1032 xs_tcp_read_fraghdr(xprt, &desc); 1033 continue; 1034 } 1035 /* Read in the xid if necessary */ 1036 if (transport->tcp_flags & TCP_RCV_COPY_XID) { 1037 xs_tcp_read_xid(transport, &desc); 1038 continue; 1039 } 1040 /* Read in the request data */ 1041 if (transport->tcp_flags & TCP_RCV_COPY_DATA) { 1042 xs_tcp_read_request(xprt, &desc); 1043 continue; 1044 } 1045 /* Skip over any trailing bytes on short reads */ 1046 xs_tcp_read_discard(transport, &desc); 1047 } while (desc.count); 1048 dprintk("RPC: xs_tcp_data_recv done\n"); 1049 return len - desc.count; 1050 } 1051 1052 /** 1053 * xs_tcp_data_ready - "data ready" callback for TCP sockets 1054 * @sk: socket with data to read 1055 * @bytes: how much data to read 1056 * 1057 */ 1058 static void xs_tcp_data_ready(struct sock *sk, int bytes) 1059 { 1060 struct rpc_xprt *xprt; 1061 read_descriptor_t rd_desc; 1062 1063 dprintk("RPC: xs_tcp_data_ready...\n"); 1064 1065 read_lock(&sk->sk_callback_lock); 1066 if (!(xprt = xprt_from_sock(sk))) 1067 goto out; 1068 if (xprt->shutdown) 1069 goto out; 1070 1071 /* We use rd_desc to pass struct xprt to xs_tcp_data_recv */ 1072 rd_desc.arg.data = xprt; 1073 rd_desc.count = 65536; 1074 tcp_read_sock(sk, &rd_desc, xs_tcp_data_recv); 1075 out: 1076 read_unlock(&sk->sk_callback_lock); 1077 } 1078 1079 /** 1080 * xs_tcp_state_change - callback to handle TCP socket state changes 1081 * @sk: socket whose state has changed 1082 * 1083 */ 1084 static void xs_tcp_state_change(struct sock *sk) 1085 { 1086 struct rpc_xprt *xprt; 1087 1088 read_lock(&sk->sk_callback_lock); 1089 if (!(xprt = xprt_from_sock(sk))) 1090 goto out; 1091 dprintk("RPC: xs_tcp_state_change client %p...\n", xprt); 1092 dprintk("RPC: state %x conn %d dead %d zapped %d\n", 1093 sk->sk_state, xprt_connected(xprt), 1094 sock_flag(sk, SOCK_DEAD), 1095 sock_flag(sk, SOCK_ZAPPED)); 1096 1097 switch (sk->sk_state) { 1098 case TCP_ESTABLISHED: 1099 spin_lock_bh(&xprt->transport_lock); 1100 if (!xprt_test_and_set_connected(xprt)) { 1101 struct sock_xprt *transport = container_of(xprt, 1102 struct sock_xprt, xprt); 1103 1104 /* Reset TCP record info */ 1105 transport->tcp_offset = 0; 1106 transport->tcp_reclen = 0; 1107 transport->tcp_copied = 0; 1108 transport->tcp_flags = 1109 TCP_RCV_COPY_FRAGHDR | TCP_RCV_COPY_XID; 1110 1111 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; 1112 xprt_wake_pending_tasks(xprt, 0); 1113 } 1114 spin_unlock_bh(&xprt->transport_lock); 1115 break; 1116 case TCP_SYN_SENT: 1117 case TCP_SYN_RECV: 1118 break; 1119 case TCP_CLOSE_WAIT: 1120 /* Try to schedule an autoclose RPC calls */ 1121 set_bit(XPRT_CLOSE_WAIT, &xprt->state); 1122 if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0) 1123 queue_work(rpciod_workqueue, &xprt->task_cleanup); 1124 default: 1125 xprt_disconnect(xprt); 1126 } 1127 out: 1128 read_unlock(&sk->sk_callback_lock); 1129 } 1130 1131 /** 1132 * xs_udp_write_space - callback invoked when socket buffer space 1133 * becomes available 1134 * @sk: socket whose state has changed 1135 * 1136 * Called when more output buffer space is available for this socket. 1137 * We try not to wake our writers until they can make "significant" 1138 * progress, otherwise we'll waste resources thrashing kernel_sendmsg 1139 * with a bunch of small requests. 1140 */ 1141 static void xs_udp_write_space(struct sock *sk) 1142 { 1143 read_lock(&sk->sk_callback_lock); 1144 1145 /* from net/core/sock.c:sock_def_write_space */ 1146 if (sock_writeable(sk)) { 1147 struct socket *sock; 1148 struct rpc_xprt *xprt; 1149 1150 if (unlikely(!(sock = sk->sk_socket))) 1151 goto out; 1152 if (unlikely(!(xprt = xprt_from_sock(sk)))) 1153 goto out; 1154 if (unlikely(!test_and_clear_bit(SOCK_NOSPACE, &sock->flags))) 1155 goto out; 1156 1157 xprt_write_space(xprt); 1158 } 1159 1160 out: 1161 read_unlock(&sk->sk_callback_lock); 1162 } 1163 1164 /** 1165 * xs_tcp_write_space - callback invoked when socket buffer space 1166 * becomes available 1167 * @sk: socket whose state has changed 1168 * 1169 * Called when more output buffer space is available for this socket. 1170 * We try not to wake our writers until they can make "significant" 1171 * progress, otherwise we'll waste resources thrashing kernel_sendmsg 1172 * with a bunch of small requests. 1173 */ 1174 static void xs_tcp_write_space(struct sock *sk) 1175 { 1176 read_lock(&sk->sk_callback_lock); 1177 1178 /* from net/core/stream.c:sk_stream_write_space */ 1179 if (sk_stream_wspace(sk) >= sk_stream_min_wspace(sk)) { 1180 struct socket *sock; 1181 struct rpc_xprt *xprt; 1182 1183 if (unlikely(!(sock = sk->sk_socket))) 1184 goto out; 1185 if (unlikely(!(xprt = xprt_from_sock(sk)))) 1186 goto out; 1187 if (unlikely(!test_and_clear_bit(SOCK_NOSPACE, &sock->flags))) 1188 goto out; 1189 1190 xprt_write_space(xprt); 1191 } 1192 1193 out: 1194 read_unlock(&sk->sk_callback_lock); 1195 } 1196 1197 static void xs_udp_do_set_buffer_size(struct rpc_xprt *xprt) 1198 { 1199 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1200 struct sock *sk = transport->inet; 1201 1202 if (transport->rcvsize) { 1203 sk->sk_userlocks |= SOCK_RCVBUF_LOCK; 1204 sk->sk_rcvbuf = transport->rcvsize * xprt->max_reqs * 2; 1205 } 1206 if (transport->sndsize) { 1207 sk->sk_userlocks |= SOCK_SNDBUF_LOCK; 1208 sk->sk_sndbuf = transport->sndsize * xprt->max_reqs * 2; 1209 sk->sk_write_space(sk); 1210 } 1211 } 1212 1213 /** 1214 * xs_udp_set_buffer_size - set send and receive limits 1215 * @xprt: generic transport 1216 * @sndsize: requested size of send buffer, in bytes 1217 * @rcvsize: requested size of receive buffer, in bytes 1218 * 1219 * Set socket send and receive buffer size limits. 1220 */ 1221 static void xs_udp_set_buffer_size(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize) 1222 { 1223 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1224 1225 transport->sndsize = 0; 1226 if (sndsize) 1227 transport->sndsize = sndsize + 1024; 1228 transport->rcvsize = 0; 1229 if (rcvsize) 1230 transport->rcvsize = rcvsize + 1024; 1231 1232 xs_udp_do_set_buffer_size(xprt); 1233 } 1234 1235 /** 1236 * xs_udp_timer - called when a retransmit timeout occurs on a UDP transport 1237 * @task: task that timed out 1238 * 1239 * Adjust the congestion window after a retransmit timeout has occurred. 1240 */ 1241 static void xs_udp_timer(struct rpc_task *task) 1242 { 1243 xprt_adjust_cwnd(task, -ETIMEDOUT); 1244 } 1245 1246 static unsigned short xs_get_random_port(void) 1247 { 1248 unsigned short range = xprt_max_resvport - xprt_min_resvport; 1249 unsigned short rand = (unsigned short) net_random() % range; 1250 return rand + xprt_min_resvport; 1251 } 1252 1253 /** 1254 * xs_set_port - reset the port number in the remote endpoint address 1255 * @xprt: generic transport 1256 * @port: new port number 1257 * 1258 */ 1259 static void xs_set_port(struct rpc_xprt *xprt, unsigned short port) 1260 { 1261 struct sockaddr *addr = xs_addr(xprt); 1262 1263 dprintk("RPC: setting port for xprt %p to %u\n", xprt, port); 1264 1265 switch (addr->sa_family) { 1266 case AF_INET: 1267 ((struct sockaddr_in *)addr)->sin_port = htons(port); 1268 break; 1269 case AF_INET6: 1270 ((struct sockaddr_in6 *)addr)->sin6_port = htons(port); 1271 break; 1272 default: 1273 BUG(); 1274 } 1275 } 1276 1277 static int xs_bind4(struct sock_xprt *transport, struct socket *sock) 1278 { 1279 struct sockaddr_in myaddr = { 1280 .sin_family = AF_INET, 1281 }; 1282 struct sockaddr_in *sa; 1283 int err; 1284 unsigned short port = transport->port; 1285 1286 if (!transport->xprt.resvport) 1287 port = 0; 1288 sa = (struct sockaddr_in *)&transport->addr; 1289 myaddr.sin_addr = sa->sin_addr; 1290 do { 1291 myaddr.sin_port = htons(port); 1292 err = kernel_bind(sock, (struct sockaddr *) &myaddr, 1293 sizeof(myaddr)); 1294 if (!transport->xprt.resvport) 1295 break; 1296 if (err == 0) { 1297 transport->port = port; 1298 break; 1299 } 1300 if (port <= xprt_min_resvport) 1301 port = xprt_max_resvport; 1302 else 1303 port--; 1304 } while (err == -EADDRINUSE && port != transport->port); 1305 dprintk("RPC: %s "NIPQUAD_FMT":%u: %s (%d)\n", 1306 __FUNCTION__, NIPQUAD(myaddr.sin_addr), 1307 port, err ? "failed" : "ok", err); 1308 return err; 1309 } 1310 1311 static int xs_bind6(struct sock_xprt *transport, struct socket *sock) 1312 { 1313 struct sockaddr_in6 myaddr = { 1314 .sin6_family = AF_INET6, 1315 }; 1316 struct sockaddr_in6 *sa; 1317 int err; 1318 unsigned short port = transport->port; 1319 1320 if (!transport->xprt.resvport) 1321 port = 0; 1322 sa = (struct sockaddr_in6 *)&transport->addr; 1323 myaddr.sin6_addr = sa->sin6_addr; 1324 do { 1325 myaddr.sin6_port = htons(port); 1326 err = kernel_bind(sock, (struct sockaddr *) &myaddr, 1327 sizeof(myaddr)); 1328 if (!transport->xprt.resvport) 1329 break; 1330 if (err == 0) { 1331 transport->port = port; 1332 break; 1333 } 1334 if (port <= xprt_min_resvport) 1335 port = xprt_max_resvport; 1336 else 1337 port--; 1338 } while (err == -EADDRINUSE && port != transport->port); 1339 dprintk("RPC: xs_bind6 "NIP6_FMT":%u: %s (%d)\n", 1340 NIP6(myaddr.sin6_addr), port, err ? "failed" : "ok", err); 1341 return err; 1342 } 1343 1344 #ifdef CONFIG_DEBUG_LOCK_ALLOC 1345 static struct lock_class_key xs_key[2]; 1346 static struct lock_class_key xs_slock_key[2]; 1347 1348 static inline void xs_reclassify_socket4(struct socket *sock) 1349 { 1350 struct sock *sk = sock->sk; 1351 1352 BUG_ON(sk->sk_lock.owner != NULL); 1353 sock_lock_init_class_and_name(sk, "slock-AF_INET-RPC", 1354 &xs_slock_key[0], "sk_lock-AF_INET-RPC", &xs_key[0]); 1355 } 1356 1357 static inline void xs_reclassify_socket6(struct socket *sock) 1358 { 1359 struct sock *sk = sock->sk; 1360 1361 BUG_ON(sk->sk_lock.owner != NULL); 1362 sock_lock_init_class_and_name(sk, "slock-AF_INET6-RPC", 1363 &xs_slock_key[1], "sk_lock-AF_INET6-RPC", &xs_key[1]); 1364 } 1365 #else 1366 static inline void xs_reclassify_socket4(struct socket *sock) 1367 { 1368 } 1369 1370 static inline void xs_reclassify_socket6(struct socket *sock) 1371 { 1372 } 1373 #endif 1374 1375 static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) 1376 { 1377 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1378 1379 if (!transport->inet) { 1380 struct sock *sk = sock->sk; 1381 1382 write_lock_bh(&sk->sk_callback_lock); 1383 1384 sk->sk_user_data = xprt; 1385 transport->old_data_ready = sk->sk_data_ready; 1386 transport->old_state_change = sk->sk_state_change; 1387 transport->old_write_space = sk->sk_write_space; 1388 sk->sk_data_ready = xs_udp_data_ready; 1389 sk->sk_write_space = xs_udp_write_space; 1390 sk->sk_no_check = UDP_CSUM_NORCV; 1391 sk->sk_allocation = GFP_ATOMIC; 1392 1393 xprt_set_connected(xprt); 1394 1395 /* Reset to new socket */ 1396 transport->sock = sock; 1397 transport->inet = sk; 1398 1399 write_unlock_bh(&sk->sk_callback_lock); 1400 } 1401 xs_udp_do_set_buffer_size(xprt); 1402 } 1403 1404 /** 1405 * xs_udp_connect_worker4 - set up a UDP socket 1406 * @work: RPC transport to connect 1407 * 1408 * Invoked by a work queue tasklet. 1409 */ 1410 static void xs_udp_connect_worker4(struct work_struct *work) 1411 { 1412 struct sock_xprt *transport = 1413 container_of(work, struct sock_xprt, connect_worker.work); 1414 struct rpc_xprt *xprt = &transport->xprt; 1415 struct socket *sock = transport->sock; 1416 int err, status = -EIO; 1417 1418 if (xprt->shutdown || !xprt_bound(xprt)) 1419 goto out; 1420 1421 /* Start by resetting any existing state */ 1422 xs_close(xprt); 1423 1424 if ((err = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) { 1425 dprintk("RPC: can't create UDP transport socket (%d).\n", -err); 1426 goto out; 1427 } 1428 xs_reclassify_socket4(sock); 1429 1430 if (xs_bind4(transport, sock)) { 1431 sock_release(sock); 1432 goto out; 1433 } 1434 1435 dprintk("RPC: worker connecting xprt %p to address: %s\n", 1436 xprt, xprt->address_strings[RPC_DISPLAY_ALL]); 1437 1438 xs_udp_finish_connecting(xprt, sock); 1439 status = 0; 1440 out: 1441 xprt_wake_pending_tasks(xprt, status); 1442 xprt_clear_connecting(xprt); 1443 } 1444 1445 /** 1446 * xs_udp_connect_worker6 - set up a UDP socket 1447 * @work: RPC transport to connect 1448 * 1449 * Invoked by a work queue tasklet. 1450 */ 1451 static void xs_udp_connect_worker6(struct work_struct *work) 1452 { 1453 struct sock_xprt *transport = 1454 container_of(work, struct sock_xprt, connect_worker.work); 1455 struct rpc_xprt *xprt = &transport->xprt; 1456 struct socket *sock = transport->sock; 1457 int err, status = -EIO; 1458 1459 if (xprt->shutdown || !xprt_bound(xprt)) 1460 goto out; 1461 1462 /* Start by resetting any existing state */ 1463 xs_close(xprt); 1464 1465 if ((err = sock_create_kern(PF_INET6, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) { 1466 dprintk("RPC: can't create UDP transport socket (%d).\n", -err); 1467 goto out; 1468 } 1469 xs_reclassify_socket6(sock); 1470 1471 if (xs_bind6(transport, sock) < 0) { 1472 sock_release(sock); 1473 goto out; 1474 } 1475 1476 dprintk("RPC: worker connecting xprt %p to address: %s\n", 1477 xprt, xprt->address_strings[RPC_DISPLAY_ALL]); 1478 1479 xs_udp_finish_connecting(xprt, sock); 1480 status = 0; 1481 out: 1482 xprt_wake_pending_tasks(xprt, status); 1483 xprt_clear_connecting(xprt); 1484 } 1485 1486 /* 1487 * We need to preserve the port number so the reply cache on the server can 1488 * find our cached RPC replies when we get around to reconnecting. 1489 */ 1490 static void xs_tcp_reuse_connection(struct rpc_xprt *xprt) 1491 { 1492 int result; 1493 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1494 struct sockaddr any; 1495 1496 dprintk("RPC: disconnecting xprt %p to reuse port\n", xprt); 1497 1498 /* 1499 * Disconnect the transport socket by doing a connect operation 1500 * with AF_UNSPEC. This should return immediately... 1501 */ 1502 memset(&any, 0, sizeof(any)); 1503 any.sa_family = AF_UNSPEC; 1504 result = kernel_connect(transport->sock, &any, sizeof(any), 0); 1505 if (result) 1506 dprintk("RPC: AF_UNSPEC connect return code %d\n", 1507 result); 1508 } 1509 1510 static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) 1511 { 1512 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1513 1514 if (!transport->inet) { 1515 struct sock *sk = sock->sk; 1516 1517 write_lock_bh(&sk->sk_callback_lock); 1518 1519 sk->sk_user_data = xprt; 1520 transport->old_data_ready = sk->sk_data_ready; 1521 transport->old_state_change = sk->sk_state_change; 1522 transport->old_write_space = sk->sk_write_space; 1523 sk->sk_data_ready = xs_tcp_data_ready; 1524 sk->sk_state_change = xs_tcp_state_change; 1525 sk->sk_write_space = xs_tcp_write_space; 1526 sk->sk_allocation = GFP_ATOMIC; 1527 1528 /* socket options */ 1529 sk->sk_userlocks |= SOCK_BINDPORT_LOCK; 1530 sock_reset_flag(sk, SOCK_LINGER); 1531 tcp_sk(sk)->linger2 = 0; 1532 tcp_sk(sk)->nonagle |= TCP_NAGLE_OFF; 1533 1534 xprt_clear_connected(xprt); 1535 1536 /* Reset to new socket */ 1537 transport->sock = sock; 1538 transport->inet = sk; 1539 1540 write_unlock_bh(&sk->sk_callback_lock); 1541 } 1542 1543 /* Tell the socket layer to start connecting... */ 1544 xprt->stat.connect_count++; 1545 xprt->stat.connect_start = jiffies; 1546 return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK); 1547 } 1548 1549 /** 1550 * xs_tcp_connect_worker4 - connect a TCP socket to a remote endpoint 1551 * @work: RPC transport to connect 1552 * 1553 * Invoked by a work queue tasklet. 1554 */ 1555 static void xs_tcp_connect_worker4(struct work_struct *work) 1556 { 1557 struct sock_xprt *transport = 1558 container_of(work, struct sock_xprt, connect_worker.work); 1559 struct rpc_xprt *xprt = &transport->xprt; 1560 struct socket *sock = transport->sock; 1561 int err, status = -EIO; 1562 1563 if (xprt->shutdown || !xprt_bound(xprt)) 1564 goto out; 1565 1566 if (!sock) { 1567 /* start from scratch */ 1568 if ((err = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) { 1569 dprintk("RPC: can't create TCP transport socket (%d).\n", -err); 1570 goto out; 1571 } 1572 xs_reclassify_socket4(sock); 1573 1574 if (xs_bind4(transport, sock) < 0) { 1575 sock_release(sock); 1576 goto out; 1577 } 1578 } else 1579 /* "close" the socket, preserving the local port */ 1580 xs_tcp_reuse_connection(xprt); 1581 1582 dprintk("RPC: worker connecting xprt %p to address: %s\n", 1583 xprt, xprt->address_strings[RPC_DISPLAY_ALL]); 1584 1585 status = xs_tcp_finish_connecting(xprt, sock); 1586 dprintk("RPC: %p connect status %d connected %d sock state %d\n", 1587 xprt, -status, xprt_connected(xprt), 1588 sock->sk->sk_state); 1589 if (status < 0) { 1590 switch (status) { 1591 case -EINPROGRESS: 1592 case -EALREADY: 1593 goto out_clear; 1594 case -ECONNREFUSED: 1595 case -ECONNRESET: 1596 /* retry with existing socket, after a delay */ 1597 break; 1598 default: 1599 /* get rid of existing socket, and retry */ 1600 xs_close(xprt); 1601 break; 1602 } 1603 } 1604 out: 1605 xprt_wake_pending_tasks(xprt, status); 1606 out_clear: 1607 xprt_clear_connecting(xprt); 1608 } 1609 1610 /** 1611 * xs_tcp_connect_worker6 - connect a TCP socket to a remote endpoint 1612 * @work: RPC transport to connect 1613 * 1614 * Invoked by a work queue tasklet. 1615 */ 1616 static void xs_tcp_connect_worker6(struct work_struct *work) 1617 { 1618 struct sock_xprt *transport = 1619 container_of(work, struct sock_xprt, connect_worker.work); 1620 struct rpc_xprt *xprt = &transport->xprt; 1621 struct socket *sock = transport->sock; 1622 int err, status = -EIO; 1623 1624 if (xprt->shutdown || !xprt_bound(xprt)) 1625 goto out; 1626 1627 if (!sock) { 1628 /* start from scratch */ 1629 if ((err = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) { 1630 dprintk("RPC: can't create TCP transport socket (%d).\n", -err); 1631 goto out; 1632 } 1633 xs_reclassify_socket6(sock); 1634 1635 if (xs_bind6(transport, sock) < 0) { 1636 sock_release(sock); 1637 goto out; 1638 } 1639 } else 1640 /* "close" the socket, preserving the local port */ 1641 xs_tcp_reuse_connection(xprt); 1642 1643 dprintk("RPC: worker connecting xprt %p to address: %s\n", 1644 xprt, xprt->address_strings[RPC_DISPLAY_ALL]); 1645 1646 status = xs_tcp_finish_connecting(xprt, sock); 1647 dprintk("RPC: %p connect status %d connected %d sock state %d\n", 1648 xprt, -status, xprt_connected(xprt), sock->sk->sk_state); 1649 if (status < 0) { 1650 switch (status) { 1651 case -EINPROGRESS: 1652 case -EALREADY: 1653 goto out_clear; 1654 case -ECONNREFUSED: 1655 case -ECONNRESET: 1656 /* retry with existing socket, after a delay */ 1657 break; 1658 default: 1659 /* get rid of existing socket, and retry */ 1660 xs_close(xprt); 1661 break; 1662 } 1663 } 1664 out: 1665 xprt_wake_pending_tasks(xprt, status); 1666 out_clear: 1667 xprt_clear_connecting(xprt); 1668 } 1669 1670 /** 1671 * xs_connect - connect a socket to a remote endpoint 1672 * @task: address of RPC task that manages state of connect request 1673 * 1674 * TCP: If the remote end dropped the connection, delay reconnecting. 1675 * 1676 * UDP socket connects are synchronous, but we use a work queue anyway 1677 * to guarantee that even unprivileged user processes can set up a 1678 * socket on a privileged port. 1679 * 1680 * If a UDP socket connect fails, the delay behavior here prevents 1681 * retry floods (hard mounts). 1682 */ 1683 static void xs_connect(struct rpc_task *task) 1684 { 1685 struct rpc_xprt *xprt = task->tk_xprt; 1686 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1687 1688 if (xprt_test_and_set_connecting(xprt)) 1689 return; 1690 1691 if (transport->sock != NULL) { 1692 dprintk("RPC: xs_connect delayed xprt %p for %lu " 1693 "seconds\n", 1694 xprt, xprt->reestablish_timeout / HZ); 1695 queue_delayed_work(rpciod_workqueue, 1696 &transport->connect_worker, 1697 xprt->reestablish_timeout); 1698 xprt->reestablish_timeout <<= 1; 1699 if (xprt->reestablish_timeout > XS_TCP_MAX_REEST_TO) 1700 xprt->reestablish_timeout = XS_TCP_MAX_REEST_TO; 1701 } else { 1702 dprintk("RPC: xs_connect scheduled xprt %p\n", xprt); 1703 queue_delayed_work(rpciod_workqueue, 1704 &transport->connect_worker, 0); 1705 } 1706 } 1707 1708 /** 1709 * xs_udp_print_stats - display UDP socket-specifc stats 1710 * @xprt: rpc_xprt struct containing statistics 1711 * @seq: output file 1712 * 1713 */ 1714 static void xs_udp_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) 1715 { 1716 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1717 1718 seq_printf(seq, "\txprt:\tudp %u %lu %lu %lu %lu %Lu %Lu\n", 1719 transport->port, 1720 xprt->stat.bind_count, 1721 xprt->stat.sends, 1722 xprt->stat.recvs, 1723 xprt->stat.bad_xids, 1724 xprt->stat.req_u, 1725 xprt->stat.bklog_u); 1726 } 1727 1728 /** 1729 * xs_tcp_print_stats - display TCP socket-specifc stats 1730 * @xprt: rpc_xprt struct containing statistics 1731 * @seq: output file 1732 * 1733 */ 1734 static void xs_tcp_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) 1735 { 1736 struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); 1737 long idle_time = 0; 1738 1739 if (xprt_connected(xprt)) 1740 idle_time = (long)(jiffies - xprt->last_used) / HZ; 1741 1742 seq_printf(seq, "\txprt:\ttcp %u %lu %lu %lu %ld %lu %lu %lu %Lu %Lu\n", 1743 transport->port, 1744 xprt->stat.bind_count, 1745 xprt->stat.connect_count, 1746 xprt->stat.connect_time, 1747 idle_time, 1748 xprt->stat.sends, 1749 xprt->stat.recvs, 1750 xprt->stat.bad_xids, 1751 xprt->stat.req_u, 1752 xprt->stat.bklog_u); 1753 } 1754 1755 static struct rpc_xprt_ops xs_udp_ops = { 1756 .set_buffer_size = xs_udp_set_buffer_size, 1757 .reserve_xprt = xprt_reserve_xprt_cong, 1758 .release_xprt = xprt_release_xprt_cong, 1759 .rpcbind = rpcb_getport_async, 1760 .set_port = xs_set_port, 1761 .connect = xs_connect, 1762 .buf_alloc = rpc_malloc, 1763 .buf_free = rpc_free, 1764 .send_request = xs_udp_send_request, 1765 .set_retrans_timeout = xprt_set_retrans_timeout_rtt, 1766 .timer = xs_udp_timer, 1767 .release_request = xprt_release_rqst_cong, 1768 .close = xs_close, 1769 .destroy = xs_destroy, 1770 .print_stats = xs_udp_print_stats, 1771 }; 1772 1773 static struct rpc_xprt_ops xs_tcp_ops = { 1774 .reserve_xprt = xprt_reserve_xprt, 1775 .release_xprt = xs_tcp_release_xprt, 1776 .rpcbind = rpcb_getport_async, 1777 .set_port = xs_set_port, 1778 .connect = xs_connect, 1779 .buf_alloc = rpc_malloc, 1780 .buf_free = rpc_free, 1781 .send_request = xs_tcp_send_request, 1782 .set_retrans_timeout = xprt_set_retrans_timeout_def, 1783 .close = xs_close, 1784 .destroy = xs_destroy, 1785 .print_stats = xs_tcp_print_stats, 1786 }; 1787 1788 static struct rpc_xprt *xs_setup_xprt(struct xprt_create *args, 1789 unsigned int slot_table_size) 1790 { 1791 struct rpc_xprt *xprt; 1792 struct sock_xprt *new; 1793 1794 if (args->addrlen > sizeof(xprt->addr)) { 1795 dprintk("RPC: xs_setup_xprt: address too large\n"); 1796 return ERR_PTR(-EBADF); 1797 } 1798 1799 new = kzalloc(sizeof(*new), GFP_KERNEL); 1800 if (new == NULL) { 1801 dprintk("RPC: xs_setup_xprt: couldn't allocate " 1802 "rpc_xprt\n"); 1803 return ERR_PTR(-ENOMEM); 1804 } 1805 xprt = &new->xprt; 1806 1807 xprt->max_reqs = slot_table_size; 1808 xprt->slot = kcalloc(xprt->max_reqs, sizeof(struct rpc_rqst), GFP_KERNEL); 1809 if (xprt->slot == NULL) { 1810 kfree(xprt); 1811 dprintk("RPC: xs_setup_xprt: couldn't allocate slot " 1812 "table\n"); 1813 return ERR_PTR(-ENOMEM); 1814 } 1815 1816 memcpy(&xprt->addr, args->dstaddr, args->addrlen); 1817 xprt->addrlen = args->addrlen; 1818 if (args->srcaddr) 1819 memcpy(&new->addr, args->srcaddr, args->addrlen); 1820 new->port = xs_get_random_port(); 1821 1822 return xprt; 1823 } 1824 1825 /** 1826 * xs_setup_udp - Set up transport to use a UDP socket 1827 * @args: rpc transport creation arguments 1828 * 1829 */ 1830 struct rpc_xprt *xs_setup_udp(struct xprt_create *args) 1831 { 1832 struct sockaddr *addr = args->dstaddr; 1833 struct rpc_xprt *xprt; 1834 struct sock_xprt *transport; 1835 1836 xprt = xs_setup_xprt(args, xprt_udp_slot_table_entries); 1837 if (IS_ERR(xprt)) 1838 return xprt; 1839 transport = container_of(xprt, struct sock_xprt, xprt); 1840 1841 xprt->prot = IPPROTO_UDP; 1842 xprt->tsh_size = 0; 1843 /* XXX: header size can vary due to auth type, IPv6, etc. */ 1844 xprt->max_payload = (1U << 16) - (MAX_HEADER << 3); 1845 1846 xprt->bind_timeout = XS_BIND_TO; 1847 xprt->connect_timeout = XS_UDP_CONN_TO; 1848 xprt->reestablish_timeout = XS_UDP_REEST_TO; 1849 xprt->idle_timeout = XS_IDLE_DISC_TO; 1850 1851 xprt->ops = &xs_udp_ops; 1852 1853 if (args->timeout) 1854 xprt->timeout = *args->timeout; 1855 else 1856 xprt_set_timeout(&xprt->timeout, 5, 5 * HZ); 1857 1858 switch (addr->sa_family) { 1859 case AF_INET: 1860 if (((struct sockaddr_in *)addr)->sin_port != htons(0)) 1861 xprt_set_bound(xprt); 1862 1863 INIT_DELAYED_WORK(&transport->connect_worker, 1864 xs_udp_connect_worker4); 1865 xs_format_ipv4_peer_addresses(xprt); 1866 break; 1867 case AF_INET6: 1868 if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) 1869 xprt_set_bound(xprt); 1870 1871 INIT_DELAYED_WORK(&transport->connect_worker, 1872 xs_udp_connect_worker6); 1873 xs_format_ipv6_peer_addresses(xprt); 1874 break; 1875 default: 1876 kfree(xprt); 1877 return ERR_PTR(-EAFNOSUPPORT); 1878 } 1879 1880 dprintk("RPC: set up transport to address %s\n", 1881 xprt->address_strings[RPC_DISPLAY_ALL]); 1882 1883 if (try_module_get(THIS_MODULE)) 1884 return xprt; 1885 1886 kfree(xprt->slot); 1887 kfree(xprt); 1888 return ERR_PTR(-EINVAL); 1889 } 1890 1891 /** 1892 * xs_setup_tcp - Set up transport to use a TCP socket 1893 * @args: rpc transport creation arguments 1894 * 1895 */ 1896 struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) 1897 { 1898 struct sockaddr *addr = args->dstaddr; 1899 struct rpc_xprt *xprt; 1900 struct sock_xprt *transport; 1901 1902 xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries); 1903 if (IS_ERR(xprt)) 1904 return xprt; 1905 transport = container_of(xprt, struct sock_xprt, xprt); 1906 1907 xprt->prot = IPPROTO_TCP; 1908 xprt->tsh_size = sizeof(rpc_fraghdr) / sizeof(u32); 1909 xprt->max_payload = RPC_MAX_FRAGMENT_SIZE; 1910 1911 xprt->bind_timeout = XS_BIND_TO; 1912 xprt->connect_timeout = XS_TCP_CONN_TO; 1913 xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO; 1914 xprt->idle_timeout = XS_IDLE_DISC_TO; 1915 1916 xprt->ops = &xs_tcp_ops; 1917 1918 if (args->timeout) 1919 xprt->timeout = *args->timeout; 1920 else 1921 xprt_set_timeout(&xprt->timeout, 2, 60 * HZ); 1922 1923 switch (addr->sa_family) { 1924 case AF_INET: 1925 if (((struct sockaddr_in *)addr)->sin_port != htons(0)) 1926 xprt_set_bound(xprt); 1927 1928 INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_connect_worker4); 1929 xs_format_ipv4_peer_addresses(xprt); 1930 break; 1931 case AF_INET6: 1932 if (((struct sockaddr_in6 *)addr)->sin6_port != htons(0)) 1933 xprt_set_bound(xprt); 1934 1935 INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_connect_worker6); 1936 xs_format_ipv6_peer_addresses(xprt); 1937 break; 1938 default: 1939 kfree(xprt); 1940 return ERR_PTR(-EAFNOSUPPORT); 1941 } 1942 1943 dprintk("RPC: set up transport to address %s\n", 1944 xprt->address_strings[RPC_DISPLAY_ALL]); 1945 1946 if (try_module_get(THIS_MODULE)) 1947 return xprt; 1948 1949 kfree(xprt->slot); 1950 kfree(xprt); 1951 return ERR_PTR(-EINVAL); 1952 } 1953 1954 static struct xprt_class xs_udp_transport = { 1955 .list = LIST_HEAD_INIT(xs_udp_transport.list), 1956 .name = "udp", 1957 .owner = THIS_MODULE, 1958 .family = AF_INET, 1959 .protocol = IPPROTO_UDP, 1960 .setup = xs_setup_udp, 1961 }; 1962 1963 static struct xprt_class xs_tcp_transport = { 1964 .list = LIST_HEAD_INIT(xs_tcp_transport.list), 1965 .name = "tcp", 1966 .owner = THIS_MODULE, 1967 .family = AF_INET, 1968 .protocol = IPPROTO_TCP, 1969 .setup = xs_setup_tcp, 1970 }; 1971 1972 /** 1973 * init_socket_xprt - set up xprtsock's sysctls, register with RPC client 1974 * 1975 */ 1976 int init_socket_xprt(void) 1977 { 1978 #ifdef RPC_DEBUG 1979 if (!sunrpc_table_header) 1980 sunrpc_table_header = register_sysctl_table(sunrpc_table); 1981 #endif 1982 1983 xprt_register_transport(&xs_udp_transport); 1984 xprt_register_transport(&xs_tcp_transport); 1985 1986 return 0; 1987 } 1988 1989 /** 1990 * cleanup_socket_xprt - remove xprtsock's sysctls, unregister 1991 * 1992 */ 1993 void cleanup_socket_xprt(void) 1994 { 1995 #ifdef RPC_DEBUG 1996 if (sunrpc_table_header) { 1997 unregister_sysctl_table(sunrpc_table_header); 1998 sunrpc_table_header = NULL; 1999 } 2000 #endif 2001 2002 xprt_unregister_transport(&xs_udp_transport); 2003 xprt_unregister_transport(&xs_tcp_transport); 2004 } 2005