summaryrefslogtreecommitdiff
path: root/docs/reference/src/api/compat.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/reference/src/api/compat.md')
-rw-r--r--docs/reference/src/api/compat.md120
1 files changed, 120 insertions, 0 deletions
diff --git a/docs/reference/src/api/compat.md b/docs/reference/src/api/compat.md
new file mode 100644
index 00000000..4ff75b3e
--- /dev/null
+++ b/docs/reference/src/api/compat.md
@@ -0,0 +1,120 @@
+# Legacy Compatibility Functions
+
+{{hi:compatibility layer}}
+_NNG_ provides source-level compatibility for most _libnanomsg_ 1.0 applications.
+
+This is intended to facilitate converting {{i:legacy applications}} to use _NNG_.
+New applications should use the newer _NNG_ APIs instead.
+
+Applications making use of this must take care
+to link with _libnng_ instead of _libnn_.
+
+> [!TIP]
+> While not recommended for long term use, the value returned by
+> [`nng_socket_id()`](nng_socket_id.md) can be used with these functions
+> just like a value returned by [`nn_socket()`](nn_socket.md).
+> This can be way to facilitate incremental transition to the new API.
+
+Some capabilities, protocols, and transports, will not be accessible
+using this API, as the compatible API has no provision for expression
+of certain concepts introduced in the new API.
+
+While reasonable efforts have been made to provide for compatibility,
+some things may behave differently, and some less common parts of the
+_libnanomsg_ 1.0 API are not supported at this time, including certain
+options and the statistics API.
+See the [Caveats](#caveats) section below.
+
+### Availability
+
+The availability of this legacy API depends on whether the library was
+configured to include it.
+
+> [!NOTE]
+> Future versions of _NNG_ may not include this compatibility layer
+> by default, or even at all. Modernizing applications to use the new
+> API is strongly recommended.
+
+### Compiling
+
+When compiling legacy _nanomsg_ applications, it will generally be
+necessary to change the include search path to add the `compat` subdirectory
+of the directory where headers were installed.
+For example, if _NNG_ is installed in `$prefix`, then header files will
+normally be located in `$prefix/include/nng`.
+In this case, to build legacy _nanomsg_ apps against _NNG_ you would
+add `$prefix/include/nng/compat` to your compiler's search path.
+
+Alternatively, you can change your source code so that `#include` statements
+referring to `<nanomsg>` instead refer to `<nng/compat/nanomsg>`.
+For example, instead of:
+
+```c
+#include <nanomsg/nn.h>
+#include <nanomsg/reqrep.h>
+```
+
+you would have this:
+
+```c
+#include <nng/compat/nanomsg/nn.h>
+#include <nng/compat/nanomsg/reqrep.h>
+```
+
+Legacy applications built using these methods should be linked against _libnng_
+instead of _libnn_, just like any other _NNG_ application.
+
+### Caveats
+
+The following caveats apply when using the legacy API with _NNG_.
+
+- Socket numbers can be quite large.
+ The legacy _libnanomsg_ attempted to reuse socket numbers, like
+ file descriptors in UNIX systems.
+ _NNG_ avoids this to prevent accidental reuse or
+ collision after a descriptor is closed.
+ Consequently, socket numbers can become quite large, and should
+ probably not be used for array indices.
+
+- The following options (`nn_getsockopt`) are unsupported:
+ `NN_SNDPRIO`, `NN_RCVPRIO`, `NN_IPV4ONLY`.
+
+- Access to statistics using this legacy API
+ [`nn_get_statistic()`](nn_get_statistic.md) is unsupported.
+
+- Some transports can support longer URLs than legacy _libnanomsg_ can.
+ It is a good idea to use short pathnames in URLs if interoperability
+ is a concern.
+
+- Only absolute paths are supported in `ipc://` URLs.
+ For example, `ipc:///tmp/mysocket` is acceptable, but `ipc://mysocket` is not.
+
+- The WebSocket transport in this implementation (`ws://` URLs)
+ only supports `BINARY` frames.
+
+- Some newer transports are unusable from this mode.
+ In particular, this legacy API offers no way to configure
+ TLS or ZeroTier parameters that may be required for use.
+
+- ABI versioning of the compatibility layer is not supported,
+ and the `NN_VERSION_` macros are not present.
+
+- Runtime symbol information is not implemented.
+ Specifically, there is no `nn_symbol()` function.
+
+- The TCP transport (`tcp://` URLs) does not support specifying the local
+ address or interface when binding. (This could be fixed in the future,
+ but most likely this will be available only using the new API.)
+
+- The values of `NN_RCVMAXSIZE` are constrained.
+ Specifically, values set larger than 2GB using the new API will be reported
+ as unlimited (`-1`) in the new API, and the value `0` will disable any
+ enforcement, just like `-1`.
+ (There is no practical reason to ever want to limit the receive size to
+ zero.)
+
+- This implementation counts buffers in terms of messages rather than bytes.
+ As a result, the buffer sizes accessed with `NN_SNDBUF` and `NN_RCVBUF` are
+ rounded up to a whole number of kilobytes, then divided by 1024, in order
+ to approximate buffering assuming 1 KB messages.
+ Few applications should need to adjust the default values.