Specify dependencies libs explicitly.

Such setup is better for cross compilation. Also changed Makefile to
properly make the project with these libraries.
This commit is contained in:
Vadim Vetrov
2024-07-22 22:46:16 +03:00
parent 4a4519cbac
commit 822266b74b
131 changed files with 17984 additions and 18 deletions

11
deps/libnfnetlink/src/Makefile.am vendored Normal file
View File

@@ -0,0 +1,11 @@
include $(top_srcdir)/Make_global.am
lib_LTLIBRARIES = libnfnetlink.la
libnfnetlink_la_LDFLAGS = -Wc,-nostartfiles \
-version-info $(LIBVERSION) \
-Wl,--version-script=$(srcdir)/nfnl.version
libnfnetlink_la_SOURCES = libnfnetlink.c iftable.c rtnl.c nfnl.version
EXTRA_libnfnetlink_la_DEPENDENCIES = $(srcdir)/nfnl.version
noinst_HEADERS = iftable.h rtnl.h

348
deps/libnfnetlink/src/iftable.c vendored Normal file
View File

@@ -0,0 +1,348 @@
/* iftable - table of network interfaces
*
* (C) 2004 by Astaro AG, written by Harald Welte <hwelte@astaro.com>
* (C) 2008 by Pablo Neira Ayuso <pablo@netfilter.org>
*
* This software is Free Software and licensed under GNU GPLv2+.
*/
/* IFINDEX handling */
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <assert.h>
#include <linux/netdevice.h>
#include <libnfnetlink/libnfnetlink.h>
#include "rtnl.h"
#include "linux_list.h"
/**
* \defgroup iftable Functions in iftable.c [DEPRECATED]
* This documentation is provided for the benefit of maintainers of legacy code.
*
* New applications should use
* [libmnl](https://netfilter.org/projects/libmnl/doxygen/html/).
* @{
*/
struct ifindex_node {
struct list_head head;
uint32_t index;
uint32_t type;
uint32_t alen;
uint32_t flags;
char addr[8];
char name[16];
};
struct nlif_handle {
struct list_head ifindex_hash[16];
struct rtnl_handle *rtnl_handle;
struct rtnl_handler ifadd_handler;
struct rtnl_handler ifdel_handler;
};
/* iftable_add - Add/Update an entry to/in the interface table
* @n: netlink message header of a RTM_NEWLINK message
* @arg: not used
*
* This function adds/updates an entry in the intrface table.
* Returns -1 on error, 1 on success.
*/
static int iftable_add(struct nlmsghdr *n, void *arg)
{
unsigned int hash, found = 0;
struct ifinfomsg *ifi_msg = NLMSG_DATA(n);
struct ifindex_node *this;
struct rtattr *cb[IFLA_MAX+1];
struct nlif_handle *h = arg;
if (n->nlmsg_type != RTM_NEWLINK)
return -1;
if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi_msg)))
return -1;
rtnl_parse_rtattr(cb, IFLA_MAX, IFLA_RTA(ifi_msg), IFLA_PAYLOAD(n));
if (!cb[IFLA_IFNAME])
return -1;
hash = ifi_msg->ifi_index & 0xF;
list_for_each_entry(this, &h->ifindex_hash[hash], head) {
if (this->index == ifi_msg->ifi_index) {
found = 1;
break;
}
}
if (!found) {
this = malloc(sizeof(*this));
if (!this)
return -1;
this->index = ifi_msg->ifi_index;
}
this->type = ifi_msg->ifi_type;
this->flags = ifi_msg->ifi_flags;
if (cb[IFLA_ADDRESS]) {
unsigned int alen;
this->alen = alen = RTA_PAYLOAD(cb[IFLA_ADDRESS]);
if (alen > sizeof(this->addr))
alen = sizeof(this->addr);
memcpy(this->addr, RTA_DATA(cb[IFLA_ADDRESS]), alen);
} else {
this->alen = 0;
memset(this->addr, 0, sizeof(this->addr));
}
strcpy(this->name, RTA_DATA(cb[IFLA_IFNAME]));
if (!found)
list_add(&this->head, &h->ifindex_hash[hash]);
return 1;
}
/* iftable_del - Delete an entry from the interface table
* @n: netlink message header of a RTM_DELLINK nlmsg
* @arg: not used
*
* Delete an entry from the interface table.
* Returns -1 on error, 0 if no matching entry was found or 1 on success.
*/
static int iftable_del(struct nlmsghdr *n, void *arg)
{
struct ifinfomsg *ifi_msg = NLMSG_DATA(n);
struct rtattr *cb[IFLA_MAX+1];
struct nlif_handle *h = arg;
struct ifindex_node *this, *tmp;
unsigned int hash;
if (n->nlmsg_type != RTM_DELLINK)
return -1;
if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi_msg)))
return -1;
rtnl_parse_rtattr(cb, IFLA_MAX, IFLA_RTA(ifi_msg), IFLA_PAYLOAD(n));
hash = ifi_msg->ifi_index & 0xF;
list_for_each_entry_safe(this, tmp, &h->ifindex_hash[hash], head) {
if (this->index == ifi_msg->ifi_index) {
list_del(&this->head);
free(this);
return 1;
}
}
return 0;
}
/** Get the name for an ifindex
*
* \param nlif_handle A pointer to a ::nlif_handle created
* \param index ifindex to be resolved
* \param name interface name, pass a buffer of IFNAMSIZ size
* \return -1 on error, 1 on success
*/
int nlif_index2name(struct nlif_handle *h,
unsigned int index,
char *name)
{
unsigned int hash;
struct ifindex_node *this;
assert(h != NULL);
assert(name != NULL);
if (index == 0) {
strcpy(name, "*");
return 1;
}
hash = index & 0xF;
list_for_each_entry(this, &h->ifindex_hash[hash], head) {
if (this->index == index) {
strcpy(name, this->name);
return 1;
}
}
errno = ENOENT;
return -1;
}
/** Get the flags for an ifindex
*
* \param nlif_handle A pointer to a ::nlif_handle created
* \param index ifindex to be resolved
* \param flags pointer to variable used to store the interface flags
* \return -1 on error, 1 on success
*/
int nlif_get_ifflags(const struct nlif_handle *h,
unsigned int index,
unsigned int *flags)
{
unsigned int hash;
struct ifindex_node *this;
assert(h != NULL);
assert(flags != NULL);
if (index == 0) {
errno = ENOENT;
return -1;
}
hash = index & 0xF;
list_for_each_entry(this, &h->ifindex_hash[hash], head) {
if (this->index == index) {
*flags = this->flags;
return 1;
}
}
errno = ENOENT;
return -1;
}
/** Initialize interface table
*
* Initialize rtnl interface and interface table
* Call this before any nlif_* function
*
* \return file descriptor to netlink socket
*/
struct nlif_handle *nlif_open(void)
{
int i;
struct nlif_handle *h;
h = calloc(1, sizeof(struct nlif_handle));
if (h == NULL)
goto err;
for (i=0; i<16; i++)
INIT_LIST_HEAD(&h->ifindex_hash[i]);
h->ifadd_handler.nlmsg_type = RTM_NEWLINK;
h->ifadd_handler.handlefn = iftable_add;
h->ifadd_handler.arg = h;
h->ifdel_handler.nlmsg_type = RTM_DELLINK;
h->ifdel_handler.handlefn = iftable_del;
h->ifdel_handler.arg = h;
h->rtnl_handle = rtnl_open();
if (h->rtnl_handle == NULL)
goto err;
if (rtnl_handler_register(h->rtnl_handle, &h->ifadd_handler) < 0)
goto err_close;
if (rtnl_handler_register(h->rtnl_handle, &h->ifdel_handler) < 0)
goto err_unregister;
return h;
err_unregister:
rtnl_handler_unregister(h->rtnl_handle, &h->ifadd_handler);
err_close:
rtnl_close(h->rtnl_handle);
free(h);
err:
return NULL;
}
/** Destructor of interface table
*
* \param nlif_handle A pointer to a ::nlif_handle created
* via nlif_open()
*/
void nlif_close(struct nlif_handle *h)
{
int i;
struct ifindex_node *this, *tmp;
assert(h != NULL);
rtnl_handler_unregister(h->rtnl_handle, &h->ifadd_handler);
rtnl_handler_unregister(h->rtnl_handle, &h->ifdel_handler);
rtnl_close(h->rtnl_handle);
for (i=0; i<16; i++) {
list_for_each_entry_safe(this, tmp, &h->ifindex_hash[i], head) {
list_del(&this->head);
free(this);
}
}
free(h);
h = NULL; /* bugtrap */
}
/** Receive message from netlink and update interface table
*
* \param nlif_handle A pointer to a ::nlif_handle created
* \return 0 if OK
*/
int nlif_catch(struct nlif_handle *h)
{
assert(h != NULL);
if (h->rtnl_handle)
return rtnl_receive(h->rtnl_handle);
return -1;
}
static int nlif_catch_multi(struct nlif_handle *h)
{
assert(h != NULL);
if (h->rtnl_handle)
return rtnl_receive_multi(h->rtnl_handle);
return -1;
}
/**
* nlif_query - request a dump of interfaces available in the system
* @h: pointer to a valid nlif_handler
*/
int nlif_query(struct nlif_handle *h)
{
assert(h != NULL);
if (rtnl_dump_type(h->rtnl_handle, RTM_GETLINK) < 0)
return -1;
return nlif_catch_multi(h);
}
/** Returns socket descriptor for the netlink socket
*
* \param nlif_handle A pointer to a ::nlif_handle created
* \return The fd or -1 if there's an error
*/
int nlif_fd(struct nlif_handle *h)
{
assert(h != NULL);
if (h->rtnl_handle)
return h->rtnl_handle->rtnl_fd;
return -1;
}
/**
* @}
*/

12
deps/libnfnetlink/src/iftable.h vendored Normal file
View File

@@ -0,0 +1,12 @@
#ifndef _IFTABLE_H
#define _IFTABLE_H
int iftable_delete(uint32_t dst, uint32_t mask, uint32_t gw, uint32_t oif);
int iftable_insert(uint32_t dst, uint32_t mask, uint32_t gw, uint32_t oif);
int iftable_init(void);
void iftable_fini(void);
int iftable_dump(FILE *outfd);
int iftable_up(unsigned int index);
#endif

1602
deps/libnfnetlink/src/libnfnetlink.c vendored Normal file

File diff suppressed because it is too large Load Diff

55
deps/libnfnetlink/src/nfnl.version vendored Normal file
View File

@@ -0,0 +1,55 @@
NFNETLINK_1.0.1 {
global:
nfnl_fd;
nfnl_portid;
nfnl_open;
nfnl_close;
nfnl_subsys_open;
nfnl_subsys_close;
nfnl_set_sequence_tracking;
nfnl_unset_sequence_tracking;
nfnl_set_rcv_buffer_size;
nfnl_send;
nfnl_sendmsg;
nfnl_sendiov;
nfnl_fill_hdr;
nfnl_talk;
nfnl_listen;
nfnl_recv;
nfnl_callback_register;
nfnl_callback_unregister;
nfnl_handle_packet;
nfnl_parse_hdr;
nfnl_check_attributes;
nfnl_get_msg_first;
nfnl_get_msg_next;
nfnl_join;
nfnl_process;
nfnl_iterator_create;
nfnl_iterator_destroy;
nfnl_iterator_process;
nfnl_iterator_next;
nfnl_catch;
nfnl_query;
nfnl_addattr_l;
nfnl_addattr8;
nfnl_addattr16;
nfnl_addattr32;
nfnl_nfa_addattr_l;
nfnl_nfa_addattr16;
nfnl_nfa_addattr32;
nfnl_parse_attr;
nfnl_build_nfa_iovec;
nfnl_rcvbufsiz;
nfnl_dump_packet;
nlif_open;
nlif_close;
nlif_fd;
nlif_query;
nlif_catch;
nlif_index2name;
nlif_get_ifflags;
local:
*;
};

266
deps/libnfnetlink/src/rtnl.c vendored Normal file
View File

@@ -0,0 +1,266 @@
/* rtnl - rtnetlink utility functions
*
* (C) 2004 by Astaro AG, written by Harald Welte <hwelte@astaro.com>
*
* Adapted to nfnetlink by Eric Leblond <eric@inl.fr>
*
* This software is free software and licensed under GNU GPLv2+.
*
*/
/* rtnetlink - routing table netlink interface */
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <netinet/in.h>
#include <linux/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include "rtnl.h"
#define rtnl_log(x, ...)
static inline struct rtnl_handler *
find_handler(struct rtnl_handle *rtnl_handle, uint16_t type)
{
struct rtnl_handler *h;
for (h = rtnl_handle->handlers; h; h = h->next) {
if (h->nlmsg_type == type)
return h;
}
return NULL;
}
static int call_handler(struct rtnl_handle *rtnl_handle,
uint16_t type,
struct nlmsghdr *hdr)
{
struct rtnl_handler *h = find_handler(rtnl_handle, type);
if (!h) {
rtnl_log(LOG_DEBUG, "no registered handler for type %u", type);
return 0;
}
return (h->handlefn)(hdr, h->arg);
}
/* rtnl_handler_register - register handler for given nlmsg type
* @hdlr: handler structure
*/
int rtnl_handler_register(struct rtnl_handle *rtnl_handle,
struct rtnl_handler *hdlr)
{
rtnl_log(LOG_DEBUG, "registering handler for type %u",
hdlr->nlmsg_type);
hdlr->next = rtnl_handle->handlers;
rtnl_handle->handlers = hdlr;
return 1;
}
/* rtnl_handler_unregister - unregister handler for given nlmst type
* @hdlr: handler structure
*/
int rtnl_handler_unregister(struct rtnl_handle *rtnl_handle,
struct rtnl_handler *hdlr)
{
struct rtnl_handler *h, *prev = NULL;
rtnl_log(LOG_DEBUG, "unregistering handler for type %u",
hdlr->nlmsg_type);
for (h = rtnl_handle->handlers; h; h = h->next) {
if (h == hdlr) {
if (prev)
prev->next = h->next;
else
rtnl_handle->handlers = h->next;
return 1;
}
prev = h;
}
return 0;
}
int rtnl_parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
{
memset(tb, 0, sizeof(struct rtattr *) * max);
while (RTA_OK(rta, len)) {
if (rta->rta_type <= max)
tb[rta->rta_type] = rta;
rta = RTA_NEXT(rta,len);
}
if (len)
return -1;
return 0;
}
/* rtnl_dump_type - ask rtnetlink to dump a specific table
* @type: type of table to be dumped
*/
int rtnl_dump_type(struct rtnl_handle *rtnl_handle, unsigned int type)
{
struct {
struct nlmsghdr nlh;
struct rtgenmsg g;
} req;
struct sockaddr_nl nladdr;
memset(&nladdr, 0, sizeof(nladdr));
memset(&req, 0, sizeof(req));
nladdr.nl_family = AF_NETLINK;
req.nlh.nlmsg_len = sizeof(req);
req.nlh.nlmsg_type = type;
req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
req.nlh.nlmsg_pid = 0;
req.nlh.nlmsg_seq = rtnl_handle->rtnl_dump = ++(rtnl_handle->rtnl_seq);
req.g.rtgen_family = AF_INET;
return sendto(rtnl_handle->rtnl_fd, &req, sizeof(req), 0,
(struct sockaddr*)&nladdr, sizeof(nladdr));
}
/* rtnl_receive - receive netlink packets from rtnetlink socket */
int rtnl_receive(struct rtnl_handle *rtnl_handle)
{
int status;
char buf[8192];
struct sockaddr_nl nladdr;
struct iovec iov = { buf, sizeof(buf) };
struct nlmsghdr *h;
struct msghdr msg = {
.msg_name = &nladdr,
.msg_namelen = sizeof(nladdr),
.msg_iov = &iov,
.msg_iovlen = 1,
};
status = recvmsg(rtnl_handle->rtnl_fd, &msg, 0);
if (status < 0) {
if (errno == EINTR)
return 0;
rtnl_log(LOG_NOTICE, "OVERRUN on rtnl socket");
return -1;
}
if (status == 0) {
rtnl_log(LOG_ERROR, "EOF on rtnl socket");
return -1;
}
if (msg.msg_namelen != sizeof(nladdr)) {
rtnl_log(LOG_ERROR, "invalid address size");
return -1;
}
h = (struct nlmsghdr *) buf;
while (NLMSG_OK(h, status)) {
#if 0
if (h->nlmsg_pid != rtnl_local.nl_pid ||
h->nlmsg_seq != rtnl_dump) {
goto skip;
}
#endif
if (h->nlmsg_type == NLMSG_DONE) {
rtnl_log(LOG_NOTICE, "NLMSG_DONE");
return 0;
}
if (h->nlmsg_type == NLMSG_ERROR) {
struct nlmsgerr *err = NLMSG_DATA(h);
if (h->nlmsg_len>=NLMSG_LENGTH(sizeof(struct nlmsgerr)))
errno = -err->error;
rtnl_log(LOG_ERROR, "NLMSG_ERROR, errnp=%d",
errno);
return -1;
}
if (call_handler(rtnl_handle, h->nlmsg_type, h) == 0)
rtnl_log(LOG_NOTICE, "unhandled nlmsg_type %u",
h->nlmsg_type);
h = NLMSG_NEXT(h, status);
}
return 1;
}
int rtnl_receive_multi(struct rtnl_handle *rtnl_handle)
{
while (1) {
if (rtnl_receive(rtnl_handle) <= 0)
break;
}
return 1;
}
/* rtnl_open - constructor of rtnetlink module */
struct rtnl_handle *rtnl_open(void)
{
socklen_t addrlen;
struct rtnl_handle *h;
h = calloc(1, sizeof(struct rtnl_handle));
if (!h)
return NULL;
addrlen = sizeof(h->rtnl_local);
h->rtnl_local.nl_pid = getpid();
h->rtnl_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (h->rtnl_fd < 0) {
rtnl_log(LOG_ERROR, "unable to create rtnetlink socket");
goto err;
}
memset(&h->rtnl_local, 0, sizeof(h->rtnl_local));
h->rtnl_local.nl_family = AF_NETLINK;
h->rtnl_local.nl_groups = RTMGRP_LINK;
if (bind(h->rtnl_fd, (struct sockaddr *) &h->rtnl_local, addrlen) < 0) {
rtnl_log(LOG_ERROR, "unable to bind rtnetlink socket");
goto err_close;
}
if (getsockname(h->rtnl_fd,
(struct sockaddr *) &h->rtnl_local,
&addrlen) < 0) {
rtnl_log(LOG_ERROR, "cannot gescockname(rtnl_socket)");
goto err_close;
}
if (addrlen != sizeof(h->rtnl_local)) {
rtnl_log(LOG_ERROR, "invalid address size %u", addr_len);
goto err_close;
}
if (h->rtnl_local.nl_family != AF_NETLINK) {
rtnl_log(LOG_ERROR, "invalid AF %u", h->rtnl_local.nl_family);
goto err_close;
}
h->rtnl_seq = time(NULL);
return h;
err_close:
close(h->rtnl_fd);
err:
free(h);
return NULL;
}
/* rtnl_close - destructor of rtnetlink module */
void rtnl_close(struct rtnl_handle *rtnl_handle)
{
close(rtnl_handle->rtnl_fd);
free(rtnl_handle);
return;
}

37
deps/libnfnetlink/src/rtnl.h vendored Normal file
View File

@@ -0,0 +1,37 @@
#ifndef _RTNL_H
#define _RTNL_H
#include <linux/types.h>
#include <linux/rtnetlink.h>
struct rtnl_handler {
struct rtnl_handler *next;
uint16_t nlmsg_type;
int (*handlefn)(struct nlmsghdr *h, void *arg);
void *arg;
};
struct rtnl_handle {
int rtnl_fd;
int rtnl_seq;
int rtnl_dump;
struct sockaddr_nl rtnl_local;
struct rtnl_handler *handlers;
};
/* api for handler plugins */
int rtnl_handler_register(struct rtnl_handle *rtnl_handle,
struct rtnl_handler *hdlr);
int rtnl_handler_unregister(struct rtnl_handle *rtnl_handle,
struct rtnl_handler *hdlr);
int rtnl_parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
int rtnl_dump_type(struct rtnl_handle *rtnl_handle, unsigned int type);
/* api for core program */
struct rtnl_handle *rtnl_open(void);
void rtnl_close(struct rtnl_handle *rtnl_handle);
int rtnl_receive(struct rtnl_handle *rtnl_handle);
int rtnl_receive_multi(struct rtnl_handle *rtnl_handle);
#endif