|
|
@ -53,7 +53,7 @@ m_index(-1) |
|
|
|
nl_socket_free(sock); |
|
|
|
} |
|
|
|
|
|
|
|
void Interface::addAddress(QString addressStr) { |
|
|
|
void Interface::addAddress(QString addressStr) const { |
|
|
|
struct nl_sock *sock; |
|
|
|
QByteArray addressArrayNoMask = addressStr.left(addressStr.indexOf('/')).toLatin1(); |
|
|
|
QByteArray addressArray = addressStr.toLatin1(); |
|
|
@ -120,6 +120,73 @@ void Interface::addAddress(QString addressStr) { |
|
|
|
nl_socket_free(sock); |
|
|
|
} |
|
|
|
|
|
|
|
void Interface::deleteAddress(QString addressStr) const { |
|
|
|
struct nl_sock *sock; |
|
|
|
QByteArray addressArrayNoMask = addressStr.left(addressStr.indexOf('/')).toLatin1(); |
|
|
|
QByteArray addressArray = addressStr.toLatin1(); |
|
|
|
QString bitmask = addressStr.right(2); |
|
|
|
const char *addressDataNoMask = addressArrayNoMask.constData(); |
|
|
|
const char *addressData = addressArray.constData(); |
|
|
|
in_addr_t brdInt = inet_addr(addressDataNoMask); |
|
|
|
struct in_addr brd = { .s_addr = brdInt }; |
|
|
|
int bitlen = bitmask.toInt(); |
|
|
|
|
|
|
|
if(bitlen <= 30) { |
|
|
|
for(int i = 31; i >= bitlen; i--) { |
|
|
|
brd.s_addr |= htonl(1 << (31 - i)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
sock = nl_cli_alloc_socket(); |
|
|
|
nl_cli_connect(sock, NETLINK_ROUTE); |
|
|
|
|
|
|
|
struct rtnl_addr *addr = rtnl_addr_alloc(); |
|
|
|
struct nl_addr *address = NULL; |
|
|
|
struct nl_addr *bcast = NULL; |
|
|
|
struct nl_msg *result = NULL; |
|
|
|
int parseResult = nl_addr_parse(addressData, AF_UNSPEC, &address); |
|
|
|
int parseBroadcastResult = nl_addr_parse(inet_ntoa(brd), AF_INET, &bcast); |
|
|
|
|
|
|
|
if(parseResult != 0) { |
|
|
|
std::cerr << "could not parse address" << std::endl; |
|
|
|
rtnl_addr_put(addr); |
|
|
|
nl_addr_put(bcast); |
|
|
|
nl_socket_free(sock); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if(parseBroadcastResult != 0) { |
|
|
|
std::cerr << "could not parse broadcast address" << std::endl; |
|
|
|
rtnl_addr_put(addr); |
|
|
|
nl_addr_put(bcast); |
|
|
|
nl_socket_free(sock); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
rtnl_addr_set_ifindex(addr, m_index); |
|
|
|
rtnl_addr_set_local(addr, address); |
|
|
|
rtnl_addr_set_broadcast(addr, bcast); |
|
|
|
|
|
|
|
int ret = rtnl_addr_build_delete_request(addr, 0, &result); |
|
|
|
|
|
|
|
if(ret != 0) { |
|
|
|
std::cerr << "could not build add request" << std::endl; |
|
|
|
} |
|
|
|
|
|
|
|
if(rtnl_addr_delete(sock, addr, 0) != 0) { |
|
|
|
std::cerr << "could not add address" << std::endl; |
|
|
|
} |
|
|
|
|
|
|
|
rtnl_addr_put(addr); |
|
|
|
nl_addr_put(bcast); |
|
|
|
|
|
|
|
//struct nlmsghdr *hdr = nlmsg_hdr(result);
|
|
|
|
//nl_msg_dump(result, stderr);
|
|
|
|
|
|
|
|
nlmsg_free(result); |
|
|
|
nl_socket_free(sock); |
|
|
|
} |
|
|
|
|
|
|
|
bool Interface::hasCarrier() { |
|
|
|
struct rtnl_link *link; |
|
|
|
struct nl_sock *sock; |
|
|
@ -143,7 +210,7 @@ bool Interface::hasCarrier() { |
|
|
|
return carrier; |
|
|
|
} |
|
|
|
|
|
|
|
QStringList Interface::addresses() { |
|
|
|
QStringList Interface::addresses() const { |
|
|
|
struct nl_sock *sock; |
|
|
|
struct rtnl_addr *addr; |
|
|
|
struct nl_cache *addr_cache, *link_cache; |
|
|
@ -246,3 +313,7 @@ QStringList Interface::list() { |
|
|
|
|
|
|
|
return linkList; |
|
|
|
} |
|
|
|
|
|
|
|
const QString& Interface::name() const { |
|
|
|
return m_interface; |
|
|
|
} |
|
|
|