-rw-r--r-- | libopie2/opienet/onetwork.cpp | 41 | ||||
-rw-r--r-- | libopie2/opienet/onetwork.h | 49 |
2 files changed, 75 insertions, 15 deletions
diff --git a/libopie2/opienet/onetwork.cpp b/libopie2/opienet/onetwork.cpp index f0094c7..be2736a 100644 --- a/libopie2/opienet/onetwork.cpp +++ b/libopie2/opienet/onetwork.cpp @@ -103,16 +103,22 @@ void ONetwork::synchronize() iface = new ONetworkInterface( this, (const char*) str ); } _interfaces.insert( str, iface ); s.readLine(); } } +int ONetwork::count() const +{ + return _interfaces.count(); +} + + ONetworkInterface* ONetwork::interface( const QString& iface ) const { return _interfaces[iface]; } ONetwork* ONetwork::instance() { @@ -206,21 +212,31 @@ bool ONetworkInterface::setUp( bool b ) bool ONetworkInterface::isUp() const { ioctl( SIOCGIFFLAGS ); return _ifr.ifr_flags & IFF_UP; } +void ONetworkInterface::setIPV4Address( const QHostAddress& addr ) +{ + struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; + sa->sin_family = AF_INET; + sa->sin_port = 0; + sa->sin_addr.s_addr = htonl( addr.ip4Addr() ); + ioctl( SIOCSIFADDR ); +} + + QString ONetworkInterface::ipV4Address() const { if ( ioctl( SIOCGIFADDR ) ) { - struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; + struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; //FIXME: Use QHostAddress here return QString( inet_ntoa( sa->sin_addr ) ); } else return "<unknown>"; } @@ -240,16 +256,39 @@ OMacAddress ONetworkInterface::macAddress() const } else { return OMacAddress::unknown; } } +void ONetworkInterface::setIPV4Netmask( const QHostAddress& addr ) +{ + struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; + sa->sin_family = AF_INET; + sa->sin_port = 0; + sa->sin_addr.s_addr = htonl( addr.ip4Addr() ); + ioctl( SIOCSIFNETMASK ); +} + + +QString ONetworkInterface::ipV4Netmask() const +{ + if ( ioctl( SIOCGIFNETMASK ) ) + { + struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; + //FIXME: Use QHostAddress here + return QString( inet_ntoa( sa->sin_addr ) ); + } + else + return "<unknown>"; +} + + int ONetworkInterface::dataLinkType() const { if ( ioctl( SIOCGIFHWADDR ) ) { return _ifr.ifr_hwaddr.sa_family; } else { diff --git a/libopie2/opienet/onetwork.h b/libopie2/opienet/onetwork.h index db8e702..2348bbc 100644 --- a/libopie2/opienet/onetwork.h +++ b/libopie2/opienet/onetwork.h @@ -51,48 +51,52 @@ #endif #ifndef IW_MAX_PRIV_DEF #define IW_MAX_PRIV_DEF 128 #endif // ML: Yeah, I hate to include kernel headers, but it's necessary here // ML: Here comes an ugly hack to prevent <linux/wireless.h> including <linux/if.h> // ML: which conflicts with the user header <net/if.h> -// ML: We really a user header for the Wireless Extensions, something like <net/wireless.h> -// ML: I will drop Jean an mail on that subject +// ML: We really need a user header for the Wireless Extensions, something like <net/wireless.h> +// ML: I will drop Jean a mail on that subject #include <net/if.h> #define _LINUX_IF_H #include <linux/wireless.h> class ONetworkInterface; class OWirelessNetworkInterface; class OChannelHopper; class OMonitoringInterface; /*====================================================================================== * ONetwork *======================================================================================*/ /** - * @brief A container class for all network devices. + * @brief A container class for all network interfaces * - * This class provides access to all available network devices of your computer. + * This class provides access to all available network interfaces of your computer. * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> */ class ONetwork : public QObject { Q_OBJECT public: typedef QDict<ONetworkInterface> InterfaceMap; typedef QDictIterator<ONetworkInterface> InterfaceIterator; public: /** + * @returns the number of available interfaces + */ + int count() const; + /** * @returns a pointer to the (one and only) @ref ONetwork instance. */ static ONetwork* instance(); /** * @returns an iterator usable for iterating through all network interfaces. */ InterfaceIterator iterator() const; /** @@ -101,20 +105,25 @@ class ONetwork : public QObject // FIXME QString? -zecke bool isWirelessInterface( const char* interface ) const; /** * @returns a pointer to the @ref ONetworkInterface object for the specified @p interface or 0, if not found * @see ONetworkInterface */ // FIXME: const QString& is prefered over QString!!! -zecke ONetworkInterface* interface( const QString& interface ) const; + /** + * @internal Rebuild the internal interface database + * @note Sometimes it might be useful to call this from client code, + * e.g. after cardctl insert + */ + void synchronize(); protected: ONetwork(); - void synchronize(); private: static ONetwork* _instance; InterfaceMap _interfaces; }; /*====================================================================================== @@ -169,40 +178,52 @@ class ONetworkInterface : public QObject /** * Setting an interface to up enables it to receive packets. */ bool setUp( bool ); /** * @returns true if the interface is up. */ bool isUp() const; - /* + /** * @returns true if the interface is a loopback interface. */ bool isLoopback() const; - /* + /** * @returns true if the interface is featuring supports the wireless extension protocol. */ bool isWireless() const; - /* - * @returns the IPv4 address associated with this interface. + /** + * Associate the IP address @ addr with the interface. + */ + void setIPV4Address( const QHostAddress& addr ); + /** + * @returns the IPv4 address associated with the interface. */ QString ipV4Address() const; - /* + /** * Associate the MAC address @a addr with the interface. * @note It can be necessary to shut down the interface prior to calling this method. * @warning This is not supported by all drivers. */ void setMacAddress( const OMacAddress& addr ); - /* - * @returns the MAC address associated with this interface. + /** + * @returns the MAC address associated with the interface. */ OMacAddress macAddress() const; - /* - * @returns the data link type currently associated with this interface. + /** + * Associate the IPv4 @a netmask with the interface. + */ + void setIPV4Netmask( const QHostAddress& netmask ); + /** + * @returns the IPv4 netmask associated with the interface. + */ + QString ipV4Netmask() const; + /** + * @returns the data link type currently associated with the interface. * @see #include <net/if_arp.h> for possible values. */ int dataLinkType() const; protected: const int _sfd; mutable ifreq _ifr; OMonitoringInterface* _mon; |