Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv4: add ip_sock_set_mtu_discover

Add a helper to directly set the IP_MTU_DISCOVER sockopt from kernel
space without going through a fake uaccess.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: David Howells <dhowells@redhat.com> [rxrpc bits]
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Christoph Hellwig and committed by
David S. Miller
2de569bd db45c0ef

+18 -16
+1
include/net/ip.h
··· 766 766 } 767 767 768 768 void ip_sock_set_freebind(struct sock *sk); 769 + int ip_sock_set_mtu_discover(struct sock *sk, int val); 769 770 void ip_sock_set_recverr(struct sock *sk); 770 771 void ip_sock_set_tos(struct sock *sk, int val); 771 772
+11
net/ipv4/ip_sockglue.c
··· 597 597 } 598 598 EXPORT_SYMBOL(ip_sock_set_recverr); 599 599 600 + int ip_sock_set_mtu_discover(struct sock *sk, int val) 601 + { 602 + if (val < IP_PMTUDISC_DONT || val > IP_PMTUDISC_OMIT) 603 + return -EINVAL; 604 + lock_sock(sk); 605 + inet_sk(sk)->pmtudisc = val; 606 + release_sock(sk); 607 + return 0; 608 + } 609 + EXPORT_SYMBOL(ip_sock_set_mtu_discover); 610 + 600 611 /* 601 612 * Socket option code for IP. This is the end of the line after any 602 613 * TCP,UDP etc options on an IP socket.
+1 -7
net/rxrpc/local_object.c
··· 174 174 ip_sock_set_recverr(local->socket->sk); 175 175 176 176 /* we want to set the don't fragment bit */ 177 - opt = IP_PMTUDISC_DO; 178 - ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, 179 - (char *) &opt, sizeof(opt)); 180 - if (ret < 0) { 181 - _debug("setsockopt failed"); 182 - goto error; 183 - } 177 + ip_sock_set_mtu_discover(local->socket->sk, IP_PMTUDISC_DO); 184 178 185 179 /* We want receive timestamps. */ 186 180 sock_enable_timestamps(local->socket->sk);
+5 -9
net/rxrpc/output.c
··· 321 321 struct kvec iov[2]; 322 322 rxrpc_serial_t serial; 323 323 size_t len; 324 - int ret, opt; 324 + int ret; 325 325 326 326 _enter(",{%d}", skb->len); 327 327 ··· 473 473 switch (conn->params.local->srx.transport.family) { 474 474 case AF_INET6: 475 475 case AF_INET: 476 - opt = IP_PMTUDISC_DONT; 477 - kernel_setsockopt(conn->params.local->socket, 478 - SOL_IP, IP_MTU_DISCOVER, 479 - (char *)&opt, sizeof(opt)); 476 + ip_sock_set_mtu_discover(conn->params.local->socket->sk, 477 + IP_PMTUDISC_DONT); 480 478 ret = kernel_sendmsg(conn->params.local->socket, &msg, 481 479 iov, 2, len); 482 480 conn->params.peer->last_tx_at = ktime_get_seconds(); 483 481 484 - opt = IP_PMTUDISC_DO; 485 - kernel_setsockopt(conn->params.local->socket, 486 - SOL_IP, IP_MTU_DISCOVER, 487 - (char *)&opt, sizeof(opt)); 482 + ip_sock_set_mtu_discover(conn->params.local->socket->sk, 483 + IP_PMTUDISC_DO); 488 484 break; 489 485 490 486 default: