1 #ifndef LIBNUTWIRELESS_BASE
2 #define LIBNUTWIRELESS_BASE
3 #include <QHostAddress>
5 #include <QSocketNotifier>
7 #include <QCoreApplication>
8 #include "libnutcommon/common.h"
13 #include <linux/wireless.h>
14 #include "wpa_ctrl/wpa_ctrl.h"
20 #define CWPA_SCAN_TIMER_TIME 1000
21 #define CWPA_SCAN_RETRY_TIMER_TIME 1000
23 namespace libnutwireless
{
25 /** @brief The base class contains all timer/lowlevel io dependant functions
27 This class provides all functions that need timers, socket notifiers etc.
28 It is not used directly.
30 class CWpaSupplicantBase
: public QObject
, public CWpaSupplicantParsers
{
33 struct wpa_ctrl
*cmd_ctrl
, *event_ctrl
;
34 QString m_wpaSupplicantPath
;
35 int m_wpaFd
, m_wextFd
;
36 QSocketNotifier
*m_eventSn
;
39 int m_connectTimerId
; ///Timer id for connection timer
44 bool m_inConnectionPhase
;
46 QList
<ScanResult
> m_wpaScanResults
;
47 WextSignal m_signalQuality
;
48 int m_scanTimeoutCount
;
49 int m_wextPollTimeoutCount
;
50 QList
<quint32
> m_supportedFrequencies
;
52 //Workaround as Constructor of subclass is not beeing called
57 QString
wpaCtrlCommand(QString cmd
);
58 //Abstracted Commands:
59 inline QString
wpaCtrlCmd_PING() { return wpaCtrlCommand("PING"); }
60 inline QString
wpaCtrlCmd_MIB() { return wpaCtrlCommand("MIB"); }
61 inline QString
wpaCtrlCmd_STATUS(bool verbose
=false) { return (verbose
) ? wpaCtrlCommand("STATUS-VERBOSE") : wpaCtrlCommand("STATUS"); }
62 inline QString
wpaCtrlCmd_PMKSA() { return wpaCtrlCommand("PMKSA"); }
63 inline void wpaCtrlCmd_SET(QString var
, QString val
) { wpaCtrlCommand(QString("SET %1 %2").arg(var
,val
)); }
64 inline void wpaCtrlCmd_LOGON() { wpaCtrlCommand("LOGON"); }
65 inline void wpaCtrlCmd_LOGOFF() { wpaCtrlCommand("LOGOFF"); }
66 inline void wpaCtrlCmd_REASSOCIATE() { wpaCtrlCommand("REASSOCIATE"); }
67 //Start pre-authentication with the given BSSID.
68 inline void wpaCtrlCmd_PREAUTH(QString bssid
) { wpaCtrlCommand(QString("PREAUTH %1").arg(bssid
)); }
69 inline void wpaCtrlCmd_LEVEL(int level
) { wpaCtrlCommand(QString("LEVEL %1").arg(QString::number(level
))); }
70 inline void wpaCtrlCmd_RECONFIGURE() { wpaCtrlCommand("RECONFIGURE"); };
71 inline void wpaCtrlCmd_TERMINATE() { wpaCtrlCommand("TERMINATE"); }
72 //Set preferred BSSID for a network. Network id can be received from the LIST_NETWORKS command output.
73 inline QString
wpaCtrlCmd_BSSID(int id
, QString bssid
) { return wpaCtrlCommand(QString("BSSID %1 %2").arg(QString::number(id
),bssid
));}
74 inline QString
wpaCtrlCmd_LIST_NETWORKS() { return wpaCtrlCommand("LIST_NETWORKS"); }
75 inline void wpaCtrlCmd_DISCONNECT() { wpaCtrlCommand("DISCONNECT"); }
76 inline QString
wpaCtrlCmd_SCAN() { return wpaCtrlCommand("SCAN"); }
77 inline QString
wpaCtrlCmd_SCAN_RESULTS() { return wpaCtrlCommand("SCAN_RESULTS"); }
78 inline QString
wpaCtrlCmd_SELECT_NETWORK(int id
) { return wpaCtrlCommand(QString("SELECT_NETWORK %1").arg(QString::number(id
))); }
79 inline QString
wpaCtrlCmd_ENABLE_NETWORK(int id
) { return wpaCtrlCommand(QString("ENABLE_NETWORK %1").arg(QString::number(id
))); }
80 inline QString
wpaCtrlCmd_DISABLE_NETWORK(int id
) { return wpaCtrlCommand(QString("DISABLE_NETWORK %1").arg(QString::number(id
))); }
81 //creates new empty network, return id on success and FAIL on failure
82 inline QString
wpaCtrlCmd_ADD_NETWORK() { return wpaCtrlCommand("ADD_NETWORK"); }
83 inline void wpaCtrlCmd_REMOVE_NETWORK(int id
) { wpaCtrlCommand(QString("REMOVE_NETWORK %1").arg(QString::number(id
))); }
84 inline QString
wpaCtrlCmd_SET_NETWORK(int id
, QString var
, QString val
) { return wpaCtrlCommand(QString("SET_NETWORK %1 %2 %3").arg(QString::number(id
),var
,val
));}
85 //get network variable
86 inline QString
wpaCtrlCmd_GET_NETWORK(int id
, QString var
) { return wpaCtrlCommand(QString("GET_NETWORK %1 %2").arg(QString::number(id
), var
)); }
87 inline QString
wpaCtrlCmd_SAVE_CONFIG() { return wpaCtrlCommand("SAVE_CONFIG"); }
88 inline void wpaCtrlCmd_CTRL_RSP(QString field_name
, int id
, QString val
) { wpaCtrlCommand(QString("CTRL-RSP-%1-%2-%3").arg(field_name
,QString::number(id
), val
)); }
89 inline QString
wpaCtrlCmd_GET_CAPABILITY(QString option
, bool strict
) { return (strict
) ? wpaCtrlCommand(QString("GET_CAPABILITY %1 strict").arg(option
)) : wpaCtrlCommand(QString("GET_CAPABILITY %1").arg(option
));}
90 //Change ap_scan value: 0 = no scanning,
91 //1 = wpa_supplicant requests scans and uses scan results to select the AP
92 //2 = wpa_supplicant does not use scanning and just requests driver to associate and take care of AP selection
93 inline QString
wpaCtrlCmd_AP_SCAN(int val
) { return wpaCtrlCommand(QString("AP_SCAN %1").arg(QString::number(val
))); }
94 inline QString
wpaCtrlCmd_INTERFACES() { return wpaCtrlCommand("INTERFACES"); }
96 //Event helper functions:
97 void eventDispatcher(Request req
);
98 void eventDispatcher(EventType event
, QString str
);
99 /** This function is called by readFromWpa
100 when new information is available from wpa_supplicant
102 void eventDispatcher(QString event
);
104 //Functions to get actual signal strength and/or signal strength for scan results:
105 //And set scanresults
106 void setScanResults(QList
<WextRawScan
> wextScanResults
);
107 void tryScanResults();
109 //Need to do it that way, as inline fails otherwise
110 inline void printMessage(QString msg
) { if (m_logEnabled
) emit(message(msg
));}
112 /** Open connection to wpa_supplicant */
113 void openWpa(bool time_call
);
114 /** close the connection to the wpa_supplicant */
115 bool closeWpa(QString call_func
, bool internal
=true);
116 /**Dynamically adjust the time between two timer events for polling the wpa_supplicant interface on connection try*/
117 int dynamicTimerTime(int m_timerCount
);
120 void readFromWpa(int socket
);
123 /**Function to dispatch the timer events */
124 void timerEvent(QTimerEvent
*event
);
127 virtual void setApScanDefault()=0;
130 CWpaSupplicantBase(QObject
* parent
, QString m_ifname
);
131 ~CWpaSupplicantBase();
132 /** open connection to wpa_supplicant */
133 inline void open() { openWpa(false); }
134 /** close connection to wpa_supplicant */
135 inline bool close() {return closeWpa("libnutclient",false); }
137 /** This function reads the signal quality from wireless extension.
138 On success signalQualityUpdated(libnutwireless::WextSignal signal) will be emitted.
140 void readWirelessInfo();
143 void setLog(bool enabled
);
145 /** Initiate a scan; See scanCompleted() */
148 void setSignalQualityPollRate(int msec
);
149 int getSignalQualityPollRate();
150 WextSignal
getSignalQuality();
152 QList
<ScanResult
> scanResults();
155 /** Signal which is emitted if wpa_supplicant connects or disconnects
157 @param state connection state of network
160 void connectionStateChanged(bool state
, int id
);
161 /** Signal which is emitted if wpa_supplicant requests a action.
162 Respond with CWpaSupplicant::response();
164 void request(libnutwireless::Request req
);
165 /** This signal is emitted if the connection to wpa_supplicant is
166 established: state=true or
169 void stateChanged(bool state
);
170 /** This signal is emitted whenever a scan is ready.
171 So far this happens twice:
172 First the scanresults from wpa_supplicant are set imediately.
173 Then we're trying to retrieve further information via wirelessExtension.
175 void scanCompleted();
176 /** Emits messages from wpa_supplicant like rekying */
177 void message(QString msg
);
178 void eventMessage(libnutwireless::EventType type
);
179 void signalQualityUpdated(libnutwireless::WextSignal signal
);
180 /** This signal is emitted whenever the network list from listNetworks() has changed. */
181 void networkListUpdated();