You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
3.7 KiB
149 lines
3.7 KiB
11 years ago
|
// gcc -Wall -Werror -O2 -s -pedantic-errors -std=gnu99 -I/usr/include/libnl3 -o nl-neigh-list nl-neigh-list.c -lnl-route-3 -lnl-3 -lnl-cli-3
|
||
|
// armeb-linux-gcc -Wall -Werror -O2 -s -std=gnu99 -I/usr/include/libnl3 -o nl-neigh-list nl-neigh-list.c -L. -lnl-route-3 -lnl-3 -lnl-cli-3 -lnl-nf-3 -lnl-genl-3
|
||
|
// with libs static compiled: armeb-linux-gcc -Wall -Werror -O2 -s -std=gnu99 -I/usr/include/libnl3 -o nl-neigh-list nl-neigh-list.c -L. -Wl,-Bstatic -lnl-route-3 -lnl-3 -lnl-cli-3 -lnl-nf-3 -lnl-genl-3 -Wl,-Bdynamic -lpthread -ldl -lm
|
||
|
|
||
|
extern "C" {
|
||
|
#include <netlink/cli/utils.h>
|
||
|
#include <netlink/cli/neigh.h>
|
||
11 years ago
|
#include <netlink/cli/addr.h>
|
||
|
#include <netlink/cli/link.h>
|
||
11 years ago
|
#include <pthread.h>
|
||
|
}
|
||
|
|
||
11 years ago
|
#include "interface.h"
|
||
11 years ago
|
#include <iostream>
|
||
|
#include <QStringList>
|
||
|
|
||
|
#define BUFLEN 65535
|
||
|
#define ADDRBUFLEN BUFLEN
|
||
11 years ago
|
|
||
11 years ago
|
Interface::Interface(QString interface) :
|
||
|
QObject(0),
|
||
|
m_interface(interface)
|
||
11 years ago
|
{
|
||
|
|
||
|
}
|
||
|
|
||
11 years ago
|
bool Interface::hasCarrier() {
|
||
|
struct rtnl_link *link;
|
||
|
struct nl_sock *sock;
|
||
|
QByteArray interfaceArray = m_interface.toLatin1();
|
||
|
const char *interface = interfaceArray.constData();
|
||
|
|
||
|
sock = nl_cli_alloc_socket();
|
||
|
nl_cli_connect(sock, NETLINK_ROUTE);
|
||
|
|
||
|
if(rtnl_link_get_kernel(sock, 0, interface, &link) < 0) {
|
||
|
std::cerr << "error looking up interface" << std::endl;
|
||
|
}
|
||
|
|
||
|
unsigned int flags = rtnl_link_get_flags(link);
|
||
|
|
||
|
bool carrier = flags & IFF_RUNNING;
|
||
|
|
||
|
nl_socket_free(sock);
|
||
|
|
||
|
return carrier;
|
||
|
}
|
||
|
|
||
|
QStringList Interface::addresses() {
|
||
11 years ago
|
struct nl_sock *sock;
|
||
|
struct rtnl_addr *addr;
|
||
|
struct nl_cache *addr_cache, *link_cache;
|
||
|
struct nl_dump_params params;
|
||
|
char buf[BUFLEN];
|
||
|
char addrs[ADDRBUFLEN];
|
||
11 years ago
|
QByteArray interfaceArray = m_interface.toLatin1();
|
||
|
const char *interface = interfaceArray.constData();
|
||
11 years ago
|
|
||
|
memset(¶ms, 0, sizeof(struct nl_dump_params));
|
||
|
|
||
|
params.dp_type = NL_DUMP_LINE;
|
||
|
params.dp_fd = NULL;
|
||
|
params.dp_buf = buf;
|
||
|
params.dp_buflen = BUFLEN;
|
||
|
|
||
|
char *ipInterface = strndup(interface, strlen(interface));
|
||
|
char *family = const_cast<char*>("inet");
|
||
|
|
||
|
sock = nl_cli_alloc_socket();
|
||
|
nl_cli_connect(sock, NETLINK_ROUTE);
|
||
|
addr_cache = nl_cli_addr_alloc_cache(sock);
|
||
|
link_cache = nl_cli_link_alloc_cache(sock);
|
||
|
addr = nl_cli_addr_alloc();
|
||
|
|
||
|
nl_cli_addr_parse_family(addr, family);
|
||
|
nl_cli_addr_parse_dev(addr, link_cache, ipInterface);
|
||
|
|
||
|
memset(buf, 0, BUFLEN);
|
||
|
memset(addrs, 0, ADDRBUFLEN);
|
||
|
|
||
|
nl_cache_dump_filter(addr_cache, ¶ms, OBJ_CAST(addr));
|
||
|
|
||
|
buf[BUFLEN - 1] = '\0';
|
||
|
|
||
|
QString addrsString = buf;
|
||
|
QStringList addrsLines = addrsString.split('\n');
|
||
|
QStringList addrsList;
|
||
|
|
||
|
foreach(QString addrString, addrsLines) {
|
||
|
QStringList fields = addrString.split(' ');
|
||
|
|
||
|
if(fields.count() > 0) {
|
||
|
QString address = fields.at(0);
|
||
|
|
||
|
if(!address.isEmpty()) {
|
||
|
addrsList << fields.at(0);
|
||
|
}
|
||
|
}else{
|
||
|
std::cerr << "empty line: " << qPrintable(fields.join(' ')) << std::endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
nl_object_free(OBJ_CAST(addr));
|
||
|
nl_cache_free(addr_cache);
|
||
|
nl_cache_free(link_cache);
|
||
|
nl_socket_free(sock);
|
||
|
free(ipInterface);
|
||
|
|
||
|
return addrsList;
|
||
|
}
|
||
|
|
||
11 years ago
|
QStringList Interface::list() {
|
||
11 years ago
|
struct nl_sock *sock;
|
||
11 years ago
|
struct nl_cache *link_cache;
|
||
|
QStringList linkList;
|
||
11 years ago
|
|
||
|
sock = nl_cli_alloc_socket();
|
||
|
nl_cli_connect(sock, NETLINK_ROUTE);
|
||
|
|
||
11 years ago
|
int ret = rtnl_link_alloc_cache(sock, AF_UNSPEC, &link_cache);
|
||
11 years ago
|
|
||
11 years ago
|
if(ret != 0) {
|
||
|
std::cerr << "could not allocate link cache" << std::endl;
|
||
|
nl_socket_free(sock);
|
||
|
return linkList;
|
||
|
}
|
||
11 years ago
|
|
||
11 years ago
|
int index = 1;
|
||
11 years ago
|
|
||
11 years ago
|
forever {
|
||
|
struct rtnl_link *link = rtnl_link_get(link_cache, index);
|
||
11 years ago
|
|
||
11 years ago
|
if(link != NULL) {
|
||
|
char *name = rtnl_link_get_name(link);
|
||
11 years ago
|
|
||
11 years ago
|
linkList << name;
|
||
|
}else{
|
||
|
break;
|
||
11 years ago
|
}
|
||
|
|
||
11 years ago
|
++index;
|
||
11 years ago
|
}
|
||
|
|
||
11 years ago
|
nl_cache_free(link_cache);
|
||
11 years ago
|
nl_socket_free(sock);
|
||
11 years ago
|
|
||
11 years ago
|
return linkList;
|
||
11 years ago
|
}
|