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()
341 subflow_generate_hmac(subflow->local_key, subflow->remote_key, in subflow_finish_connect()
342 subflow->local_nonce, in subflow_finish_connect()
343 subflow->remote_nonce, in subflow_finish_connect()
345 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()
485 void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow, in mptcp_subflow_fully_established() argument
488 struct mptcp_sock *msk = mptcp_sk(subflow->conn); in mptcp_subflow_fully_established()
490 subflow->remote_key = mp_opt->sndr_key; in mptcp_subflow_fully_established()
491 subflow->fully_established = 1; in mptcp_subflow_fully_established()
492 subflow->can_ack = 1; in mptcp_subflow_fully_established()
655 static void warn_bad_map(struct mptcp_subflow_context *subflow, u32 ssn) in warn_bad_map() argument
658 ssn, subflow->map_subflow_seq, subflow->map_data_len); in warn_bad_map()
663 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in skb_is_fully_mapped() local
670 return skb->len - skb_consumed <= subflow->map_data_len - in skb_is_fully_mapped()
671 mptcp_subflow_get_map_offset(subflow); in skb_is_fully_mapped()
676 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in validate_mapping() local
677 u32 ssn = tcp_sk(ssk)->copied_seq - subflow->ssn_offset; in validate_mapping()
679 if (unlikely(before(ssn, subflow->map_subflow_seq))) { in validate_mapping()
683 warn_bad_map(subflow, ssn); in validate_mapping()
686 if (unlikely(!before(ssn, subflow->map_subflow_seq + in validate_mapping()
687 subflow->map_data_len))) { in validate_mapping()
689 warn_bad_map(subflow, ssn + skb->len); in validate_mapping()
698 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in get_mapping_status() local
713 if (!subflow->map_valid && !skb->len) { in get_mapping_status()
727 if (!subflow->map_valid) in get_mapping_status()
749 if (subflow->map_valid) { in get_mapping_status()
782 map_seq = expand_seq(subflow->map_seq, subflow->map_data_len, in get_mapping_status()
784 pr_debug("expanded seq=%llu", subflow->map_seq); in get_mapping_status()
788 WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64); in get_mapping_status()
790 if (subflow->map_valid) { in get_mapping_status()
792 if (subflow->map_seq == map_seq && in get_mapping_status()
793 subflow->map_subflow_seq == mpext->subflow_seq && in get_mapping_status()
794 subflow->map_data_len == data_len) { in get_mapping_status()
811 subflow->map_seq = map_seq; in get_mapping_status()
812 subflow->map_subflow_seq = mpext->subflow_seq; in get_mapping_status()
813 subflow->map_data_len = data_len; in get_mapping_status()
814 subflow->map_valid = 1; in get_mapping_status()
815 subflow->mpc_map = mpext->mpc_map; in get_mapping_status()
817 subflow->map_seq, subflow->map_subflow_seq, in get_mapping_status()
818 subflow->map_data_len); in get_mapping_status()
834 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_subflow_discard_data() local
841 subflow->map_subflow_seq); in mptcp_subflow_discard_data()
846 if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) in mptcp_subflow_discard_data()
847 subflow->map_valid = 0; in mptcp_subflow_discard_data()
854 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in subflow_check_data_avail() local
859 pr_debug("msk=%p ssk=%p data_avail=%d skb=%p", subflow->conn, ssk, in subflow_check_data_avail()
860 subflow->data_avail, skb_peek(&ssk->sk_receive_queue)); in subflow_check_data_avail()
862 subflow->data_avail = 0; in subflow_check_data_avail()
863 if (subflow->data_avail) in subflow_check_data_avail()
866 msk = mptcp_sk(subflow->conn); in subflow_check_data_avail()
880 subflow->map_valid = 1; in subflow_check_data_avail()
881 subflow->map_seq = READ_ONCE(msk->ack_seq); in subflow_check_data_avail()
882 subflow->map_data_len = skb->len; in subflow_check_data_avail()
883 subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - in subflow_check_data_avail()
884 subflow->ssn_offset; in subflow_check_data_avail()
885 subflow->data_avail = MPTCP_SUBFLOW_DATA_AVAIL; in subflow_check_data_avail()
900 if (!subflow->mpc_map) { in subflow_check_data_avail()
904 WRITE_ONCE(msk->remote_key, subflow->remote_key); in subflow_check_data_avail()
905 WRITE_ONCE(msk->ack_seq, subflow->map_seq); in subflow_check_data_avail()
910 ack_seq = mptcp_subflow_get_mapped_dsn(subflow); in subflow_check_data_avail()
914 subflow->data_avail = MPTCP_SUBFLOW_DATA_AVAIL; in subflow_check_data_avail()
917 subflow->data_avail = MPTCP_SUBFLOW_OOO_DATA; in subflow_check_data_avail()
935 subflow->data_avail = 0; in subflow_check_data_avail()
941 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in mptcp_subflow_data_available() local
944 if (subflow->map_valid && in mptcp_subflow_data_available()
945 mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) { in mptcp_subflow_data_available()
946 subflow->map_valid = 0; in mptcp_subflow_data_available()
947 subflow->data_avail = 0; in mptcp_subflow_data_available()
950 subflow->map_subflow_seq, in mptcp_subflow_data_available()
951 subflow->map_data_len); in mptcp_subflow_data_available()
968 const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); in mptcp_space() local
969 const struct sock *sk = subflow->conn; in mptcp_space()
977 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_data_ready() local
979 struct sock *parent = subflow->conn; in subflow_data_ready()
989 WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable && in subflow_data_ready()
990 !subflow->mp_join && !(state & TCPF_CLOSE)); in subflow_data_ready()
998 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_write_space() local
999 struct sock *parent = subflow->conn; in subflow_write_space()
1025 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in mptcpv6_handle_mapped() local
1032 subflow, sk->sk_family, icsk->icsk_af_ops, target, mapped); in mptcpv6_handle_mapped()
1037 subflow->icsk_af_ops = icsk->icsk_af_ops; in mptcpv6_handle_mapped()
1067 struct mptcp_subflow_context *subflow; in __mptcp_subflow_connect() local
1085 subflow = mptcp_subflow_ctx(ssk); in __mptcp_subflow_connect()
1087 get_random_bytes(&subflow->local_nonce, sizeof(u32)); in __mptcp_subflow_connect()
1088 } while (!subflow->local_nonce); in __mptcp_subflow_connect()
1098 subflow->remote_key = msk->remote_key; in __mptcp_subflow_connect()
1099 subflow->local_key = msk->local_key; in __mptcp_subflow_connect()
1100 subflow->token = msk->token; in __mptcp_subflow_connect()
1113 mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL); in __mptcp_subflow_connect()
1116 subflow->remote_token = remote_token; in __mptcp_subflow_connect()
1117 subflow->local_id = local_id; in __mptcp_subflow_connect()
1118 subflow->remote_id = remote_id; in __mptcp_subflow_connect()
1119 subflow->request_join = 1; in __mptcp_subflow_connect()
1120 subflow->request_bkup = !!(loc->flags & MPTCP_PM_ADDR_FLAG_BACKUP); in __mptcp_subflow_connect()
1128 list_add_tail(&subflow->node, &msk->join_list); in __mptcp_subflow_connect()
1140 struct mptcp_subflow_context *subflow; in mptcp_subflow_create_socket() local
1184 subflow = mptcp_subflow_ctx(sf->sk); in mptcp_subflow_create_socket()
1185 pr_debug("subflow=%p", subflow); in mptcp_subflow_create_socket()
1189 subflow->conn = sk; in mptcp_subflow_create_socket()
1232 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); in subflow_state_change() local
1233 struct sock *parent = subflow->conn; in subflow_state_change()
1241 subflow->conn_finished = 1; in subflow_state_change()
1257 !subflow->rx_eof && subflow_is_done(sk)) { in subflow_state_change()
1258 subflow->rx_eof = 1; in subflow_state_change()