Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f2aeed3a authored by David Howells's avatar David Howells
Browse files

rxrpc: Fix error reception on AF_INET6 sockets



AF_RXRPC tries to turn on IP_RECVERR and IP_MTU_DISCOVER on the UDP socket
it just opened for communications with the outside world, regardless of the
type of socket.  Unfortunately, this doesn't work with an AF_INET6 socket.

Fix this by turning on IPV6_RECVERR and IPV6_MTU_DISCOVER instead if the
socket is of the AF_INET6 family.

Without this, kAFS server and address rotation doesn't work correctly
because the algorithm doesn't detect received network errors.

Fixes: 75b54cb5 ("rxrpc: Add IPv6 support")
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent c54e43d7
Loading
Loading
Loading
Loading
+42 −15
Original line number Diff line number Diff line
@@ -134,6 +134,8 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
		}
	}

	switch (local->srx.transport.family) {
	case AF_INET:
		/* we want to receive ICMP errors */
		opt = 1;
		ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR,
@@ -151,6 +153,31 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
			_debug("setsockopt failed");
			goto error;
		}
		break;

	case AF_INET6:
		/* we want to receive ICMP errors */
		opt = 1;
		ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR,
					(char *) &opt, sizeof(opt));
		if (ret < 0) {
			_debug("setsockopt failed");
			goto error;
		}

		/* we want to set the don't fragment bit */
		opt = IPV6_PMTUDISC_DO;
		ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER,
					(char *) &opt, sizeof(opt));
		if (ret < 0) {
			_debug("setsockopt failed");
			goto error;
		}
		break;

	default:
		BUG();
	}

	/* set the socket up */
	sock = local->socket->sk;