Repository navigation
v0.4.0
Date: 2026-10-20
Previous release: v0.3.2
Summary
dnp3ctl exposes what go-dnp3 v1.0.0 added: the dual end point, where the outstation connects to its master, in both roles; Secure Authentication aggressive mode and security statistics; and command events and times and intervals in the simulated outstation. New flags only: nothing that worked before changes.
Highlights
- Dual end point (IEEE 1815-2012 annex A.3), for outstations behind a firewall or on a dial-out link:
client … --listen host[:port](DNP3CTL_MASTER_LISTEN) makes every client command wait for the outstation to connect instead of connecting to it, within--timeout;client monitorwaits for it again after a lost connection. With--tls-certand--tls-keydnp3ctl is the TLS server of that connection, and--tls-camakes the outstation present a certificate of that CA. The result'stargetis the address the outstation connected from. Mutually exclusive with--urland--ip.server start --dial tcp://host[:port]ortls://host[:port](DNP3CTL_DIAL) makes the simulated outstation connect to its master, and again whenever the connection ends (after 1 s, doubling up to 1 min). Over TLS it is the TLS client: the new--tls-ca(DNP3CTL_TLS_CA) verifies the master,--tls-certand--tls-keyare presented to it. The event log starts with adialingevent.
- Secure Authentication aggressive mode:
--sa-aggressive(DNP3CTL_SA_AGGRESSIVE) sends critical requests with their MAC once the outstation has challenged one, saving a round trip; inclient operate --mode sbothe OPERATE goes in aggressive mode after the challenged SELECT. It needs a key. The simulated outstation accepts it. - Security statistics: the simulated outstation keeps the 18 statistics of IEEE 1815-2012 clause 7.6 per master when secure authentication is on, and reports g122 events in class 1.
client read --object g121v1shows them with their name (statisticin JSON:"session key changes","authentication failures", …). - Command events in the outstation model:
command_event_class(andcommand_event_variation) on abinary-outputoranalog-outputreports every executed control as a g13 or g43 event with the commanded value and the status. The demo outstation has them on binary output 0 and analog output 0. - Times and intervals (g50v4): the point type
time-and-intervalwith an RFC 3339value,intervalandinterval_unit, read withclient read --object g50v4, which shows the time and the interval (intervalandinterval_unitin JSON, typetime-and-interval). Like in the reference outstations it is not in class 0. The demo outstation has one.
Changed
clientresults: a measurement of a time and interval has the new fieldsintervalandinterval_unit, a security statistic the new fieldstatistic; text and table output show them after the value. g50v4 objects used to be left out of results.- The client's
--tls-ca,--tls-certand--tls-keyalso apply to--listen, andserver starthas a--tls-cafor--dial;--tls-cawithout atls://--dialis refused. - An outstation that does not connect to
--listenin time, and a--listenaddress that cannot be opened, exit with code 4 (transport_connect_failed,listen_failed). - docs: SECURITY.md on aggressive mode, the security statistics and the dual end point; the interoperability note now names DSC Systems' go-dnp3, against which go-dnp3 verifies Secure Authentication.
Upgrade notes
- No breaking changes. Scripts that read
--format jsonsee three new optional fields (interval,interval_unit,statistic) and thedialingevent. DNP3CTL_MASTER_LISTENis the client's variable for--listen;server start --listenkeepsDNP3CTL_LISTEN.