diff --git a/netdev/netdev.go b/netdev/netdev.go index 01a8bf8..52cf529 100644 --- a/netdev/netdev.go +++ b/netdev/netdev.go @@ -36,6 +36,7 @@ var ( ErrFamilyNotSupported = errors.New("Address family not supported") ErrProtocolNotSupported = errors.New("Socket protocol/type not supported") ErrStartingDHCPClient = errors.New("Error starting DHPC client") + ErrStartingDHCPServer = errors.New("Error starting DHPC server") ErrNoMoreSockets = errors.New("No more sockets") ErrClosingSocket = errors.New("Error closing socket") ErrNotSupported = errors.New("Not supported") diff --git a/rtl8720dn/rtl8720dn.go b/rtl8720dn/rtl8720dn.go index 7e073bf..6493f06 100644 --- a/rtl8720dn/rtl8720dn.go +++ b/rtl8720dn/rtl8720dn.go @@ -32,8 +32,9 @@ var ( ) const ( - O_NONBLOCK = 1 // note: different value than syscall.O_NONBLOCK (0x800) - RTW_MODE_STA = 0x00000001 + O_NONBLOCK = 1 // note: different value than syscall.O_NONBLOCK (0x800) + RTW_MODE_STA = 0x00000001 + defaultChannel = 6 ) type sock int32 @@ -135,6 +136,51 @@ func (r *rtl8720dn) connectToAP() error { return r.startDhcpc() } +func (r *rtl8720dn) startDhcps() error { + if result := r.rpc_tcpip_adapter_dhcps_start(0); result == -1 { + return netdev.ErrStartingDHCPServer + } + return nil +} + +func (r *rtl8720dn) startAP() error { + if len(r.params.Ssid) == 0 { + return netlink.ErrMissingSSID + } + + if len(r.params.Passphrase) != 0 && len(r.params.Passphrase) < 8 { + return netlink.ErrShortPassphrase + } + + if debugging(debugBasic) { + fmt.Printf("Starting Wifi AP as SSID '%s'...", r.params.Ssid) + } + + // Start the connection process + securityType := uint32(0) // RTW_SECURITY_OPEN + if len(r.params.Passphrase) != 0 { + securityType = 0x00400004 // RTW_SECURITY_WPA2_AES_PSK + } + + result := r.rpc_wifi_start_ap(r.params.Ssid, r.params.Passphrase, securityType, defaultChannel) + if result != 0 { + if debugging(debugBasic) { + fmt.Printf("FAILED\r\n") + } + return netlink.ErrConnectFailed + } + + if debugging(debugBasic) { + fmt.Printf("LISTENING\r\n") + } + + if r.notifyCb != nil { + r.notifyCb(netlink.EventNetUp) + } + + return r.startDhcps() +} + func (r *rtl8720dn) showDriver() { if r.driverShown { return @@ -246,14 +292,27 @@ func (r *rtl8720dn) netConnect(reset bool) error { } r.showDevice() +retry: for i := 0; r.params.Retries == 0 || i < r.params.Retries; i++ { - if err := r.connectToAP(); err != nil { - if err == netlink.ErrConnectFailed { - continue + switch r.params.ConnectMode { + case netlink.ConnectModeAP: + if err := r.startAP(); err != nil { + if err == netlink.ErrConnectFailed { + continue + } + return err } - return err + break retry + + default: + if err := r.connectToAP(); err != nil { + if err == netlink.ErrConnectFailed { + continue + } + return err + } + break retry } - break } if r.networkDown() {