mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-16 00:00:07 +01:00
52 lines
2 KiB
Markdown
52 lines
2 KiB
Markdown
![]() |
# Lws routing
|
||
|
|
||
|
lws is mainly built around POSIX sockets and operates from the
|
||
|
information available from those. But in some cases, it needs to go
|
||
|
a step further and monitor and understand the device routing table.
|
||
|
|
||
|
## Recognizing loss of routability
|
||
|
|
||
|
On mobile devices, switching between interfaces and losing / regaining
|
||
|
connections quickly is a given. But POSIX sockets do not act like
|
||
|
that, the socket remains connected until something times it out if it
|
||
|
no longer has a route to its peer, and the tcp timeouts can be in the
|
||
|
order of minutes.
|
||
|
|
||
|
In order to do better, lws must monitor and understand how the routing
|
||
|
table relates to existing connections, dynamically.
|
||
|
|
||
|
## Linux: netlink
|
||
|
|
||
|
For linux-based devices you can build in netlink-based route monitoring
|
||
|
with `-DLWS_WITH_NETLINK=1`, lws aquires a copy of the routing table
|
||
|
when the context / pt starts up and modifies it according to netlink
|
||
|
messages from then on.
|
||
|
|
||
|
On Linux routing table events do not take much care about backing out
|
||
|
changes made on interface up by, eg, NetworkManager. So lws also
|
||
|
monitors for link / interface down to remove the related routes.
|
||
|
|
||
|
## Actions in lws based on routing table
|
||
|
|
||
|
Both server and client connections now store their peer sockaddr in the
|
||
|
wsi, and when the routing table changes, all active wsi on a pt are
|
||
|
checked against the routing table to confirm the peer is still
|
||
|
routable.
|
||
|
|
||
|
For example if there is no net route matching the peer and no gateway,
|
||
|
the connection is invalidated and closed. Similarly, if we are
|
||
|
removing the highest priority gateway route, all connections to a peer
|
||
|
without a net route match are invalidated. However connections with
|
||
|
an unaffected matching net route like 127.0.0.0/8 are left alone.
|
||
|
|
||
|
## Intergration to other subsystems
|
||
|
|
||
|
If SMD is built in, on any route change a NETWORK message
|
||
|
`{"rt":"add|del"}` is issued.
|
||
|
|
||
|
If SMD is built in, on any route change involving a gateway, a NETWORK
|
||
|
message `{"trigger":"cpdcheck", "src":"gw-change"}` is issued. If
|
||
|
Captive Portal Detection is built in, this will cause a new captive
|
||
|
portal detection sequence.
|
||
|
|