8 #include <libmnl/libmnl.h>
10 #include <linux/if_link.h>
11 #include <linux/rtnetlink.h>
13 static int data_attr_cb2(
const struct nlattr *attr,
void *data)
20 perror(
"mnl_attr_validate");
26 static void attributes_show_ipv4(
struct nlattr *tb[])
33 printf(
"dst=%s ", inet_ntoa(*addr));
37 printf(
"src=%s ", inet_ntoa(*addr));
45 if (tb[RTA_PREFSRC]) {
47 printf(
"prefsrc=%s ", inet_ntoa(*addr));
49 if (tb[RTA_GATEWAY]) {
51 printf(
"gw=%s ", inet_ntoa(*addr));
53 if (tb[RTA_METRICS]) {
55 struct nlattr *tbx[RTAX_MAX+1] = {};
59 for (i=0; i<RTAX_MAX; i++) {
61 printf(
"metrics[%d]=%u ",
69 static int data_attr_cb(
const struct nlattr *attr,
void *data)
71 const struct nlattr **tb = data;
87 perror(
"mnl_attr_validate");
93 perror(
"mnl_attr_validate");
102 static int data_cb(
const struct nlmsghdr *nlh,
void *data)
104 struct nlattr *tb[RTA_MAX+1] = {};
108 printf(
"family=%u ", rm->rtm_family);
111 printf(
"dst_len=%u ", rm->rtm_dst_len);
114 printf(
"src_len=%u ", rm->rtm_src_len);
117 printf(
"tos=%u ", rm->rtm_tos);
132 printf(
"table=%u ", rm->rtm_table);
149 printf(
"type=%u ", rm->rtm_type);
161 printf(
"scope=%u ", rm->rtm_scope);
173 printf(
"proto=%u ", rm->rtm_protocol);
181 printf(
"flags=%x\n", rm->rtm_flags);
185 switch(rm->rtm_family) {
187 attributes_show_ipv4(tb);
197 char buf[MNL_SOCKET_BUFFER_SIZE];
198 struct nlmsghdr *nlh;
201 unsigned int seq, portid;
204 nlh->nlmsg_type = RTM_GETROUTE;
205 nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
206 nlh->nlmsg_seq = seq = time(NULL);
208 rtm->rtm_family = AF_INET;
212 perror(
"mnl_socket_open");
217 perror(
"mnl_socket_bind");
223 perror(
"mnl_socket_send");
229 ret =
mnl_cb_run(buf, ret, seq, portid, data_cb, NULL);
230 if (ret <= MNL_CB_STOP)
int mnl_attr_parse(const struct nlmsghdr *nlh, unsigned int offset, mnl_attr_cb_t cb, void *data)
void * mnl_nlmsg_put_extra_header(struct nlmsghdr *nlh, size_t size)
uint16_t mnl_attr_get_type(const struct nlattr *attr)
struct mnl_socket * mnl_socket_open(int type)
unsigned int mnl_socket_get_portid(const struct mnl_socket *nl)
ssize_t mnl_socket_recvfrom(const struct mnl_socket *nl, void *buf, size_t siz)
void * mnl_attr_get_payload(const struct nlattr *attr)
int mnl_cb_run(const void *buf, size_t numbytes, unsigned int seq, unsigned int portid, mnl_cb_t cb_data, void *data)
int mnl_attr_parse_nested(const struct nlattr *attr, mnl_attr_cb_t cb, void *data)
int mnl_socket_bind(struct mnl_socket *nl, unsigned int groups, pid_t pid)
int mnl_socket_close(struct mnl_socket *nl)
int mnl_attr_type_valid(const struct nlattr *attr, uint16_t maxtype)
struct nlmsghdr * mnl_nlmsg_put_header(void *buf)
ssize_t mnl_socket_sendto(const struct mnl_socket *nl, const void *req, size_t siz)
uint32_t mnl_attr_get_u32(const struct nlattr *attr)
int mnl_attr_validate(const struct nlattr *attr, enum mnl_attr_data_type type)
void * mnl_nlmsg_get_payload(const struct nlmsghdr *nlh)