You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2017/08/04 21:41:12 UTC
[mynewt-newtmgr] 03/05: MYNEWT-822 newtmgr bll - reconn on spvtmo.
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 <cc...@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" <co...@mynewt.apache.org>.