tcp_ipv4.c (d819524d3144f4703f45f473fdc85ad7579ae94c) tcp_ipv4.c (08eaef90403110e51861d93e8008a355af467bbe)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * INET An implementation of the TCP/IP protocol suite for the LINUX
4 * operating system. INET is implemented using the BSD Socket
5 * interface as the means of communication with the user level.
6 *
7 * Implementation of the Transmission Control Protocol(TCP).
8 *

--- 185 unchanged lines hidden (view full) ---

194 sock_owned_by_me(sk);
195
196 return BPF_CGROUP_RUN_PROG_INET4_CONNECT(sk, uaddr);
197}
198
199/* This will initiate an outgoing connection. */
200int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
201{
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * INET An implementation of the TCP/IP protocol suite for the LINUX
4 * operating system. INET is implemented using the BSD Socket
5 * interface as the means of communication with the user level.
6 *
7 * Implementation of the Transmission Control Protocol(TCP).
8 *

--- 185 unchanged lines hidden (view full) ---

194 sock_owned_by_me(sk);
195
196 return BPF_CGROUP_RUN_PROG_INET4_CONNECT(sk, uaddr);
197}
198
199/* This will initiate an outgoing connection. */
200int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
201{
202 struct inet_bind_hashbucket *prev_addr_hashbucket = NULL;
202 struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;
203 struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;
204 struct inet_timewait_death_row *tcp_death_row;
205 __be32 daddr, nexthop, prev_sk_rcv_saddr;
203 struct inet_sock *inet = inet_sk(sk);
204 struct tcp_sock *tp = tcp_sk(sk);
206 struct inet_sock *inet = inet_sk(sk);
207 struct tcp_sock *tp = tcp_sk(sk);
208 struct ip_options_rcu *inet_opt;
209 struct net *net = sock_net(sk);
205 __be16 orig_sport, orig_dport;
210 __be16 orig_sport, orig_dport;
206 __be32 daddr, nexthop;
207 struct flowi4 *fl4;
208 struct rtable *rt;
209 int err;
211 struct flowi4 *fl4;
212 struct rtable *rt;
213 int err;
210 struct ip_options_rcu *inet_opt;
211 struct inet_timewait_death_row *tcp_death_row = sock_net(sk)->ipv4.tcp_death_row;
212
213 if (addr_len < sizeof(struct sockaddr_in))
214 return -EINVAL;
215
216 if (usin->sin_family != AF_INET)
217 return -EAFNOSUPPORT;
218
219 nexthop = daddr = usin->sin_addr.s_addr;

--- 9 unchanged lines hidden (view full) ---

229 orig_dport = usin->sin_port;
230 fl4 = &inet->cork.fl.u.ip4;
231 rt = ip_route_connect(fl4, nexthop, inet->inet_saddr,
232 sk->sk_bound_dev_if, IPPROTO_TCP, orig_sport,
233 orig_dport, sk);
234 if (IS_ERR(rt)) {
235 err = PTR_ERR(rt);
236 if (err == -ENETUNREACH)
214
215 if (addr_len < sizeof(struct sockaddr_in))
216 return -EINVAL;
217
218 if (usin->sin_family != AF_INET)
219 return -EAFNOSUPPORT;
220
221 nexthop = daddr = usin->sin_addr.s_addr;

--- 9 unchanged lines hidden (view full) ---

231 orig_dport = usin->sin_port;
232 fl4 = &inet->cork.fl.u.ip4;
233 rt = ip_route_connect(fl4, nexthop, inet->inet_saddr,
234 sk->sk_bound_dev_if, IPPROTO_TCP, orig_sport,
235 orig_dport, sk);
236 if (IS_ERR(rt)) {
237 err = PTR_ERR(rt);
238 if (err == -ENETUNREACH)
237 IP_INC_STATS(sock_net(sk), IPSTATS_MIB_OUTNOROUTES);
239 IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);
238 return err;
239 }
240
241 if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) {
242 ip_rt_put(rt);
243 return -ENETUNREACH;
244 }
245
246 if (!inet_opt || !inet_opt->opt.srr)
247 daddr = fl4->daddr;
248
240 return err;
241 }
242
243 if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) {
244 ip_rt_put(rt);
245 return -ENETUNREACH;
246 }
247
248 if (!inet_opt || !inet_opt->opt.srr)
249 daddr = fl4->daddr;
250
249 if (!inet->inet_saddr)
251 if (!inet->inet_saddr) {
252 if (inet_csk(sk)->icsk_bind2_hash) {
253 prev_addr_hashbucket = inet_bhashfn_portaddr(&tcp_hashinfo,
254 sk, net, inet->inet_num);
255 prev_sk_rcv_saddr = sk->sk_rcv_saddr;
256 }
250 inet->inet_saddr = fl4->saddr;
257 inet->inet_saddr = fl4->saddr;
258 }
259
251 sk_rcv_saddr_set(sk, inet->inet_saddr);
252
260 sk_rcv_saddr_set(sk, inet->inet_saddr);
261
262 if (prev_addr_hashbucket) {
263 err = inet_bhash2_update_saddr(prev_addr_hashbucket, sk);
264 if (err) {
265 inet->inet_saddr = 0;
266 sk_rcv_saddr_set(sk, prev_sk_rcv_saddr);
267 ip_rt_put(rt);
268 return err;
269 }
270 }
271
253 if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) {
254 /* Reset inherited state */
255 tp->rx_opt.ts_recent = 0;
256 tp->rx_opt.ts_recent_stamp = 0;
257 if (likely(!tp->repair))
258 WRITE_ONCE(tp->write_seq, 0);
259 }
260

--- 7 unchanged lines hidden (view full) ---

268 tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT;
269
270 /* Socket identity is still unknown (sport may be zero).
271 * However we set state to SYN-SENT and not releasing socket
272 * lock select source port, enter ourselves into the hash tables and
273 * complete initialization after this.
274 */
275 tcp_set_state(sk, TCP_SYN_SENT);
272 if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) {
273 /* Reset inherited state */
274 tp->rx_opt.ts_recent = 0;
275 tp->rx_opt.ts_recent_stamp = 0;
276 if (likely(!tp->repair))
277 WRITE_ONCE(tp->write_seq, 0);
278 }
279

--- 7 unchanged lines hidden (view full) ---

287 tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT;
288
289 /* Socket identity is still unknown (sport may be zero).
290 * However we set state to SYN-SENT and not releasing socket
291 * lock select source port, enter ourselves into the hash tables and
292 * complete initialization after this.
293 */
294 tcp_set_state(sk, TCP_SYN_SENT);
295 tcp_death_row = net->ipv4.tcp_death_row;
276 err = inet_hash_connect(tcp_death_row, sk);
277 if (err)
278 goto failure;
279
280 sk_set_txhash(sk);
281
282 rt = ip_route_newports(fl4, rt, orig_sport, orig_dport,
283 inet->inet_sport, inet->inet_dport, sk);

--- 9 unchanged lines hidden (view full) ---

293
294 if (likely(!tp->repair)) {
295 if (!tp->write_seq)
296 WRITE_ONCE(tp->write_seq,
297 secure_tcp_seq(inet->inet_saddr,
298 inet->inet_daddr,
299 inet->inet_sport,
300 usin->sin_port));
296 err = inet_hash_connect(tcp_death_row, sk);
297 if (err)
298 goto failure;
299
300 sk_set_txhash(sk);
301
302 rt = ip_route_newports(fl4, rt, orig_sport, orig_dport,
303 inet->inet_sport, inet->inet_dport, sk);

--- 9 unchanged lines hidden (view full) ---

313
314 if (likely(!tp->repair)) {
315 if (!tp->write_seq)
316 WRITE_ONCE(tp->write_seq,
317 secure_tcp_seq(inet->inet_saddr,
318 inet->inet_daddr,
319 inet->inet_sport,
320 usin->sin_port));
301 tp->tsoffset = secure_tcp_ts_off(sock_net(sk),
302 inet->inet_saddr,
321 tp->tsoffset = secure_tcp_ts_off(net, inet->inet_saddr,
303 inet->inet_daddr);
304 }
305
306 inet->inet_id = prandom_u32();
307
308 if (tcp_fastopen_defer_connect(sk, &err))
309 return err;
310 if (err)

--- 2071 unchanged lines hidden (view full) ---

2382 spin_unlock_bh(lock);
2383 }
2384
2385 return NULL;
2386}
2387
2388static void *established_get_next(struct seq_file *seq, void *cur)
2389{
322 inet->inet_daddr);
323 }
324
325 inet->inet_id = prandom_u32();
326
327 if (tcp_fastopen_defer_connect(sk, &err))
328 return err;
329 if (err)

--- 2071 unchanged lines hidden (view full) ---

2401 spin_unlock_bh(lock);
2402 }
2403
2404 return NULL;
2405}
2406
2407static void *established_get_next(struct seq_file *seq, void *cur)
2408{
2390 struct sock *sk = cur;
2391 struct hlist_nulls_node *node;
2392 struct tcp_iter_state *st = seq->private;
2409 struct tcp_iter_state *st = seq->private;
2410 struct hlist_nulls_node *node;
2411 struct sock *sk = cur;
2393
2394 ++st->num;
2395 ++st->offset;
2396
2397 sk = sk_nulls_next(sk);
2398
2399 sk_nulls_for_each_from(sk, node) {
2400 if (seq_sk_match(seq, sk))

--- 894 unchanged lines hidden ---
2412
2413 ++st->num;
2414 ++st->offset;
2415
2416 sk = sk_nulls_next(sk);
2417
2418 sk_nulls_for_each_from(sk, node) {
2419 if (seq_sk_match(seq, sk))

--- 894 unchanged lines hidden ---