author | mickeyl <mickeyl> | 2003-04-16 22:24:29 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-04-16 22:24:29 (UTC) |
commit | 0ac702419b3b8450b689e0ee2500f34b577f1a72 (patch) (unidiff) | |
tree | ef9e8101430c1429992b43a780bd68ca10daa77f | |
parent | 14db7d7d1ea99b8d9715f11daaa3ca9f4d8a554a (diff) | |
download | opie-0ac702419b3b8450b689e0ee2500f34b577f1a72.zip opie-0ac702419b3b8450b689e0ee2500f34b577f1a72.tar.gz opie-0ac702419b3b8450b689e0ee2500f34b577f1a72.tar.bz2 |
add some missing APIs to ONetworkInterface
-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 | |||
@@ -95,32 +95,38 @@ void ONetwork::synchronize() | |||
95 | ONetworkInterface* iface; | 95 | ONetworkInterface* iface; |
96 | if ( isWirelessInterface( str ) ) | 96 | if ( isWirelessInterface( str ) ) |
97 | { | 97 | { |
98 | iface = new OWirelessNetworkInterface( this, (const char*) str ); | 98 | iface = new OWirelessNetworkInterface( this, (const char*) str ); |
99 | qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str ); | 99 | qDebug( "ONetwork: interface '%s' has Wireless Extensions", (const char*) str ); |
100 | } | 100 | } |
101 | else | 101 | else |
102 | { | 102 | { |
103 | iface = new ONetworkInterface( this, (const char*) str ); | 103 | iface = new ONetworkInterface( this, (const char*) str ); |
104 | } | 104 | } |
105 | _interfaces.insert( str, iface ); | 105 | _interfaces.insert( str, iface ); |
106 | s.readLine(); | 106 | s.readLine(); |
107 | } | 107 | } |
108 | } | 108 | } |
109 | 109 | ||
110 | 110 | ||
111 | int ONetwork::count() const | ||
112 | { | ||
113 | return _interfaces.count(); | ||
114 | } | ||
115 | |||
116 | |||
111 | ONetworkInterface* ONetwork::interface( const QString& iface ) const | 117 | ONetworkInterface* ONetwork::interface( const QString& iface ) const |
112 | { | 118 | { |
113 | return _interfaces[iface]; | 119 | return _interfaces[iface]; |
114 | } | 120 | } |
115 | 121 | ||
116 | 122 | ||
117 | ONetwork* ONetwork::instance() | 123 | ONetwork* ONetwork::instance() |
118 | { | 124 | { |
119 | if ( !_instance ) _instance = new ONetwork(); | 125 | if ( !_instance ) _instance = new ONetwork(); |
120 | return _instance; | 126 | return _instance; |
121 | } | 127 | } |
122 | 128 | ||
123 | 129 | ||
124 | ONetwork::InterfaceIterator ONetwork::iterator() const | 130 | ONetwork::InterfaceIterator ONetwork::iterator() const |
125 | { | 131 | { |
126 | return ONetwork::InterfaceIterator( _interfaces ); | 132 | return ONetwork::InterfaceIterator( _interfaces ); |
@@ -198,66 +204,99 @@ bool ONetworkInterface::isLoopback() const | |||
198 | bool ONetworkInterface::setUp( bool b ) | 204 | bool ONetworkInterface::setUp( bool b ) |
199 | { | 205 | { |
200 | ioctl( SIOCGIFFLAGS ); | 206 | ioctl( SIOCGIFFLAGS ); |
201 | if ( b ) _ifr.ifr_flags |= IFF_UP; | 207 | if ( b ) _ifr.ifr_flags |= IFF_UP; |
202 | else _ifr.ifr_flags &= (~IFF_UP); | 208 | else _ifr.ifr_flags &= (~IFF_UP); |
203 | return ioctl( SIOCSIFFLAGS ); | 209 | return ioctl( SIOCSIFFLAGS ); |
204 | } | 210 | } |
205 | 211 | ||
206 | 212 | ||
207 | bool ONetworkInterface::isUp() const | 213 | bool ONetworkInterface::isUp() const |
208 | { | 214 | { |
209 | ioctl( SIOCGIFFLAGS ); | 215 | ioctl( SIOCGIFFLAGS ); |
210 | return _ifr.ifr_flags & IFF_UP; | 216 | return _ifr.ifr_flags & IFF_UP; |
211 | } | 217 | } |
212 | 218 | ||
213 | 219 | ||
220 | void ONetworkInterface::setIPV4Address( const QHostAddress& addr ) | ||
221 | { | ||
222 | struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; | ||
223 | sa->sin_family = AF_INET; | ||
224 | sa->sin_port = 0; | ||
225 | sa->sin_addr.s_addr = htonl( addr.ip4Addr() ); | ||
226 | ioctl( SIOCSIFADDR ); | ||
227 | } | ||
228 | |||
229 | |||
214 | QString ONetworkInterface::ipV4Address() const | 230 | QString ONetworkInterface::ipV4Address() const |
215 | { | 231 | { |
216 | if ( ioctl( SIOCGIFADDR ) ) | 232 | if ( ioctl( SIOCGIFADDR ) ) |
217 | { | 233 | { |
218 | struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; | 234 | struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; |
219 | //FIXME: Use QHostAddress here | 235 | //FIXME: Use QHostAddress here |
220 | return QString( inet_ntoa( sa->sin_addr ) ); | 236 | return QString( inet_ntoa( sa->sin_addr ) ); |
221 | } | 237 | } |
222 | else | 238 | else |
223 | return "<unknown>"; | 239 | return "<unknown>"; |
224 | } | 240 | } |
225 | 241 | ||
226 | 242 | ||
227 | void ONetworkInterface::setMacAddress( const OMacAddress& addr ) | 243 | void ONetworkInterface::setMacAddress( const OMacAddress& addr ) |
228 | { | 244 | { |
229 | _ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; | 245 | _ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; |
230 | memcpy( &_ifr.ifr_hwaddr.sa_data, addr.native(), 6 ); | 246 | memcpy( &_ifr.ifr_hwaddr.sa_data, addr.native(), 6 ); |
231 | ioctl( SIOCSIFHWADDR ); | 247 | ioctl( SIOCSIFHWADDR ); |
232 | } | 248 | } |
233 | 249 | ||
234 | 250 | ||
235 | OMacAddress ONetworkInterface::macAddress() const | 251 | OMacAddress ONetworkInterface::macAddress() const |
236 | { | 252 | { |
237 | if ( ioctl( SIOCGIFHWADDR ) ) | 253 | if ( ioctl( SIOCGIFHWADDR ) ) |
238 | { | 254 | { |
239 | return OMacAddress( _ifr ); | 255 | return OMacAddress( _ifr ); |
240 | } | 256 | } |
241 | else | 257 | else |
242 | { | 258 | { |
243 | return OMacAddress::unknown; | 259 | return OMacAddress::unknown; |
244 | } | 260 | } |
245 | } | 261 | } |
246 | 262 | ||
247 | 263 | ||
264 | void ONetworkInterface::setIPV4Netmask( const QHostAddress& addr ) | ||
265 | { | ||
266 | struct sockaddr_in *sa = (struct sockaddr_in *) &_ifr.ifr_addr; | ||
267 | sa->sin_family = AF_INET; | ||
268 | sa->sin_port = 0; | ||
269 | sa->sin_addr.s_addr = htonl( addr.ip4Addr() ); | ||
270 | ioctl( SIOCSIFNETMASK ); | ||
271 | } | ||
272 | |||
273 | |||
274 | QString ONetworkInterface::ipV4Netmask() const | ||
275 | { | ||
276 | if ( ioctl( SIOCGIFNETMASK ) ) | ||
277 | { | ||
278 | struct sockaddr_in* sa = (struct sockaddr_in *) &_ifr.ifr_addr; | ||
279 | //FIXME: Use QHostAddress here | ||
280 | return QString( inet_ntoa( sa->sin_addr ) ); | ||
281 | } | ||
282 | else | ||
283 | return "<unknown>"; | ||
284 | } | ||
285 | |||
286 | |||
248 | int ONetworkInterface::dataLinkType() const | 287 | int ONetworkInterface::dataLinkType() const |
249 | { | 288 | { |
250 | if ( ioctl( SIOCGIFHWADDR ) ) | 289 | if ( ioctl( SIOCGIFHWADDR ) ) |
251 | { | 290 | { |
252 | return _ifr.ifr_hwaddr.sa_family; | 291 | return _ifr.ifr_hwaddr.sa_family; |
253 | } | 292 | } |
254 | else | 293 | else |
255 | { | 294 | { |
256 | return -1; | 295 | return -1; |
257 | } | 296 | } |
258 | } | 297 | } |
259 | 298 | ||
260 | 299 | ||
261 | void ONetworkInterface::setMonitoring( OMonitoringInterface* m ) | 300 | void ONetworkInterface::setMonitoring( OMonitoringInterface* m ) |
262 | { | 301 | { |
263 | _mon = m; | 302 | _mon = m; |
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 | |||
@@ -43,86 +43,95 @@ | |||
43 | #include <qhostaddress.h> | 43 | #include <qhostaddress.h> |
44 | 44 | ||
45 | /* OPIE */ | 45 | /* OPIE */ |
46 | 46 | ||
47 | #include <opie2/onetutils.h> | 47 | #include <opie2/onetutils.h> |
48 | 48 | ||
49 | #ifndef IFNAMSIZ | 49 | #ifndef IFNAMSIZ |
50 | #define IFNAMSIZ 16 | 50 | #define IFNAMSIZ 16 |
51 | #endif | 51 | #endif |
52 | #ifndef IW_MAX_PRIV_DEF | 52 | #ifndef IW_MAX_PRIV_DEF |
53 | #define IW_MAX_PRIV_DEF 128 | 53 | #define IW_MAX_PRIV_DEF 128 |
54 | #endif | 54 | #endif |
55 | 55 | ||
56 | // ML: Yeah, I hate to include kernel headers, but it's necessary here | 56 | // ML: Yeah, I hate to include kernel headers, but it's necessary here |
57 | // ML: Here comes an ugly hack to prevent <linux/wireless.h> including <linux/if.h> | 57 | // ML: Here comes an ugly hack to prevent <linux/wireless.h> including <linux/if.h> |
58 | // ML: which conflicts with the user header <net/if.h> | 58 | // ML: which conflicts with the user header <net/if.h> |
59 | // ML: We really a user header for the Wireless Extensions, something like <net/wireless.h> | 59 | // ML: We really need a user header for the Wireless Extensions, something like <net/wireless.h> |
60 | // ML: I will drop Jean an mail on that subject | 60 | // ML: I will drop Jean a mail on that subject |
61 | 61 | ||
62 | #include <net/if.h> | 62 | #include <net/if.h> |
63 | #define _LINUX_IF_H | 63 | #define _LINUX_IF_H |
64 | #include <linux/wireless.h> | 64 | #include <linux/wireless.h> |
65 | 65 | ||
66 | class ONetworkInterface; | 66 | class ONetworkInterface; |
67 | class OWirelessNetworkInterface; | 67 | class OWirelessNetworkInterface; |
68 | class OChannelHopper; | 68 | class OChannelHopper; |
69 | class OMonitoringInterface; | 69 | class OMonitoringInterface; |
70 | 70 | ||
71 | /*====================================================================================== | 71 | /*====================================================================================== |
72 | * ONetwork | 72 | * ONetwork |
73 | *======================================================================================*/ | 73 | *======================================================================================*/ |
74 | 74 | ||
75 | /** | 75 | /** |
76 | * @brief A container class for all network devices. | 76 | * @brief A container class for all network interfaces |
77 | * | 77 | * |
78 | * This class provides access to all available network devices of your computer. | 78 | * This class provides access to all available network interfaces of your computer. |
79 | * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 79 | * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
80 | */ | 80 | */ |
81 | class ONetwork : public QObject | 81 | class ONetwork : public QObject |
82 | { | 82 | { |
83 | Q_OBJECT | 83 | Q_OBJECT |
84 | 84 | ||
85 | public: | 85 | public: |
86 | typedef QDict<ONetworkInterface> InterfaceMap; | 86 | typedef QDict<ONetworkInterface> InterfaceMap; |
87 | typedef QDictIterator<ONetworkInterface> InterfaceIterator; | 87 | typedef QDictIterator<ONetworkInterface> InterfaceIterator; |
88 | 88 | ||
89 | public: | 89 | public: |
90 | /** | 90 | /** |
91 | * @returns the number of available interfaces | ||
92 | */ | ||
93 | int count() const; | ||
94 | /** | ||
91 | * @returns a pointer to the (one and only) @ref ONetwork instance. | 95 | * @returns a pointer to the (one and only) @ref ONetwork instance. |
92 | */ | 96 | */ |
93 | static ONetwork* instance(); | 97 | static ONetwork* instance(); |
94 | /** | 98 | /** |
95 | * @returns an iterator usable for iterating through all network interfaces. | 99 | * @returns an iterator usable for iterating through all network interfaces. |
96 | */ | 100 | */ |
97 | InterfaceIterator iterator() const; | 101 | InterfaceIterator iterator() const; |
98 | /** | 102 | /** |
99 | * @returns true, if the @p interface supports the wireless extension protocol. | 103 | * @returns true, if the @p interface supports the wireless extension protocol. |
100 | */ | 104 | */ |
101 | // FIXME QString? -zecke | 105 | // FIXME QString? -zecke |
102 | bool isWirelessInterface( const char* interface ) const; | 106 | bool isWirelessInterface( const char* interface ) const; |
103 | /** | 107 | /** |
104 | * @returns a pointer to the @ref ONetworkInterface object for the specified @p interface or 0, if not found | 108 | * @returns a pointer to the @ref ONetworkInterface object for the specified @p interface or 0, if not found |
105 | * @see ONetworkInterface | 109 | * @see ONetworkInterface |
106 | */ | 110 | */ |
107 | // FIXME: const QString& is prefered over QString!!! -zecke | 111 | // FIXME: const QString& is prefered over QString!!! -zecke |
108 | ONetworkInterface* interface( const QString& interface ) const; | 112 | ONetworkInterface* interface( const QString& interface ) const; |
113 | /** | ||
114 | * @internal Rebuild the internal interface database | ||
115 | * @note Sometimes it might be useful to call this from client code, | ||
116 | * e.g. after cardctl insert | ||
117 | */ | ||
118 | void synchronize(); | ||
109 | 119 | ||
110 | protected: | 120 | protected: |
111 | ONetwork(); | 121 | ONetwork(); |
112 | void synchronize(); | ||
113 | 122 | ||
114 | private: | 123 | private: |
115 | static ONetwork* _instance; | 124 | static ONetwork* _instance; |
116 | InterfaceMap _interfaces; | 125 | InterfaceMap _interfaces; |
117 | }; | 126 | }; |
118 | 127 | ||
119 | 128 | ||
120 | /*====================================================================================== | 129 | /*====================================================================================== |
121 | * ONetworkInterface | 130 | * ONetworkInterface |
122 | *======================================================================================*/ | 131 | *======================================================================================*/ |
123 | 132 | ||
124 | /** | 133 | /** |
125 | * @brief A network interface wrapper. | 134 | * @brief A network interface wrapper. |
126 | * | 135 | * |
127 | * This class provides a wrapper for a network interface. All the cumbersume details of | 136 | * This class provides a wrapper for a network interface. All the cumbersume details of |
128 | * Linux ioctls are hidden under a convenient high-level interface. | 137 | * Linux ioctls are hidden under a convenient high-level interface. |
@@ -161,56 +170,68 @@ class ONetworkInterface : public QObject | |||
161 | * Setting an interface to promiscuous mode enables the device to receive | 170 | * Setting an interface to promiscuous mode enables the device to receive |
162 | * all packets on the shared medium - as opposed to packets which are addressed to this interface. | 171 | * all packets on the shared medium - as opposed to packets which are addressed to this interface. |
163 | */ | 172 | */ |
164 | bool setPromiscuousMode( bool ); | 173 | bool setPromiscuousMode( bool ); |
165 | /** | 174 | /** |
166 | * @returns true if the interface is set to promiscuous mode. | 175 | * @returns true if the interface is set to promiscuous mode. |
167 | */ | 176 | */ |
168 | bool promiscuousMode() const; | 177 | bool promiscuousMode() const; |
169 | /** | 178 | /** |
170 | * Setting an interface to up enables it to receive packets. | 179 | * Setting an interface to up enables it to receive packets. |
171 | */ | 180 | */ |
172 | bool setUp( bool ); | 181 | bool setUp( bool ); |
173 | /** | 182 | /** |
174 | * @returns true if the interface is up. | 183 | * @returns true if the interface is up. |
175 | */ | 184 | */ |
176 | bool isUp() const; | 185 | bool isUp() const; |
177 | /* | 186 | /** |
178 | * @returns true if the interface is a loopback interface. | 187 | * @returns true if the interface is a loopback interface. |
179 | */ | 188 | */ |
180 | bool isLoopback() const; | 189 | bool isLoopback() const; |
181 | /* | 190 | /** |
182 | * @returns true if the interface is featuring supports the wireless extension protocol. | 191 | * @returns true if the interface is featuring supports the wireless extension protocol. |
183 | */ | 192 | */ |
184 | bool isWireless() const; | 193 | bool isWireless() const; |
185 | /* | 194 | /** |
186 | * @returns the IPv4 address associated with this interface. | 195 | * Associate the IP address @ addr with the interface. |
196 | */ | ||
197 | void setIPV4Address( const QHostAddress& addr ); | ||
198 | /** | ||
199 | * @returns the IPv4 address associated with the interface. | ||
187 | */ | 200 | */ |
188 | QString ipV4Address() const; | 201 | QString ipV4Address() const; |
189 | /* | 202 | /** |
190 | * Associate the MAC address @a addr with the interface. | 203 | * Associate the MAC address @a addr with the interface. |
191 | * @note It can be necessary to shut down the interface prior to calling this method. | 204 | * @note It can be necessary to shut down the interface prior to calling this method. |
192 | * @warning This is not supported by all drivers. | 205 | * @warning This is not supported by all drivers. |
193 | */ | 206 | */ |
194 | void setMacAddress( const OMacAddress& addr ); | 207 | void setMacAddress( const OMacAddress& addr ); |
195 | /* | 208 | /** |
196 | * @returns the MAC address associated with this interface. | 209 | * @returns the MAC address associated with the interface. |
197 | */ | 210 | */ |
198 | OMacAddress macAddress() const; | 211 | OMacAddress macAddress() const; |
199 | /* | 212 | /** |
200 | * @returns the data link type currently associated with this interface. | 213 | * Associate the IPv4 @a netmask with the interface. |
214 | */ | ||
215 | void setIPV4Netmask( const QHostAddress& netmask ); | ||
216 | /** | ||
217 | * @returns the IPv4 netmask associated with the interface. | ||
218 | */ | ||
219 | QString ipV4Netmask() const; | ||
220 | /** | ||
221 | * @returns the data link type currently associated with the interface. | ||
201 | * @see #include <net/if_arp.h> for possible values. | 222 | * @see #include <net/if_arp.h> for possible values. |
202 | */ | 223 | */ |
203 | int dataLinkType() const; | 224 | int dataLinkType() const; |
204 | 225 | ||
205 | protected: | 226 | protected: |
206 | const int _sfd; | 227 | const int _sfd; |
207 | mutable ifreq _ifr; | 228 | mutable ifreq _ifr; |
208 | OMonitoringInterface* _mon; | 229 | OMonitoringInterface* _mon; |
209 | 230 | ||
210 | protected: | 231 | protected: |
211 | struct ifreq& ifr() const; | 232 | struct ifreq& ifr() const; |
212 | virtual void init(); | 233 | virtual void init(); |
213 | bool ioctl( int call ) const; | 234 | bool ioctl( int call ) const; |
214 | bool ioctl( int call, struct ifreq& ) const; | 235 | bool ioctl( int call, struct ifreq& ) const; |
215 | }; | 236 | }; |
216 | 237 | ||