diff options
Diffstat (limited to 'Documentation/userspace-api/netlink/intro-specs.rst')
| -rw-r--r-- | Documentation/userspace-api/netlink/intro-specs.rst | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/Documentation/userspace-api/netlink/intro-specs.rst b/Documentation/userspace-api/netlink/intro-specs.rst index a3b847eafff7..bada89699455 100644 --- a/Documentation/userspace-api/netlink/intro-specs.rst +++ b/Documentation/userspace-api/netlink/intro-specs.rst @@ -78,3 +78,82 @@ to see other examples.  The code generation itself is performed by ``tools/net/ynl/ynl-gen-c.py``  but it takes a few arguments so calling it directly for each file  quickly becomes tedious. + +YNL lib +======= + +``tools/net/ynl/lib/`` contains an implementation of a C library +(based on libmnl) which integrates with code generated by +``tools/net/ynl/ynl-gen-c.py`` to create easy to use netlink wrappers. + +YNL basics +---------- + +The YNL library consists of two parts - the generic code (functions +prefix by ``ynl_``) and per-family auto-generated code (prefixed +with the name of the family). + +To create a YNL socket call ynl_sock_create() passing the family +struct (family structs are exported by the auto-generated code). +ynl_sock_destroy() closes the socket. + +YNL requests +------------ + +Steps for issuing YNL requests are best explained on an example. +All the functions and types in this example come from the auto-generated +code (for the netdev family in this case): + +.. code-block:: c + +   // 0. Request and response pointers +   struct netdev_dev_get_req *req; +   struct netdev_dev_get_rsp *d; + +   // 1. Allocate a request +   req = netdev_dev_get_req_alloc(); +   // 2. Set request parameters (as needed) +   netdev_dev_get_req_set_ifindex(req, ifindex); + +   // 3. Issues the request +   d = netdev_dev_get(ys, req); +   // 4. Free the request arguments +   netdev_dev_get_req_free(req); +   // 5. Error check (the return value from step 3) +   if (!d) { +	// 6. Print the YNL-generated error +	fprintf(stderr, "YNL: %s\n", ys->err.msg); +        return -1; +   } + +   // ... do stuff with the response @d + +   // 7. Free response +   netdev_dev_get_rsp_free(d); + +YNL dumps +--------- + +Performing dumps follows similar pattern as requests. +Dumps return a list of objects terminated by a special marker, +or NULL on error. Use ``ynl_dump_foreach()`` to iterate over +the result. + +YNL notifications +----------------- + +YNL lib supports using the same socket for notifications and +requests. In case notifications arrive during processing of a request +they are queued internally and can be retrieved at a later time. + +To subscribed to notifications use ``ynl_subscribe()``. +The notifications have to be read out from the socket, +``ynl_socket_get_fd()`` returns the underlying socket fd which can +be plugged into appropriate asynchronous IO API like ``poll``, +or ``select``. + +Notifications can be retrieved using ``ynl_ntf_dequeue()`` and have +to be freed using ``ynl_ntf_free()``. Since we don't know the notification +type upfront the notifications are returned as ``struct ynl_ntf_base_type *`` +and user is expected to cast them to the appropriate full type based +on the ``cmd`` member. | 
