|
@@ -135,10 +135,10 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
|
|
}
|
|
}
|
|
|
|
|
|
switch (local->srx.transport.family) {
|
|
switch (local->srx.transport.family) {
|
|
- case AF_INET:
|
|
|
|
- /* we want to receive ICMP errors */
|
|
|
|
|
|
+ case AF_INET6:
|
|
|
|
+ /* we want to receive ICMPv6 errors */
|
|
opt = 1;
|
|
opt = 1;
|
|
- ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR,
|
|
|
|
|
|
+ ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR,
|
|
(char *) &opt, sizeof(opt));
|
|
(char *) &opt, sizeof(opt));
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
_debug("setsockopt failed");
|
|
_debug("setsockopt failed");
|
|
@@ -146,19 +146,22 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
|
|
}
|
|
}
|
|
|
|
|
|
/* we want to set the don't fragment bit */
|
|
/* we want to set the don't fragment bit */
|
|
- opt = IP_PMTUDISC_DO;
|
|
|
|
- ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER,
|
|
|
|
|
|
+ opt = IPV6_PMTUDISC_DO;
|
|
|
|
+ ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER,
|
|
(char *) &opt, sizeof(opt));
|
|
(char *) &opt, sizeof(opt));
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
_debug("setsockopt failed");
|
|
_debug("setsockopt failed");
|
|
goto error;
|
|
goto error;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
|
|
|
|
- case AF_INET6:
|
|
|
|
|
|
+ /* Fall through and set IPv4 options too otherwise we don't get
|
|
|
|
+ * errors from IPv4 packets sent through the IPv6 socket.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ case AF_INET:
|
|
/* we want to receive ICMP errors */
|
|
/* we want to receive ICMP errors */
|
|
opt = 1;
|
|
opt = 1;
|
|
- ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR,
|
|
|
|
|
|
+ ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR,
|
|
(char *) &opt, sizeof(opt));
|
|
(char *) &opt, sizeof(opt));
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
_debug("setsockopt failed");
|
|
_debug("setsockopt failed");
|
|
@@ -166,8 +169,8 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
|
|
}
|
|
}
|
|
|
|
|
|
/* we want to set the don't fragment bit */
|
|
/* we want to set the don't fragment bit */
|
|
- opt = IPV6_PMTUDISC_DO;
|
|
|
|
- ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER,
|
|
|
|
|
|
+ opt = IP_PMTUDISC_DO;
|
|
|
|
+ ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER,
|
|
(char *) &opt, sizeof(opt));
|
|
(char *) &opt, sizeof(opt));
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
_debug("setsockopt failed");
|
|
_debug("setsockopt failed");
|