Merge tag 'rxrpc-rewrite-20160929' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / net / rxrpc / misc.c
1 /* Miscellaneous bits
2  *
3  * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public Licence
8  * as published by the Free Software Foundation; either version
9  * 2 of the Licence, or (at your option) any later version.
10  */
11
12 #include <linux/kernel.h>
13 #include <net/sock.h>
14 #include <net/af_rxrpc.h>
15 #include "ar-internal.h"
16
17 /*
18  * The maximum listening backlog queue size that may be set on a socket by
19  * listen().
20  */
21 unsigned int rxrpc_max_backlog __read_mostly = 10;
22
23 /*
24  * How long to wait before scheduling ACK generation after seeing a
25  * packet with RXRPC_REQUEST_ACK set (in jiffies).
26  */
27 unsigned int rxrpc_requested_ack_delay = 1;
28
29 /*
30  * How long to wait before scheduling an ACK with subtype DELAY (in jiffies).
31  *
32  * We use this when we've received new data packets.  If those packets aren't
33  * all consumed within this time we will send a DELAY ACK if an ACK was not
34  * requested to let the sender know it doesn't need to resend.
35  */
36 unsigned int rxrpc_soft_ack_delay = 1 * HZ;
37
38 /*
39  * How long to wait before scheduling an ACK with subtype IDLE (in jiffies).
40  *
41  * We use this when we've consumed some previously soft-ACK'd packets when
42  * further packets aren't immediately received to decide when to send an IDLE
43  * ACK let the other end know that it can free up its Tx buffer space.
44  */
45 unsigned int rxrpc_idle_ack_delay = 0.5 * HZ;
46
47 /*
48  * Receive window size in packets.  This indicates the maximum number of
49  * unconsumed received packets we're willing to retain in memory.  Once this
50  * limit is hit, we should generate an EXCEEDS_WINDOW ACK and discard further
51  * packets.
52  */
53 unsigned int rxrpc_rx_window_size = RXRPC_INIT_RX_WINDOW_SIZE;
54 #if (RXRPC_RXTX_BUFF_SIZE - 1) < RXRPC_INIT_RX_WINDOW_SIZE
55 #error Need to reduce RXRPC_INIT_RX_WINDOW_SIZE
56 #endif
57
58 /*
59  * Maximum Rx MTU size.  This indicates to the sender the size of jumbo packet
60  * made by gluing normal packets together that we're willing to handle.
61  */
62 unsigned int rxrpc_rx_mtu = 5692;
63
64 /*
65  * The maximum number of fragments in a received jumbo packet that we tell the
66  * sender that we're willing to handle.
67  */
68 unsigned int rxrpc_rx_jumbo_max = 4;
69
70 /*
71  * Time till packet resend (in milliseconds).
72  */
73 unsigned int rxrpc_resend_timeout = 4 * 1000;
74
75 const char *const rxrpc_pkts[] = {
76         "?00",
77         "DATA", "ACK", "BUSY", "ABORT", "ACKALL", "CHALL", "RESP", "DEBUG",
78         "?09", "?10", "?11", "?12", "VERSION", "?14", "?15"
79 };
80
81 const s8 rxrpc_ack_priority[] = {
82         [0]                             = 0,
83         [RXRPC_ACK_DELAY]               = 1,
84         [RXRPC_ACK_REQUESTED]           = 2,
85         [RXRPC_ACK_IDLE]                = 3,
86         [RXRPC_ACK_DUPLICATE]           = 4,
87         [RXRPC_ACK_OUT_OF_SEQUENCE]     = 5,
88         [RXRPC_ACK_EXCEEDS_WINDOW]      = 6,
89         [RXRPC_ACK_NOSPACE]             = 7,
90         [RXRPC_ACK_PING_RESPONSE]       = 8,
91         [RXRPC_ACK_PING]                = 9,
92 };
93
94 const char const rxrpc_ack_names[RXRPC_ACK__INVALID + 1][4] = {
95         "---", "REQ", "DUP", "OOS", "WIN", "MEM", "PNG", "PNR", "DLY",
96         "IDL", "-?-"
97 };
98
99 const char rxrpc_skb_traces[rxrpc_skb__nr_trace][7] = {
100         [rxrpc_skb_rx_cleaned]          = "Rx CLN",
101         [rxrpc_skb_rx_freed]            = "Rx FRE",
102         [rxrpc_skb_rx_got]              = "Rx GOT",
103         [rxrpc_skb_rx_lost]             = "Rx *L*",
104         [rxrpc_skb_rx_received]         = "Rx RCV",
105         [rxrpc_skb_rx_purged]           = "Rx PUR",
106         [rxrpc_skb_rx_rotated]          = "Rx ROT",
107         [rxrpc_skb_rx_seen]             = "Rx SEE",
108         [rxrpc_skb_tx_cleaned]          = "Tx CLN",
109         [rxrpc_skb_tx_freed]            = "Tx FRE",
110         [rxrpc_skb_tx_got]              = "Tx GOT",
111         [rxrpc_skb_tx_new]              = "Tx NEW",
112         [rxrpc_skb_tx_rotated]          = "Tx ROT",
113         [rxrpc_skb_tx_seen]             = "Tx SEE",
114 };
115
116 const char rxrpc_conn_traces[rxrpc_conn__nr_trace][4] = {
117         [rxrpc_conn_new_client]         = "NWc",
118         [rxrpc_conn_new_service]        = "NWs",
119         [rxrpc_conn_queued]             = "QUE",
120         [rxrpc_conn_seen]               = "SEE",
121         [rxrpc_conn_got]                = "GOT",
122         [rxrpc_conn_put_client]         = "PTc",
123         [rxrpc_conn_put_service]        = "PTs",
124 };
125
126 const char rxrpc_client_traces[rxrpc_client__nr_trace][7] = {
127         [rxrpc_client_activate_chans]   = "Activa",
128         [rxrpc_client_alloc]            = "Alloc ",
129         [rxrpc_client_chan_activate]    = "ChActv",
130         [rxrpc_client_chan_disconnect]  = "ChDisc",
131         [rxrpc_client_chan_pass]        = "ChPass",
132         [rxrpc_client_chan_unstarted]   = "ChUnst",
133         [rxrpc_client_cleanup]          = "Clean ",
134         [rxrpc_client_count]            = "Count ",
135         [rxrpc_client_discard]          = "Discar",
136         [rxrpc_client_duplicate]        = "Duplic",
137         [rxrpc_client_exposed]          = "Expose",
138         [rxrpc_client_replace]          = "Replac",
139         [rxrpc_client_to_active]        = "->Actv",
140         [rxrpc_client_to_culled]        = "->Cull",
141         [rxrpc_client_to_idle]          = "->Idle",
142         [rxrpc_client_to_inactive]      = "->Inac",
143         [rxrpc_client_to_waiting]       = "->Wait",
144         [rxrpc_client_uncount]          = "Uncoun",
145 };
146
147 const char rxrpc_transmit_traces[rxrpc_transmit__nr_trace][4] = {
148         [rxrpc_transmit_wait]           = "WAI",
149         [rxrpc_transmit_queue]          = "QUE",
150         [rxrpc_transmit_queue_last]     = "QLS",
151         [rxrpc_transmit_rotate]         = "ROT",
152         [rxrpc_transmit_rotate_last]    = "RLS",
153         [rxrpc_transmit_await_reply]    = "AWR",
154         [rxrpc_transmit_end]            = "END",
155 };
156
157 const char rxrpc_receive_traces[rxrpc_receive__nr_trace][4] = {
158         [rxrpc_receive_incoming]        = "INC",
159         [rxrpc_receive_queue]           = "QUE",
160         [rxrpc_receive_queue_last]      = "QLS",
161         [rxrpc_receive_front]           = "FRN",
162         [rxrpc_receive_rotate]          = "ROT",
163         [rxrpc_receive_end]             = "END",
164 };
165
166 const char rxrpc_recvmsg_traces[rxrpc_recvmsg__nr_trace][5] = {
167         [rxrpc_recvmsg_enter]           = "ENTR",
168         [rxrpc_recvmsg_wait]            = "WAIT",
169         [rxrpc_recvmsg_dequeue]         = "DEQU",
170         [rxrpc_recvmsg_hole]            = "HOLE",
171         [rxrpc_recvmsg_next]            = "NEXT",
172         [rxrpc_recvmsg_cont]            = "CONT",
173         [rxrpc_recvmsg_full]            = "FULL",
174         [rxrpc_recvmsg_data_return]     = "DATA",
175         [rxrpc_recvmsg_terminal]        = "TERM",
176         [rxrpc_recvmsg_to_be_accepted]  = "TBAC",
177         [rxrpc_recvmsg_return]          = "RETN",
178 };
179
180 const char rxrpc_rtt_tx_traces[rxrpc_rtt_tx__nr_trace][5] = {
181         [rxrpc_rtt_tx_ping]             = "PING",
182         [rxrpc_rtt_tx_data]             = "DATA",
183 };
184
185 const char rxrpc_rtt_rx_traces[rxrpc_rtt_rx__nr_trace][5] = {
186         [rxrpc_rtt_rx_ping_response]    = "PONG",
187         [rxrpc_rtt_rx_requested_ack]    = "RACK",
188 };
189
190 const char rxrpc_timer_traces[rxrpc_timer__nr_trace][8] = {
191         [rxrpc_timer_begin]                     = "Begin ",
192         [rxrpc_timer_expired]                   = "*EXPR*",
193         [rxrpc_timer_init_for_reply]            = "IniRpl",
194         [rxrpc_timer_set_for_ack]               = "SetAck",
195         [rxrpc_timer_set_for_send]              = "SetTx ",
196         [rxrpc_timer_set_for_resend]            = "SetRTx",
197 };
198
199 const char rxrpc_propose_ack_traces[rxrpc_propose_ack__nr_trace][8] = {
200         [rxrpc_propose_ack_client_tx_end]       = "ClTxEnd",
201         [rxrpc_propose_ack_input_data]          = "DataIn ",
202         [rxrpc_propose_ack_ping_for_lost_ack]   = "LostAck",
203         [rxrpc_propose_ack_ping_for_lost_reply] = "LostRpl",
204         [rxrpc_propose_ack_ping_for_params]     = "Params ",
205         [rxrpc_propose_ack_respond_to_ack]      = "Rsp2Ack",
206         [rxrpc_propose_ack_respond_to_ping]     = "Rsp2Png",
207         [rxrpc_propose_ack_retry_tx]            = "RetryTx",
208         [rxrpc_propose_ack_rotate_rx]           = "RxAck  ",
209         [rxrpc_propose_ack_terminal_ack]        = "ClTerm ",
210 };
211
212 const char *const rxrpc_propose_ack_outcomes[rxrpc_propose_ack__nr_outcomes] = {
213         [rxrpc_propose_ack_use]                 = "",
214         [rxrpc_propose_ack_update]              = " Update",
215         [rxrpc_propose_ack_subsume]             = " Subsume",
216 };
217
218 const char rxrpc_congest_modes[NR__RXRPC_CONGEST_MODES][10] = {
219         [RXRPC_CALL_SLOW_START]         = "SlowStart",
220         [RXRPC_CALL_CONGEST_AVOIDANCE]  = "CongAvoid",
221         [RXRPC_CALL_PACKET_LOSS]        = "PktLoss  ",
222         [RXRPC_CALL_FAST_RETRANSMIT]    = "FastReTx ",
223 };
224
225 const char rxrpc_congest_changes[rxrpc_congest__nr_change][9] = {
226         [rxrpc_cong_begin_retransmission]       = " Retrans",
227         [rxrpc_cong_cleared_nacks]              = " Cleared",
228         [rxrpc_cong_new_low_nack]               = " NewLowN",
229         [rxrpc_cong_no_change]                  = "",
230         [rxrpc_cong_progress]                   = " Progres",
231         [rxrpc_cong_retransmit_again]           = " ReTxAgn",
232         [rxrpc_cong_rtt_window_end]             = " RttWinE",
233         [rxrpc_cong_saw_nack]                   = " SawNack",
234 };