Skip to main content

opcua_server/config/
limits.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
4/// Server limits configuration.
5pub struct Limits {
6    /// Max array length in elements
7    #[serde(default = "defaults::max_array_length")]
8    pub max_array_length: usize,
9    /// Max string length in characters
10    #[serde(default = "defaults::max_string_length")]
11    pub max_string_length: usize,
12    /// Max bytestring length in bytes
13    #[serde(default = "defaults::max_byte_string_length")]
14    pub max_byte_string_length: usize,
15    /// Maximum message length in bytes
16    #[serde(default = "defaults::max_message_size")]
17    pub max_message_size: usize,
18    /// Maximum chunk count
19    #[serde(default = "defaults::max_chunk_count")]
20    pub max_chunk_count: usize,
21    /// Send buffer size in bytes
22    #[serde(default = "defaults::send_buffer_size")]
23    pub send_buffer_size: usize,
24    /// Receive buffer size in bytes
25    #[serde(default = "defaults::receive_buffer_size")]
26    pub receive_buffer_size: usize,
27    /// Limits specific to subscriptions.
28    #[serde(default)]
29    pub subscriptions: SubscriptionLimits,
30    /// Limits on service calls.
31    #[serde(default)]
32    pub operational: OperationalLimits,
33    /// Maximum number of browse continuation points per session.
34    #[serde(default = "defaults::max_browse_continuation_points")]
35    pub max_browse_continuation_points: usize,
36    /// Maximum number of history continuation points per session.
37    #[serde(default = "defaults::max_history_continuation_points")]
38    pub max_history_continuation_points: usize,
39    /// Maximum number of query continuation points per session.
40    #[serde(default = "defaults::max_query_continuation_points")]
41    pub max_query_continuation_points: usize,
42    /// Maximum number of registered sessions before new ones are rejected.
43    #[serde(default = "defaults::max_sessions")]
44    pub max_sessions: usize,
45}
46
47impl Default for Limits {
48    fn default() -> Self {
49        Self {
50            max_array_length: defaults::max_array_length(),
51            max_string_length: defaults::max_string_length(),
52            max_byte_string_length: defaults::max_byte_string_length(),
53            max_message_size: defaults::max_message_size(),
54            max_chunk_count: defaults::max_chunk_count(),
55            send_buffer_size: defaults::send_buffer_size(),
56            receive_buffer_size: defaults::receive_buffer_size(),
57            subscriptions: Default::default(),
58            max_browse_continuation_points: defaults::max_browse_continuation_points(),
59            max_history_continuation_points: defaults::max_history_continuation_points(),
60            max_query_continuation_points: defaults::max_query_continuation_points(),
61            operational: OperationalLimits::default(),
62            max_sessions: defaults::max_sessions(),
63        }
64    }
65}
66
67#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
68/// Subscription-related limits.
69pub struct SubscriptionLimits {
70    /// Maximum number of subscriptions per session.
71    #[serde(default = "defaults::max_subscriptions_per_session")]
72    pub max_subscriptions_per_session: usize,
73    /// Maximum number of pending publish requests per session.
74    #[serde(default = "defaults::max_pending_publish_requests")]
75    pub max_pending_publish_requests: usize,
76    /// Maximum number of publish requests per session, per subscription.
77    /// The smallest of this and `max_pending_publish_requests` is used.
78    #[serde(default = "defaults::max_publish_requests_per_subscription")]
79    pub max_publish_requests_per_subscription: usize,
80    /// Specifies the minimum sampling interval for this server in milliseconds.
81    #[serde(default = "defaults::min_sampling_interval_ms")]
82    pub min_sampling_interval_ms: f64,
83    /// Specifies the minimum publishing interval for this server in milliseconds.
84    #[serde(default = "defaults::min_publishing_interval_ms")]
85    pub min_publishing_interval_ms: f64,
86    /// Maximum value of `KeepAliveCount`
87    #[serde(default = "defaults::max_keep_alive_count")]
88    pub max_keep_alive_count: u32,
89    /// Default value of `KeepAliveCount`, used if the client sets it to 0.
90    #[serde(default = "defaults::default_keep_alive_count")]
91    pub default_keep_alive_count: u32,
92    /// Maximum number of monitored items per subscription, 0 for no limit
93    #[serde(default = "defaults::max_monitored_items_per_sub")]
94    pub max_monitored_items_per_sub: usize,
95    /// Maximum number of values in a monitored item queue
96    #[serde(default = "defaults::max_monitored_item_queue_size")]
97    pub max_monitored_item_queue_size: usize,
98    /// Maximum lifetime count (3 times as large as max keep alive)
99    #[serde(default = "defaults::max_lifetime_count")]
100    pub max_lifetime_count: u32,
101    /// Maximum number of notifications per publish message.
102    #[serde(default = "defaults::max_notifications_per_publish")]
103    pub max_notifications_per_publish: u64,
104    /// Maximum number of queued notifications per subscription. 0 for unlimited.
105    #[serde(default = "defaults::max_queued_notifications")]
106    pub max_queued_notifications: usize,
107}
108
109impl Default for SubscriptionLimits {
110    fn default() -> Self {
111        Self {
112            max_subscriptions_per_session: defaults::max_subscriptions_per_session(),
113            max_pending_publish_requests: defaults::max_pending_publish_requests(),
114            max_publish_requests_per_subscription: defaults::max_publish_requests_per_subscription(
115            ),
116            min_sampling_interval_ms: defaults::min_sampling_interval_ms(),
117            min_publishing_interval_ms: defaults::min_publishing_interval_ms(),
118            max_keep_alive_count: defaults::max_keep_alive_count(),
119            default_keep_alive_count: defaults::default_keep_alive_count(),
120            max_monitored_items_per_sub: defaults::max_monitored_items_per_sub(),
121            max_monitored_item_queue_size: defaults::max_monitored_item_queue_size(),
122            max_lifetime_count: defaults::max_lifetime_count(),
123            max_notifications_per_publish: defaults::max_notifications_per_publish(),
124            max_queued_notifications: defaults::max_queued_notifications(),
125        }
126    }
127}
128
129#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
130/// Limits on service calls.
131pub struct OperationalLimits {
132    /// Maximum number of nodes per translate browse paths to node IDs call.
133    #[serde(default = "defaults::max_nodes_per_translate_browse_paths_to_node_ids")]
134    pub max_nodes_per_translate_browse_paths_to_node_ids: usize,
135    /// Maximum number of nodes per Read call.
136    #[serde(default = "defaults::max_nodes_per_read")]
137    pub max_nodes_per_read: usize,
138    /// Maximum number of nodes per Write call.
139    #[serde(default = "defaults::max_nodes_per_write")]
140    pub max_nodes_per_write: usize,
141    /// Maximum number of nodes per Call service call.
142    #[serde(default = "defaults::max_nodes_per_method_call")]
143    pub max_nodes_per_method_call: usize,
144    /// Maximum number of nodes per Browse call.
145    #[serde(default = "defaults::max_nodes_per_browse")]
146    pub max_nodes_per_browse: usize,
147    /// Maximum number of nodes per RegisterNodes call.
148    #[serde(default = "defaults::max_nodes_per_register_nodes")]
149    pub max_nodes_per_register_nodes: usize,
150    /// Maximum number of nodes per create/modify/delete monitored items call.
151    #[serde(default = "defaults::max_monitored_items_per_call")]
152    pub max_monitored_items_per_call: usize,
153    /// Maximum number of nodes per history read call for data values.
154    #[serde(default = "defaults::max_nodes_per_history_read_data")]
155    pub max_nodes_per_history_read_data: usize,
156    /// Maximum number of nodes per history read call for events.
157    #[serde(default = "defaults::max_nodes_per_history_read_events")]
158    pub max_nodes_per_history_read_events: usize,
159    /// Maximum number of nodes per history update call.
160    #[serde(default = "defaults::max_nodes_per_history_update")]
161    pub max_nodes_per_history_update: usize,
162    /// Maximum number of references per node during browse.
163    #[serde(default = "defaults::max_references_per_browse_node")]
164    pub max_references_per_browse_node: usize,
165    /// Maximum number of node descriptions per query call.
166    #[serde(default = "defaults::max_node_descs_per_query")]
167    pub max_node_descs_per_query: usize,
168    /// Maximum number of data sets returned per node on query calls.
169    #[serde(default = "defaults::max_data_sets_query_return")]
170    pub max_data_sets_query_return: usize,
171    /// Maximum number of references per data set on query calls.
172    #[serde(default = "defaults::max_references_query_return")]
173    pub max_references_query_return: usize,
174    /// Maximum number of nodes per add/delete nodes call.
175    #[serde(default = "defaults::max_nodes_per_node_management")]
176    pub max_nodes_per_node_management: usize,
177    /// Maximum number of references per add/delete references call.
178    #[serde(default = "defaults::max_references_per_references_management")]
179    pub max_references_per_references_management: usize,
180    /// Maximum number of subscriptions per create/modify/delete subscriptions call.
181    #[serde(default = "defaults::max_subscriptions_per_call")]
182    pub max_subscriptions_per_call: usize,
183}
184
185impl Default for OperationalLimits {
186    fn default() -> Self {
187        Self {
188            max_nodes_per_translate_browse_paths_to_node_ids:
189                defaults::max_nodes_per_translate_browse_paths_to_node_ids(),
190            max_nodes_per_read: defaults::max_nodes_per_read(),
191            max_nodes_per_write: defaults::max_nodes_per_write(),
192            max_nodes_per_method_call: defaults::max_nodes_per_method_call(),
193            max_nodes_per_browse: defaults::max_nodes_per_browse(),
194            max_nodes_per_register_nodes: defaults::max_nodes_per_register_nodes(),
195            max_monitored_items_per_call: defaults::max_monitored_items_per_call(),
196            max_nodes_per_history_read_data: defaults::max_nodes_per_history_read_data(),
197            max_nodes_per_history_read_events: defaults::max_nodes_per_history_read_events(),
198            max_nodes_per_history_update: defaults::max_nodes_per_history_update(),
199            max_references_per_browse_node: defaults::max_references_per_browse_node(),
200            max_node_descs_per_query: defaults::max_node_descs_per_query(),
201            max_data_sets_query_return: defaults::max_data_sets_query_return(),
202            max_references_query_return: defaults::max_references_query_return(),
203            max_nodes_per_node_management: defaults::max_nodes_per_node_management(),
204            max_references_per_references_management:
205                defaults::max_references_per_references_management(),
206            max_subscriptions_per_call: defaults::max_subscriptions_per_call(),
207        }
208    }
209}
210
211mod defaults {
212    use crate::constants;
213    pub(super) fn max_array_length() -> usize {
214        opcua_types::constants::MAX_ARRAY_LENGTH
215    }
216    pub(super) fn max_string_length() -> usize {
217        opcua_types::constants::MAX_STRING_LENGTH
218    }
219    pub(super) fn max_byte_string_length() -> usize {
220        opcua_types::constants::MAX_BYTE_STRING_LENGTH
221    }
222    pub(super) fn max_message_size() -> usize {
223        opcua_types::constants::MAX_MESSAGE_SIZE
224    }
225    pub(super) fn max_chunk_count() -> usize {
226        opcua_types::constants::MAX_CHUNK_COUNT
227    }
228    pub(super) fn send_buffer_size() -> usize {
229        constants::SEND_BUFFER_SIZE
230    }
231    pub(super) fn receive_buffer_size() -> usize {
232        constants::RECEIVE_BUFFER_SIZE
233    }
234    pub(super) fn max_browse_continuation_points() -> usize {
235        constants::MAX_BROWSE_CONTINUATION_POINTS
236    }
237    pub(super) fn max_history_continuation_points() -> usize {
238        constants::MAX_HISTORY_CONTINUATION_POINTS
239    }
240    pub(super) fn max_query_continuation_points() -> usize {
241        constants::MAX_QUERY_CONTINUATION_POINTS
242    }
243    pub(super) fn max_sessions() -> usize {
244        constants::MAX_SESSIONS
245    }
246
247    pub(super) fn max_subscriptions_per_session() -> usize {
248        constants::MAX_SUBSCRIPTIONS_PER_SESSION
249    }
250    pub(super) fn max_pending_publish_requests() -> usize {
251        constants::MAX_PENDING_PUBLISH_REQUESTS
252    }
253    pub(super) fn max_publish_requests_per_subscription() -> usize {
254        constants::MAX_PUBLISH_REQUESTS_PER_SUBSCRIPTION
255    }
256    pub(super) fn min_sampling_interval_ms() -> f64 {
257        constants::MIN_SAMPLING_INTERVAL_MS
258    }
259    pub(super) fn min_publishing_interval_ms() -> f64 {
260        constants::MIN_PUBLISHING_INTERVAL_MS
261    }
262    pub(super) fn max_keep_alive_count() -> u32 {
263        constants::MAX_KEEP_ALIVE_COUNT
264    }
265    pub(super) fn default_keep_alive_count() -> u32 {
266        constants::DEFAULT_KEEP_ALIVE_COUNT
267    }
268    pub(super) fn max_monitored_items_per_sub() -> usize {
269        constants::DEFAULT_MAX_MONITORED_ITEMS_PER_SUB
270    }
271    pub(super) fn max_monitored_item_queue_size() -> usize {
272        constants::MAX_DATA_CHANGE_QUEUE_SIZE
273    }
274    pub(super) fn max_lifetime_count() -> u32 {
275        constants::MAX_KEEP_ALIVE_COUNT * 3
276    }
277    pub(super) fn max_notifications_per_publish() -> u64 {
278        constants::MAX_NOTIFICATIONS_PER_PUBLISH
279    }
280    pub(super) fn max_queued_notifications() -> usize {
281        constants::MAX_QUEUED_NOTIFICATIONS
282    }
283
284    pub(super) fn max_nodes_per_translate_browse_paths_to_node_ids() -> usize {
285        constants::MAX_NODES_PER_TRANSLATE_BROWSE_PATHS_TO_NODE_IDS
286    }
287    pub(super) fn max_nodes_per_read() -> usize {
288        constants::MAX_NODES_PER_READ
289    }
290    pub(super) fn max_nodes_per_write() -> usize {
291        constants::MAX_NODES_PER_WRITE
292    }
293    pub(super) fn max_nodes_per_method_call() -> usize {
294        constants::MAX_NODES_PER_METHOD_CALL
295    }
296    pub(super) fn max_nodes_per_browse() -> usize {
297        constants::MAX_NODES_PER_BROWSE
298    }
299    pub(super) fn max_nodes_per_register_nodes() -> usize {
300        constants::MAX_NODES_PER_REGISTER_NODES
301    }
302    pub(super) fn max_monitored_items_per_call() -> usize {
303        constants::MAX_MONITORED_ITEMS_PER_CALL
304    }
305    pub(super) fn max_nodes_per_history_read_data() -> usize {
306        constants::MAX_NODES_PER_HISTORY_READ_DATA
307    }
308    pub(super) fn max_nodes_per_history_read_events() -> usize {
309        constants::MAX_NODES_PER_HISTORY_READ_EVENTS
310    }
311    pub(super) fn max_nodes_per_history_update() -> usize {
312        constants::MAX_NODES_PER_HISTORY_UPDATE
313    }
314    pub(super) fn max_references_per_browse_node() -> usize {
315        constants::MAX_REFERENCES_PER_BROWSE_NODE
316    }
317    pub(super) fn max_node_descs_per_query() -> usize {
318        constants::MAX_NODE_DESCS_PER_QUERY
319    }
320    pub(super) fn max_data_sets_query_return() -> usize {
321        constants::MAX_DATA_SETS_QUERY_RETURN
322    }
323    pub(super) fn max_references_query_return() -> usize {
324        constants::MAX_REFERENCES_QUERY_RETURN
325    }
326    pub(super) fn max_nodes_per_node_management() -> usize {
327        constants::MAX_NODES_PER_NODE_MANAGEMENT
328    }
329    pub(super) fn max_references_per_references_management() -> usize {
330        constants::MAX_REFERENCES_PER_REFERENCE_MANAGEMENT
331    }
332    pub(super) fn max_subscriptions_per_call() -> usize {
333        constants::MAX_SUBSCRIPTIONS_PER_CALL
334    }
335}