Bluetooth: NAP working, mustn't disable SSP

This commit is contained in:
MaMe82 2018-09-26 15:15:47 +02:00
parent 4edac190bf
commit 199a7ab54a
6 changed files with 63 additions and 89 deletions

View File

@ -18,19 +18,9 @@ import (
func main() {
err := service.InitGlobalServiceState()
if err != nil { panic(err) }
state := service.ServiceState
state.StartService()
//ToDo: Check for root privs
//service.NewLed(false) //Set LED to manual trigger
//service.InitDefaultLEDSettings()
/*
log.Printf("Keyboard devFile: %s\n", service.HidDevPath[service.USB_FUNCTION_HID_KEYBOARD_name])
log.Printf("Mouse devFile: %s\n", service.HidDevPath[service.USB_FUNCTION_HID_MOUSE_name])
@ -38,13 +28,6 @@ func main() {
*/
// ToDo: The webroot has to be changed to /usr/local/P4wnP1/www
//service.StartRpcServerAndWeb("0.0.0.0", "50051", "8000", "/usr/local/P4wnP1/www") //start gRPC service
/*
//Indicate servers up with LED blink count 1
state.Led.SetLed(&pb.LEDSettings{1})
*/
@ -55,15 +38,7 @@ func main() {
svc.Start()
/*
//service.StartEventManager(20)
// log.SetOutput(state.EvMgr)
go func() {
err := common.RunBashScript("/usr/local/P4wnP1/scripts/servicestart.sh")
if err != nil { log.Printf("Error executing service startup script: %v\n", err) }
}()
*/
// ToDo: Remove this (testing only)
//Send some log messages for testing
textfill := "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea"
i := 0
@ -83,6 +58,6 @@ func main() {
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
s := <-sig
log.Printf("Signal (%v) received, ending P4wnP1_service ...\n", s)
state.StopService()
svc.Stop()
return
}

View File

@ -13,28 +13,30 @@ import (
)
const (
BT_MINIMUM_BLUEZ_VERSION_MAJOR = 5
BT_MINIMUM_BLUEZ_VERSION_MINOR = 43
BT_MINIMUM_BLUEZ_VERSION_MAJOR = 5
BT_MINIMUM_BLUEZ_VERSION_MINOR = 43
)
type BtService struct {
RootSvc *Service
ServiceAvailable bool
Controller *bluetooth.Controller
BrName string
bridgeIfDeployed bool
Agent *bluetooth.DefaultAgent
Agent *bluetooth.DefaultAgent
}
func NewBtService() (res *BtService) {
func NewBtService(rootService *Service) (res *BtService) {
res = &BtService{
Agent: bluetooth.NewDefaultAgent("4321"),
BrName: BT_ETHERNET_BRIDGE_NAME,
RootSvc: rootService,
Agent: bluetooth.NewDefaultAgent("4321"),
BrName: BT_ETHERNET_BRIDGE_NAME,
}
// ToDo Check if bluetooth service is loaded
if c,err := bluetooth.FindFirstAvailableController(); err == nil {
if c, err := bluetooth.FindFirstAvailableController(); err == nil {
res.ServiceAvailable = true
res.Controller = c
} else {
@ -52,7 +54,8 @@ func NewBtService() (res *BtService) {
// ToDo: Move all controller specific tasks to controller
func (bt *BtService) StartNAP() (err error) {
if !bt.ServiceAvailable { return bluetooth.ErrBtSvcNotAvailable
if !bt.ServiceAvailable {
return bluetooth.ErrBtSvcNotAvailable
}
log.Println("Bluetooth: starting NAP...")
// assure bnep module is loaded
@ -72,33 +75,51 @@ func (bt *BtService) StartNAP() (err error) {
// Disable simple secure pairing to make PIN requests work
bt.Controller.SetPowered(false)
bt.Controller.SetSSP(false)
bt.Controller.SetSSP(true) //NAP doesn't work well without SSP
bt.Controller.SetPowered(true)
// Configure adapter
fmt.Println("Reconfigure adapter to be discoverable and pairable")
err = bt.Controller.SetAlias("P4wnP1")
if err != nil { return }
if err != nil {
return
}
err = bt.Controller.SetDiscoverableTimeout(0)
if err != nil { return }
if err != nil {
return
}
err = bt.Controller.SetPairableTimeout(0)
if err != nil { return }
if err != nil {
return
}
err = bt.Controller.SetDiscoverable(true)
if err != nil { return }
if err != nil {
return
}
err = bt.Controller.SetPairable(true)
// Enable PAN networking for bridge
nw,err := toolz.NetworkServer(bt.Controller.DBusPath)
if err != nil { return }
nw, err := toolz.NetworkServer(bt.Controller.DBusPath)
if err != nil {
return
}
//defer nw.Close()
err = nw.Register(toolz.UUID_NETWORK_SERVER_NAP, BT_ETHERNET_BRIDGE_NAME)
if err != nil { return }
if err != nil {
return
}
if mi, err := bt.RootSvc.SubSysNetwork.GetManagedInterface(BT_ETHERNET_BRIDGE_NAME); err == nil {
mi.ReDeploy()
}
return
}
func (bt *BtService) StopNAP() (err error) {
if !bt.ServiceAvailable { return bluetooth.ErrBtSvcNotAvailable }
if !bt.ServiceAvailable {
return bluetooth.ErrBtSvcNotAvailable
}
log.Println("Bluetooth: stopping NAP...")
//Stop bt-agent
@ -108,7 +129,7 @@ func (bt *BtService) StopNAP() (err error) {
bt.DisableBridge()
// Unregister pan service
nw,err := toolz.NetworkServer(bt.Controller.DBusPath)
nw, err := toolz.NetworkServer(bt.Controller.DBusPath)
//if err != nil { return }
defer nw.Close()
err = nw.Unregister("pan")
@ -135,7 +156,12 @@ func (bt *BtService) EnableBridge() (err error) {
return err
}
// SetBridgeSTP(BT_ETHERNET_BRIDGE_NAME, true) //enable spanning tree
SetBridgeForwardDelay(BT_ETHERNET_BRIDGE_NAME, 0)
err = SetBridgeForwardDelay(BT_ETHERNET_BRIDGE_NAME, 0)
if err != nil {
return err
}
err = SetBridgeSTP(BT_ETHERNET_BRIDGE_NAME, false)
if err != nil {
return err
}

View File

@ -24,7 +24,7 @@ func (a *DefaultAgent) Release() *dbus.Error {
}
func (a *DefaultAgent) RequestPinCode(device dbus.ObjectPath) (pincode string, err *dbus.Error) {
fmt.Println("DefaultAgent request pincode called, returning string '12345'")
fmt.Printf("DefaultAgent request pincode called, returning string '%s'\n", a.pincode)
// Called when SSP is off and currentCap != CAP_NO_INPUT_NO_OUTPUT, we could use a pre-generated PIN
// and the remote device has to enter the same one
return a.pincode, nil
@ -61,8 +61,8 @@ func (a *DefaultAgent) RequestConfirmation(device dbus.ObjectPath, passkey uint3
func (a *DefaultAgent) RequestAuthorization(device dbus.ObjectPath) *dbus.Error {
fmt.Println("DefaultAgent request authorization called")
fmt.Println("... rejecting")
return toolz.ErrRejected
fmt.Println("... accepting")
return nil
}
func (a *DefaultAgent) AuthorizeService(device dbus.ObjectPath, uuid string) *dbus.Error {

View File

@ -20,7 +20,7 @@ func GetDefaultNetworkSettingsBluetooth() (*pb.EthernetInterfaceSettings) {
ifSettings := &pb.EthernetInterfaceSettings{
Name: BT_ETHERNET_BRIDGE_NAME,
Enabled: true,
Mode: pb.EthernetInterfaceSettings_MANUAL,
Mode: pb.EthernetInterfaceSettings_DHCP_SERVER,
IpAddress4: "172.26.0.1",
Netmask4: "255.255.255.0",
DhcpServerSettings: GetDefaultDHCPConfigBluetooth(),

View File

@ -101,8 +101,8 @@ func RegisterDefaultTriggerActions(tam *TriggerActionManager) {
type Service struct {
SubSysDataStore *datastore.Store // very first service
SubSysState interface{}
SubSysLogging interface{}
// SubSysState interface{}
// SubSysLogging interface{}
SubSysNetwork *NetworkManager
SubSysEvent *EventManager
@ -126,12 +126,12 @@ func NewService() (svc *Service, err error) {
svc.SubSysNetwork, err = NewNetworkManager()
if err != nil { return nil,err}
svc.SubSysUSB,err = NewUSBGadgetManager(svc) //Depends on NetworkSubSys, EvenSubSys
if err == ErrUsbNotUsable { err = nil } //ToDo: delete this
// if err == ErrUsbNotUsable { err = nil } //ToDo: delete this
if err != nil { return nil,err}
svc.SubSysWifi = NewWifiService(svc) //Depends on NetworkSubSys
svc.SubSysBluetooth = NewBtService(svc) //Depends on NetworkSubSys
svc.SubSysRPC = NewRpcServerService(svc) //Depends on all other
@ -147,6 +147,10 @@ func (s *Service) Start() {
// Register TriggerActions
RegisterDefaultTriggerActions(s.SubSysTriggerActions)
// ToDo: Manual start of BT NAP, has to be replaced by settings based approach (same as other subsystems)
s.SubSysBluetooth.StartNAP()
// fire service started Event
s.SubSysEvent.Emit(ConstructEventTrigger(common_web.EVT_TRIGGER_TYPE_SERVICE_STARTED))
}
@ -155,5 +159,7 @@ func (s *Service) Stop() {
s.SubSysTriggerActions.Stop()
s.SubSysLed.Stop()
s.SubSysBluetooth.StopNAP()
s.SubSysEvent.Stop()
}

View File

@ -1,33 +0,0 @@
// +build linux
package service
var ServiceState *GlobalServiceState
type GlobalServiceState struct {
BtSvc *BtService
}
func InitGlobalServiceState() (err error) {
state := &GlobalServiceState{}
ServiceState = state // store state in global variable
// state.EvMgr = NewEventManager(20)
state.BtSvc = NewBtService()
return nil
}
func (state *GlobalServiceState) StartService() {
// state.EvMgr.Start()
// ToDo: Remove this, till the service is able to deploy startup settings
state.BtSvc.StartNAP()
}
func (state *GlobalServiceState) StopService() {
// state.EvMgr.Stop()
}