diff options
Diffstat (limited to 'net/rxrpc/local_object.c')
| -rw-r--r-- | net/rxrpc/local_object.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c index 777c3ed4cfc0..94d234e9c685 100644 --- a/net/rxrpc/local_object.c +++ b/net/rxrpc/local_object.c | |||
| @@ -135,10 +135,10 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) | |||
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | switch (local->srx.transport.family) { | 137 | switch (local->srx.transport.family) { |
| 138 | case AF_INET: | 138 | case AF_INET6: |
| 139 | /* we want to receive ICMP errors */ | 139 | /* we want to receive ICMPv6 errors */ |
| 140 | opt = 1; | 140 | opt = 1; |
| 141 | ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR, | 141 | ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR, |
| 142 | (char *) &opt, sizeof(opt)); | 142 | (char *) &opt, sizeof(opt)); |
| 143 | if (ret < 0) { | 143 | if (ret < 0) { |
| 144 | _debug("setsockopt failed"); | 144 | _debug("setsockopt failed"); |
| @@ -146,19 +146,22 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) | |||
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | /* we want to set the don't fragment bit */ | 148 | /* we want to set the don't fragment bit */ |
| 149 | opt = IP_PMTUDISC_DO; | 149 | opt = IPV6_PMTUDISC_DO; |
| 150 | ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, | 150 | ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER, |
| 151 | (char *) &opt, sizeof(opt)); | 151 | (char *) &opt, sizeof(opt)); |
| 152 | if (ret < 0) { | 152 | if (ret < 0) { |
| 153 | _debug("setsockopt failed"); | 153 | _debug("setsockopt failed"); |
| 154 | goto error; | 154 | goto error; |
| 155 | } | 155 | } |
| 156 | break; | ||
| 157 | 156 | ||
| 158 | case AF_INET6: | 157 | /* Fall through and set IPv4 options too otherwise we don't get |
| 158 | * errors from IPv4 packets sent through the IPv6 socket. | ||
| 159 | */ | ||
| 160 | |||
| 161 | case AF_INET: | ||
| 159 | /* we want to receive ICMP errors */ | 162 | /* we want to receive ICMP errors */ |
| 160 | opt = 1; | 163 | opt = 1; |
| 161 | ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_RECVERR, | 164 | ret = kernel_setsockopt(local->socket, SOL_IP, IP_RECVERR, |
| 162 | (char *) &opt, sizeof(opt)); | 165 | (char *) &opt, sizeof(opt)); |
| 163 | if (ret < 0) { | 166 | if (ret < 0) { |
| 164 | _debug("setsockopt failed"); | 167 | _debug("setsockopt failed"); |
| @@ -166,13 +169,22 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net) | |||
| 166 | } | 169 | } |
| 167 | 170 | ||
| 168 | /* we want to set the don't fragment bit */ | 171 | /* we want to set the don't fragment bit */ |
| 169 | opt = IPV6_PMTUDISC_DO; | 172 | opt = IP_PMTUDISC_DO; |
| 170 | ret = kernel_setsockopt(local->socket, SOL_IPV6, IPV6_MTU_DISCOVER, | 173 | ret = kernel_setsockopt(local->socket, SOL_IP, IP_MTU_DISCOVER, |
| 171 | (char *) &opt, sizeof(opt)); | 174 | (char *) &opt, sizeof(opt)); |
| 172 | if (ret < 0) { | 175 | if (ret < 0) { |
| 173 | _debug("setsockopt failed"); | 176 | _debug("setsockopt failed"); |
| 174 | goto error; | 177 | goto error; |
| 175 | } | 178 | } |
| 179 | |||
| 180 | /* We want receive timestamps. */ | ||
| 181 | opt = 1; | ||
| 182 | ret = kernel_setsockopt(local->socket, SOL_SOCKET, SO_TIMESTAMPNS, | ||
| 183 | (char *)&opt, sizeof(opt)); | ||
| 184 | if (ret < 0) { | ||
| 185 | _debug("setsockopt failed"); | ||
| 186 | goto error; | ||
| 187 | } | ||
| 176 | break; | 188 | break; |
| 177 | 189 | ||
| 178 | default: | 190 | default: |
