---
name: "libnetlink"
section: "3"
platform: "linux"
package: "iproute2"
version: "6.15.0-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/libnetlink"
---

# libnetlink(3)

A library for accessing the netlink service

## NAME

libnetlink - A library for accessing the netlink service

## SYNOPSIS

```
#include <asm/types.h>
#include <libnetlink.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>

int rtnl_open(struct rtnl_handle *rth, unsigned subscriptions)

int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)

int rtnl_send(struct rtnl_handle *rth, char *buf, int len)

int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)

int rtnl_dump_filter(struct rtnl_handle *rth,
		     int (*filter)(struct sockaddr_nl *, struct nlmsghdr *n, void *),
		     void *arg1,
		     int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
		     void *arg2)

int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
	      unsigned groups, struct nlmsghdr *answer,
	      int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
	      void *jarg)

int rtnl_listen(struct rtnl_handle *rtnl,
	      int (*handler)(struct sockaddr_nl *, struct rtnl_ctrl_data *,
			     struct nlmsghdr *n, void *),
	      void *jarg)

int rtnl_from_file(FILE *rtnl,
	      int (*handler)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
	      void *jarg)

int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data)

int addattr_l(struct nlmsghdr *n, int maxlen, int type, void *data, int alen)

int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data)

int rta_addattr_l(struct rtattr *rta, int maxlen, int type, void *data, int alen)
```

## DESCRIPTION

libnetlink provides a higher level interface to [**rtnetlink**(7)](/rtnetlink/7.md). The read functions return 0 on success and a negative errno on failure. The send functions return the amount of data sent, or -1 on error.

- rtnl\_open

  Open a rtnetlink socket and save the state into the **rth** handle. This handle is passed to all subsequent calls. **subscriptions** is a bitmap of the rtnetlink multicast groups the socket will be a member of.

- rtnl\_wilddump\_request

  Request a full dump of the **type** database for **family** addresses. **type** is a rtnetlink message type.

- rtnl\_dump\_request

  Request a full dump of the **type** data buffer into **buf** with maximum length of **len.** **type** is a rtnetlink message type.

- rtnl\_dump\_filter

  Receive netlink data after a request and filter it. The **filter** callback checks if the received message is wanted. It gets the source address of the message, the message itself and **arg1** as arguments. 0 as return means that the filter passed, a negative value is returned by *rtnl\_dump\_filter* in case of error. NULL for *filter* means to not use a filter. **junk** is used to filter messages not destined to the local socket. Only one message bundle is received. If there is a message pending, this function does not block.

- rtnl\_listen

  Receive netlink data after a request and pass it to *handler.* **handler** is a callback that gets the message source address, anscillary data, the message itself, and the **jarg** cookie as arguments. It will get called for all received messages. Only one message bundle is received. If there is a message pending this function does not block.

- rtnl\_from\_file

  Works like *rtnl\_listen,* but reads a netlink message bundle from the file **file** and passes the messages to **handler** for parsing. The file should contain raw data as received from a rtnetlink socket.

The following functions are useful to construct custom rtnetlink messages. For simple database dumping with filtering it is better to use the higher level functions above. See [**rtnetlink**(3)](/rtnetlink/3.md) and [**netlink**(3)](/netlink/3.md) on how to generate a rtnetlink message. The following utility functions require a continuous buffer that already contains a netlink message header and a rtnetlink request.

- rtnl\_send

  Send the rtnetlink message in **buf** of length **len** to handle **rth.**

- addattr32

  Add a \_\_u32 attribute of type **type** and with value **data** to netlink message **n,** which is part of a buffer of length **maxlen.**

- addattr\_l

  Add a variable length attribute of type **type** and with value **data** and **alen** length to netlink message **n,** which is part of a buffer of length **maxlen.** **data** is copied.

- rta\_addattr32

  Initialize the rtnetlink attribute **rta** with a \_\_u32 data value.

- rta\_addattr32

  Initialize the rtnetlink attribute **rta** with a variable length data value.

## BUGS

This library is meant for internal use, use libmnl for new programs.

The functions sometimes use fprintf and exit when a fatal error occurs. This library should be named librtnetlink.

## AUTHORS

netlink/rtnetlink was designed and written by Alexey Kuznetsov. Andi Kleen wrote the man page.

## SEE ALSO

[**netlink**(7)](/netlink/7.md), [**rtnetlink**(7)](/rtnetlink/7.md)\
 /usr/include/linux/rtnetlink.h
