blob: 6cab1f74ae05a39e54cdba498928d7ef1d6953da [file] [log] [blame]
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +02001.. SPDX-License-Identifier: GPL-2.0
2
3=========================
Tom Herbertbbb03022017-07-28 16:22:43 -07004Stream Parser (strparser)
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +02005=========================
Tom Herbertbbb03022017-07-28 16:22:43 -07006
7Introduction
8============
Tom Herbertadcce4d2016-08-15 14:51:03 -07009
10The stream parser (strparser) is a utility that parses messages of an
Tom Herbertbbb03022017-07-28 16:22:43 -070011application layer protocol running over a data stream. The stream
Tom Herbertadcce4d2016-08-15 14:51:03 -070012parser works in conjunction with an upper layer in the kernel to provide
13kernel support for application layer messages. For instance, Kernel
14Connection Multiplexor (KCM) uses the Stream Parser to parse messages
15using a BPF program.
16
Tom Herbertbbb03022017-07-28 16:22:43 -070017The strparser works in one of two modes: receive callback or general
18mode.
19
20In receive callback mode, the strparser is called from the data_ready
21callback of a TCP socket. Messages are parsed and delivered as they are
22received on the socket.
23
24In general mode, a sequence of skbs are fed to strparser from an
25outside source. Message are parsed and delivered as the sequence is
26processed. This modes allows strparser to be applied to arbitrary
27streams of data.
28
Tom Herbertadcce4d2016-08-15 14:51:03 -070029Interface
Tom Herbertbbb03022017-07-28 16:22:43 -070030=========
Tom Herbertadcce4d2016-08-15 14:51:03 -070031
32The API includes a context structure, a set of callbacks, utility
Tom Herbertbbb03022017-07-28 16:22:43 -070033functions, and a data_ready function for receive callback mode. The
34callbacks include a parse_msg function that is called to perform
35parsing (e.g. BPF parsing in case of KCM), and a rcv_msg function
36that is called when a full message has been completed.
Tom Herbertadcce4d2016-08-15 14:51:03 -070037
Tom Herbertbbb03022017-07-28 16:22:43 -070038Functions
39=========
Tom Herbertadcce4d2016-08-15 14:51:03 -070040
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020041 ::
42
43 strp_init(struct strparser *strp, struct sock *sk,
44 const struct strp_callbacks *cb)
Tom Herbertadcce4d2016-08-15 14:51:03 -070045
Tom Herbertbbb03022017-07-28 16:22:43 -070046 Called to initialize a stream parser. strp is a struct of type
47 strparser that is allocated by the upper layer. sk is the TCP
48 socket associated with the stream parser for use with receive
49 callback mode; in general mode this is set to NULL. Callbacks
50 are called by the stream parser (the callbacks are listed below).
51
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020052 ::
53
54 void strp_pause(struct strparser *strp)
Tom Herbertbbb03022017-07-28 16:22:43 -070055
56 Temporarily pause a stream parser. Message parsing is suspended
57 and no new messages are delivered to the upper layer.
58
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020059 ::
60
61 void strp_unpause(struct strparser *strp)
Tom Herbertbbb03022017-07-28 16:22:43 -070062
63 Unpause a paused stream parser.
64
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020065 ::
66
67 void strp_stop(struct strparser *strp);
Tom Herbertbbb03022017-07-28 16:22:43 -070068
69 strp_stop is called to completely stop stream parser operations.
70 This is called internally when the stream parser encounters an
71 error, and it is called from the upper layer to stop parsing
72 operations.
73
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020074 ::
75
76 void strp_done(struct strparser *strp);
Tom Herbertbbb03022017-07-28 16:22:43 -070077
78 strp_done is called to release any resources held by the stream
79 parser instance. This must be called after the stream processor
80 has been stopped.
81
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020082 ::
83
84 int strp_process(struct strparser *strp, struct sk_buff *orig_skb,
85 unsigned int orig_offset, size_t orig_len,
86 size_t max_msg_size, long timeo)
Tom Herbertbbb03022017-07-28 16:22:43 -070087
88 strp_process is called in general mode for a stream parser to
89 parse an sk_buff. The number of bytes processed or a negative
90 error number is returned. Note that strp_process does not
91 consume the sk_buff. max_msg_size is maximum size the stream
92 parser will parse. timeo is timeout for completing a message.
93
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +020094 ::
95
96 void strp_data_ready(struct strparser *strp);
Tom Herbertbbb03022017-07-28 16:22:43 -070097
98 The upper layer calls strp_tcp_data_ready when data is ready on
99 the lower socket for strparser to process. This should be called
100 from a data_ready callback that is set on the socket. Note that
101 maximum messages size is the limit of the receive socket
102 buffer and message timeout is the receive timeout for the socket.
103
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200104 ::
105
106 void strp_check_rcv(struct strparser *strp);
Tom Herbertbbb03022017-07-28 16:22:43 -0700107
108 strp_check_rcv is called to check for new messages on the socket.
109 This is normally called at initialization of a stream parser
110 instance or after strp_unpause.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700111
112Callbacks
Tom Herbertbbb03022017-07-28 16:22:43 -0700113=========
Tom Herbertadcce4d2016-08-15 14:51:03 -0700114
Tom Herbertbbb03022017-07-28 16:22:43 -0700115There are six callbacks:
Tom Herbertadcce4d2016-08-15 14:51:03 -0700116
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200117 ::
118
119 int (*parse_msg)(struct strparser *strp, struct sk_buff *skb);
Tom Herbertadcce4d2016-08-15 14:51:03 -0700120
121 parse_msg is called to determine the length of the next message
122 in the stream. The upper layer must implement this function. It
123 should parse the sk_buff as containing the headers for the
Tom Herbertbbb03022017-07-28 16:22:43 -0700124 next application layer message in the stream.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700125
Tom Herbertbbb03022017-07-28 16:22:43 -0700126 The skb->cb in the input skb is a struct strp_msg. Only
Tom Herbertadcce4d2016-08-15 14:51:03 -0700127 the offset field is relevant in parse_msg and gives the offset
128 where the message starts in the skb.
129
130 The return values of this function are:
131
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200132 ========= ===========================================================
133 >0 indicates length of successfully parsed message
134 0 indicates more data must be received to parse the message
135 -ESTRPIPE current message should not be processed by the
136 kernel, return control of the socket to userspace which
137 can proceed to read the messages itself
138 other < 0 Error in parsing, give control back to userspace
139 assuming that synchronization is lost and the stream
140 is unrecoverable (application expected to close TCP socket)
141 ========= ===========================================================
Tom Herbertadcce4d2016-08-15 14:51:03 -0700142
143 In the case that an error is returned (return value is less than
Tom Herbertbbb03022017-07-28 16:22:43 -0700144 zero) and the parser is in receive callback mode, then it will set
145 the error on TCP socket and wake it up. If parse_msg returned
146 -ESTRPIPE and the stream parser had previously read some bytes for
147 the current message, then the error set on the attached socket is
148 ENODATA since the stream is unrecoverable in that case.
149
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200150 ::
151
152 void (*lock)(struct strparser *strp)
Tom Herbertbbb03022017-07-28 16:22:43 -0700153
154 The lock callback is called to lock the strp structure when
155 the strparser is performing an asynchronous operation (such as
156 processing a timeout). In receive callback mode the default
157 function is to lock_sock for the associated socket. In general
158 mode the callback must be set appropriately.
159
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200160 ::
161
162 void (*unlock)(struct strparser *strp)
Tom Herbertbbb03022017-07-28 16:22:43 -0700163
164 The unlock callback is called to release the lock obtained
165 by the lock callback. In receive callback mode the default
166 function is release_sock for the associated socket. In general
167 mode the callback must be set appropriately.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700168
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200169 ::
170
171 void (*rcv_msg)(struct strparser *strp, struct sk_buff *skb);
Tom Herbertadcce4d2016-08-15 14:51:03 -0700172
173 rcv_msg is called when a full message has been received and
174 is queued. The callee must consume the sk_buff; it can
175 call strp_pause to prevent any further messages from being
Tom Herbertbbb03022017-07-28 16:22:43 -0700176 received in rcv_msg (see strp_pause above). This callback
Tom Herbertadcce4d2016-08-15 14:51:03 -0700177 must be set.
178
Tom Herbertbbb03022017-07-28 16:22:43 -0700179 The skb->cb in the input skb is a struct strp_msg. This
Tom Herbertadcce4d2016-08-15 14:51:03 -0700180 struct contains two fields: offset and full_len. Offset is
181 where the message starts in the skb, and full_len is the
182 the length of the message. skb->len - offset may be greater
183 then full_len since strparser does not trim the skb.
184
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200185 ::
186
187 int (*read_sock_done)(struct strparser *strp, int err);
Tom Herbertadcce4d2016-08-15 14:51:03 -0700188
189 read_sock_done is called when the stream parser is done reading
Tom Herbertbbb03022017-07-28 16:22:43 -0700190 the TCP socket in receive callback mode. The stream parser may
191 read multiple messages in a loop and this function allows cleanup
192 to occur when exiting the loop. If the callback is not set (NULL
193 in strp_init) a default function is used.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700194
Mauro Carvalho Chehab060d9d32020-04-30 18:04:26 +0200195 ::
196
197 void (*abort_parser)(struct strparser *strp, int err);
Tom Herbertadcce4d2016-08-15 14:51:03 -0700198
199 This function is called when stream parser encounters an error
Tom Herbertbbb03022017-07-28 16:22:43 -0700200 in parsing. The default function stops the stream parser and
201 sets the error in the socket if the parser is in receive callback
202 mode. The default function can be changed by setting the callback
203 to non-NULL in strp_init.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700204
205Statistics
Tom Herbertbbb03022017-07-28 16:22:43 -0700206==========
Tom Herbertadcce4d2016-08-15 14:51:03 -0700207
Tom Herbertbbb03022017-07-28 16:22:43 -0700208Various counters are kept for each stream parser instance. These are in
209the strp_stats structure. strp_aggr_stats is a convenience structure for
210accumulating statistics for multiple stream parser instances.
211save_strp_stats and aggregate_strp_stats are helper functions to save
212and aggregate statistics.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700213
214Message assembly limits
Tom Herbertbbb03022017-07-28 16:22:43 -0700215=======================
Tom Herbertadcce4d2016-08-15 14:51:03 -0700216
217The stream parser provide mechanisms to limit the resources consumed by
218message assembly.
219
Tom Herbertbbb03022017-07-28 16:22:43 -0700220A timer is set when assembly starts for a new message. In receive
221callback mode the message timeout is taken from rcvtime for the
222associated TCP socket. In general mode, the timeout is passed as an
223argument in strp_process. If the timer fires before assembly completes
224the stream parser is aborted and the ETIMEDOUT error is set on the TCP
225socket if in receive callback mode.
Tom Herbertadcce4d2016-08-15 14:51:03 -0700226
Tom Herbertbbb03022017-07-28 16:22:43 -0700227In receive callback mode, message length is limited to the receive
228buffer size of the associated TCP socket. If the length returned by
229parse_msg is greater than the socket buffer size then the stream parser
230is aborted with EMSGSIZE error set on the TCP socket. Note that this
231makes the maximum size of receive skbuffs for a socket with a stream
232parser to be 2*sk_rcvbuf of the TCP socket.
233
234In general mode the message length limit is passed in as an argument
235to strp_process.
236
237Author
238======
239
240Tom Herbert (tom@quantonium.net)