Lines Matching refs:subflow
256 static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow) in subflow_thmac_valid() argument
261 subflow_generate_hmac(subflow->remote_key, subflow->local_key, in subflow_thmac_valid()
262 subflow->remote_nonce, subflow->local_nonce, in subflow_thmac_valid()
267 subflow, subflow->token, in subflow_thmac_valid()
269 (unsigned long long)subflow->thmac); in subflow_thmac_valid()
271 return thmac == subflow->thmac; in subflow_thmac_valid()
276 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_reset() local
277 struct sock *sk = subflow->conn; in mptcp_subflow_reset()
289 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_finish_connect() local
291 struct sock *parent = subflow->conn; in subflow_finish_connect()
293 subflow->icsk_af_ops->sk_rx_dst_set(sk, skb); in subflow_finish_connect()
301 if (subflow->conn_finished) in subflow_finish_connect()
304 subflow->rel_write_seq = 1; in subflow_finish_connect()
305 subflow->conn_finished = 1; in subflow_finish_connect()
306 subflow->ssn_offset = TCP_SKB_CB(skb)->seq; in subflow_finish_connect()
307 pr_debug("subflow=%p synack seq=%x", subflow, subflow->ssn_offset); in subflow_finish_connect()
310 if (subflow->request_mptcp) { in subflow_finish_connect()
315 pr_fallback(mptcp_sk(subflow->conn)); in subflow_finish_connect()
319 subflow->mp_capable = 1; in subflow_finish_connect()
320 subflow->can_ack = 1; in subflow_finish_connect()
321 subflow->remote_key = mp_opt.sndr_key; in subflow_finish_connect()
322 pr_debug("subflow=%p, remote_key=%llu", subflow, in subflow_finish_connect()
323 subflow->remote_key); in subflow_finish_connect()
325 } else if (subflow->request_join) { in subflow_finish_connect()
331 subflow->thmac = mp_opt.thmac; in subflow_finish_connect()
332 subflow->remote_nonce = mp_opt.nonce; in subflow_finish_connect()
333 pr_debug("subflow=%p, thmac=%llu, remote_nonce=%u", subflow, in subflow_finish_connect()
334 subflow->thmac, subflow->remote_nonce); in subflow_finish_connect()
336 if (!subflow_thmac_valid(subflow)) { in subflow_finish_connect()
344 subflow_generate_hmac(subflow->local_key, subflow->remote_key, in subflow_finish_connect()
345 subflow->local_nonce, in subflow_finish_connect()
346 subflow->remote_nonce, in subflow_finish_connect()
348 memcpy(subflow->hmac, hmac, MPTCPOPT_HMAC_LEN); in subflow_finish_connect()
350 subflow->mp_join = 1; in subflow_finish_connect()
368 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_v4_conn_request() local
370 pr_debug("subflow=%p", subflow); in subflow_v4_conn_request()
391 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_v6_conn_request() local
393 pr_debug("subflow=%p", subflow); in subflow_v6_conn_request()
489 void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow, in mptcp_subflow_fully_established() argument
492 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in mptcp_subflow_fully_established()
494 subflow->remote_key = mp_opt->sndr_key; in mptcp_subflow_fully_established()
495 subflow->fully_established = 1; in mptcp_subflow_fully_established()
496 subflow->can_ack = 1; in mptcp_subflow_fully_established()
658 static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn) in dbg_bad_map() argument
661 ssn, subflow->map_subflow_seq, subflow->map_data_len); in dbg_bad_map()
666 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in skb_is_fully_mapped() local
673 return skb->len - skb_consumed <= subflow->map_data_len - in skb_is_fully_mapped()
674 mptcp_subflow_get_map_offset(subflow); in skb_is_fully_mapped()
679 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in validate_mapping() local
680 u32 ssn = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; in validate_mapping()
682 if (unlikely(before(ssn, subflow->map_subflow_seq))) { in validate_mapping()
686 dbg_bad_map(subflow, ssn); in validate_mapping()
689 if (unlikely(!before(ssn, subflow->map_subflow_seq + in validate_mapping()
690 subflow->map_data_len))) { in validate_mapping()
692 dbg_bad_map(subflow, ssn); in validate_mapping()
701 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in get_mapping_status() local
716 if (!subflow->map_valid && !skb->len) { in get_mapping_status()
730 if (!subflow->map_valid) in get_mapping_status()
751 if (subflow->map_valid) { in get_mapping_status()
784 map_seq = expand_seq(subflow->map_seq, subflow->map_data_len, in get_mapping_status()
786 pr_debug("expanded seq=%llu", subflow->map_seq); in get_mapping_status()
790 WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64); in get_mapping_status()
792 if (subflow->map_valid) { in get_mapping_status()
794 if (subflow->map_seq == map_seq && in get_mapping_status()
795 subflow->map_subflow_seq == mpext->subflow_seq && in get_mapping_status()
796 subflow->map_data_len == data_len) { in get_mapping_status()
813 subflow->map_seq = map_seq; in get_mapping_status()
814 subflow->map_subflow_seq = mpext->subflow_seq; in get_mapping_status()
815 subflow->map_data_len = data_len; in get_mapping_status()
816 subflow->map_valid = 1; in get_mapping_status()
817 subflow->mpc_map = mpext->mpc_map; in get_mapping_status()
819 subflow->map_seq, subflow->map_subflow_seq, in get_mapping_status()
820 subflow->map_data_len); in get_mapping_status()
836 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_discard_data() local
843 subflow->map_subflow_seq); in mptcp_subflow_discard_data()
848 if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) in mptcp_subflow_discard_data()
849 subflow->map_valid = 0; in mptcp_subflow_discard_data()
856 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in subflow_check_data_avail() local
861 pr_debug("msk=%p ssk=%p data_avail=%d skb=%p", subflow->conn, ssk, in subflow_check_data_avail()
862 subflow->data_avail, skb_peek(&ssk->sk_receive_queue)); in subflow_check_data_avail()
864 subflow->data_avail = 0; in subflow_check_data_avail()
865 if (subflow->data_avail) in subflow_check_data_avail()
868 msk = mptcp_sk(subflow->conn); in subflow_check_data_avail()
882 subflow->map_valid = 1; in subflow_check_data_avail()
883 subflow->map_seq = READ_ONCE(msk->ack_seq); in subflow_check_data_avail()
884 subflow->map_data_len = skb->len; in subflow_check_data_avail()
885 subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - in subflow_check_data_avail()
886 subflow->ssn_offset; in subflow_check_data_avail()
887 subflow->data_avail = MPTCP_SUBFLOW_DATA_AVAIL; in subflow_check_data_avail()
902 if (!subflow->mpc_map) { in subflow_check_data_avail()
906 WRITE_ONCE(msk->remote_key, subflow->remote_key); in subflow_check_data_avail()
907 WRITE_ONCE(msk->ack_seq, subflow->map_seq); in subflow_check_data_avail()
912 ack_seq = mptcp_subflow_get_mapped_dsn(subflow); in subflow_check_data_avail()
916 subflow->data_avail = MPTCP_SUBFLOW_DATA_AVAIL; in subflow_check_data_avail()
919 subflow->data_avail = MPTCP_SUBFLOW_OOO_DATA; in subflow_check_data_avail()
937 subflow->data_avail = 0; in subflow_check_data_avail()
943 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in mptcp_subflow_data_available() local
946 if (subflow->map_valid && in mptcp_subflow_data_available()
947 mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) { in mptcp_subflow_data_available()
948 subflow->map_valid = 0; in mptcp_subflow_data_available()
949 subflow->data_avail = 0; in mptcp_subflow_data_available()
952 subflow->map_subflow_seq, in mptcp_subflow_data_available()
953 subflow->map_data_len); in mptcp_subflow_data_available()
970 const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_space() local
971 const struct sock *sk = subflow->conn; in mptcp_space()
979 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_data_ready() local
981 struct sock *parent = subflow->conn; in subflow_data_ready()
997 WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable && in subflow_data_ready()
998 !subflow->mp_join && !(state & TCPF_CLOSE)); in subflow_data_ready()
1006 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_write_space() local
1007 struct sock *parent = subflow->conn; in subflow_write_space()
1033 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in mptcpv6_handle_mapped() local
1040 subflow, sk->sk_family, icsk->icsk_af_ops, target, mapped); in mptcpv6_handle_mapped()
1045 subflow->icsk_af_ops = icsk->icsk_af_ops; in mptcpv6_handle_mapped()
1075 struct mptcp_subflow_context *subflow; in __mptcp_subflow_connect() local
1093 subflow = mptcp_subflow_ctx(ssk); in __mptcp_subflow_connect()
1095 get_random_bytes(&subflow->local_nonce, sizeof(u32)); in __mptcp_subflow_connect()
1096 } while (!subflow->local_nonce); in __mptcp_subflow_connect()
1106 subflow->remote_key = msk->remote_key; in __mptcp_subflow_connect()
1107 subflow->local_key = msk->local_key; in __mptcp_subflow_connect()
1108 subflow->token = msk->token; in __mptcp_subflow_connect()
1121 mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL); in __mptcp_subflow_connect()
1124 subflow->remote_token = remote_token; in __mptcp_subflow_connect()
1125 subflow->local_id = local_id; in __mptcp_subflow_connect()
1126 subflow->remote_id = remote_id; in __mptcp_subflow_connect()
1127 subflow->request_join = 1; in __mptcp_subflow_connect()
1128 subflow->request_bkup = !!(loc->flags & MPTCP_PM_ADDR_FLAG_BACKUP); in __mptcp_subflow_connect()
1136 list_add_tail(&subflow->node, &msk->join_list); in __mptcp_subflow_connect()
1148 struct mptcp_subflow_context *subflow; in mptcp_subflow_create_socket() local
1192 subflow = mptcp_subflow_ctx(sf->sk); in mptcp_subflow_create_socket()
1193 pr_debug("subflow=%p", subflow); in mptcp_subflow_create_socket()
1197 subflow->conn = sk; in mptcp_subflow_create_socket()
1240 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_state_change() local
1241 struct sock *parent = subflow->conn; in subflow_state_change()
1249 subflow->conn_finished = 1; in subflow_state_change()
1265 !subflow->rx_eof && subflow_is_done(sk)) { in subflow_state_change()
1266 subflow->rx_eof = 1; in subflow_state_change()