Browse Source

add "deleteAddress" interface command, add "name" function for interface/neighbor and add some const qualifiers

master
Brad Parker 11 years ago
parent
commit
8a5ea276f9
  1. 75
      interface.cpp
  2. 6
      interface.h
  3. 8
      iptest/iptest.cpp
  4. 6
      neighbor.cpp
  5. 3
      neighbor.h

75
interface.cpp

@ -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;
}

6
interface.h

@ -9,9 +9,11 @@ Q_OBJECT
public:
Interface(QString interface);
static QStringList list();
QStringList addresses();
QStringList addresses() const;
bool hasCarrier();
void addAddress(QString address);
void addAddress(QString address) const;
void deleteAddress(QString address) const;
const QString& name() const;
private:
QString m_interface;

8
iptest/iptest.cpp

@ -17,7 +17,7 @@ int main(int argc, char *argv[]) {
std::cout << "Address: " << qPrintable(address) << std::endl;
}
std::cout << "Link of wlp3s0 is: " << interface.hasCarrier() << std::endl;
std::cout << "Link of " << qPrintable(interface.name()) << " is: " << interface.hasCarrier() << std::endl;
std::cout << "Interfaces:" << std::endl;
@ -27,6 +27,8 @@ int main(int argc, char *argv[]) {
std::cout << qPrintable(link) << std::endl;
}
std::cout << "-----" << std::endl;
std::cout << "Neighbors:" << std::endl;
QStringList neighs = Neighbor::list();
@ -35,7 +37,9 @@ int main(int argc, char *argv[]) {
std::cout << qPrintable(neigh) << std::endl;
}
interface.addAddress("1.1.1.5/29");
std::cout << "-----" << std::endl;
//interface.deleteAddress("1.1.1.5/29");
QTimer::singleShot(0, qApp, SLOT(quit()));

6
neighbor.cpp

@ -21,7 +21,7 @@ m_interface(interface)
}
QString Neighbor::macOfIP(QString ip) {
QString Neighbor::macOfIP(QString ip) const {
struct nl_sock *sock;
struct rtnl_neigh *neigh;
struct nl_cache *neigh_cache, *link_cache;
@ -144,3 +144,7 @@ QStringList Neighbor::list(QString interfaceString) {
return neighborList;
}
const QString Neighbor::name() const {
return m_interface;
}

3
neighbor.h

@ -8,8 +8,9 @@ Q_OBJECT
public:
Neighbor(QString interface = QString());
QString macOfIP(QString ip);
QString macOfIP(QString ip) const;
static QStringList list(QString interface = QString());
const QString name() const;
private:
QString m_interface;

Loading…
Cancel
Save