This is an automated email from the ASF dual-hosted git repository. ccollins pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-newtmgr.git
commit fe7c1e34a0c4362f621d7e1b835d82ef21611039 Author: Christopher Collins <ccoll...@apache.org> AuthorDate: Mon Jul 31 13:06:39 2017 -0700 MYNEWT-822 newtmgr bll - reconn on spvtmo. 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. --- newtmgr/bll/bll_oic_sesn.go | 36 ++++++++++++++++++++++++++++++------ newtmgr/bll/bll_plain_sesn.go | 34 +++++++++++++++++++++++++++++----- newtmgr/bll/bll_sesn_cfg.go | 2 ++ 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/newtmgr/bll/bll_oic_sesn.go b/newtmgr/bll/bll_oic_sesn.go index 242d6f3..34c6986 100644 --- a/newtmgr/bll/bll_oic_sesn.go +++ b/newtmgr/bll/bll_oic_sesn.go @@ -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 } diff --git a/newtmgr/bll/bll_plain_sesn.go b/newtmgr/bll/bll_plain_sesn.go index 8fa064d..89f4127 100644 --- a/newtmgr/bll/bll_plain_sesn.go +++ b/newtmgr/bll/bll_plain_sesn.go @@ -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 } diff --git a/newtmgr/bll/bll_sesn_cfg.go b/newtmgr/bll/bll_sesn_cfg.go index a011439..bdae89f 100644 --- a/newtmgr/bll/bll_sesn_cfg.go +++ b/newtmgr/bll/bll_sesn_cfg.go @@ -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, } } -- To stop receiving notification emails like this one, please contact "commits@mynewt.apache.org" <commits@mynewt.apache.org>.