|
@ -5,30 +5,99 @@ |
|
|
extern "C" { |
|
|
extern "C" { |
|
|
#include <netlink/cli/utils.h> |
|
|
#include <netlink/cli/utils.h> |
|
|
#include <netlink/cli/neigh.h> |
|
|
#include <netlink/cli/neigh.h> |
|
|
|
|
|
#include <netlink/cli/addr.h> |
|
|
|
|
|
#include <netlink/cli/link.h> |
|
|
#include <pthread.h> |
|
|
#include <pthread.h> |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#include "ip.h" |
|
|
#include "ip.h" |
|
|
|
|
|
#include <iostream> |
|
|
|
|
|
#include <QStringList> |
|
|
|
|
|
|
|
|
|
|
|
#define BUFLEN 65535 |
|
|
|
|
|
#define MACBUFLEN 18 |
|
|
|
|
|
#define ADDRBUFLEN BUFLEN |
|
|
|
|
|
|
|
|
IP::IP() : |
|
|
IP::IP() : |
|
|
QObject(0), |
|
|
QObject(0) |
|
|
m_buf(), |
|
|
|
|
|
m_mac() |
|
|
|
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const char* IP::get_mac(const char *ip) { |
|
|
QStringList IP::addresses(const char *interface) { |
|
|
|
|
|
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]; |
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QString IP::macOfIP(const char *ip) { |
|
|
struct nl_sock *sock; |
|
|
struct nl_sock *sock; |
|
|
struct rtnl_neigh *neigh; |
|
|
struct rtnl_neigh *neigh; |
|
|
struct nl_cache *neigh_cache; |
|
|
struct nl_cache *neigh_cache; |
|
|
struct nl_dump_params params; |
|
|
struct nl_dump_params params; |
|
|
|
|
|
char buf[BUFLEN]; |
|
|
|
|
|
char mac[MACBUFLEN]; |
|
|
|
|
|
|
|
|
memset(¶ms, 0, sizeof(struct nl_dump_params)); |
|
|
memset(¶ms, 0, sizeof(struct nl_dump_params)); |
|
|
|
|
|
|
|
|
params.dp_type = NL_DUMP_LINE; |
|
|
params.dp_type = NL_DUMP_LINE; |
|
|
params.dp_fd = NULL; |
|
|
params.dp_fd = NULL; |
|
|
params.dp_buf = m_buf; |
|
|
params.dp_buf = buf; |
|
|
params.dp_buflen = BUFLEN; |
|
|
params.dp_buflen = BUFLEN; |
|
|
|
|
|
|
|
|
char *ipAddr = strndup(ip, strlen(ip)); |
|
|
char *ipAddr = strndup(ip, strlen(ip)); |
|
@ -41,22 +110,22 @@ const char* IP::get_mac(const char *ip) { |
|
|
//case 'f': params.dp_type = nl_cli_parse_dumptype(optarg); break;
|
|
|
//case 'f': params.dp_type = nl_cli_parse_dumptype(optarg); break;
|
|
|
nl_cli_neigh_parse_dst(neigh, ipAddr); |
|
|
nl_cli_neigh_parse_dst(neigh, ipAddr); |
|
|
|
|
|
|
|
|
memset(m_buf, 0, BUFLEN); |
|
|
memset(buf, 0, BUFLEN); |
|
|
memset(m_mac, 0, MACBUFLEN); |
|
|
memset(mac, 0, MACBUFLEN); |
|
|
|
|
|
|
|
|
nl_cache_dump_filter(neigh_cache, ¶ms, OBJ_CAST(neigh)); |
|
|
nl_cache_dump_filter(neigh_cache, ¶ms, OBJ_CAST(neigh)); |
|
|
|
|
|
|
|
|
//char data[128] = {0};
|
|
|
//char data[128] = {0};
|
|
|
unsigned short count = 0; |
|
|
unsigned short count = 0; |
|
|
char *rest = NULL; |
|
|
char *rest = NULL; |
|
|
char *field = strtok_r(m_buf, " ", &rest); |
|
|
char *field = strtok_r(buf, " ", &rest); |
|
|
|
|
|
|
|
|
while(field != NULL) { |
|
|
while(field != NULL) { |
|
|
++count; |
|
|
++count; |
|
|
|
|
|
|
|
|
if(count == 5) { |
|
|
if(count == 5) { |
|
|
if(strstr(field, ":") != NULL) { |
|
|
if(strstr(field, ":") != NULL) { |
|
|
memcpy(m_mac, field, MACBUFLEN - 1); |
|
|
memcpy(mac, field, MACBUFLEN - 1); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -68,9 +137,11 @@ const char* IP::get_mac(const char *ip) { |
|
|
nl_socket_free(sock); |
|
|
nl_socket_free(sock); |
|
|
free(ipAddr); |
|
|
free(ipAddr); |
|
|
|
|
|
|
|
|
if(m_mac == NULL || count == 0) { |
|
|
if(mac == NULL || count == 0) { |
|
|
return "00:00:00:00:00:00"; |
|
|
return "00:00:00:00:00:00"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return m_mac; |
|
|
QString macStr = mac; |
|
|
|
|
|
|
|
|
|
|
|
return macStr; |
|
|
} |
|
|
} |
|
|