Lines Matching defs:subflow
255 static bool subflow_thmac_valid(struct mptcp_subflow_context *subflow)
260 subflow_generate_hmac(subflow->remote_key, subflow->local_key,
261 subflow->remote_nonce, subflow->local_nonce,
265 pr_debug("subflow=%p, token=%u, thmac=%llu, subflow->thmac=%llu\n",
266 subflow, subflow->token,
268 (unsigned long long)subflow->thmac);
270 return thmac == subflow->thmac;
275 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
276 struct sock *sk = subflow->conn;
287 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
289 struct sock *parent = subflow->conn;
291 subflow->icsk_af_ops->sk_rx_dst_set(sk, skb);
299 if (subflow->conn_finished)
302 subflow->rel_write_seq = 1;
303 subflow->conn_finished = 1;
304 subflow->ssn_offset = TCP_SKB_CB(skb)->seq;
305 pr_debug("subflow=%p synack seq=%x", subflow, subflow->ssn_offset);
308 if (subflow->request_mptcp) {
313 pr_fallback(mptcp_sk(subflow->conn));
317 subflow->mp_capable = 1;
318 subflow->can_ack = 1;
319 subflow->remote_key = mp_opt.sndr_key;
320 pr_debug("subflow=%p, remote_key=%llu", subflow,
321 subflow->remote_key);
323 } else if (subflow->request_join) {
329 subflow->thmac = mp_opt.thmac;
330 subflow->remote_nonce = mp_opt.nonce;
331 pr_debug("subflow=%p, thmac=%llu, remote_nonce=%u", subflow,
332 subflow->thmac, subflow->remote_nonce);
334 if (!subflow_thmac_valid(subflow)) {
342 subflow_generate_hmac(subflow->local_key, subflow->remote_key,
343 subflow->local_nonce,
344 subflow->remote_nonce,
346 memcpy(subflow->hmac, hmac, MPTCPOPT_HMAC_LEN);
348 subflow->mp_join = 1;
365 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
367 pr_debug("subflow=%p", subflow);
395 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
397 pr_debug("subflow=%p", subflow);
514 void mptcp_subflow_fully_established(struct mptcp_subflow_context *subflow,
517 struct mptcp_sock *msk = mptcp_sk(subflow->conn);
519 subflow->remote_key = mp_opt->sndr_key;
520 subflow->fully_established = 1;
521 subflow->can_ack = 1;
608 /* new mpc subflow takes ownership of the newly
629 /* move the msk reference ownership to the subflow */
683 static void dbg_bad_map(struct mptcp_subflow_context *subflow, u32 ssn)
686 ssn, subflow->map_subflow_seq, subflow->map_data_len);
691 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
698 return skb->len - skb_consumed <= subflow->map_data_len -
699 mptcp_subflow_get_map_offset(subflow);
704 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
705 u32 ssn = tcp_sk(ssk)->copied_seq - subflow->ssn_offset;
707 if (unlikely(before(ssn, subflow->map_subflow_seq))) {
708 /* Mapping covers data later in the subflow stream,
711 dbg_bad_map(subflow, ssn);
714 if (unlikely(!before(ssn, subflow->map_subflow_seq +
715 subflow->map_data_len))) {
716 /* Mapping does covers past subflow data, invalid */
717 dbg_bad_map(subflow, ssn);
726 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
741 if (!subflow->map_valid && !skb->len) {
755 if (!subflow->map_valid)
776 if (subflow->map_valid) {
809 map_seq = expand_seq(subflow->map_seq, subflow->map_data_len,
811 pr_debug("expanded seq=%llu", subflow->map_seq);
815 WRITE_ONCE(mptcp_sk(subflow->conn)->use_64bit_ack, !!mpext->dsn64);
817 if (subflow->map_valid) {
819 if (subflow->map_seq == map_seq &&
820 subflow->map_subflow_seq == mpext->subflow_seq &&
821 subflow->map_data_len == data_len) {
838 subflow->map_seq = map_seq;
839 subflow->map_subflow_seq = mpext->subflow_seq;
840 subflow->map_data_len = data_len;
841 subflow->map_valid = 1;
842 subflow->mpc_map = mpext->mpc_map;
844 subflow->map_seq, subflow->map_subflow_seq,
845 subflow->map_data_len);
861 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
868 subflow->map_subflow_seq);
873 if (mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len)
874 subflow->map_valid = 0;
881 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
886 pr_debug("msk=%p ssk=%p data_avail=%d skb=%p", subflow->conn, ssk,
887 subflow->data_avail, skb_peek(&ssk->sk_receive_queue));
889 subflow->data_avail = 0;
890 if (subflow->data_avail)
893 msk = mptcp_sk(subflow->conn);
907 subflow->map_valid = 1;
908 subflow->map_seq = READ_ONCE(msk->ack_seq);
909 subflow->map_data_len = skb->len;
910 subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq -
911 subflow->ssn_offset;
912 subflow->data_avail = MPTCP_SUBFLOW_DATA_AVAIL;
923 /* if msk lacks the remote key, this subflow must provide an
927 if (!subflow->mpc_map) {
931 WRITE_ONCE(msk->remote_key, subflow->remote_key);
932 WRITE_ONCE(msk->ack_seq, subflow->map_seq);
937 ack_seq = mptcp_subflow_get_mapped_dsn(subflow);
938 pr_debug("msk ack_seq=%llx subflow ack_seq=%llx", old_ack,
941 subflow->data_avail = MPTCP_SUBFLOW_DATA_AVAIL;
944 subflow->data_avail = MPTCP_SUBFLOW_OOO_DATA;
962 subflow->data_avail = 0;
968 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
971 if (subflow->map_valid &&
972 mptcp_subflow_get_map_offset(subflow) >= subflow->map_data_len) {
973 subflow->map_valid = 0;
974 subflow->data_avail = 0;
977 subflow->map_subflow_seq,
978 subflow->map_data_len);
995 const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
996 const struct sock *sk = subflow->conn;
1004 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
1006 struct sock *parent = subflow->conn;
1011 /* MPJ subflow are removed from accept queue before reaching here,
1022 WARN_ON_ONCE(!__mptcp_check_fallback(msk) && !subflow->mp_capable &&
1023 !subflow->mp_join && !(state & TCPF_CLOSE));
1031 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
1032 struct sock *parent = subflow->conn;
1058 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
1064 pr_debug("subflow=%p family=%d ops=%p target=%p mapped=%d",
1065 subflow, sk->sk_family, icsk->icsk_af_ops, target, mapped);
1070 subflow->icsk_af_ops = icsk->icsk_af_ops;
1100 struct mptcp_subflow_context *subflow;
1118 subflow = mptcp_subflow_ctx(ssk);
1120 get_random_bytes(&subflow->local_nonce, sizeof(u32));
1121 } while (!subflow->local_nonce);
1131 subflow->remote_key = msk->remote_key;
1132 subflow->local_key = msk->local_key;
1133 subflow->token = msk->token;
1146 mptcp_crypto_key_sha(subflow->remote_key, &remote_token, NULL);
1149 subflow->remote_token = remote_token;
1150 subflow->local_id = local_id;
1151 subflow->remote_id = remote_id;
1152 subflow->request_join = 1;
1153 subflow->request_bkup = !!(loc->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
1161 list_add_tail(&subflow->node, &msk->join_list);
1173 struct mptcp_subflow_context *subflow;
1217 subflow = mptcp_subflow_ctx(sf->sk);
1218 pr_debug("subflow=%p", subflow);
1222 subflow->conn = sk;
1240 pr_debug("subflow=%p", ctx);
1265 struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
1266 struct sock *parent = subflow->conn;
1274 subflow->conn_finished = 1;
1281 /* as recvmsg() does not acquire the subflow socket for ssk selection
1290 !subflow->rx_eof && subflow_is_done(sk)) {
1291 subflow->rx_eof = 1;
1317 pr_debug("subflow=%p, family=%d", ctx, sk->sk_family);
1424 panic("MPTCP: failed to init subflow v4 request sock ops\n");
1447 panic("MPTCP: failed to init subflow v6 request sock ops\n");