aboutsummaryrefslogtreecommitdiffstats
path: root/net/rxrpc/local_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/rxrpc/local_object.c')
-rw-r--r--net/rxrpc/local_object.c32
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: