pub struct ServerConfig {Show 32 fields
pub registered_network_port: Option<ObjectIdentifier>,
pub audit_reporters: Option<AuditReportersConfig>,
pub get_alarm_summary_budget: GetAlarmSummaryBudget,
pub get_enrollment_summary_budget: GetEnrollmentSummaryBudget,
pub atomic_read_file_budget: AtomicReadFileBudget,
pub atomic_write_file_budget: AtomicWriteFileBudget,
pub read_range_budget: ReadRangeBudget,
pub get_event_information_budget: GetEventInformationBudget,
pub read_property_multiple_budget: ReadPropertyMultipleBudget,
pub interface: Ipv4Addr,
pub port: u16,
pub broadcast_address: Ipv4Addr,
pub share_port_by_address: bool,
pub device: DeviceIdentity,
pub cov_retry_timeout_ms: u64,
pub time_sync_policy: TimeSyncPolicy,
pub on_time_sync: Option<Arc<dyn Fn(TimeSyncData) + Send + Sync>>,
pub on_reinitialize: Option<ReinitializeHandler>,
pub mutation_policy: MutationPolicy,
pub policy: Option<Arc<dyn ServerPolicy>>,
pub audit_notification_sink: Option<ObjectIdentifier>,
pub dcc_password: Option<String>,
pub dcc_policy: DccPolicy,
pub dcc_source_restriction: Option<DccSourceRestriction>,
pub dcc_disable_rate_limit: Option<DccDisableRateLimit>,
pub reinit_password: Option<String>,
pub enable_fault_detection: bool,
pub enable_event_enrollment: bool,
pub event_enrollment_interval_secs: u64,
pub discovery_policy: DiscoveryPolicy,
pub cov_policy: CovPolicy,
pub request_admission_policy: RequestAdmissionPolicy,
}Expand description
Server configuration.
Fields§
§registered_network_port: Option<ObjectIdentifier>Explicit concrete Network Port for one owned B/IP transport, in NORMAL, FOREIGN or BBMD mode (a BBMD that also registers as a foreign device is refused at start). None leaves configured objects unbound and receiving-port wildcard unavailable.
audit_reporters: Option<AuditReportersConfig>Optional target Audit Reporter profile. Its recipient is provisioned on the built-in Device and becomes writable while the runtime is installed.
get_alarm_summary_budget: GetAlarmSummaryBudgetPer-service GetAlarmSummary database scan and encoded response limits.
get_enrollment_summary_budget: GetEnrollmentSummaryBudgetLocal complete-response limits for GetEnrollmentSummary.
atomic_read_file_budget: AtomicReadFileBudgetLocal AtomicReadFile raw-count and complete service-ACK limits.
atomic_write_file_budget: AtomicWriteFileBudgetLocal AtomicWriteFile payload admission limits.
read_range_budget: ReadRangeBudgetReadRange directional page item and logical service-byte limits.
get_event_information_budget: GetEventInformationBudgetGetEventInformation database admission and strict response-page limits.
read_property_multiple_budget: ReadPropertyMultipleBudgetPer-service RPM work and encoded response limits (finite by default).
interface: Ipv4AddrLocal interface to bind.
port: u16UDP port (default 0xBAC0 = 47808).
broadcast_address: Ipv4AddrDirected broadcast address.
B/IP only: bind the interface address itself, so devices on other
addresses of this host can share the port (#1538). Off by default.
Needs an explicit interface and a nonzero port; see
BipTransport::set_share_port_by_address for what changes. Only the
B/IP builder reads it; a transport passed to start has its own.
device: DeviceIdentityDevice declarations shared by stock objects, discovery and active limits. Startup resolves its receive ceiling against the owned transport. An explicitly supplied selected Device must match; an empty database may later add this same OID, but never rebinds the runtime to another Device.
cov_retry_timeout_ms: u64APDU timeout in ms of confirmed COV and event notifications and of the WriteProperty a Command action sends to another device (default 3000 ms): how long each attempt waits for the reply once its send has completed, before the next retry. The transport bounds the send itself. It is also the base of the COV hold-off after a failed confirmed report, one full retry cycle: this timeout times the attempts (#896).
time_sync_policy: TimeSyncPolicyOpt-in inbound time-sync restrictions; default allows all, with no step cap.
on_time_sync: Option<Arc<dyn Fn(TimeSyncData) + Send + Sync>>Optional fast, nonblocking observer invoked after the clock changes. A panic is caught (with unwind builds); the change stands and ingress continues. This callback cannot authorize or roll back synchronization.
on_reinitialize: Option<ReinitializeHandler>Optional ReinitializeDevice handler, called with the requester’s
ReinitializeContext once the request passes its password and state
checks. Without it every such request is refused with
SERVICES / SERVICE_REQUEST_DENIED.
The rules are on ReinitializeHandler. In short: the SimpleACK goes
out only after the handler returns, so register any restart with
ReinitializeContext::after_reply rather than restarting inline; it
runs once the reply has been handed to the transport (#1565), and
never for a refusal. The handler runs synchronously with the
object database write-locked, so keep it quick and hand slow work to a
task; its database edits skip the COV, event and Audit work of
BACnetServer::write_local, so apply changes that need it there
afterwards. Without reinit_password any peer
reaches it, and neither mutation_policy nor
policy covers this service, so restrict sources
through the context. Refuse
with Error::protocol: a panic or an Error::reject is answered
SERVICES / OTHER.
mutation_policy: MutationPolicyLocal mutation authorization mode (default: permissive). SC mTLS channel/peer
authentication is not service authorization. See MutationPolicy.
DenyAll denies every covered mutation without asking
policy, each Channel write of an inbound WriteGroup
included, counted in BACnetServer::mutation_decision_counters (#1319).
Denials mutate nothing and write no audit log.
policy: Option<Arc<dyn ServerPolicy>>The application’s authorization decisions (default: none). See
ServerPolicy for what it decides, each method’s default and the
direct-SC principal its contexts carry. None behaves as those
defaults: covered mutations are allowed (without being decoded for
authorization first), and LifeSafetyOperation and both
AuditNotification services are denied.
audit_notification_sink: Option<ObjectIdentifier>Exactly one explicitly configured Audit Log notification sink.
Absence is fail-closed; the server never selects a sink by database
iteration order. Storing a notification also needs
policy to authorize it.
A built-in AuditLogObject configured with set_member_of also forwards
record-changing accepted batches once, after commit, to that parent using
a configured DeviceBinding. No backlog, retries, or durable send progress.
dcc_password: Option<String>Optional password required for DeviceCommunicationControl.
dcc_policy: DccPolicyLocal DCC authorization. Supplying a password alone does not enable DCC.
dcc_source_restriction: Option<DccSourceRestriction>Optional exact claimed-source restriction, valid only with RequirePassword.
dcc_disable_rate_limit: Option<DccDisableRateLimit>Optional global DISABLE_INITIATION budget; does not enable DCC authorization.
reinit_password: Option<String>Optional password required for ReinitializeDevice.
enable_fault_detection: boolEnable periodic fault detection / reliability evaluation. When true, the server invokes every object’s opt-in, object-owned reliability evaluation hook every 10 seconds. Stock objects currently inherit the no-op default.
This governs reliability evaluation only. Event Enrollment evaluation
is configured separately via enable_event_enrollment.
enable_event_enrollment: boolEnable periodic Event Enrollment evaluation (default true).
When true, the server re-reads the property each Event Enrollment object
names in its Object_Property_Reference and applies the configured event
algorithm. Startup: the task is spawned by start
and its first pass runs immediately, then once per interval. Shutdown:
stop aborts it and awaits the abort.
This switch governs the evaluation task; it is not the per-object
Event_Detection_Enable property of ASHRAE 135-2020 Clause 13.2.2.1.
Setting it false stops evaluation without performing the reset that
clause requires of a disabled detector (Event_State to NORMAL, with the
corresponding timestamp and acknowledgment state), so a device carrying
active enrollments will hold whatever state it last detected.
Evaluation is a no-op on databases holding no Event Enrollment objects, so the default is on.
Successful enabled transitions commit Event_State,
Acked_Transitions, and Event_Time_Stamps atomically and are then
routed through the shared EventNotification sender. Event Enrollment
message text remains intentionally absent, and exact event-specific
notification values are deferred to the payload projection work.
event_enrollment_interval_secs: u64Interval in seconds between Event Enrollment evaluation passes (default 10).
This is a sampling cadence with no basis in ASHRAE 135-2020, which
prescribes no evaluation frequency and leaves acquisition of a monitored
value a local matter (Clause 12.12). It is not the Time_Delay of an
event algorithm, which is how long a condition must persist before a
transition is indicated (Clause 13.3) — a coarse interval delays
detection and can miss a condition that both appears and clears between
two passes.
A value of 0 is clamped to one second. Ignored when
enable_event_enrollment is false.
discovery_policy: DiscoveryPolicyDiscovery rate-limiting and duplicate suppression policy.
cov_policy: CovPolicyCOV quota, rate accounting, and notification work budget policy.
request_admission_policy: RequestAdmissionPolicyPositive independent top-level request handler limits.