Skip to content

Commit

Permalink
MYNEWT-822 newtmgr bll - reconn on spvtmo.
Browse files Browse the repository at this point in the history
The first data packet to be exchanged over a BLE connection has a high
probability of triggering a disconnect. The sending controller uses this
packet to determine if the connection attempt was successful in the
first place, and it does not get retried if it gets dropped.

In the case of newtmgr, the first data packet gets sent during ATT MTU
negotiation. The bhd (blehostd) transports recover from a disconnect
during ATT MTU negotiation by reopening the session.

The ble transports (native BLE) do not recover from such a disconnect.
We should add the same recovery logic for the ble transports that has
already been implemented for bhd.
  • Loading branch information
ccollins476ad committed Aug 4, 2017
1 parent bcff584 commit eb2ca89
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 11 deletions.
36 changes: 30 additions & 6 deletions newtmgr/bll/bll_oic_sesn.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,31 +196,55 @@ func (bls *BllOicSesn) exchangeMtu() error {
return nil
}

func (bls *BllOicSesn) Open() error {
// @return bool Whether to retry the open attempt; false
// on success.
// error The cause of a failed open; nil on success.
func (bls *BllOicSesn) openOnce() (bool, error) {
if bls.IsOpen() {
return nmxutil.NewSesnAlreadyOpenError(
return false, nmxutil.NewSesnAlreadyOpenError(
"Attempt to open an already-open bll session")
}

d, err := omp.NewDispatcher(true, 3)
if err != nil {
return err
return false, err
}
bls.d = d

if err := bls.connect(); err != nil {
return err
return false, err
}

if err := bls.exchangeMtu(); err != nil {
return err
return true, err
}

if err := bls.discoverAll(); err != nil {
return err
return false, err
}

if err := bls.subscribe(); err != nil {
return false, err
}

return false, nil
}

func (bls *BllOicSesn) Open() error {
var err error

for i := 0; i < bls.cfg.ConnTries; i++ {
var retry bool

retry, err = bls.openOnce()
if !retry {
break
}
}

if err != nil {
// Ensure the session is closed.
bls.Close()
return err
}

Expand Down
34 changes: 29 additions & 5 deletions newtmgr/bll/bll_plain_sesn.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,25 +140,49 @@ func (bps *BllPlainSesn) exchangeMtu() error {
return nil
}

func (bps *BllPlainSesn) Open() error {
// @return bool Whether to retry the open attempt; false
// on success.
// error The cause of a failed open; nil on success.
func (bps *BllPlainSesn) openOnce() (bool, error) {
if bps.IsOpen() {
return nmxutil.NewSesnAlreadyOpenError(
return false, nmxutil.NewSesnAlreadyOpenError(
"Attempt to open an already-open bll session")
}

if err := bps.connect(); err != nil {
return err
return false, err
}

if err := bps.exchangeMtu(); err != nil {
return err
return true, err
}

if err := bps.discoverAll(); err != nil {
return err
return false, err
}

if err := bps.subscribe(); err != nil {
return false, err
}

return false, nil
}

func (bps *BllPlainSesn) Open() error {
var err error

for i := 0; i < bps.cfg.ConnTries; i++ {
var retry bool

retry, err = bps.openOnce()
if !retry {
break
}
}

if err != nil {
// Ensure the session is closed.
bps.Close()
return err
}

Expand Down
2 changes: 2 additions & 0 deletions newtmgr/bll/bll_sesn_cfg.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,13 @@ type BllSesnCfg struct {
AdvFilter ble.AdvFilter
PreferredMtu int
ConnTimeout time.Duration
ConnTries int
}

func NewBllSesnCfg() BllSesnCfg {
return BllSesnCfg{
PreferredMtu: 527,
ConnTimeout: 10 * time.Second,
ConnTries: 3,
}
}

0 comments on commit eb2ca89

Please sign in to comment.