|
32 | 32 | )
|
33 | 33 |
|
34 | 34 | const (
|
35 |
| - O_NONBLOCK = 1 // note: different value than syscall.O_NONBLOCK (0x800) |
36 |
| - RTW_MODE_STA = 0x00000001 |
| 35 | + O_NONBLOCK = 1 // note: different value than syscall.O_NONBLOCK (0x800) |
| 36 | + RTW_MODE_STA = 0x00000001 |
| 37 | + defaultChannel = 6 |
37 | 38 | )
|
38 | 39 |
|
39 | 40 | type sock int32
|
@@ -135,6 +136,51 @@ func (r *rtl8720dn) connectToAP() error {
|
135 | 136 | return r.startDhcpc()
|
136 | 137 | }
|
137 | 138 |
|
| 139 | +func (r *rtl8720dn) startDhcps() error { |
| 140 | + if result := r.rpc_tcpip_adapter_dhcps_start(0); result == -1 { |
| 141 | + return netdev.ErrStartingDHCPServer |
| 142 | + } |
| 143 | + return nil |
| 144 | +} |
| 145 | + |
| 146 | +func (r *rtl8720dn) startAP() error { |
| 147 | + if len(r.params.Ssid) == 0 { |
| 148 | + return netlink.ErrMissingSSID |
| 149 | + } |
| 150 | + |
| 151 | + if len(r.params.Passphrase) != 0 && len(r.params.Passphrase) < 8 { |
| 152 | + return netlink.ErrShortPassphrase |
| 153 | + } |
| 154 | + |
| 155 | + if debugging(debugBasic) { |
| 156 | + fmt.Printf("Starting Wifi AP as SSID '%s'...", r.params.Ssid) |
| 157 | + } |
| 158 | + |
| 159 | + // Start the connection process |
| 160 | + securityType := uint32(0) // RTW_SECURITY_OPEN |
| 161 | + if len(r.params.Passphrase) != 0 { |
| 162 | + securityType = 0x00400004 // RTW_SECURITY_WPA2_AES_PSK |
| 163 | + } |
| 164 | + |
| 165 | + result := r.rpc_wifi_start_ap(r.params.Ssid, r.params.Passphrase, securityType, defaultChannel) |
| 166 | + if result != 0 { |
| 167 | + if debugging(debugBasic) { |
| 168 | + fmt.Printf("FAILED\r\n") |
| 169 | + } |
| 170 | + return netlink.ErrConnectFailed |
| 171 | + } |
| 172 | + |
| 173 | + if debugging(debugBasic) { |
| 174 | + fmt.Printf("LISTENING\r\n") |
| 175 | + } |
| 176 | + |
| 177 | + if r.notifyCb != nil { |
| 178 | + r.notifyCb(netlink.EventNetUp) |
| 179 | + } |
| 180 | + |
| 181 | + return r.startDhcps() |
| 182 | +} |
| 183 | + |
138 | 184 | func (r *rtl8720dn) showDriver() {
|
139 | 185 | if r.driverShown {
|
140 | 186 | return
|
@@ -246,14 +292,27 @@ func (r *rtl8720dn) netConnect(reset bool) error {
|
246 | 292 | }
|
247 | 293 | r.showDevice()
|
248 | 294 |
|
| 295 | +retry: |
249 | 296 | for i := 0; r.params.Retries == 0 || i < r.params.Retries; i++ {
|
250 |
| - if err := r.connectToAP(); err != nil { |
251 |
| - if err == netlink.ErrConnectFailed { |
252 |
| - continue |
| 297 | + switch r.params.ConnectMode { |
| 298 | + case netlink.ConnectModeAP: |
| 299 | + if err := r.startAP(); err != nil { |
| 300 | + if err == netlink.ErrConnectFailed { |
| 301 | + continue |
| 302 | + } |
| 303 | + return err |
253 | 304 | }
|
254 |
| - return err |
| 305 | + break retry |
| 306 | + |
| 307 | + default: |
| 308 | + if err := r.connectToAP(); err != nil { |
| 309 | + if err == netlink.ErrConnectFailed { |
| 310 | + continue |
| 311 | + } |
| 312 | + return err |
| 313 | + } |
| 314 | + break retry |
255 | 315 | }
|
256 |
| - break |
257 | 316 | }
|
258 | 317 |
|
259 | 318 | if r.networkDown() {
|
|
0 commit comments