diff options
Diffstat (limited to 'net/rxrpc/local_object.c')
| -rw-r--r-- | net/rxrpc/local_object.c | 57 | 
1 files changed, 42 insertions, 15 deletions
| diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c index 8b54e9531d52..b493e6b62740 100644 --- a/net/rxrpc/local_object.c +++ b/net/rxrpc/local_object.c @@ -134,22 +134,49 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)  		}  	} -	/* we want to receive ICMP errors */ -	opt = 1; -	ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR, -				(char *) &opt, sizeof(opt)); -	if (ret < 0) { -		_debug("setsockopt failed"); -		goto error; -	} +	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, +					(char *) &opt, sizeof(opt)); +		if (ret < 0) { +			_debug("setsockopt failed"); +			goto error; +		} -	/* we want to set the don't fragment bit */ -	opt = IP_PMTUDISC_DO; -	ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, -				(char *) &opt, sizeof(opt)); -	if (ret < 0) { -		_debug("setsockopt failed"); -		goto error; +		/* we want to set the don't fragment bit */ +		opt = IP_PMTUDISC_DO; +		ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, +					(char *) &opt, sizeof(opt)); +		if (ret < 0) { +			_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 */ |