---
name: "ifstated.conf"
section: "5"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["openbsd"]
url: "https://new.carta.tech/ifstated.conf"
---

# ifstated.conf(5)

Interface State daemon configuration file

## NAME

**ifstated.conf** – Interface State daemon configuration file

## DESCRIPTION

The [ifstated(8)](/ifstated/8.md) daemon runs commands in response to network state changes, which it determines by monitoring interface link state or running external tests. **ifstated.conf** is the configuration file for this daemon.

The **ifstated.conf** config file is divided into the following main sections:

- Global configuration

  Global settings for [ifstated(8)](/ifstated/8.md).

- Macros

  Definitions of variables that can be used later, simplifying the configuration file.

- State definitions

  Definitions of states and transitions.

### Global configuration

- **init-state** *state*

  Set the initial state to *state* instead of using the first state defined.

### Macros

A macro is defined with a command of the form *name*=*value*. The macro *name* can contain letters, digits, and underscores and cannot be a reserved word (for example, *state* or *run*). Within unquoted arguments, the string $*name* is later expanded to *value*.

Macros are usually used to define tests for state transitions like interface link state or external tests.

Currently an interface can have three different link states:

- *up*

  The physical link of the interface is up. For [carp(4)](/carp/4.md) interfaces this equals the master state.

- *down*

  The physical link of the interface is down. For [carp(4)](/carp/4.md) interfaces this equals the backup state.

- *unknown*

  The physical link of the interface is unknown. This is because the interface driver does not provide information of the physical link state. For [carp(4)](/carp/4.md) interfaces this equals the init state.

In contrast to link state tests, external tests must be run periodically to evaluate their status. The frequency at which an external test is run is set, in seconds, with the *every* keyword.

For example:

```
links_up = "em0.link.up && em1.link.up"
net = '( "ping -q -c 1 -w 1 192.168.0.1 > /dev/null" every 10 && \
         "ping -q -c 1 -w 1 192.168.0.2 > /dev/null" every 10 )'
```

### Tests and events

[ifstated(8)](/ifstated/8.md) delegates the process of testing to libevent which associates a value with every test, in this case *true* or *false*. Whenever the value of a test associated with the current state changes, an event is triggered and the state's body is processed.

### State definitions

[ifstated(8)](/ifstated/8.md) operates on a finite state machine with states and transitions.

Each state consists of an *init* block and a body. The *init* block is used to initialise the state and is executed each time the state is entered. The body of a state is only executed when that state is the current state and an event occurs.

The action taken within a certain state is typically made dependent on the evaluation of one or more *if* statements. Possible actions include executing commands using the *run* statement, or triggering a state transition with the *set-state* keyword. It is also possible to write multiple nested *if* blocks.

For example:

```
state one {
	init {
		run "logger -t ifstated entering state one"
		run "ifconfig -g carp -carpdemote"
	}
	if ! $net || urndis0.link.up
		set-state two
	if ! $links_up {
		run "ifconfig -g carp carpdemote"
		if urndis0.link.down
			set-state three
	}
}
```

## GRAMMAR

Syntax for **ifstated.conf** in BNF:

```
grammar		= entry grammar | entry
entry		= global_config | varset | action | state
global_config	= initstate
initstate	= "init-state" string
varset		= string "=" string
action_list	= action [ action_list ]
action		= "run" string | "set-state" string |
		  "if" expr action_block
action_block	= "{" action_list "}" | action
expr		= "!" expr | expr "&&" expr | expr "||" expr | term
term		= if_test | ext_test | "(" expr ")"
if_test		= string ".link." ( "up" | "down" | "unknown" )
ext_test	= string "every" number
state		= "state" string "{" stateopt_list "}"
stateopt_list	= stateopt [ stateopt_list ]
stateopt	= init | action
init		= "init" action_block
```

## FILES

- */etc/ifstated.conf*

  [ifstated(8)](/ifstated/8.md) configuration file.

- */etc/examples/ifstated.conf*

  Example configuration file.

## SEE ALSO

[carp(4)](/carp/4.md), [pf(4)](/pf/4.md), [ifstated(8)](/ifstated/8.md)

## HISTORY

The **ifstated.conf** file format first appeared in OpenBSD 3.8.
