Skip to main content
A server is a listener your customers bind in to. Adding one is a port, a name, and then the policy you want applied to everyone who connects to it.

Adding one

Servers → Add server. Name and port are the only required fields; everything else has a working default.
Every setting is at Listener settings.
A listener that cannot take its port does not stop the gateway. It logs and everything else keeps running — right for a multi-listener deployment, and surprising the first time.A clean start is not proof every listener is up. Check /ops/health.

What a bind is checked against, in order

1

The credential

systemId and password must match an enabled SMPP credential. See credentials.yml.
2

allowedIps, if set

Empty means no restriction.
3

Connection limits

srv.maxConnections overall, srv.maxConnectionsPerIP, and conf.maxConnectionsPerUser.default per account.
4

The product, if conf.product.required is on

The resolved product must name an enabled row in the product catalogue. Blank or unknown is refused with 0x40F — at bind, not at submit, because the product lives on the session context.

Where the product comes from

system_type on the bind request, falling back to the credential’s product field.
system_type is free text validated nowhere else. A customer binding prem instead of premium passes any non-empty test and lands in the unrated state where messages are delivered and charged nothing.That is why conf.product.required checks membership of the catalogue rather than presence of a value — and why, in file mode, where there is no catalogue, only the non-empty half applies. It is logged once per configuration load naming the listener.

What a listener applies to everyone bound to it

The states a listener can be in

The panel shows these as one badge per card. Listening with nobody bound is not a fault — a listener with no customers connected is quiet, not broken, which is why it is not painted red the way a vendor with no session is.

Dropping one customer’s bind

Session ids come from fireflo health. They are the listener’s own counter, so they collide between listeners and restart with the gateway.
This ends a connection; it does not withdraw permission. A healthy client rebinds within seconds unless you also disable its login.

Inbound messages

mo.owner.map decides which account owns which inbound address. mo.owner.default is where an unmatched one goes — and empty means nowhere: the listener logs message.mo.unmapped and consumes it rather than guessing an owner. Deliberate, because delivering a stranger’s message to the wrong customer is worse. But unmapped traffic disappears quietly unless you watch for that line.