diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:59:05 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:59:05 -0400 |
| commit | 1f19f33e45791ea59aed048796fc68672c6723a5 (patch) | |
| tree | 54625fba89e91d1c2177801ec635e8528bba937f /static/freebsd/man3/snl.3 3.html | |
| parent | ac5e55f5f2af5b92794c2aded46c6bae85b5f5ed (diff) | |
docs: Removed Precompiled HTML
Diffstat (limited to 'static/freebsd/man3/snl.3 3.html')
| -rw-r--r-- | static/freebsd/man3/snl.3 3.html | 395 |
1 files changed, 0 insertions, 395 deletions
diff --git a/static/freebsd/man3/snl.3 3.html b/static/freebsd/man3/snl.3 3.html deleted file mode 100644 index 5af578e0..00000000 --- a/static/freebsd/man3/snl.3 3.html +++ /dev/null @@ -1,395 +0,0 @@ -<table class="head"> - <tr> - <td class="head-ltitle">SNL(3)</td> - <td class="head-vol">Library Functions Manual</td> - <td class="head-rtitle">SNL(3)</td> - </tr> -</table> -<div class="manual-text"> -<section class="Sh"> -<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> -<p class="Pp"><code class="Nm">snl_init</code>, - <code class="Nm">snl_free</code>, <code class="Nm">snl_read_message</code>, - <code class="Nm">snl_send</code>, <code class="Nm">snl_get_seq</code>, - <code class="Nm">snl_allocz</code>, <code class="Nm">snl_clear_lb</code>, - <code class="Nm">snl_parse_nlmsg</code>, - <code class="Nm">snl_parse_header</code>, - <code class="Nm">snl_parse_attrs</code>, - <code class="Nm">snl_parse_attrs_raw</code>, - <code class="Nm">snl_attr_get_flag</code>, - <code class="Nm">snl_attr_get_ip</code>, - <code class="Nm">snl_attr_get_uint16</code>, - <code class="Nm">snl_attr_get_uint32</code>, - <code class="Nm">snl_attr_get_string</code>, - <code class="Nm">snl_attr_get_stringn</code>, - <code class="Nm">snl_attr_get_nla</code>, - <code class="Nm">snl_field_get_uint8</code>, - <code class="Nm">snl_field_get_uint16</code>, - <code class="Nm">snl_field_get_uint32</code> — - <span class="Nd">simple netlink library</span></p> -</section> -<section class="Sh"> -<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> -<p class="Pp"><code class="In">#include - <<a class="In">netlink/netlink_snl.h</a>></code> - <br/> - <code class="In">#include - <<a class="In">netlink/netlink_snl_route.h</a>></code></p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_init</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">int - netlink_family</var>);</p> -<p class="Pp"><code class="Fn">snl_free</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>);</p> -<p class="Pp"><var class="Ft">struct nlmsghdr *</var> - <br/> - <code class="Fn">snl_read_message</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_send</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">void - *data</var>, <var class="Fa" style="white-space: nowrap;">int sz</var>);</p> -<p class="Pp"><var class="Ft">uint32_t</var> - <br/> - <code class="Fn">snl_get_seq</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>);</p> -<p class="Pp"><var class="Ft">void *</var> - <br/> - <code class="Fn">snl_allocz</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">int - len</var>);</p> -<p class="Pp"><code class="Fn">snl_clear_lb</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_parse_nlmsg</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlmsghdr *hdr</var>, <var class="Fa" style="white-space: nowrap;">const - struct snl_hdr_parser *ps</var>, - <var class="Fa" style="white-space: nowrap;">void *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_parse_header</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">void - *hdr</var>, <var class="Fa" style="white-space: nowrap;">int len</var>, - <var class="Fa" style="white-space: nowrap;">const struct snl_hdr_parser - *ps</var>, <var class="Fa" style="white-space: nowrap;">int pslen</var>, - <var class="Fa" style="white-space: nowrap;">void *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_parse_attrs</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlmsghdr *hdr</var>, <var class="Fa" style="white-space: nowrap;">int - hdrlen</var>, <var class="Fa" style="white-space: nowrap;">const struct - snl_attr_parser *ps</var>, <var class="Fa" style="white-space: nowrap;">int - pslen</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_parse_attrs_raw</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla_head</var>, <var class="Fa" style="white-space: nowrap;">int - len</var>, <var class="Fa" style="white-space: nowrap;">const struct - snl_attr_parser *ps</var>, <var class="Fa" style="white-space: nowrap;">int - pslen</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_flag</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_uint8</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_uint16</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_uint32</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_uint64</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_string</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_stringn</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_nla</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_ip</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -<p class="Pp"><var class="Ft">bool</var> - <br/> - <code class="Fn">snl_attr_get_ipvia</code>(<var class="Fa" style="white-space: nowrap;">struct - snl_state *ss</var>, <var class="Fa" style="white-space: nowrap;">struct - nlattr *nla</var>, <var class="Fa" style="white-space: nowrap;">void - *target</var>);</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> -<p class="Pp">The <a class="Xr">snl(3)</a> library provides an easy way of - sending and receiving Netlink messages, taking care of serialisation and - deserialisation.</p> -<section class="Ss"> -<h2 class="Ss" id="INITIALISATION"><a class="permalink" href="#INITIALISATION">INITIALISATION</a></h2> -<p class="Pp">Call - <a class="permalink" href="#snl_init"><code class="Fn" id="snl_init">snl_init</code></a>() - with a pointer to the <code class="Dv">struct snl_state</code> and the - desired Netlink family to initialise the library instance. To free the - library instance, call - <a class="permalink" href="#snl_free"><code class="Fn" id="snl_free">snl_free</code></a>().</p> -<p class="Pp">The library functions are NOT multithread-safe. If multithreading - is desired, consider initializing an instance per thread.</p> -</section> -<section class="Ss"> -<h2 class="Ss" id="MEMORY_ALLOCATION"><a class="permalink" href="#MEMORY_ALLOCATION">MEMORY - ALLOCATION</a></h2> -<p class="Pp">The library uses pre-allocated extendable memory buffers to handle - message parsing. The typical usage pattern is to allocate the necessary data - structures during the message parsing or writing process via - <a class="permalink" href="#snl_allocz"><code class="Fn" id="snl_allocz">snl_allocz</code></a>() - and free all allocated data at once using - <a class="permalink" href="#snl_clear_lb"><code class="Fn" id="snl_clear_lb">snl_clear_lb</code></a>() - after handling the message.</p> -</section> -<section class="Ss"> -<h2 class="Ss" id="COMPOSING_AND_SENDING_MESSAGES"><a class="permalink" href="#COMPOSING_AND_SENDING_MESSAGES">COMPOSING - AND SENDING MESSAGES</a></h2> -<p class="Pp">The library does not currently offer any wrappers for writing - netlink messages. Simple request messages can be composed by filling in all - needed fields directly. Example for constructing an interface dump - request:</p> -<div class="Bd Pp Li"> -<pre> struct { - struct nlmsghdr hdr; - struct ifinfomsg ifmsg; - } msg = { - .hdr.nlmsg_type = RTM_GETLINK, - .hdr.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, - .hdr.nlmsg_seq = snl_get_seq(ss), - }; - msg.hdr.nlmsg_len = sizeof(msg);</pre> -</div> -<a class="permalink" href="#snl_get_seq"><code class="Fn" id="snl_get_seq">snl_get_seq</code></a>() - can be used to generate a unique message number. To send the resulting - message, - <a class="permalink" href="#snl_send"><code class="Fn" id="snl_send">snl_send</code></a>() - can be used. -</section> -<section class="Ss"> -<h2 class="Ss" id="RECEIVING_AND_PARSING_MESSAGES"><a class="permalink" href="#RECEIVING_AND_PARSING_MESSAGES">RECEIVING - AND PARSING MESSAGES</a></h2> -<p class="Pp">To receive a message, use - <a class="permalink" href="#snl_read_message"><code class="Fn" id="snl_read_message">snl_read_message</code></a>(). - Currently, this call is blocking.</p> -<p class="Pp" id="SNL_VERIFY_PARSERS">The library provides an easy way to - convert the message to the pre-defined C structure. For each message type, - one needs to define rules, converting the protocol header fields and the - desired attributes to the specified structure. It can be accomplished by - using message parsers. Each message parser consists of an array of attribute - getters and an array of header field getters. The former array needs to be - sorted by the attribute type. There is a - <a class="permalink" href="#SNL_VERIFY_PARSERS"><code class="Fn">SNL_VERIFY_PARSERS</code></a>() - macro to check if the order is correct. - <a class="permalink" href="#SNL_DECLARE_PARSER"><code class="Fn" id="SNL_DECLARE_PARSER">SNL_DECLARE_PARSER</code></a>(<var class="Fa">parser_name</var>, - <var class="Fa">family header type</var>, <var class="Fa">struct - snl_field_parser[]</var>, <var class="Fa">struct snl_attr_parser[]</var>) - can be used to create a new parser. - <a class="permalink" href="#SNL_DECLARE_ATTR_PARSER"><code class="Fn" id="SNL_DECLARE_ATTR_PARSER">SNL_DECLARE_ATTR_PARSER</code></a>(<var class="Fa">parser_name</var>, - <var class="Fa">struct snl_field_parser[]</var>) can be used to create an - attribute-only message parser.</p> -<p class="Pp">Each attribute getter needs to be embedded in the following - structure:</p> -<div class="Bd Pp Li"> -<pre>typedef bool snl_parse_attr_f(struct snl_state *ss, struct nlattr *attr, const void *arg, void *target); -struct snl_attr_parser { - uint16_t type; /* Attribute type */ - uint16_t off; /* field offset in the target structure */ - snl_parse_attr_f *cb; /* getter function to call */ - const void *arg; /* getter function custom argument */ -};</pre> -</div> -The generic attribute getter has the following signature: - <var class="Ft">bool</var> - <a class="permalink" href="#snl_attr_get__type_"><code class="Fn" id="snl_attr_get__type_">snl_attr_get_<type></code></a>(<var class="Fa">struct - snl_state *ss</var>, <var class="Fa">struct nlattr *nla</var>, - <var class="Fa">const void *arg</var>, <var class="Fa">void *target</var>). - nla contains the pointer of the attribute to use as the datasource. The target - field is the pointer to the field in the target structure. It is up to the - getter to know the type of the target field. The getter must check the input - attribute and return false if the attribute is not formed correctly. - Otherwise, the getter fetches the attribute value and stores it in the target, - then returns true. It is possible to use <code class="Fn">snl_allocz</code>() - to create the desired data structure . A number of predefined getters for the - common data types exist. - <a class="permalink" href="#snl_attr_get_flag"><code class="Fn" id="snl_attr_get_flag">snl_attr_get_flag</code></a>() - converts a flag-type attribute to an uint8_t value of 1 or 0, depending on the - attribute presence. - <a class="permalink" href="#snl_attr_get_uint8"><code class="Fn" id="snl_attr_get_uint8">snl_attr_get_uint8</code></a>() - stores a uint8_t type attribute into the uint8_t target field. - <a class="permalink" href="#snl_attr_get_uint16"><code class="Fn" id="snl_attr_get_uint16">snl_attr_get_uint16</code></a>() - stores a uint16_t type attribute into the uint16_t target field. - <a class="permalink" href="#snl_attr_get_uint32"><code class="Fn" id="snl_attr_get_uint32">snl_attr_get_uint32</code></a>() - stores a uint32_t type attribute into the uint32_t target field. - <a class="permalink" href="#snl_attr_get_uint64"><code class="Fn" id="snl_attr_get_uint64">snl_attr_get_uint64</code></a>() - stores a uint64_t type attribute into the uint64_t target field. - <a class="permalink" href="#snl_attr_get_ip"><code class="Fn" id="snl_attr_get_ip">snl_attr_get_ip</code></a>() - and - <a class="permalink" href="#snl_attr_get_ipvia"><code class="Fn" id="snl_attr_get_ipvia">snl_attr_get_ipvia</code></a>() - stores a pointer to the sockaddr structure with the IPv4/IPv6 address - contained in the attribute. Sockaddr is allocated using - <code class="Fn">snl_allocz</code>(). - <a class="permalink" href="#snl_attr_get_string"><code class="Fn" id="snl_attr_get_string">snl_attr_get_string</code></a>() - stores a pointer to the NULL-terminated string. The string itself is allocated - using <code class="Fn">snl_allocz</code>(). - <a class="permalink" href="#snl_attr_get_nla"><code class="Fn" id="snl_attr_get_nla">snl_attr_get_nla</code></a>() - stores a pointer to the specified attribute. - <a class="permalink" href="#snl_attr_get_stringn"><code class="Fn" id="snl_attr_get_stringn">snl_attr_get_stringn</code></a>() - stores a pointer to the non-NULL-terminated string. -<p class="Pp">Similarly, each family header getter needs to be embedded in the - following structure:</p> -<div class="Bd Pp Li"> -<pre>typedef void snl_parse_field_f(struct snl_state *ss, void *hdr, void *target); -struct snl_field_parser { - uint16_t off_in; /* field offset in the input structure */ - uint16_t off_out;/* field offset in the target structure */ - snl_parse_field_f *cb; /* getter function to call */ -};</pre> -</div> -The generic field getter has the following signature: <var class="Ft">void</var> - snl_field_get_<type> "struct snl_state *ss" "void - *src" "void *target" . A number of pre-defined getters for the - common data types exist. - <a class="permalink" href="#snl_field_get_uint8"><code class="Fn" id="snl_field_get_uint8">snl_field_get_uint8</code></a>() - fetches an uint8_t value and stores it in the target. - <a class="permalink" href="#snl_field_get_uint16"><code class="Fn" id="snl_field_get_uint16">snl_field_get_uint16</code></a>() - fetches an uint8_t value and stores it in the target. - <a class="permalink" href="#snl_field_get_uint32"><code class="Fn" id="snl_field_get_uint32">snl_field_get_uint32</code></a>() - fetches an uint32_t value and stores it in the target. -</section> -</section> -<section class="Sh"> -<h1 class="Sh" id="EXAMPLES"><a class="permalink" href="#EXAMPLES">EXAMPLES</a></h1> -<p class="Pp">The following example demonstrates how to list all system - interfaces using netlink.</p> -<div class="Bd Pp Li"> -<pre>#include <stdio.h> - -#include <netlink/netlink.h> -#include <netlink/netlink_route.h> -#include "netlink/netlink_snl.h" -#include "netlink/netlink_snl_route.h" - -struct nl_parsed_link { - uint32_t ifi_index; - uint32_t ifla_mtu; - char *ifla_ifname; -}; - -#define _IN(_field) offsetof(struct ifinfomsg, _field) -#define _OUT(_field) offsetof(struct nl_parsed_link, _field) -static const struct snl_attr_parser ap_link[] = { - { .type = IFLA_IFNAME, .off = _OUT(ifla_ifname), .cb = snl_attr_get_string }, - { .type = IFLA_MTU, .off = _OUT(ifla_mtu), .cb = snl_attr_get_uint32 }, -}; -static const struct snl_field_parser fp_link[] = { - {.off_in = _IN(ifi_index), .off_out = _OUT(ifi_index), .cb = snl_field_get_uint32 }, -}; -#undef _IN -#undef _OUT -SNL_DECLARE_PARSER(link_parser, struct ifinfomsg, fp_link, ap_link); - - -int -main(int ac, char *argv[]) -{ - struct snl_state ss; - - if (!snl_init(&ss, NETLINK_ROUTE)) - return (1); - - struct { - struct nlmsghdr hdr; - struct ifinfomsg ifmsg; - } msg = { - .hdr.nlmsg_type = RTM_GETLINK, - .hdr.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST, - .hdr.nlmsg_seq = snl_get_seq(&ss), - }; - msg.hdr.nlmsg_len = sizeof(msg); - - if (!snl_send(&ss, &msg, sizeof(msg))) { - snl_free(&ss); - return (1); - } - - struct nlmsghdr *hdr; - while ((hdr = snl_read_message(&ss)) != NULL && hdr->nlmsg_type != NLMSG_DONE) { - if (hdr->nlmsg_seq != msg.hdr.nlmsg_seq) - break; - - struct nl_parsed_link link = {}; - if (!snl_parse_nlmsg(&ss, hdr, &link_parser, &link)) - continue; - printf("Link#%u %s mtu %u\n", link.ifi_index, link.ifla_ifname, link.ifla_mtu); - } - - return (0); -}</pre> -</div> -</section> -<section class="Sh"> -<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE - ALSO</a></h1> -<p class="Pp"><a class="Xr">genetlink(4)</a>, <a class="Xr">netlink(4)</a>, and - <a class="Xr">rtnetlink(4)</a></p> -</section> -<section class="Sh"> -<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> -<p class="Pp">The <code class="Dv">SNL</code> library appeared in - <span class="Ux">FreeBSD 13.2</span>.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> -<p class="Pp">This library was implemented by <span class="An">Alexander - Chernikov</span> - <<a class="Mt" href="mailto:melifaro@FreeBSD.org">melifaro@FreeBSD.org</a>>.</p> -</section> -</div> -<table class="foot"> - <tr> - <td class="foot-date">December 16, 2022</td> - <td class="foot-os">FreeBSD 15.0</td> - </tr> -</table> |
