Lines Matching refs:subflow
347 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_prep_synack() local
355 mptcp_fastopen_subflow_synack_set_params(subflow, req); in subflow_prep_synack()
414 static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow) in subflow_thmac_valid() argument
419 subflow_generate_hmac(subflow->remote_key, subflow->local_key, in subflow_thmac_valid()
420 subflow->remote_nonce, subflow->local_nonce, in subflow_thmac_valid()
425 subflow, subflow->token, thmac, subflow->thmac); in subflow_thmac_valid()
427 return thmac == subflow->thmac; in subflow_thmac_valid()
432 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_reset() local
433 struct sock *sk = subflow->conn; in mptcp_subflow_reset()
459 struct mptcp_subflow_context *subflow; in __mptcp_sync_state() local
463 subflow = mptcp_subflow_ctx(ssk); in __mptcp_sync_state()
470 WRITE_ONCE(msk->write_seq, subflow->idsn + 1); in __mptcp_sync_state()
478 struct mptcp_subflow_context *subflow, in subflow_set_remote_key() argument
484 if (subflow->remote_key_valid) in subflow_set_remote_key()
487 subflow->remote_key_valid = 1; in subflow_set_remote_key()
488 subflow->remote_key = mp_opt->sndr_key; in subflow_set_remote_key()
489 mptcp_crypto_key_sha(subflow->remote_key, NULL, &subflow->iasn); in subflow_set_remote_key()
490 subflow->iasn++; in subflow_set_remote_key()
493 subflow->map_seq = subflow->iasn; in subflow_set_remote_key()
495 WRITE_ONCE(msk->remote_key, subflow->remote_key); in subflow_set_remote_key()
496 WRITE_ONCE(msk->ack_seq, subflow->iasn); in subflow_set_remote_key()
498 atomic64_set(&msk->rcv_wnd_sent, subflow->iasn); in subflow_set_remote_key()
502 struct mptcp_subflow_context *subflow, in mptcp_propagate_state() argument
512 WRITE_ONCE(msk->snd_una, subflow->idsn + 1); in mptcp_propagate_state()
513 WRITE_ONCE(msk->wnd_end, subflow->idsn + 1 + tcp_sk(ssk)->snd_wnd); in mptcp_propagate_state()
514 subflow_set_remote_key(msk, subflow, mp_opt); in mptcp_propagate_state()
528 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_finish_connect() local
530 struct sock *parent = subflow->conn; in subflow_finish_connect()
533 subflow->icsk_af_ops->sk_rx_dst_set(sk, skb); in subflow_finish_connect()
536 if (subflow->conn_finished) in subflow_finish_connect()
540 subflow->rel_write_seq = 1; in subflow_finish_connect()
541 subflow->conn_finished = 1; in subflow_finish_connect()
542 subflow->ssn_offset = TCP_SKB_CB(skb)->seq; in subflow_finish_connect()
543 pr_debug("subflow=%p synack seq=%x\n", subflow, subflow->ssn_offset); in subflow_finish_connect()
546 if (subflow->request_mptcp) { in subflow_finish_connect()
562 subflow->mp_capable = 1; in subflow_finish_connect()
566 mptcp_propagate_state(parent, sk, subflow, &mp_opt); in subflow_finish_connect()
567 } else if (subflow->request_join) { in subflow_finish_connect()
571 subflow->reset_reason = MPTCP_RST_EMPTCP; in subflow_finish_connect()
575 subflow->backup = mp_opt.backup; in subflow_finish_connect()
576 subflow->thmac = mp_opt.thmac; in subflow_finish_connect()
577 subflow->remote_nonce = mp_opt.nonce; in subflow_finish_connect()
578 WRITE_ONCE(subflow->remote_id, mp_opt.join_id); in subflow_finish_connect()
580 subflow, subflow->thmac, subflow->remote_nonce, in subflow_finish_connect()
581 subflow->backup); in subflow_finish_connect()
583 if (!subflow_thmac_valid(subflow)) { in subflow_finish_connect()
585 subflow->reset_reason = MPTCP_RST_EMPTCP; in subflow_finish_connect()
592 subflow_generate_hmac(subflow->local_key, subflow->remote_key, in subflow_finish_connect()
593 subflow->local_nonce, in subflow_finish_connect()
594 subflow->remote_nonce, in subflow_finish_connect()
596 memcpy(subflow->hmac, hmac, MPTCPOPT_HMAC_LEN); in subflow_finish_connect()
598 subflow->mp_join = 1; in subflow_finish_connect()
601 if (subflow->backup) in subflow_finish_connect()
612 if (subflow->mpc_drop) in subflow_finish_connect()
615 mptcp_propagate_state(parent, sk, subflow, NULL); in subflow_finish_connect()
620 subflow->reset_transient = 0; in subflow_finish_connect()
624 static void subflow_set_local_id(struct mptcp_subflow_context *subflow, int local_id) in subflow_set_local_id() argument
627 WRITE_ONCE(subflow->local_id, local_id); in subflow_set_local_id()
632 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_chk_local_id() local
633 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in subflow_chk_local_id()
636 if (likely(subflow->local_id >= 0)) in subflow_chk_local_id()
643 subflow_set_local_id(subflow, err); in subflow_chk_local_id()
644 subflow->request_bkup = mptcp_pm_is_backup(msk, (struct sock_common *)sk); in subflow_chk_local_id()
676 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_v4_conn_request() local
678 pr_debug("subflow=%p\n", subflow); in subflow_v4_conn_request()
707 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_v6_conn_request() local
709 pr_debug("subflow=%p\n", subflow); in subflow_v6_conn_request()
798 struct mptcp_subflow_context *subflow, in __mptcp_subflow_fully_established() argument
801 subflow_set_remote_key(msk, subflow, mp_opt); in __mptcp_subflow_fully_established()
802 WRITE_ONCE(subflow->fully_established, true); in __mptcp_subflow_fully_established()
938 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(child); in subflow_syn_recv_sock() local
940 subflow_add_reset_reason(skb, subflow->reset_reason); in subflow_syn_recv_sock()
988 static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn) in dbg_bad_map() argument
991 ssn, subflow->map_subflow_seq, subflow->map_data_len); in dbg_bad_map()
996 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in skb_is_fully_mapped() local
1005 return skb->len - skb_consumed <= subflow->map_data_len - in skb_is_fully_mapped()
1006 mptcp_subflow_get_map_offset(subflow); in skb_is_fully_mapped()
1011 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in validate_mapping() local
1012 u32 ssn = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; in validate_mapping()
1014 if (unlikely(before(ssn, subflow->map_subflow_seq))) { in validate_mapping()
1018 dbg_bad_map(subflow, ssn); in validate_mapping()
1021 if (unlikely(!before(ssn, subflow->map_subflow_seq + in validate_mapping()
1022 subflow->map_data_len))) { in validate_mapping()
1024 dbg_bad_map(subflow, ssn); in validate_mapping()
1033 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in validate_data_csum() local
1042 if (subflow->map_csum_len == subflow->map_data_len) in validate_data_csum()
1050 delta = subflow->map_data_len - subflow->map_csum_len; in validate_data_csum()
1052 seq = tcp_sk(ssk)->copied_seq + subflow->map_csum_len; in validate_data_csum()
1063 subflow->map_data_csum = csum_block_add(subflow->map_data_csum, csum, in validate_data_csum()
1064 subflow->map_csum_len); in validate_data_csum()
1067 subflow->map_csum_len += len; in validate_data_csum()
1096 csum = __mptcp_make_csum(subflow->map_seq, in validate_data_csum()
1097 subflow->map_subflow_seq, in validate_data_csum()
1098 subflow->map_data_len + subflow->map_data_fin, in validate_data_csum()
1099 subflow->map_data_csum); in validate_data_csum()
1105 subflow->valid_csum_seen = 1; in validate_data_csum()
1112 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in get_mapping_status() local
1128 if (!subflow->map_valid && !skb->len) { in get_mapping_status()
1143 if (!subflow->map_valid) in get_mapping_status()
1165 if (subflow->map_valid) { in get_mapping_status()
1198 WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64); in get_mapping_status()
1200 if (subflow->map_valid) { in get_mapping_status()
1202 if (subflow->map_seq == map_seq && in get_mapping_status()
1203 subflow->map_subflow_seq == mpext->subflow_seq && in get_mapping_status()
1204 subflow->map_data_len == data_len && in get_mapping_status()
1205 subflow->map_csum_reqd == mpext->csum_reqd) { in get_mapping_status()
1222 subflow->map_seq = map_seq; in get_mapping_status()
1223 subflow->map_subflow_seq = mpext->subflow_seq; in get_mapping_status()
1224 subflow->map_data_len = data_len; in get_mapping_status()
1225 subflow->map_valid = 1; in get_mapping_status()
1226 subflow->map_data_fin = mpext->data_fin; in get_mapping_status()
1227 subflow->mpc_map = mpext->mpc_map; in get_mapping_status()
1228 subflow->map_csum_reqd = mpext->csum_reqd; in get_mapping_status()
1229 subflow->map_csum_len = 0; in get_mapping_status()
1230 subflow->map_data_csum = csum_unfold(mpext->csum); in get_mapping_status()
1233 if (unlikely(subflow->map_csum_reqd != csum_reqd)) in get_mapping_status()
1237 subflow->map_seq, subflow->map_subflow_seq, in get_mapping_status()
1238 subflow->map_data_len, subflow->map_csum_reqd, in get_mapping_status()
1239 subflow->map_data_csum); in get_mapping_status()
1259 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_discard_data() local
1272 offset, subflow->map_subflow_seq); in mptcp_subflow_discard_data()
1279 if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) in mptcp_subflow_discard_data()
1280 subflow->map_valid = 0; in mptcp_subflow_discard_data()
1291 const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in subflow_sched_work_if_closed() local
1310 mptcp_update_rcv_data_fin(msk, subflow->map_seq + in subflow_sched_work_if_closed()
1311 subflow->map_data_len, true)) in subflow_sched_work_if_closed()
1317 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_fail() local
1345 WRITE_ONCE(subflow->fail_tout, fail_tout); in mptcp_subflow_fail()
1348 mptcp_reset_tout_timer(msk, subflow->fail_tout); in mptcp_subflow_fail()
1354 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in subflow_check_data_avail() local
1360 WRITE_ONCE(subflow->data_avail, false); in subflow_check_data_avail()
1361 if (subflow->data_avail) in subflow_check_data_avail()
1364 msk = mptcp_sk(subflow->conn); in subflow_check_data_avail()
1386 ack_seq = mptcp_subflow_get_mapped_dsn(subflow); in subflow_check_data_avail()
1394 WRITE_ONCE(subflow->data_avail, true); in subflow_check_data_avail()
1407 (subflow->mp_join || subflow->valid_csum_seen)) { in subflow_check_data_avail()
1408 subflow->send_mp_fail = 1; in subflow_check_data_avail()
1411 subflow->reset_transient = 0; in subflow_check_data_avail()
1412 subflow->reset_reason = MPTCP_RST_EMIDDLEBOX; in subflow_check_data_avail()
1415 WRITE_ONCE(subflow->data_avail, true); in subflow_check_data_avail()
1423 subflow->reset_transient = 0; in subflow_check_data_avail()
1424 subflow->reset_reason = status == MAPPING_NODSS ? in subflow_check_data_avail()
1434 WRITE_ONCE(subflow->data_avail, false); in subflow_check_data_avail()
1440 subflow->map_valid = 1; in subflow_check_data_avail()
1441 subflow->map_data_len = skb->len; in subflow_check_data_avail()
1442 subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; in subflow_check_data_avail()
1443 subflow->map_seq = __mptcp_expand_seq(subflow->map_seq, in subflow_check_data_avail()
1444 subflow->iasn + in subflow_check_data_avail()
1446 subflow->ssn_offset - 1); in subflow_check_data_avail()
1447 WRITE_ONCE(subflow->data_avail, true); in subflow_check_data_avail()
1453 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in mptcp_subflow_data_available() local
1456 if (subflow->map_valid && in mptcp_subflow_data_available()
1457 mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) { in mptcp_subflow_data_available()
1458 subflow->map_valid = 0; in mptcp_subflow_data_available()
1459 WRITE_ONCE(subflow->data_avail, false); in mptcp_subflow_data_available()
1462 subflow->map_subflow_seq, in mptcp_subflow_data_available()
1463 subflow->map_data_len); in mptcp_subflow_data_available()
1480 const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_space() local
1481 const struct sock *sk = subflow->conn; in mptcp_space()
1508 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_data_ready() local
1510 struct sock *parent = subflow->conn; in subflow_data_ready()
1527 WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable && in subflow_data_ready()
1528 !subflow->mp_join && !(state & TCPF_CLOSE)); in subflow_data_ready()
1565 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in mptcpv6_handle_mapped() local
1572 subflow, sk->sk_family, icsk->icsk_af_ops, target, mapped); in mptcpv6_handle_mapped()
1577 subflow->icsk_af_ops = icsk->icsk_af_ops; in mptcpv6_handle_mapped()
1617 struct mptcp_subflow_context *subflow; in __mptcp_subflow_connect() local
1640 subflow = mptcp_subflow_ctx(ssk); in __mptcp_subflow_connect()
1642 get_random_bytes(&subflow->local_nonce, sizeof(u32)); in __mptcp_subflow_connect()
1643 } while (!subflow->local_nonce); in __mptcp_subflow_connect()
1657 subflow_set_local_id(subflow, local_id); in __mptcp_subflow_connect()
1659 subflow->remote_key_valid = 1; in __mptcp_subflow_connect()
1660 subflow->remote_key = READ_ONCE(msk->remote_key); in __mptcp_subflow_connect()
1661 subflow->local_key = READ_ONCE(msk->local_key); in __mptcp_subflow_connect()
1662 subflow->token = msk->token; in __mptcp_subflow_connect()
1679 mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL); in __mptcp_subflow_connect()
1682 subflow->remote_token = remote_token; in __mptcp_subflow_connect()
1683 WRITE_ONCE(subflow->remote_id, remote_id); in __mptcp_subflow_connect()
1684 subflow->request_join = 1; in __mptcp_subflow_connect()
1685 subflow->request_bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP); in __mptcp_subflow_connect()
1686 subflow->subflow_id = msk->subflow_id++; in __mptcp_subflow_connect()
1690 list_add_tail(&subflow->node, &msk->conn_list); in __mptcp_subflow_connect()
1708 list_del(&subflow->node); in __mptcp_subflow_connect()
1709 sock_put(mptcp_subflow_tcp_sock(subflow)); in __mptcp_subflow_connect()
1712 subflow->disposable = 1; in __mptcp_subflow_connect()
1779 struct mptcp_subflow_context *subflow; in mptcp_subflow_create_socket() local
1825 subflow = mptcp_subflow_ctx(sf->sk); in mptcp_subflow_create_socket()
1826 pr_debug("subflow=%p\n", subflow); in mptcp_subflow_create_socket()
1830 subflow->conn = sk; in mptcp_subflow_create_socket()
1876 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_state_change() local
1877 struct sock *parent = subflow->conn; in subflow_state_change()
1897 struct mptcp_subflow_context *subflow; in mptcp_subflow_queue_clean() local
1924 subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_queue_clean()
1925 if (!subflow || !subflow->conn) in mptcp_subflow_queue_clean()
1928 sk = subflow->conn; in mptcp_subflow_queue_clean()
2093 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in tcp_release_cb_override() local
2100 status = set_mask_bits(&subflow->delegated_status, MPTCP_DELEGATE_ACTIONS_MASK, 0); in tcp_release_cb_override()