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/05/11 00:34:20 UTC

[2/2] incubator-mynewt-newtmgr git commit: nmxact - reset ctlr on ble_xport shutdown.

nmxact - reset ctlr on ble_xport shutdown.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/commit/8c186383
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/tree/8c186383
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/diff/8c186383

Branch: refs/heads/master
Commit: 8c1863838b37abdc80d01fc09c294b453619c6a6
Parents: 97e9dfb
Author: Christopher Collins <cc...@apache.org>
Authored: Wed May 10 17:33:50 2017 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed May 10 17:33:50 2017 -0700

----------------------------------------------------------------------
 nmxact/nmble/ble_act.go   | 32 ++++++++++++++++++++++++++++++++
 nmxact/nmble/ble_proto.go | 16 ++++++++++++++++
 nmxact/nmble/ble_util.go  | 27 +++++++++++++++++++++++++++
 nmxact/nmble/ble_xport.go |  7 ++++++-
 nmxact/nmble/dispatch.go  |  2 ++
 nmxact/nmxutil/nmxutil.go | 10 ++++++++++
 6 files changed, 93 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/8c186383/nmxact/nmble/ble_act.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_act.go b/nmxact/nmble/ble_act.go
index ad3a648..4c5eef0 100644
--- a/nmxact/nmble/ble_act.go
+++ b/nmxact/nmble/ble_act.go
@@ -411,6 +411,38 @@ func connFind(x *BleXport, bl *BleListener, r *BleConnFindReq) (
 	}
 }
 
+// Tells the host to reset the controller.
+func reset(x *BleXport, bl *BleListener,
+	r *BleResetReq) error {
+
+	const rspType = MSG_TYPE_RESET
+
+	j, err := json.Marshal(r)
+	if err != nil {
+		return err
+	}
+
+	x.txNoSync(j)
+	for {
+		select {
+		case err := <-bl.ErrChan:
+			return err
+
+		case bm := <-bl.BleChan:
+			switch bm.(type) {
+			case *BleResetRsp:
+				bl.Acked = true
+				return nil
+
+			default:
+			}
+
+		case <-bl.AfterTimeout(x.RspTimeout()):
+			return BhdTimeoutError(rspType, r.Seq)
+		}
+	}
+}
+
 // Asks the controller to generate a random address.  This is done when the
 // transport is starting up, and therefore does not require the transport to be
 // synced.  Only the transport should call this function.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/8c186383/nmxact/nmble/ble_proto.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_proto.go b/nmxact/nmble/ble_proto.go
index d2976d0..0bb4d01 100644
--- a/nmxact/nmble/ble_proto.go
+++ b/nmxact/nmble/ble_proto.go
@@ -233,6 +233,7 @@ const (
 	MSG_TYPE_SET_PREFERRED_MTU         = 17
 	MSG_TYPE_SECURITY_INITIATE         = 18
 	MSG_TYPE_CONN_FIND                 = 19
+	MSG_TYPE_RESET                     = 20
 
 	MSG_TYPE_SYNC_EVT       = 2049
 	MSG_TYPE_CONNECT_EVT    = 2050
@@ -270,6 +271,7 @@ var MsgTypeStringMap = map[MsgType]string{
 	MSG_TYPE_SCAN_CANCEL:       "scan_cancel",
 	MSG_TYPE_SET_PREFERRED_MTU: "set_preferred_mtu",
 	MSG_TYPE_CONN_FIND:         "conn_find",
+	MSG_TYPE_RESET:             "reset",
 
 	MSG_TYPE_SYNC_EVT:       "sync_evt",
 	MSG_TYPE_CONNECT_EVT:    "connect_evt",
@@ -770,6 +772,20 @@ type BleConnFindRsp struct {
 	PeerOtaAddr     BleAddr     `json:"peer_ota_addr"`
 }
 
+type BleResetReq struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+}
+
+type BleResetRsp struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+}
+
 func ErrCodeToString(e int) string {
 	var s string
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/8c186383/nmxact/nmble/ble_util.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_util.go b/nmxact/nmble/ble_util.go
index cc9409b..13a2b8c 100644
--- a/nmxact/nmble/ble_util.go
+++ b/nmxact/nmble/ble_util.go
@@ -243,6 +243,14 @@ func NewBleConnFindReq() *BleConnFindReq {
 	}
 }
 
+func NewResetReq() *BleResetReq {
+	return &BleResetReq{
+		Op:   MSG_OP_REQ,
+		Type: MSG_TYPE_RESET,
+		Seq:  NextSeq(),
+	}
+}
+
 func ConnFindXact(x *BleXport, connHandle uint16) (BleConnDesc, error) {
 	r := NewBleConnFindReq()
 	r.ConnHandle = connHandle
@@ -320,3 +328,22 @@ func SetPreferredMtuXact(x *BleXport, mtu uint16) error {
 
 	return setPreferredMtu(x, bl, r)
 }
+
+func ResetXact(x *BleXport) error {
+	r := NewResetReq()
+
+	base := BleMsgBase{
+		Op:         -1,
+		Type:       -1,
+		Seq:        r.Seq,
+		ConnHandle: -1,
+	}
+
+	bl := NewBleListener()
+	if err := x.Bd.AddListener(base, bl); err != nil {
+		return err
+	}
+	defer x.Bd.RemoveListener(base)
+
+	return reset(x, bl, r)
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/8c186383/nmxact/nmble/ble_xport.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_xport.go b/nmxact/nmble/ble_xport.go
index e7a495f..091b607 100644
--- a/nmxact/nmble/ble_xport.go
+++ b/nmxact/nmble/ble_xport.go
@@ -322,7 +322,12 @@ func (bx *BleXport) setStateFrom(from BleXportState, to BleXportState) bool {
 }
 
 func (bx *BleXport) Stop() error {
-	// XXX: Reset controller to terminate all connections.
+	synced, err := bx.querySyncStatus()
+	if err == nil && synced {
+		// Reset controller so that all outstanding connections terminate.
+		ResetXact(bx)
+	}
+
 	bx.shutdown(false, nmxutil.NewXportError("xport stopped"))
 	return nil
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/8c186383/nmxact/nmble/dispatch.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/dispatch.go b/nmxact/nmble/dispatch.go
index 83f1f0f..c9f17ec 100644
--- a/nmxact/nmble/dispatch.go
+++ b/nmxact/nmble/dispatch.go
@@ -100,6 +100,7 @@ func scanRspCtor() BleMsg            { return &BleScanRsp{} }
 func scanCancelRspCtor() BleMsg      { return &BleScanCancelRsp{} }
 func setPreferredMtuRspCtor() BleMsg { return &BleSetPreferredMtuRsp{} }
 func connFindRspCtor() BleMsg        { return &BleConnFindRsp{} }
+func resetRspCtor() BleMsg           { return &BleResetRsp{} }
 
 func syncEvtCtor() BleMsg       { return &BleSyncEvt{} }
 func connectEvtCtor() BleMsg    { return &BleConnectEvt{} }
@@ -128,6 +129,7 @@ var msgCtorMap = map[OpTypePair]msgCtor{
 	{MSG_OP_RSP, MSG_TYPE_SCAN_CANCEL}:       scanCancelRspCtor,
 	{MSG_OP_RSP, MSG_TYPE_SET_PREFERRED_MTU}: setPreferredMtuRspCtor,
 	{MSG_OP_RSP, MSG_TYPE_CONN_FIND}:         connFindRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_RESET}:             resetRspCtor,
 
 	{MSG_OP_EVT, MSG_TYPE_SYNC_EVT}:       syncEvtCtor,
 	{MSG_OP_EVT, MSG_TYPE_CONNECT_EVT}:    connectEvtCtor,

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/8c186383/nmxact/nmxutil/nmxutil.go
----------------------------------------------------------------------
diff --git a/nmxact/nmxutil/nmxutil.go b/nmxact/nmxutil/nmxutil.go
index 707b1bc..75ce988 100644
--- a/nmxact/nmxutil/nmxutil.go
+++ b/nmxact/nmxutil/nmxutil.go
@@ -173,6 +173,16 @@ func (f *ErrFunnel) Reset() {
 	}
 }
 
+func (f *ErrFunnel) BlockUntilExp() {
+	f.mtx.Lock()
+	defer f.mtx.Unlock()
+
+	if f.started {
+		f.resetMtx.Lock()
+		f.resetMtx.Unlock()
+	}
+}
+
 func (f *ErrFunnel) timerExp() {
 	f.mtx.Lock()
 	err := f.curErr