1e10a9892SGeliang Tang /* SPDX-License-Identifier: GPL-2.0 */ 2e10a9892SGeliang Tang #undef TRACE_SYSTEM 3e10a9892SGeliang Tang #define TRACE_SYSTEM mptcp 4e10a9892SGeliang Tang 5e10a9892SGeliang Tang #if !defined(_TRACE_MPTCP_H) || defined(TRACE_HEADER_MULTI_READ) 6e10a9892SGeliang Tang #define _TRACE_MPTCP_H 7e10a9892SGeliang Tang 8e10a9892SGeliang Tang #include <linux/tracepoint.h> 9e10a9892SGeliang Tang 10d96a838aSGeliang Tang #define show_mapping_status(status) \ 11d96a838aSGeliang Tang __print_symbolic(status, \ 12d96a838aSGeliang Tang { 0, "MAPPING_OK" }, \ 13d96a838aSGeliang Tang { 1, "MAPPING_INVALID" }, \ 14d96a838aSGeliang Tang { 2, "MAPPING_EMPTY" }, \ 15d96a838aSGeliang Tang { 3, "MAPPING_DATA_FIN" }, \ 16d96a838aSGeliang Tang { 4, "MAPPING_DUMMY" }) 17d96a838aSGeliang Tang 18e10a9892SGeliang Tang TRACE_EVENT(mptcp_subflow_get_send, 19e10a9892SGeliang Tang 20e10a9892SGeliang Tang TP_PROTO(struct mptcp_subflow_context *subflow), 21e10a9892SGeliang Tang 22e10a9892SGeliang Tang TP_ARGS(subflow), 23e10a9892SGeliang Tang 24e10a9892SGeliang Tang TP_STRUCT__entry( 25e10a9892SGeliang Tang __field(bool, active) 26e10a9892SGeliang Tang __field(bool, free) 27e10a9892SGeliang Tang __field(u32, snd_wnd) 28e10a9892SGeliang Tang __field(u32, pace) 29e10a9892SGeliang Tang __field(u8, backup) 30e10a9892SGeliang Tang __field(u64, ratio) 31e10a9892SGeliang Tang ), 32e10a9892SGeliang Tang 33e10a9892SGeliang Tang TP_fast_assign( 34e10a9892SGeliang Tang struct sock *ssk; 35e10a9892SGeliang Tang 36e10a9892SGeliang Tang __entry->active = mptcp_subflow_active(subflow); 37*add243b7SMatthieu Baerts (NGI0) __entry->backup = subflow->backup || subflow->request_bkup; 38e10a9892SGeliang Tang 39e10a9892SGeliang Tang if (subflow->tcp_sock && sk_fullsock(subflow->tcp_sock)) 40e10a9892SGeliang Tang __entry->free = sk_stream_memory_free(subflow->tcp_sock); 41e10a9892SGeliang Tang else 42e10a9892SGeliang Tang __entry->free = 0; 43e10a9892SGeliang Tang 44e10a9892SGeliang Tang ssk = mptcp_subflow_tcp_sock(subflow); 45e10a9892SGeliang Tang if (ssk && sk_fullsock(ssk)) { 46e10a9892SGeliang Tang __entry->snd_wnd = tcp_sk(ssk)->snd_wnd; 47e10a9892SGeliang Tang __entry->pace = ssk->sk_pacing_rate; 48e10a9892SGeliang Tang } else { 49e10a9892SGeliang Tang __entry->snd_wnd = 0; 50e10a9892SGeliang Tang __entry->pace = 0; 51e10a9892SGeliang Tang } 52e10a9892SGeliang Tang 53e10a9892SGeliang Tang if (ssk && sk_fullsock(ssk) && __entry->pace) 54e10a9892SGeliang Tang __entry->ratio = div_u64((u64)ssk->sk_wmem_queued << 32, __entry->pace); 55e10a9892SGeliang Tang else 56e10a9892SGeliang Tang __entry->ratio = 0; 57e10a9892SGeliang Tang ), 58e10a9892SGeliang Tang 59e10a9892SGeliang Tang TP_printk("active=%d free=%d snd_wnd=%u pace=%u backup=%u ratio=%llu", 60e10a9892SGeliang Tang __entry->active, __entry->free, 61e10a9892SGeliang Tang __entry->snd_wnd, __entry->pace, 62e10a9892SGeliang Tang __entry->backup, __entry->ratio) 63e10a9892SGeliang Tang ); 64e10a9892SGeliang Tang 650918e34bSGeliang Tang DECLARE_EVENT_CLASS(mptcp_dump_mpext, 660918e34bSGeliang Tang 670918e34bSGeliang Tang TP_PROTO(struct mptcp_ext *mpext), 680918e34bSGeliang Tang 690918e34bSGeliang Tang TP_ARGS(mpext), 700918e34bSGeliang Tang 710918e34bSGeliang Tang TP_STRUCT__entry( 720918e34bSGeliang Tang __field(u64, data_ack) 730918e34bSGeliang Tang __field(u64, data_seq) 740918e34bSGeliang Tang __field(u32, subflow_seq) 750918e34bSGeliang Tang __field(u16, data_len) 76401e3030SGeliang Tang __field(u16, csum) 770918e34bSGeliang Tang __field(u8, use_map) 780918e34bSGeliang Tang __field(u8, dsn64) 790918e34bSGeliang Tang __field(u8, data_fin) 800918e34bSGeliang Tang __field(u8, use_ack) 810918e34bSGeliang Tang __field(u8, ack64) 820918e34bSGeliang Tang __field(u8, mpc_map) 830918e34bSGeliang Tang __field(u8, frozen) 840918e34bSGeliang Tang __field(u8, reset_transient) 850918e34bSGeliang Tang __field(u8, reset_reason) 86401e3030SGeliang Tang __field(u8, csum_reqd) 87d9fdd02dSGeliang Tang __field(u8, infinite_map) 880918e34bSGeliang Tang ), 890918e34bSGeliang Tang 900918e34bSGeliang Tang TP_fast_assign( 910918e34bSGeliang Tang __entry->data_ack = mpext->ack64 ? mpext->data_ack : mpext->data_ack32; 920918e34bSGeliang Tang __entry->data_seq = mpext->data_seq; 930918e34bSGeliang Tang __entry->subflow_seq = mpext->subflow_seq; 940918e34bSGeliang Tang __entry->data_len = mpext->data_len; 95401e3030SGeliang Tang __entry->csum = (__force u16)mpext->csum; 960918e34bSGeliang Tang __entry->use_map = mpext->use_map; 970918e34bSGeliang Tang __entry->dsn64 = mpext->dsn64; 980918e34bSGeliang Tang __entry->data_fin = mpext->data_fin; 990918e34bSGeliang Tang __entry->use_ack = mpext->use_ack; 1000918e34bSGeliang Tang __entry->ack64 = mpext->ack64; 1010918e34bSGeliang Tang __entry->mpc_map = mpext->mpc_map; 1020918e34bSGeliang Tang __entry->frozen = mpext->frozen; 1030918e34bSGeliang Tang __entry->reset_transient = mpext->reset_transient; 1040918e34bSGeliang Tang __entry->reset_reason = mpext->reset_reason; 105401e3030SGeliang Tang __entry->csum_reqd = mpext->csum_reqd; 106d9fdd02dSGeliang Tang __entry->infinite_map = mpext->infinite_map; 1070918e34bSGeliang Tang ), 1080918e34bSGeliang Tang 109d9fdd02dSGeliang Tang TP_printk("data_ack=%llu data_seq=%llu subflow_seq=%u data_len=%u csum=%x use_map=%u dsn64=%u data_fin=%u use_ack=%u ack64=%u mpc_map=%u frozen=%u reset_transient=%u reset_reason=%u csum_reqd=%u infinite_map=%u", 1100918e34bSGeliang Tang __entry->data_ack, __entry->data_seq, 1110918e34bSGeliang Tang __entry->subflow_seq, __entry->data_len, 112401e3030SGeliang Tang __entry->csum, __entry->use_map, 113401e3030SGeliang Tang __entry->dsn64, __entry->data_fin, 114401e3030SGeliang Tang __entry->use_ack, __entry->ack64, 115401e3030SGeliang Tang __entry->mpc_map, __entry->frozen, 116401e3030SGeliang Tang __entry->reset_transient, __entry->reset_reason, 117d9fdd02dSGeliang Tang __entry->csum_reqd, __entry->infinite_map) 1180918e34bSGeliang Tang ); 1190918e34bSGeliang Tang 1200eb4e7eeSGeliang Tang DEFINE_EVENT(mptcp_dump_mpext, mptcp_sendmsg_frag, 1210eb4e7eeSGeliang Tang TP_PROTO(struct mptcp_ext *mpext), 1220eb4e7eeSGeliang Tang TP_ARGS(mpext)); 1230eb4e7eeSGeliang Tang 1240918e34bSGeliang Tang DEFINE_EVENT(mptcp_dump_mpext, get_mapping_status, 1250918e34bSGeliang Tang TP_PROTO(struct mptcp_ext *mpext), 1260918e34bSGeliang Tang TP_ARGS(mpext)); 1270918e34bSGeliang Tang 128ed66bfb4SGeliang Tang TRACE_EVENT(ack_update_msk, 129ed66bfb4SGeliang Tang 130ed66bfb4SGeliang Tang TP_PROTO(u64 data_ack, u64 old_snd_una, 131ed66bfb4SGeliang Tang u64 new_snd_una, u64 new_wnd_end, 132ed66bfb4SGeliang Tang u64 msk_wnd_end), 133ed66bfb4SGeliang Tang 134ed66bfb4SGeliang Tang TP_ARGS(data_ack, old_snd_una, 135ed66bfb4SGeliang Tang new_snd_una, new_wnd_end, 136ed66bfb4SGeliang Tang msk_wnd_end), 137ed66bfb4SGeliang Tang 138ed66bfb4SGeliang Tang TP_STRUCT__entry( 139ed66bfb4SGeliang Tang __field(u64, data_ack) 140ed66bfb4SGeliang Tang __field(u64, old_snd_una) 141ed66bfb4SGeliang Tang __field(u64, new_snd_una) 142ed66bfb4SGeliang Tang __field(u64, new_wnd_end) 143ed66bfb4SGeliang Tang __field(u64, msk_wnd_end) 144ed66bfb4SGeliang Tang ), 145ed66bfb4SGeliang Tang 146ed66bfb4SGeliang Tang TP_fast_assign( 147ed66bfb4SGeliang Tang __entry->data_ack = data_ack; 148ed66bfb4SGeliang Tang __entry->old_snd_una = old_snd_una; 149ed66bfb4SGeliang Tang __entry->new_snd_una = new_snd_una; 150ed66bfb4SGeliang Tang __entry->new_wnd_end = new_wnd_end; 151ed66bfb4SGeliang Tang __entry->msk_wnd_end = msk_wnd_end; 152ed66bfb4SGeliang Tang ), 153ed66bfb4SGeliang Tang 154ed66bfb4SGeliang Tang TP_printk("data_ack=%llu old_snd_una=%llu new_snd_una=%llu new_wnd_end=%llu msk_wnd_end=%llu", 155ed66bfb4SGeliang Tang __entry->data_ack, __entry->old_snd_una, 156ed66bfb4SGeliang Tang __entry->new_snd_una, __entry->new_wnd_end, 157ed66bfb4SGeliang Tang __entry->msk_wnd_end) 158ed66bfb4SGeliang Tang ); 159ed66bfb4SGeliang Tang 160d96a838aSGeliang Tang TRACE_EVENT(subflow_check_data_avail, 161d96a838aSGeliang Tang 162d96a838aSGeliang Tang TP_PROTO(__u8 status, struct sk_buff *skb), 163d96a838aSGeliang Tang 164d96a838aSGeliang Tang TP_ARGS(status, skb), 165d96a838aSGeliang Tang 166d96a838aSGeliang Tang TP_STRUCT__entry( 167d96a838aSGeliang Tang __field(u8, status) 168d96a838aSGeliang Tang __field(const void *, skb) 169d96a838aSGeliang Tang ), 170d96a838aSGeliang Tang 171d96a838aSGeliang Tang TP_fast_assign( 172d96a838aSGeliang Tang __entry->status = status; 173d96a838aSGeliang Tang __entry->skb = skb; 174d96a838aSGeliang Tang ), 175d96a838aSGeliang Tang 176d96a838aSGeliang Tang TP_printk("mapping_status=%s, skb=%p", 177d96a838aSGeliang Tang show_mapping_status(__entry->status), 178d96a838aSGeliang Tang __entry->skb) 179d96a838aSGeliang Tang ); 180d96a838aSGeliang Tang 181e10a9892SGeliang Tang #endif /* _TRACE_MPTCP_H */ 182e10a9892SGeliang Tang 183e10a9892SGeliang Tang /* This part must be outside protection */ 184e10a9892SGeliang Tang #include <trace/define_trace.h> 185