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>.

Reply via email to