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 --- |