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/04/06 02:27:57 UTC

[52/54] incubator-mynewt-newtmgr git commit: nmxact - Perform controller setup (addr, mtu)

nmxact - Perform controller setup (addr,mtu)

Prior to this change, nmxact assumed a random address was already
configured and the preferred ATT MTU was already set.  This assumption
was valid because blehostd was hacked to do this upon host-controller
sync.


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/06c80b76
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/tree/06c80b76
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/diff/06c80b76

Branch: refs/heads/master
Commit: 06c80b760a69d3628d3bd98706bfad22b22a0f65
Parents: 9975ef7
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Apr 5 15:16:44 2017 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Wed Apr 5 16:04:26 2017 -0700

----------------------------------------------------------------------
 nmxact/nmble/ble_act.go   | 110 +++++++++++++++++++++++++++++++++++++
 nmxact/nmble/ble_proto.go | 121 +++++++++++++++++++++++++++++++----------
 nmxact/nmble/ble_util.go  |  24 ++++++++
 nmxact/nmble/ble_xport.go | 114 ++++++++++++++++++++++++++++++++++++--
 nmxact/nmble/dispatch.go  |  54 ++++++++++--------
 5 files changed, 365 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/06c80b76/nmxact/nmble/ble_act.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_act.go b/nmxact/nmble/ble_act.go
index cb6cb00..ff6dff9 100644
--- a/nmxact/nmble/ble_act.go
+++ b/nmxact/nmble/ble_act.go
@@ -3,6 +3,7 @@ package nmble
 import (
 	"encoding/json"
 
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
 	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
 )
 
@@ -361,3 +362,112 @@ func scanCancel(x *BleXport, bl *BleListener, r *BleScanCancelReq) error {
 		}
 	}
 }
+
+// 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.
+func genRandAddr(x *BleXport, bl *BleListener, r *BleGenRandAddrReq) (
+	BleAddr, error) {
+
+	j, err := json.Marshal(r)
+	if err != nil {
+		return BleAddr{}, err
+	}
+
+	x.txNoSync(j)
+	for {
+		select {
+		case err := <-bl.ErrChan:
+			return BleAddr{}, err
+
+		case bm := <-bl.BleChan:
+			switch msg := bm.(type) {
+			case *BleGenRandAddrRsp:
+				bl.Acked = true
+				if msg.Status != 0 {
+					return BleAddr{},
+						StatusError(MSG_OP_RSP, MSG_TYPE_GEN_RAND_ADDR,
+							msg.Status)
+				}
+				return msg.Addr, nil
+
+			default:
+			}
+
+		case <-bl.AfterTimeout(x.RspTimeout()):
+			return BleAddr{}, BhdTimeoutError(MSG_TYPE_GEN_RAND_ADDR)
+		}
+	}
+}
+
+// Configures the controller with the specified 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.
+func setRandAddr(x *BleXport, bl *BleListener, r *BleSetRandAddrReq) error {
+	const msgType = MSG_TYPE_SET_RAND_ADDR
+
+	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 msg := bm.(type) {
+			case *BleSetRandAddrRsp:
+				bl.Acked = true
+				if msg.Status != 0 {
+					return StatusError(MSG_OP_RSP, msgType, msg.Status)
+				}
+				return nil
+
+			default:
+			}
+
+		case <-bl.AfterTimeout(x.RspTimeout()):
+			return BhdTimeoutError(msgType)
+		}
+	}
+}
+
+// Configures the host with the specified preferred ATT MTU.  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.
+func setPreferredMtu(x *BleXport, bl *BleListener,
+	r *BleSetPreferredMtuReq) error {
+
+	const msgType = MSG_TYPE_SET_PREFERRED_MTU
+
+	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 msg := bm.(type) {
+			case *BleSetPreferredMtuRsp:
+				bl.Acked = true
+				if msg.Status != 0 {
+					return StatusError(MSG_OP_RSP, msgType, msg.Status)
+				}
+				return nil
+
+			default:
+			}
+
+		case <-bl.AfterTimeout(x.RspTimeout()):
+			return BhdTimeoutError(msgType)
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/06c80b76/nmxact/nmble/ble_proto.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_proto.go b/nmxact/nmble/ble_proto.go
index 8545335..41afd51 100644
--- a/nmxact/nmble/ble_proto.go
+++ b/nmxact/nmble/ble_proto.go
@@ -216,22 +216,23 @@ const (
 )
 
 const (
-	MSG_TYPE_ERR           MsgType = 1
-	MSG_TYPE_SYNC                  = 2
-	MSG_TYPE_CONNECT               = 3
-	MSG_TYPE_TERMINATE             = 4
-	MSG_TYPE_DISC_ALL_SVCS         = 5
-	MSG_TYPE_DISC_SVC_UUID         = 6
-	MSG_TYPE_DISC_ALL_CHRS         = 7
-	MSG_TYPE_DISC_CHR_UUID         = 8
-	MSG_TYPE_WRITE                 = 9
-	MSG_TYPE_WRITE_CMD             = 10
-	MSG_TYPE_EXCHANGE_MTU          = 11
-	MSG_TYPE_GEN_RAND_ADDR         = 12
-	MSG_TYPE_SET_RAND_ADDR         = 13
-	MSG_TYPE_CONN_CANCEL           = 14
-	MSG_TYPE_SCAN                  = 15
-	MSG_TYPE_SCAN_CANCEL           = 16
+	MSG_TYPE_ERR               MsgType = 1
+	MSG_TYPE_SYNC                      = 2
+	MSG_TYPE_CONNECT                   = 3
+	MSG_TYPE_TERMINATE                 = 4
+	MSG_TYPE_DISC_ALL_SVCS             = 5
+	MSG_TYPE_DISC_SVC_UUID             = 6
+	MSG_TYPE_DISC_ALL_CHRS             = 7
+	MSG_TYPE_DISC_CHR_UUID             = 8
+	MSG_TYPE_WRITE                     = 9
+	MSG_TYPE_WRITE_CMD                 = 10
+	MSG_TYPE_EXCHANGE_MTU              = 11
+	MSG_TYPE_GEN_RAND_ADDR             = 12
+	MSG_TYPE_SET_RAND_ADDR             = 13
+	MSG_TYPE_CONN_CANCEL               = 14
+	MSG_TYPE_SCAN                      = 15
+	MSG_TYPE_SCAN_CANCEL               = 16
+	MSG_TYPE_SET_PREFERRED_MTU         = 17
 
 	MSG_TYPE_SYNC_EVT       = 2049
 	MSG_TYPE_CONNECT_EVT    = 2050
@@ -251,18 +252,21 @@ var MsgOpStringMap = map[MsgOp]string{
 }
 
 var MsgTypeStringMap = map[MsgType]string{
-	MSG_TYPE_ERR:           "error",
-	MSG_TYPE_SYNC:          "sync",
-	MSG_TYPE_CONNECT:       "connect",
-	MSG_TYPE_TERMINATE:     "terminate",
-	MSG_TYPE_DISC_SVC_UUID: "disc_svc_uuid",
-	MSG_TYPE_DISC_CHR_UUID: "disc_chr_uuid",
-	MSG_TYPE_DISC_ALL_CHRS: "disc_all_chrs",
-	MSG_TYPE_WRITE_CMD:     "write_cmd",
-	MSG_TYPE_EXCHANGE_MTU:  "exchange_mtu",
-	MSG_TYPE_CONN_CANCEL:   "conn_cancel",
-	MSG_TYPE_SCAN:          "scan",
-	MSG_TYPE_SCAN_CANCEL:   "scan_cancel",
+	MSG_TYPE_ERR:               "error",
+	MSG_TYPE_SYNC:              "sync",
+	MSG_TYPE_CONNECT:           "connect",
+	MSG_TYPE_TERMINATE:         "terminate",
+	MSG_TYPE_DISC_SVC_UUID:     "disc_svc_uuid",
+	MSG_TYPE_DISC_CHR_UUID:     "disc_chr_uuid",
+	MSG_TYPE_DISC_ALL_CHRS:     "disc_all_chrs",
+	MSG_TYPE_WRITE_CMD:         "write_cmd",
+	MSG_TYPE_EXCHANGE_MTU:      "exchange_mtu",
+	MSG_TYPE_GEN_RAND_ADDR:     "gen_rand_addr",
+	MSG_TYPE_SET_RAND_ADDR:     "set_rand_addr",
+	MSG_TYPE_CONN_CANCEL:       "conn_cancel",
+	MSG_TYPE_SCAN:              "scan",
+	MSG_TYPE_SCAN_CANCEL:       "scan_cancel",
+	MSG_TYPE_SET_PREFERRED_MTU: "set_preferred_mtu",
 
 	MSG_TYPE_SYNC_EVT:       "sync_evt",
 	MSG_TYPE_CONNECT_EVT:    "connect_evt",
@@ -588,6 +592,47 @@ type BleMtuChangeEvt struct {
 	Mtu        int `json:"mtu"`
 }
 
+type BleGenRandAddrReq struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+
+	// Mandatory
+	Nrpa bool `json:"nrpa"`
+}
+
+type BleGenRandAddrRsp struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+
+	// Mandatory
+	Status int     `json:"status"`
+	Addr   BleAddr `json:"addr"`
+}
+
+type BleSetRandAddrReq struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+
+	// Mandatory
+	Addr BleAddr `json:"addr"`
+}
+
+type BleSetRandAddrRsp struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+
+	// Mandatory
+	Status int `json:"status"`
+}
+
 type BleScanReq struct {
 	// Header
 	Op   MsgOp   `json:"op"`
@@ -651,6 +696,26 @@ type BleScanCancelRsp struct {
 	Status int `json:"status"`
 }
 
+type BleSetPreferredMtuReq struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+
+	// Mandatory
+	Mtu uint16 `json:"mtu"`
+}
+
+type BleSetPreferredMtuRsp struct {
+	// Header
+	Op   MsgOp   `json:"op"`
+	Type MsgType `json:"type"`
+	Seq  BleSeq  `json:"seq"`
+
+	// Mandatory
+	Status int `json:"status"`
+}
+
 func ErrCodeToString(e int) string {
 	var s string
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/06c80b76/nmxact/nmble/ble_util.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_util.go b/nmxact/nmble/ble_util.go
index 07cd8c3..a61618f 100644
--- a/nmxact/nmble/ble_util.go
+++ b/nmxact/nmble/ble_util.go
@@ -145,6 +145,22 @@ func NewBleExchangeMtuReq() *BleExchangeMtuReq {
 	}
 }
 
+func NewBleGenRandAddrReq() *BleGenRandAddrReq {
+	return &BleGenRandAddrReq{
+		Op:   MSG_OP_REQ,
+		Type: MSG_TYPE_GEN_RAND_ADDR,
+		Seq:  NextSeq(),
+	}
+}
+
+func NewBleSetRandAddrReq() *BleSetRandAddrReq {
+	return &BleSetRandAddrReq{
+		Op:   MSG_OP_REQ,
+		Type: MSG_TYPE_SET_RAND_ADDR,
+		Seq:  NextSeq(),
+	}
+}
+
 func NewBleWriteCmdReq() *BleWriteCmdReq {
 	return &BleWriteCmdReq{
 		Op:   MSG_OP_REQ,
@@ -172,3 +188,11 @@ func NewBleScanCancelReq() *BleScanCancelReq {
 		Seq:  NextSeq(),
 	}
 }
+
+func NewBleSetPreferredMtuReq() *BleSetPreferredMtuReq {
+	return &BleSetPreferredMtuReq{
+		Op:   MSG_OP_REQ,
+		Type: MSG_TYPE_SET_PREFERRED_MTU,
+		Seq:  NextSeq(),
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/06c80b76/nmxact/nmble/ble_xport.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_xport.go b/nmxact/nmble/ble_xport.go
index f957341..4f44577 100644
--- a/nmxact/nmble/ble_xport.go
+++ b/nmxact/nmble/ble_xport.go
@@ -10,32 +10,54 @@ import (
 	log "github.com/Sirupsen/logrus"
 
 	"mynewt.apache.org/newt/util/unixchild"
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
 	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
 	"mynewt.apache.org/newtmgr/nmxact/sesn"
 )
 
 type XportCfg struct {
+	// ***********************
+	// *** Required fields ***
+	// ***********************
+
 	// Path of Unix domain socket to create and listen on.
 	SockPath string
 
 	// Path of the blehostd executable.
 	BlehostdPath string
 
+	// Path of the BLE controller device (e.g., /dev/ttyUSB0).
+	DevPath string
+
+	// ***********************
+	// *** Optional fields ***
+	// ***********************
+
 	// How long to wait for the blehostd process to connect to the Unix domain
 	// socket.
+	// Default: 1 second.
 	BlehostdAcceptTimeout time.Duration
 
-	// Whether to restart the blehostd process if it terminates.
-	BlehostdRestart bool
-
 	// How long to wait for a JSON response from the blehostd process.
+	// Default: 1 second.
 	BlehostdRspTimeout time.Duration
 
-	// Path of the BLE controller device (e.g., /dev/ttyUSB0).
-	DevPath string
+	// Whether to restart the blehostd process if it terminates.
+	// Default: true.
+	BlehostdRestart bool
 
 	// How long to allow for the host and controller to sync at startup.
+	// Default: 10 seconds.
 	SyncTimeout time.Duration
+
+	// The static random address to use.  Set to nil if one should be
+	// generated.
+	// Default: nil (auto-generate).
+	RandAddr *BleAddr
+
+	// The value to specify during ATT MTU exchange.
+	// Default: 512.
+	PreferredMtu uint16
 }
 
 func NewXportCfg() XportCfg {
@@ -44,6 +66,7 @@ func NewXportCfg() XportCfg {
 		BlehostdRspTimeout:    time.Second,
 		BlehostdRestart:       true,
 		SyncTimeout:           10 * time.Second,
+		PreferredMtu:          512,
 	}
 }
 
@@ -51,10 +74,10 @@ type BleXportState int
 
 const (
 	BLE_XPORT_STATE_DORMANT BleXportState = iota
+	BLE_XPORT_STATE_STOPPING
 	BLE_XPORT_STATE_STOPPED
 	BLE_XPORT_STATE_STARTING
 	BLE_XPORT_STATE_STARTED
-	BLE_XPORT_STATE_STOPPING
 )
 
 // Implements xport.Xport.
@@ -67,6 +90,7 @@ type BleXport struct {
 	shutdownChan      chan bool
 	readyChan         chan error
 	numReadyListeners int
+	randAddr          *BleAddr
 	mtx               sync.Mutex
 
 	cfg XportCfg
@@ -96,6 +120,64 @@ func (bx *BleXport) createUnixChild() {
 	bx.client = unixchild.New(config)
 }
 
+func (bx *BleXport) genRandAddr() (BleAddr, error) {
+	r := NewBleGenRandAddrReq()
+	base := BleMsgBase{
+		Op:         -1,
+		Type:       -1,
+		Seq:        r.Seq,
+		ConnHandle: -1,
+	}
+
+	bl := NewBleListener()
+	if err := bx.Bd.AddListener(base, bl); err != nil {
+		return BleAddr{}, err
+	}
+	defer bx.Bd.RemoveListener(base)
+
+	return genRandAddr(bx, bl, r)
+}
+
+func (bx *BleXport) setRandAddr(addr BleAddr) error {
+	r := NewBleSetRandAddrReq()
+	r.Addr = addr
+
+	base := BleMsgBase{
+		Op:         -1,
+		Type:       -1,
+		Seq:        r.Seq,
+		ConnHandle: -1,
+	}
+
+	bl := NewBleListener()
+	if err := bx.Bd.AddListener(base, bl); err != nil {
+		return err
+	}
+	defer bx.Bd.RemoveListener(base)
+
+	return setRandAddr(bx, bl, r)
+}
+
+func (bx *BleXport) setPreferredMtu(mtu uint16) error {
+	r := NewBleSetPreferredMtuReq()
+	r.Mtu = mtu
+
+	base := BleMsgBase{
+		Op:         -1,
+		Type:       -1,
+		Seq:        r.Seq,
+		ConnHandle: -1,
+	}
+
+	bl := NewBleListener()
+	if err := bx.Bd.AddListener(base, bl); err != nil {
+		return err
+	}
+	defer bx.Bd.RemoveListener(base)
+
+	return setPreferredMtu(bx, bl, r)
+}
+
 func (bx *BleXport) BuildSesn(cfg sesn.SesnCfg) (sesn.Sesn, error) {
 	switch cfg.MgmtProto {
 	case sesn.MGMT_PROTO_NMP:
@@ -386,6 +468,26 @@ func (bx *BleXport) startOnce() error {
 		}
 	}()
 
+	if bx.randAddr == nil {
+		addr, err := bx.genRandAddr()
+		if err != nil {
+			bx.shutdown(true, err)
+			return err
+		}
+
+		bx.randAddr = &addr
+	}
+
+	if err := bx.setRandAddr(*bx.randAddr); err != nil {
+		bx.shutdown(true, err)
+		return err
+	}
+
+	if err := bx.setPreferredMtu(bx.cfg.PreferredMtu); err != nil {
+		bx.shutdown(true, err)
+		return err
+	}
+
 	if !bx.setStateFrom(BLE_XPORT_STATE_STARTING, BLE_XPORT_STATE_STARTED) {
 		bx.shutdown(true, err)
 		return nmxutil.NewXportError(

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/06c80b76/nmxact/nmble/dispatch.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/dispatch.go b/nmxact/nmble/dispatch.go
index 583f3a4..06d2847 100644
--- a/nmxact/nmble/dispatch.go
+++ b/nmxact/nmble/dispatch.go
@@ -84,18 +84,21 @@ type BleDispatcher struct {
 
 type msgCtor func() BleMsg
 
-func errRspCtor() BleMsg         { return &BleErrRsp{} }
-func syncRspCtor() BleMsg        { return &BleSyncRsp{} }
-func connectRspCtor() BleMsg     { return &BleConnectRsp{} }
-func terminateRspCtor() BleMsg   { return &BleTerminateRsp{} }
-func discSvcUuidRspCtor() BleMsg { return &BleDiscSvcUuidRsp{} }
-func discAllChrsRspCtor() BleMsg { return &BleDiscAllChrsRsp{} }
-func discChrUuidRspCtor() BleMsg { return &BleDiscChrUuidRsp{} }
-func writeCmdRspCtor() BleMsg    { return &BleWriteCmdRsp{} }
-func exchangeMtuRspCtor() BleMsg { return &BleExchangeMtuRsp{} }
-func connCancelRspCtor() BleMsg  { return &BleConnCancelRsp{} }
-func scanRspCtor() BleMsg        { return &BleScanRsp{} }
-func scanCancelRspCtor() BleMsg  { return &BleScanCancelRsp{} }
+func errRspCtor() BleMsg             { return &BleErrRsp{} }
+func syncRspCtor() BleMsg            { return &BleSyncRsp{} }
+func connectRspCtor() BleMsg         { return &BleConnectRsp{} }
+func terminateRspCtor() BleMsg       { return &BleTerminateRsp{} }
+func discSvcUuidRspCtor() BleMsg     { return &BleDiscSvcUuidRsp{} }
+func discAllChrsRspCtor() BleMsg     { return &BleDiscAllChrsRsp{} }
+func discChrUuidRspCtor() BleMsg     { return &BleDiscChrUuidRsp{} }
+func writeCmdRspCtor() BleMsg        { return &BleWriteCmdRsp{} }
+func exchangeMtuRspCtor() BleMsg     { return &BleExchangeMtuRsp{} }
+func genRandAddrRspCtor() BleMsg     { return &BleGenRandAddrRsp{} }
+func setRandAddrRspCtor() BleMsg     { return &BleSetRandAddrRsp{} }
+func connCancelRspCtor() BleMsg      { return &BleConnCancelRsp{} }
+func scanRspCtor() BleMsg            { return &BleScanRsp{} }
+func scanCancelRspCtor() BleMsg      { return &BleScanCancelRsp{} }
+func setPreferredMtuRspCtor() BleMsg { return &BleSetPreferredMtuRsp{} }
 
 func syncEvtCtor() BleMsg       { return &BleSyncEvt{} }
 func connectEvtCtor() BleMsg    { return &BleConnectEvt{} }
@@ -107,18 +110,21 @@ func mtuChangeEvtCtor() BleMsg  { return &BleMtuChangeEvt{} }
 func scanEvtCtor() BleMsg       { return &BleScanEvt{} }
 
 var msgCtorMap = map[OpTypePair]msgCtor{
-	{MSG_OP_RSP, MSG_TYPE_ERR}:           errRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_SYNC}:          syncRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_CONNECT}:       connectRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_TERMINATE}:     terminateRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_DISC_SVC_UUID}: discSvcUuidRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_DISC_CHR_UUID}: discChrUuidRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_DISC_ALL_CHRS}: discAllChrsRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_WRITE_CMD}:     writeCmdRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_EXCHANGE_MTU}:  exchangeMtuRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_CONN_CANCEL}:   connCancelRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_SCAN}:          scanRspCtor,
-	{MSG_OP_RSP, MSG_TYPE_SCAN_CANCEL}:   scanCancelRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_ERR}:               errRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_SYNC}:              syncRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_CONNECT}:           connectRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_TERMINATE}:         terminateRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_DISC_SVC_UUID}:     discSvcUuidRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_DISC_CHR_UUID}:     discChrUuidRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_DISC_ALL_CHRS}:     discAllChrsRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_WRITE_CMD}:         writeCmdRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_EXCHANGE_MTU}:      exchangeMtuRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_GEN_RAND_ADDR}:     genRandAddrRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_SET_RAND_ADDR}:     setRandAddrRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_CONN_CANCEL}:       connCancelRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_SCAN}:              scanRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_SCAN_CANCEL}:       scanCancelRspCtor,
+	{MSG_OP_RSP, MSG_TYPE_SET_PREFERRED_MTU}: setPreferredMtuRspCtor,
 
 	{MSG_OP_EVT, MSG_TYPE_SYNC_EVT}:       syncEvtCtor,
 	{MSG_OP_EVT, MSG_TYPE_CONNECT_EVT}:    connectEvtCtor,