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/03/28 22:42:00 UTC

[63/67] [abbrv] incubator-mynewt-newtmgr git commit: newtmgr - use newtmgr repo, not newt repo.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/nmp.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/nmp.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/nmp.go
new file mode 100644
index 0000000..bb35743
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/nmp.go
@@ -0,0 +1,165 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package nmp
+
+import (
+	"encoding/binary"
+	"encoding/hex"
+	"fmt"
+
+	log "github.com/Sirupsen/logrus"
+	"github.com/ugorji/go/codec"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newt/util"
+)
+
+const NMP_HDR_SIZE = 8
+
+type NmpHdr struct {
+	Op    uint8 /* 3 bits of opcode */
+	Flags uint8
+	Len   uint16
+	Group uint16
+	Seq   uint8
+	Id    uint8
+}
+
+type NmpMsg struct {
+	Hdr  NmpHdr
+	Body interface{}
+}
+
+// Combine req + rsp.
+type NmpReq interface {
+	Hdr() *NmpHdr
+	SetHdr(hdr *NmpHdr)
+
+	Msg() *NmpMsg
+}
+
+type NmpRsp interface {
+	Hdr() *NmpHdr
+	SetHdr(msg *NmpHdr)
+
+	Msg() *NmpMsg
+}
+
+type NmpBase struct {
+	hdr NmpHdr `codec:"-"`
+}
+
+func (b *NmpBase) Hdr() *NmpHdr {
+	return &b.hdr
+}
+
+func (b *NmpBase) SetHdr(h *NmpHdr) {
+	b.hdr = *h
+}
+
+func MsgFromReq(r NmpReq) *NmpMsg {
+	return &NmpMsg{
+		*r.Hdr(),
+		r,
+	}
+}
+
+func NewNmpMsg() *NmpMsg {
+	return &NmpMsg{}
+}
+
+func DecodeNmpHdr(data []byte) (*NmpHdr, error) {
+	if len(data) < NMP_HDR_SIZE {
+		return nil, util.NewNewtError(fmt.Sprintf(
+			"Newtmgr request buffer too small %d bytes", len(data)))
+	}
+
+	hdr := &NmpHdr{}
+
+	hdr.Op = uint8(data[0])
+	hdr.Flags = uint8(data[1])
+	hdr.Len = binary.BigEndian.Uint16(data[2:4])
+	hdr.Group = binary.BigEndian.Uint16(data[4:6])
+	hdr.Seq = uint8(data[6])
+	hdr.Id = uint8(data[7])
+
+	return hdr, nil
+}
+
+func (hdr *NmpHdr) Bytes() []byte {
+	buf := make([]byte, 0, NMP_HDR_SIZE)
+
+	buf = append(buf, byte(hdr.Op))
+	buf = append(buf, byte(hdr.Flags))
+
+	u16b := make([]byte, 2)
+	binary.BigEndian.PutUint16(u16b, hdr.Len)
+	buf = append(buf, u16b...)
+
+	binary.BigEndian.PutUint16(u16b, hdr.Group)
+	buf = append(buf, u16b...)
+
+	buf = append(buf, byte(hdr.Seq))
+	buf = append(buf, byte(hdr.Id))
+
+	return buf
+}
+
+func BodyBytes(body interface{}) ([]byte, error) {
+	data := make([]byte, 0)
+
+	enc := codec.NewEncoderBytes(&data, new(codec.CborHandle))
+	if err := enc.Encode(body); err != nil {
+		return nil, fmt.Errorf("Failed to encode message %s", err.Error())
+	}
+
+	log.Debugf("Encoded %+v to:\n%s", body, hex.Dump(data))
+
+	return data, nil
+}
+
+func EncodeNmpPlain(nmr *NmpMsg) ([]byte, error) {
+	bb, err := BodyBytes(nmr.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	nmr.Hdr.Len = uint16(len(bb))
+
+	hb := nmr.Hdr.Bytes()
+	data := append(hb, bb...)
+
+	log.Debugf("Encoded:\n%s", hex.Dump(data))
+
+	return data, nil
+}
+
+func fillNmpReq(req NmpReq, op uint8, group uint16, id uint8) {
+	hdr := NmpHdr{
+		Op:    op,
+		Flags: 0,
+		Len:   0,
+		Group: group,
+		Seq:   nmxutil.NextNmpSeq(),
+		Id:    id,
+	}
+
+	req.SetHdr(&hdr)
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/reset.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/reset.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/reset.go
new file mode 100644
index 0000000..9b8cbad
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/reset.go
@@ -0,0 +1,44 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package nmp
+
+import ()
+
+type ResetReq struct {
+	NmpBase
+}
+
+type ResetRsp struct {
+	NmpBase
+}
+
+func NewResetReq() *ResetReq {
+	r := &ResetReq{}
+	fillNmpReq(r, NMP_OP_WRITE, NMP_GROUP_DEFAULT, NMP_ID_DEF_RESET)
+	return r
+}
+
+func (r *ResetReq) Msg() *NmpMsg { return MsgFromReq(r) }
+
+func NewResetRsp() *ResetRsp {
+	return &ResetRsp{}
+}
+
+func (r *ResetRsp) Msg() *NmpMsg { return MsgFromReq(r) }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/run.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/run.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/run.go
new file mode 100644
index 0000000..3672b0f
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/run.go
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package nmp
+
+import ()
+
+//////////////////////////////////////////////////////////////////////////////
+// $test                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type RunTestReq struct {
+	NmpBase
+	Testname string `codec:"testname"`
+	Token    string `codec:"token"`
+}
+
+type RunTestRsp struct {
+	NmpBase
+	Rc int `codec:"rc" codec:",omitempty"`
+}
+
+func NewRunTestReq() *RunTestReq {
+	r := &RunTestReq{}
+	fillNmpReq(r, NMP_OP_WRITE, NMP_GROUP_RUN, NMP_ID_RUN_TEST)
+	return r
+}
+
+func (r *RunTestReq) Msg() *NmpMsg { return MsgFromReq(r) }
+
+func NewRunTestRsp() *RunTestRsp {
+	return &RunTestRsp{}
+}
+
+func (r *RunTestRsp) Msg() *NmpMsg { return MsgFromReq(r) }
+
+//////////////////////////////////////////////////////////////////////////////
+// $list                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type RunListReq struct {
+	NmpBase
+}
+
+type RunListRsp struct {
+	NmpBase
+	Rc   int      `codec:"rc" codec:",omitempty"`
+	List []string `codec:"run_list"`
+}
+
+func NewRunListReq() *RunListReq {
+	r := &RunListReq{}
+	fillNmpReq(r, NMP_OP_READ, NMP_GROUP_RUN, NMP_ID_RUN_LIST)
+	return r
+}
+
+func (r *RunListReq) Msg() *NmpMsg { return MsgFromReq(r) }
+
+func NewRunListRsp() *RunListRsp {
+	return &RunListRsp{}
+}
+
+func (r *RunListRsp) Msg() *NmpMsg { return MsgFromReq(r) }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/stat.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/stat.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/stat.go
new file mode 100644
index 0000000..2839c02
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/stat.go
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package nmp
+
+import ()
+
+//////////////////////////////////////////////////////////////////////////////
+// $read                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type StatReadReq struct {
+	NmpBase
+	Name string `codec:"name"`
+}
+
+type StatReadRsp struct {
+	NmpBase
+	Rc     int                    `codec:"rc"`
+	Name   string                 `codec:"name"`
+	Group  string                 `codec:"group"`
+	Fields map[string]interface{} `codec:"fields"`
+}
+
+func NewStatReadReq() *StatReadReq {
+	r := &StatReadReq{}
+	fillNmpReq(r, NMP_OP_READ, NMP_GROUP_STAT, NMP_ID_STAT_READ)
+	return r
+}
+
+func (r *StatReadReq) Msg() *NmpMsg { return MsgFromReq(r) }
+
+func NewStatReadRsp() *StatReadRsp {
+	return &StatReadRsp{}
+}
+
+func (r *StatReadRsp) Msg() *NmpMsg { return MsgFromReq(r) }
+
+//////////////////////////////////////////////////////////////////////////////
+// $list                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type StatListReq struct {
+	NmpBase
+}
+
+type StatListRsp struct {
+	NmpBase
+	Rc   int      `codec:"rc"`
+	List []string `codec:"stat_list"`
+}
+
+func NewStatListReq() *StatListReq {
+	r := &StatListReq{}
+	fillNmpReq(r, NMP_OP_READ, NMP_GROUP_STAT, NMP_ID_STAT_LIST)
+	return r
+}
+
+func (r *StatListReq) Msg() *NmpMsg { return MsgFromReq(r) }
+
+func NewStatListRsp() *StatListRsp {
+	return &StatListRsp{}
+}
+
+func (r *StatListRsp) Msg() *NmpMsg { return MsgFromReq(r) }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/taskstat.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/taskstat.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/taskstat.go
new file mode 100644
index 0000000..6dda49d
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmp/taskstat.go
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package nmp
+
+import ()
+
+type TaskStatReq struct {
+	NmpBase
+}
+
+type TaskStatRsp struct {
+	NmpBase
+	Rc    int                       `codec:"rc" codec:",omitempty"`
+	Tasks map[string]map[string]int `codec:"tasks"`
+}
+
+func NewTaskStatReq() *TaskStatReq {
+	r := &TaskStatReq{}
+	fillNmpReq(r, NMP_OP_READ, NMP_GROUP_DEFAULT, NMP_ID_DEF_TASKSTAT)
+	return r
+}
+
+func (r *TaskStatReq) Msg() *NmpMsg { return MsgFromReq(r) }
+
+func NewTaskStatRsp() *TaskStatRsp {
+	return &TaskStatRsp{}
+}
+
+func (r *TaskStatRsp) Msg() *NmpMsg { return MsgFromReq(r) }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/packet.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/packet.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/packet.go
new file mode 100644
index 0000000..e25bc2e
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/packet.go
@@ -0,0 +1,40 @@
+package nmserial
+
+import (
+	"bytes"
+)
+
+type Packet struct {
+	expectedLen uint16
+	buffer      *bytes.Buffer
+}
+
+func NewPacket(expectedLen uint16) (*Packet, error) {
+	pkt := &Packet{
+		expectedLen: expectedLen,
+		buffer:      bytes.NewBuffer([]byte{}),
+	}
+
+	return pkt, nil
+}
+
+func (pkt *Packet) AddBytes(bytes []byte) bool {
+	pkt.buffer.Write(bytes)
+	if pkt.buffer.Len() >= int(pkt.expectedLen) {
+		return true
+	} else {
+		return false
+	}
+}
+
+func (pkt *Packet) GetBytes() []byte {
+	return pkt.buffer.Bytes()
+}
+
+func (pkt *Packet) TrimEnd(count int) {
+
+	if pkt.buffer.Len() < count {
+		count = pkt.buffer.Len()
+	}
+	pkt.buffer.Truncate(pkt.buffer.Len() - count)
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_plain_sesn.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_plain_sesn.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_plain_sesn.go
new file mode 100644
index 0000000..fe7173e
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_plain_sesn.go
@@ -0,0 +1,137 @@
+package nmserial
+
+import (
+	"fmt"
+	"sync"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type SerialPlainSesn struct {
+	sx     *SerialXport
+	nd     *nmp.NmpDispatcher
+	isOpen bool
+
+	// This mutex ensures:
+	//     * each response get matched up with its corresponding request.
+	//     * accesses to isOpen are protected.
+	m sync.Mutex
+}
+
+func NewSerialPlainSesn(sx *SerialXport) *SerialPlainSesn {
+	return &SerialPlainSesn{
+		sx: sx,
+		nd: nmp.NewNmpDispatcher(),
+	}
+}
+
+func (sps *SerialPlainSesn) Open() error {
+	sps.m.Lock()
+	defer sps.m.Unlock()
+
+	if sps.isOpen {
+		return nmxutil.NewSesnAlreadyOpenError(
+			"Attempt to open an already-open serial session")
+	}
+
+	sps.isOpen = true
+	return nil
+}
+
+func (sps *SerialPlainSesn) Close() error {
+	sps.m.Lock()
+	defer sps.m.Unlock()
+
+	if !sps.isOpen {
+		return nmxutil.NewSesnClosedError(
+			"Attempt to close an unopened serial session")
+	}
+	sps.isOpen = false
+	return nil
+}
+
+func (sps *SerialPlainSesn) IsOpen() bool {
+	sps.m.Lock()
+	defer sps.m.Unlock()
+
+	return sps.isOpen
+}
+
+func (sps *SerialPlainSesn) MtuIn() int {
+	return 1024
+}
+
+func (sps *SerialPlainSesn) MtuOut() int {
+	// Mynewt commands have a default chunk buffer size of 512.  Account for
+	// base64 encoding.
+	return 512 * 3 / 4
+}
+
+func (sps *SerialPlainSesn) AbortRx(seq uint8) error {
+	return sps.nd.FakeRxError(seq, fmt.Errorf("Rx aborted"))
+}
+
+func (sps *SerialPlainSesn) addNmpListener(seq uint8) (
+	*nmp.NmpListener, error) {
+
+	nl := nmp.NewNmpListener()
+	if err := sps.nd.AddListener(seq, nl); err != nil {
+		return nil, err
+	}
+
+	return nl, nil
+}
+
+func (sps *SerialPlainSesn) removeNmpListener(seq uint8) {
+	sps.nd.RemoveListener(seq)
+}
+
+func (sps *SerialPlainSesn) EncodeNmpMsg(m *nmp.NmpMsg) ([]byte, error) {
+	return nmp.EncodeNmpPlain(m)
+}
+
+func (sps *SerialPlainSesn) TxNmpOnce(m *nmp.NmpMsg, opt sesn.TxOptions) (
+	nmp.NmpRsp, error) {
+
+	sps.m.Lock()
+	defer sps.m.Unlock()
+
+	if !sps.isOpen {
+		return nil, nmxutil.NewSesnClosedError(
+			"Attempt to transmit over closed serial session")
+	}
+
+	nl, err := sps.addNmpListener(m.Hdr.Seq)
+	if err != nil {
+		return nil, err
+	}
+	defer sps.removeNmpListener(m.Hdr.Seq)
+
+	reqb, err := sps.EncodeNmpMsg(m)
+	if err != nil {
+		return nil, err
+	}
+
+	if err := sps.sx.Tx(reqb); err != nil {
+		return nil, err
+	}
+
+	for {
+		rspb, err := sps.sx.Rx()
+		if err != nil {
+			return nil, err
+		}
+
+		// Now wait for newtmgr response.
+		if sps.nd.Dispatch(rspb) {
+			select {
+			case err := <-nl.ErrChan:
+				return nil, err
+			case rsp := <-nl.RspChan:
+				return rsp, nil
+			}
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_xport.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_xport.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_xport.go
new file mode 100644
index 0000000..7dbb5ca
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmserial/serial_xport.go
@@ -0,0 +1,217 @@
+package nmserial
+
+import (
+	"bufio"
+	"encoding/base64"
+	"encoding/binary"
+	"encoding/hex"
+	"fmt"
+	"time"
+
+	log "github.com/Sirupsen/logrus"
+	"github.com/joaojeronimo/go-crc16"
+	"github.com/tarm/serial"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+	"mynewt.apache.org/newt/util"
+)
+
+type XportCfg struct {
+	DevPath     string
+	Baud        int
+	ReadTimeout time.Duration
+}
+
+func NewXportCfg() *XportCfg {
+	return &XportCfg{
+		ReadTimeout: 10 * time.Second,
+	}
+}
+
+type SerialXport struct {
+	cfg     *XportCfg
+	port    *serial.Port
+	scanner *bufio.Scanner
+
+	pkt *Packet
+}
+
+func NewSerialXport(cfg *XportCfg) *SerialXport {
+	return &SerialXport{
+		cfg: cfg,
+	}
+}
+
+func (sx *SerialXport) BuildSesn(cfg sesn.SesnCfg) (sesn.Sesn, error) {
+	switch cfg.MgmtProto {
+	case sesn.MGMT_PROTO_NMP:
+		return NewSerialPlainSesn(sx), nil
+	case sesn.MGMT_PROTO_OMP:
+		return nil, fmt.Errorf("OMP over serial currently unsupported")
+	default:
+		return nil, fmt.Errorf(
+			"Invalid management protocol: %d; expected NMP or OMP",
+			cfg.MgmtProto)
+	}
+}
+
+func (sx *SerialXport) Start() error {
+	c := &serial.Config{
+		Name:        sx.cfg.DevPath,
+		Baud:        sx.cfg.Baud,
+		ReadTimeout: sx.cfg.ReadTimeout,
+	}
+
+	var err error
+	sx.port, err = serial.OpenPort(c)
+	if err != nil {
+		return err
+	}
+
+	// Most of the reading will be done line by line, use the
+	// bufio.Scanner to do this
+	sx.scanner = bufio.NewScanner(sx.port)
+
+	return nil
+}
+
+func (sx *SerialXport) Stop() error {
+	return sx.port.Close()
+}
+
+func (sx *SerialXport) txRaw(bytes []byte) error {
+	log.Debugf("Tx serial\n%s", hex.Dump(bytes))
+
+	_, err := sx.port.Write(bytes)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (sx *SerialXport) Tx(bytes []byte) error {
+	log.Debugf("Base64 encoding request:\n%s", hex.Dump(bytes))
+
+	pktData := make([]byte, 2)
+
+	crc := crc16.Crc16(bytes)
+	binary.BigEndian.PutUint16(pktData, crc)
+	bytes = append(bytes, pktData...)
+
+	dLen := uint16(len(bytes))
+	binary.BigEndian.PutUint16(pktData, dLen)
+	pktData = append(pktData, bytes...)
+
+	base64Data := make([]byte, base64.StdEncoding.EncodedLen(len(pktData)))
+
+	base64.StdEncoding.Encode(base64Data, pktData)
+
+	written := 0
+	totlen := len(base64Data)
+
+	for written < totlen {
+		/* write the packet stat designators. They are
+		 * different whether we are starting a new packet or continuing one */
+		if written == 0 {
+			sx.txRaw([]byte{6, 9})
+		} else {
+			/* slower platforms take some time to process each segment
+			 * and have very small receive buffers.  Give them a bit of
+			 * time here */
+			time.Sleep(20 * time.Millisecond)
+			sx.txRaw([]byte{4, 20})
+		}
+
+		/* ensure that the total frame fits into 128 bytes.
+		 * base 64 is 3 ascii to 4 base 64 byte encoding.  so
+		 * the number below should be a multiple of 4.  Also,
+		 * we need to save room for the header (2 byte) and
+		 * carriage return (and possibly LF 2 bytes), */
+
+		/* all totaled, 124 bytes should work */
+		writeLen := util.Min(124, totlen-written)
+
+		writeBytes := base64Data[written : written+writeLen]
+		sx.txRaw(writeBytes)
+		sx.txRaw([]byte{'\n'})
+
+		written += writeLen
+	}
+
+	return nil
+}
+
+// Blocking receive.
+func (sx *SerialXport) Rx() ([]byte, error) {
+	for sx.scanner.Scan() {
+		line := []byte(sx.scanner.Text())
+
+		for {
+			if len(line) > 1 && line[0] == '\r' {
+				line = line[1:]
+			} else {
+				break
+			}
+		}
+		log.Debugf("Rx serial:\n%s", hex.Dump(line))
+		if len(line) < 2 || ((line[0] != 4 || line[1] != 20) &&
+			(line[0] != 6 || line[1] != 9)) {
+			continue
+		}
+
+		base64Data := string(line[2:])
+
+		data, err := base64.StdEncoding.DecodeString(base64Data)
+		if err != nil {
+			return nil, fmt.Errorf("Couldn't decode base64 string:"+
+				" %s\nPacket hex dump:\n%s",
+				base64Data, hex.Dump(line))
+		}
+
+		if line[0] == 6 && line[1] == 9 {
+			if len(data) < 2 {
+				continue
+			}
+
+			pktLen := binary.BigEndian.Uint16(data[0:2])
+			sx.pkt, err = NewPacket(pktLen)
+			if err != nil {
+				return nil, err
+			}
+			data = data[2:]
+		}
+
+		if sx.pkt == nil {
+			continue
+		}
+
+		full := sx.pkt.AddBytes(data)
+		if full {
+			if crc16.Crc16(sx.pkt.GetBytes()) != 0 {
+				return nil, fmt.Errorf("CRC error")
+			}
+
+			/*
+			 * Trim away the 2 bytes of CRC
+			 */
+			sx.pkt.TrimEnd(2)
+			b := sx.pkt.GetBytes()
+			sx.pkt = nil
+
+			log.Debugf("Decoded input:\n%s", hex.Dump(b))
+			return b, nil
+		}
+	}
+
+	err := sx.scanner.Err()
+	if err == nil {
+		// Scanner hit EOF, so we'll need to create a new one.  This only
+		// happens on timeouts.
+		err = nmxutil.NewXportTimeoutError(
+			"Timeout reading from serial connection")
+		sx.scanner = bufio.NewScanner(sx.port)
+	}
+	return nil, err
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxerr.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxerr.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxerr.go
new file mode 100644
index 0000000..aa9da23
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxerr.go
@@ -0,0 +1,160 @@
+package nmxutil
+
+import (
+	"fmt"
+)
+
+// Represents an NMP timeout; request sent, but no response received.
+type NmpTimeoutError struct {
+	Text string
+}
+
+func NewNmpTimeoutError(text string) *NmpTimeoutError {
+	return &NmpTimeoutError{
+		Text: text,
+	}
+}
+
+func FmtNmpTimeoutError(format string, args ...interface{}) *NmpTimeoutError {
+	return NewNmpTimeoutError(fmt.Sprintf(format, args...))
+}
+
+func (e *NmpTimeoutError) Error() string {
+	return e.Text
+}
+
+func IsNmpTimeout(err error) bool {
+	_, ok := err.(*NmpTimeoutError)
+	return ok
+}
+
+type BleSesnDisconnectError struct {
+	Text   string
+	Reason int
+}
+
+func NewBleSesnDisconnectError(reason int,
+	text string) *BleSesnDisconnectError {
+
+	return &BleSesnDisconnectError{
+		Reason: reason,
+		Text:   text,
+	}
+}
+
+func (e *BleSesnDisconnectError) Error() string {
+	return e.Text
+}
+
+func IsBleSesnDisconnect(err error) bool {
+	_, ok := err.(*BleSesnDisconnectError)
+	return ok
+}
+
+type SesnAlreadyOpenError struct {
+	Text string
+}
+
+func NewSesnAlreadyOpenError(text string) *SesnAlreadyOpenError {
+	return &SesnAlreadyOpenError{
+		Text: text,
+	}
+}
+
+func (e *SesnAlreadyOpenError) Error() string {
+	return e.Text
+}
+
+func IsSesnAlreadyOpen(err error) bool {
+	_, ok := err.(*SesnAlreadyOpenError)
+	return ok
+}
+
+type SesnClosedError struct {
+	Text string
+}
+
+func NewSesnClosedError(text string) *SesnClosedError {
+	return &SesnClosedError{
+		Text: text,
+	}
+}
+
+func (e *SesnClosedError) Error() string {
+	return e.Text
+}
+
+func IsSesnClosed(err error) bool {
+	_, ok := err.(*SesnClosedError)
+	return ok
+}
+
+// Represents a low-level transport error.
+type XportError struct {
+	Text string
+}
+
+func NewXportError(text string) *XportError {
+	return &XportError{text}
+}
+
+func (e *XportError) Error() string {
+	return e.Text
+}
+
+func IsXport(err error) bool {
+	_, ok := err.(*XportError)
+	return ok
+}
+
+type XportTimeoutError struct {
+	Text string
+}
+
+func NewXportTimeoutError(text string) *XportTimeoutError {
+	return &XportTimeoutError{text}
+}
+
+func (e *XportTimeoutError) Error() string {
+	return e.Text
+}
+
+func IsXportTimeout(err error) bool {
+	_, ok := err.(*XportTimeoutError)
+	return ok
+}
+
+type BleHostError struct {
+	Text   string
+	Status int
+}
+
+func NewBleHostError(status int, text string) *BleHostError {
+	return &BleHostError{
+		Status: status,
+		Text:   text,
+	}
+}
+
+func FmtBleHostError(status int, format string,
+	args ...interface{}) *BleHostError {
+
+	return NewBleHostError(status, fmt.Sprintf(format, args...))
+}
+
+func (e *BleHostError) Error() string {
+	return e.Text
+}
+
+func IsBleHost(err error) bool {
+	_, ok := err.(*BleHostError)
+	return ok
+}
+
+func ToBleHost(err error) *BleHostError {
+	if berr, ok := err.(*BleHostError); ok {
+		return berr
+	} else {
+		return nil
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxutil.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxutil.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxutil.go
new file mode 100644
index 0000000..ef1ecd4
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/nmxutil/nmxutil.go
@@ -0,0 +1,25 @@
+package nmxutil
+
+import (
+	"math/rand"
+	"sync"
+)
+
+var nextNmpSeq uint8
+var beenRead bool
+var seqMutex sync.Mutex
+
+func NextNmpSeq() uint8 {
+	seqMutex.Lock()
+	defer seqMutex.Unlock()
+
+	if !beenRead {
+		nextNmpSeq = uint8(rand.Uint32())
+		beenRead = true
+	}
+
+	val := nextNmpSeq
+	nextNmpSeq++
+
+	return val
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/dispatch.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/dispatch.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/dispatch.go
new file mode 100644
index 0000000..44d1022
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/dispatch.go
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package omp
+
+import (
+	log "github.com/Sirupsen/logrus"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+)
+
+type OmpDispatcher struct {
+	nd          *nmp.NmpDispatcher
+	reassembler *Reassembler
+}
+
+func NewOmpDispatcher() *OmpDispatcher {
+	return &OmpDispatcher{
+		nd:          nmp.NewNmpDispatcher(),
+		reassembler: NewReassembler(),
+	}
+}
+
+func (od *OmpDispatcher) AddListener(seq uint8, rl *nmp.NmpListener) error {
+	return od.nd.AddListener(seq, rl)
+}
+
+func (od *OmpDispatcher) RemoveListener(seq uint8) *nmp.NmpListener {
+	return od.nd.RemoveListener(seq)
+}
+
+func (od *OmpDispatcher) FakeRxError(seq uint8, err error) error {
+	return od.nd.FakeRxError(seq, err)
+}
+
+// Returns true if the response was dispatched.
+func (om *OmpDispatcher) Dispatch(data []byte) bool {
+	tm := om.reassembler.RxFrag(data)
+	if tm == nil {
+		return false
+	}
+
+	r, err := DecodeOmpTcp(tm)
+	if err != nil {
+		log.Printf("OMP decode failure: %s", err.Error())
+		return false
+	}
+
+	return om.nd.DispatchRsp(r)
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/frag.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/frag.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/frag.go
new file mode 100644
index 0000000..caf7f48
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/frag.go
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package omp
+
+import (
+	log "github.com/Sirupsen/logrus"
+	"github.com/runtimeco/go-coap"
+)
+
+type Reassembler struct {
+	cur []byte
+}
+
+func NewReassembler() *Reassembler {
+	return &Reassembler{}
+}
+
+func (r *Reassembler) RxFrag(frag []byte) *coap.TcpMessage {
+	r.cur = append(r.cur, frag...)
+
+	var tm *coap.TcpMessage
+	var err error
+	tm, r.cur, err = coap.PullTcp(r.cur)
+	if err != nil {
+		log.Debugf("received invalid CoAP-TCP packet: %s", err.Error())
+		return nil
+	}
+
+	return tm
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/omp.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/omp.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/omp.go
new file mode 100644
index 0000000..77dbd1b
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/omp/omp.go
@@ -0,0 +1,125 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package omp
+
+import (
+	"encoding/hex"
+	"fmt"
+
+	log "github.com/Sirupsen/logrus"
+	"github.com/fatih/structs"
+	"github.com/runtimeco/go-coap"
+	"github.com/ugorji/go/codec"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+)
+
+// OIC wrapping adds this many bytes to an NMP message.
+const OMP_MSG_OVERHEAD = 13
+
+type OicMsg struct {
+	Hdr []byte `codec:"_h"`
+}
+
+/*
+ * Not able to install custom decoder for indefite length objects with the
+ * codec.  So we need to decode the whole response, and then re-encode the
+ * newtmgr response part.
+ */
+func DecodeOmpTcp(tm *coap.TcpMessage) (nmp.NmpRsp, error) {
+	// Ignore non-responses.
+	if tm.Code == coap.GET || tm.Code == coap.PUT {
+		return nil, nil
+	}
+
+	if tm.Code != coap.Created && tm.Code != coap.Deleted &&
+		tm.Code != coap.Valid && tm.Code != coap.Changed &&
+		tm.Code != coap.Content {
+		return nil, fmt.Errorf(
+			"OMP response specifies unexpected code: %d (%s)", int(tm.Code),
+			tm.Code.String())
+	}
+
+	var om OicMsg
+	err := codec.NewDecoderBytes(tm.Payload, new(codec.CborHandle)).Decode(&om)
+	if err != nil {
+		return nil, fmt.Errorf("Invalid incoming cbor: %s", err.Error())
+	}
+	if om.Hdr == nil {
+		return nil, fmt.Errorf("Invalid incoming OMP response; NMP header" +
+			"missing")
+	}
+
+	hdr, err := nmp.DecodeNmpHdr(om.Hdr)
+	if err != nil {
+		return nil, err
+	}
+
+	rsp, err := nmp.DecodeRspBody(hdr, tm.Payload)
+	if err != nil {
+		return nil, fmt.Errorf("Error decoding OMP response: %s", err.Error())
+	}
+	if rsp == nil {
+		return nil, nil
+	}
+
+	return rsp, nil
+}
+
+func EncodeOmpTcp(nmr *nmp.NmpMsg) ([]byte, error) {
+	req := coap.TcpMessage{
+		Message: coap.Message{
+			Type: coap.Confirmable,
+			Code: coap.PUT,
+		},
+	}
+	req.SetPathString("/omgr")
+
+	payload := []byte{}
+	enc := codec.NewEncoderBytes(&payload, new(codec.CborHandle))
+
+	fields := structs.Fields(nmr.Body)
+	m := make(map[string]interface{}, len(fields))
+	for _, f := range fields {
+		if cname := f.Tag("codec"); cname != "" {
+			m[cname] = f.Value()
+		}
+	}
+
+	// Add the NMP heder to the OMP response map.
+	hbytes := nmr.Hdr.Bytes()
+	m["_h"] = hbytes
+
+	if err := enc.Encode(m); err != nil {
+		return nil, err
+	}
+	req.Payload = payload
+
+	data, err := req.MarshalBinary()
+	if err != nil {
+		return nil, fmt.Errorf("Failed to encode: %s\n", err.Error())
+	}
+
+	log.Debugf("Serialized OMP request:\n"+
+		"Hdr %+v:\n%s\nPayload:%s\nData:\n%s",
+		nmr.Hdr, hex.Dump(hbytes), hex.Dump(req.Payload), hex.Dump(data))
+
+	return data, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn.go
new file mode 100644
index 0000000..8ef8934
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn.go
@@ -0,0 +1,79 @@
+package sesn
+
+import (
+	"time"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+)
+
+type TxOptions struct {
+	Timeout time.Duration
+	Tries   int
+}
+
+func (opt *TxOptions) AfterTimeout() <-chan time.Time {
+	if opt.Timeout == 0 {
+		return nil
+	} else {
+		return time.After(opt.Timeout)
+	}
+}
+
+// Represents a communication session with a specific peer.  The particulars
+// vary according to protocol and transport. Several Sesn instances can use the
+// same Xport.
+type Sesn interface {
+	// Initiates communication with the peer.  For connection-oriented
+	// transports, this creates a connection.
+	// Returns:
+	//     * nil: success.
+	//     * nmxutil.SesnAlreadyOpenError: session already open.
+	//     * other error
+	Open() error
+
+	// Ends communication with the peer.  For connection-oriented transports,
+	// this closes the connection.
+	//     * nil: success.
+	//     * nmxutil.SesnClosedError: session not open.
+	//     * other error
+	Close() error
+
+	// Indicates whether the session is currently open.
+	IsOpen() bool
+
+	// Retrieves the maximum data payload for outgoing NMP requests.
+	MtuOut() int
+
+	// Retrieves the maximum data payload for incoming NMP responses.
+	MtuIn() int
+
+	EncodeNmpMsg(msg *nmp.NmpMsg) ([]byte, error)
+
+	// Performs a blocking transmit a single NMP message and listens for the
+	// response.
+	//     * nil: success.
+	//     * nmxutil.SesnClosedError: session not open.
+	//     * other error
+	TxNmpOnce(m *nmp.NmpMsg, opt TxOptions) (nmp.NmpRsp, error)
+
+	// Stops a receive operation in progress.  This must be called from a
+	// separate thread, as sesn receive operations are blocking.
+	AbortRx(nmpSeq uint8) error
+}
+
+func TxNmp(s Sesn, m *nmp.NmpMsg, o TxOptions) (nmp.NmpRsp, error) {
+	retries := o.Tries - 1
+	for i := 0; ; i++ {
+		r, err := s.TxNmpOnce(m, o)
+		if err == nil {
+			return r, nil
+		}
+
+		if (!nmxutil.IsNmpTimeout(err) && !nmxutil.IsXportTimeout(err)) ||
+			i >= retries {
+
+			return nil, err
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn_cfg.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn_cfg.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn_cfg.go
new file mode 100644
index 0000000..e18711d
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/sesn/sesn_cfg.go
@@ -0,0 +1,65 @@
+package sesn
+
+import (
+	"time"
+
+	"mynewt.apache.org/newtmgr/nmxact/bledefs"
+)
+
+type MgmtProto int
+
+const (
+	MGMT_PROTO_NMP MgmtProto = iota
+	MGMT_PROTO_OMP
+)
+
+type BleOnCloseFn func(s Sesn, peer bledefs.BleDev, err error)
+
+// Specifies the BLE peer to connect to.
+type BlePeerSpec struct {
+	// This is filled in if you know the address of the peer to connect to.
+	Dev bledefs.BleDev
+
+	// Otherwise, we must scan for a peer to connect to.  This points to a
+	// function that indicates whether we should connect to the sender of the
+	// specified advertisement.  This function gets called each time an
+	// incoming advertisement is received.  If it returns true, the session
+	// will connect to the sender of the corresponding advertisement.  Set this
+	// to nil if you populate the Dev field.
+	ScanPred bledefs.BleAdvPredicate
+}
+
+func BlePeerSpecDev(dev bledefs.BleDev) BlePeerSpec {
+	return BlePeerSpec{Dev: dev}
+}
+
+func BlePeerSpecName(name string) BlePeerSpec {
+	return BlePeerSpec{
+		ScanPred: func(r bledefs.BleAdvReport) bool {
+			return r.Name == name
+		},
+	}
+}
+
+type SesnCfgBle struct {
+	OwnAddrType  bledefs.BleAddrType
+	PeerSpec     BlePeerSpec
+	CloseTimeout time.Duration
+	OnCloseCb    BleOnCloseFn
+}
+
+type SesnCfg struct {
+	// Used with all transport types.
+	MgmtProto MgmtProto
+
+	// Only used with BLE transports.
+	Ble SesnCfgBle
+}
+
+func NewSesnCfg() SesnCfg {
+	return SesnCfg{
+		Ble: SesnCfgBle{
+			CloseTimeout: 5 * time.Second,
+		},
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/cmd.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/cmd.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/cmd.go
new file mode 100644
index 0000000..d5d7a23
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/cmd.go
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package xact
+
+import (
+	"fmt"
+
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type Result interface {
+	Status() int
+}
+
+type Cmd interface {
+	// Transmits request and listens for response; blocking.
+	Run(s sesn.Sesn) (Result, error)
+	Abort() error
+
+	TxOptions() sesn.TxOptions
+	SetTxOptions(opt sesn.TxOptions)
+}
+
+type CmdBase struct {
+	txOptions sesn.TxOptions
+	curNmpSeq uint8
+	curSesn   sesn.Sesn
+	abortErr  error
+}
+
+func (c *CmdBase) TxOptions() sesn.TxOptions {
+	return c.txOptions
+}
+
+func (c *CmdBase) SetTxOptions(opt sesn.TxOptions) {
+	c.txOptions = opt
+}
+
+func (c *CmdBase) Abort() error {
+	if c.curSesn != nil {
+		if err := c.curSesn.AbortRx(c.curNmpSeq); err != nil {
+			return err
+		}
+	}
+
+	c.abortErr = fmt.Errorf("Command aborted")
+	return nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/config.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/config.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/config.go
new file mode 100644
index 0000000..ddc893b
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/config.go
@@ -0,0 +1,88 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+//////////////////////////////////////////////////////////////////////////////
+// $read                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type ConfigReadCmd struct {
+	CmdBase
+	Name string
+}
+
+func NewConfigReadCmd() *ConfigReadCmd {
+	return &ConfigReadCmd{}
+}
+
+type ConfigReadResult struct {
+	Rsp *nmp.ConfigReadRsp
+}
+
+func newConfigReadResult() *ConfigReadResult {
+	return &ConfigReadResult{}
+}
+
+func (r *ConfigReadResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *ConfigReadCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewConfigReadReq()
+	r.Name = c.Name
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.ConfigReadRsp)
+
+	res := newConfigReadResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $write                                                                   //
+//////////////////////////////////////////////////////////////////////////////
+
+type ConfigWriteCmd struct {
+	CmdBase
+	Name string
+	Val  string
+}
+
+func NewConfigWriteCmd() *ConfigWriteCmd {
+	return &ConfigWriteCmd{}
+}
+
+type ConfigWriteResult struct {
+	Rsp *nmp.ConfigWriteRsp
+}
+
+func newConfigWriteResult() *ConfigWriteResult {
+	return &ConfigWriteResult{}
+}
+
+func (r *ConfigWriteResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *ConfigWriteCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewConfigWriteReq()
+	r.Name = c.Name
+	r.Val = c.Val
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.ConfigWriteRsp)
+
+	res := newConfigWriteResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/crash.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/crash.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/crash.go
new file mode 100644
index 0000000..ebb94c7
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/crash.go
@@ -0,0 +1,87 @@
+package xact
+
+import (
+	"fmt"
+	"sort"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type CrashType int
+
+const (
+	CRASH_TYPE_DIV0 CrashType = iota
+	CRASH_TYPE_JUMP0
+	CRASH_TYPE_REF0
+	CRASH_TYPE_ASSERT
+	CRASH_TYPE_WDOG
+)
+
+var CrashTypeNameMap = map[CrashType]string{
+	CRASH_TYPE_DIV0:   "div0",
+	CRASH_TYPE_JUMP0:  "jump0",
+	CRASH_TYPE_REF0:   "ref0",
+	CRASH_TYPE_ASSERT: "assert",
+	CRASH_TYPE_WDOG:   "wdog",
+}
+
+func CrashTypeToString(ct CrashType) string {
+	return CrashTypeNameMap[ct]
+}
+
+func CrashTypeFromString(s string) (CrashType, error) {
+	for k, v := range CrashTypeNameMap {
+		if s == v {
+			return k, nil
+		}
+	}
+
+	return CrashType(0), fmt.Errorf("invalid crash type: %s", s)
+}
+
+func CrashTypeNames() []string {
+	names := make([]string, 0, len(CrashTypeNameMap))
+	for _, v := range CrashTypeNameMap {
+		names = append(names, v)
+	}
+
+	sort.Strings(names)
+	return names
+}
+
+type CrashCmd struct {
+	CmdBase
+	CrashType CrashType
+}
+
+func NewCrashCmd() *CrashCmd {
+	return &CrashCmd{}
+}
+
+type CrashResult struct {
+	Rsp *nmp.CrashRsp
+}
+
+func newCrashResult() *CrashResult {
+	return &CrashResult{}
+}
+
+func (r *CrashResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *CrashCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewCrashReq()
+	r.CrashType = CrashTypeToString(c.CrashType)
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.CrashRsp)
+
+	res := newCrashResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/datetime.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/datetime.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/datetime.go
new file mode 100644
index 0000000..27bd089
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/datetime.go
@@ -0,0 +1,84 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+///////////////////////////////////////////////////////////////////////////////
+// $read                                                                     //
+///////////////////////////////////////////////////////////////////////////////
+
+type DateTimeReadCmd struct {
+	CmdBase
+}
+
+func NewDateTimeReadCmd() *DateTimeReadCmd {
+	return &DateTimeReadCmd{}
+}
+
+type DateTimeReadResult struct {
+	Rsp *nmp.DateTimeReadRsp
+}
+
+func newDateTimeReadResult() *DateTimeReadResult {
+	return &DateTimeReadResult{}
+}
+
+func (r *DateTimeReadResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *DateTimeReadCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewDateTimeReadReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.DateTimeReadRsp)
+
+	res := newDateTimeReadResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// $write                                                                    //
+///////////////////////////////////////////////////////////////////////////////
+
+type DateTimeWriteCmd struct {
+	CmdBase
+	DateTime string
+}
+
+func NewDateTimeWriteCmd() *DateTimeWriteCmd {
+	return &DateTimeWriteCmd{}
+}
+
+type DateTimeWriteResult struct {
+	Rsp *nmp.DateTimeWriteRsp
+}
+
+func newDateTimeWriteResult() *DateTimeWriteResult {
+	return &DateTimeWriteResult{}
+}
+
+func (r *DateTimeWriteResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *DateTimeWriteCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewDateTimeWriteReq()
+	r.DateTime = c.DateTime
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.DateTimeWriteRsp)
+
+	res := newDateTimeWriteResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/echo.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/echo.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/echo.go
new file mode 100644
index 0000000..09622b2
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/echo.go
@@ -0,0 +1,42 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type EchoCmd struct {
+	CmdBase
+	Payload string
+}
+
+func NewEchoCmd() *EchoCmd {
+	return &EchoCmd{}
+}
+
+type EchoResult struct {
+	Rsp *nmp.EchoRsp
+}
+
+func newEchoResult() *EchoResult {
+	return &EchoResult{}
+}
+
+func (r *EchoResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *EchoCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewEchoReq()
+	r.Payload = c.Payload
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.EchoRsp)
+
+	res := newEchoResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/fs.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/fs.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/fs.go
new file mode 100644
index 0000000..0fe32c6
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/fs.go
@@ -0,0 +1,178 @@
+package xact
+
+import (
+	"fmt"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+//////////////////////////////////////////////////////////////////////////////
+// $download                                                                //
+//////////////////////////////////////////////////////////////////////////////
+
+type FsDownloadProgressCb func(c *FsDownloadCmd, r *nmp.FsDownloadRsp)
+type FsDownloadCmd struct {
+	CmdBase
+	Name       string
+	ProgressCb FsDownloadProgressCb
+}
+
+func NewFsDownloadCmd() *FsDownloadCmd {
+	return &FsDownloadCmd{}
+}
+
+type FsDownloadResult struct {
+	Rsps []*nmp.FsDownloadRsp
+}
+
+func newFsDownloadResult() *FsDownloadResult {
+	return &FsDownloadResult{}
+}
+
+func (r *FsDownloadResult) Status() int {
+	rsp := r.Rsps[len(r.Rsps)-1]
+	return rsp.Rc
+}
+
+func (c *FsDownloadCmd) Run(s sesn.Sesn) (Result, error) {
+	res := newFsDownloadResult()
+	off := 0
+
+	for {
+		r := nmp.NewFsDownloadReq()
+		r.Name = c.Name
+		r.Off = uint32(off)
+
+		rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+		if err != nil {
+			return nil, err
+		}
+		frsp := rsp.(*nmp.FsDownloadRsp)
+		res.Rsps = append(res.Rsps, frsp)
+
+		if frsp.Rc != 0 {
+			break
+		}
+
+		if c.ProgressCb != nil {
+			c.ProgressCb(c, frsp)
+		}
+
+		off = int(frsp.Off) + len(frsp.Data)
+		if off >= int(frsp.Len) {
+			break
+		}
+	}
+
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $upload                                                                  //
+//////////////////////////////////////////////////////////////////////////////
+
+type FsUploadProgressCb func(c *FsUploadCmd, r *nmp.FsUploadRsp)
+type FsUploadCmd struct {
+	CmdBase
+	Name       string
+	Data       []byte
+	ProgressCb FsUploadProgressCb
+}
+
+func NewFsUploadCmd() *FsUploadCmd {
+	return &FsUploadCmd{}
+}
+
+type FsUploadResult struct {
+	Rsps []*nmp.FsUploadRsp
+}
+
+func newFsUploadResult() *FsUploadResult {
+	return &FsUploadResult{}
+}
+
+func (r *FsUploadResult) Status() int {
+	rsp := r.Rsps[len(r.Rsps)-1]
+	return rsp.Rc
+}
+
+func buildFsUploadReq(name string, fileSz int, chunk []byte,
+	off int) *nmp.FsUploadReq {
+
+	r := nmp.NewFsUploadReq()
+
+	if r.Off == 0 {
+		r.Len = uint32(fileSz)
+	}
+	r.Name = name
+	r.Off = uint32(off)
+	r.Data = chunk
+
+	return r
+}
+
+func nextFsUploadReq(s sesn.Sesn, name string, data []byte, off int) (
+	*nmp.FsUploadReq, error) {
+
+	// First, build a request without data to determine how much data could
+	// fit.
+	empty := buildFsUploadReq(name, len(data), nil, off)
+	emptyEnc, err := s.EncodeNmpMsg(empty.Msg())
+	if err != nil {
+		return nil, err
+	}
+
+	room := s.MtuOut() - len(emptyEnc)
+	if room <= 0 {
+		return nil, fmt.Errorf("Cannot create image upload request; " +
+			"MTU too low to fit any image data")
+	}
+
+	// Assume all the unused space can hold image data.  This assumption may
+	// not be valid for some encodings (e.g., CBOR uses variable length fields
+	// to encodes byte string lengths).
+	r := buildFsUploadReq(name, len(data), data[off:off+room], off)
+	enc, err := s.EncodeNmpMsg(r.Msg())
+	if err != nil {
+		return nil, err
+	}
+
+	oversize := len(enc) - s.MtuOut()
+	if oversize > 0 {
+		// Request too big.  Reduce the amount of image data.
+		r = buildFsUploadReq(name, len(data), data[off:off+room-oversize], off)
+	}
+
+	return r, nil
+}
+
+func (c *FsUploadCmd) Run(s sesn.Sesn) (Result, error) {
+	res := newFsUploadResult()
+
+	for off := 0; off < len(c.Data); {
+		r, err := nextFsUploadReq(s, c.Name, c.Data, off)
+		if err != nil {
+			return nil, err
+		}
+
+		rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+		if err != nil {
+			return nil, err
+		}
+		crsp := rsp.(*nmp.FsUploadRsp)
+
+		off = int(crsp.Off)
+
+		if c.ProgressCb != nil {
+			c.ProgressCb(c, crsp)
+		}
+
+		res.Rsps = append(res.Rsps, crsp)
+		if crsp.Rc != 0 {
+			break
+		}
+	}
+
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/image.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/image.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/image.go
new file mode 100644
index 0000000..615dd74
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/image.go
@@ -0,0 +1,332 @@
+package xact
+
+import (
+	"fmt"
+
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+//////////////////////////////////////////////////////////////////////////////
+// $upload                                                                  //
+//////////////////////////////////////////////////////////////////////////////
+
+type ImageUploadProgressFn func(c *ImageUploadCmd, r *nmp.ImageUploadRsp)
+type ImageUploadCmd struct {
+	CmdBase
+	Data       []byte
+	ProgressCb ImageUploadProgressFn
+}
+
+type ImageUploadResult struct {
+	Rsps []*nmp.ImageUploadRsp
+}
+
+func NewImageUploadCmd() *ImageUploadCmd {
+	return &ImageUploadCmd{}
+}
+
+func newImageUploadResult() *ImageUploadResult {
+	return &ImageUploadResult{}
+}
+
+func (r *ImageUploadResult) Status() int {
+	rsp := r.Rsps[len(r.Rsps)-1]
+	return rsp.Rc
+}
+
+func buildImageUploadReq(imageSz int, chunk []byte,
+	off int) *nmp.ImageUploadReq {
+
+	r := nmp.NewImageUploadReq()
+
+	if r.Off == 0 {
+		r.Len = uint32(imageSz)
+	}
+	r.Off = uint32(off)
+	r.Data = chunk
+
+	return r
+}
+
+func nextImageUploadReq(s sesn.Sesn, data []byte, off int) (
+	*nmp.ImageUploadReq, error) {
+
+	// First, build a request without data to determine how much data could
+	// fit.
+	empty := buildImageUploadReq(len(data), nil, off)
+	emptyEnc, err := s.EncodeNmpMsg(empty.Msg())
+	if err != nil {
+		return nil, err
+	}
+
+	room := s.MtuOut() - len(emptyEnc)
+	if room <= 0 {
+		return nil, fmt.Errorf("Cannot create image upload request; " +
+			"MTU too low to fit any image data")
+	}
+
+	// Assume all the unused space can hold image data.  This assumption may
+	// not be valid for some encodings (e.g., CBOR uses variable length fields
+	// to encodes byte string lengths).
+	r := buildImageUploadReq(len(data), data[off:off+room], off)
+	enc, err := s.EncodeNmpMsg(r.Msg())
+	if err != nil {
+		return nil, err
+	}
+
+	oversize := len(enc) - s.MtuOut()
+	if oversize > 0 {
+		// Request too big.  Reduce the amount of image data.
+		r = buildImageUploadReq(len(data), data[off:off+room-oversize], off)
+	}
+
+	return r, nil
+}
+
+func (c *ImageUploadCmd) Run(s sesn.Sesn) (Result, error) {
+	res := newImageUploadResult()
+
+	for off := 0; off < len(c.Data); {
+		r, err := nextImageUploadReq(s, c.Data, off)
+		if err != nil {
+			return nil, err
+		}
+
+		rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+		if err != nil {
+			return nil, err
+		}
+		irsp := rsp.(*nmp.ImageUploadRsp)
+
+		off = int(irsp.Off)
+
+		if c.ProgressCb != nil {
+			c.ProgressCb(c, irsp)
+		}
+
+		res.Rsps = append(res.Rsps, irsp)
+		if irsp.Rc != 0 {
+			break
+		}
+	}
+
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $state read                                                              //
+//////////////////////////////////////////////////////////////////////////////
+
+type ImageStateReadCmd struct {
+	CmdBase
+}
+
+type ImageStateReadResult struct {
+	Rsp *nmp.ImageStateRsp
+}
+
+func NewImageStateReadCmd() *ImageStateReadCmd {
+	return &ImageStateReadCmd{}
+}
+
+func newImageStateReadResult() *ImageStateReadResult {
+	return &ImageStateReadResult{}
+}
+
+func (r *ImageStateReadResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *ImageStateReadCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewImageStateReadReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.ImageStateRsp)
+
+	res := newImageStateReadResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $state write                                                             //
+//////////////////////////////////////////////////////////////////////////////
+
+type ImageStateWriteCmd struct {
+	CmdBase
+	Hash    []byte
+	Confirm bool
+}
+
+type ImageStateWriteResult struct {
+	Rsp *nmp.ImageStateRsp
+}
+
+func NewImageStateWriteCmd() *ImageStateWriteCmd {
+	return &ImageStateWriteCmd{}
+}
+
+func newImageStateWriteResult() *ImageStateWriteResult {
+	return &ImageStateWriteResult{}
+}
+
+func (r *ImageStateWriteResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *ImageStateWriteCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewImageStateWriteReq()
+	r.Hash = c.Hash
+	r.Confirm = c.Confirm
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.ImageStateRsp)
+
+	res := newImageStateWriteResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $corelist                                                                //
+//////////////////////////////////////////////////////////////////////////////
+
+type CoreListCmd struct {
+	CmdBase
+}
+
+type CoreListResult struct {
+	Rsp *nmp.CoreListRsp
+}
+
+func NewCoreListCmd() *CoreListCmd {
+	return &CoreListCmd{}
+}
+
+func newCoreListResult() *CoreListResult {
+	return &CoreListResult{}
+}
+
+func (r *CoreListResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *CoreListCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewCoreListReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.CoreListRsp)
+
+	res := newCoreListResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $coreload                                                                //
+//////////////////////////////////////////////////////////////////////////////
+
+type CoreLoadProgressFn func(c *CoreLoadCmd, r *nmp.CoreLoadRsp)
+type CoreLoadCmd struct {
+	CmdBase
+	ProgressCb CoreLoadProgressFn
+}
+
+type CoreLoadResult struct {
+	Rsps []*nmp.CoreLoadRsp
+}
+
+func NewCoreLoadCmd() *CoreLoadCmd {
+	return &CoreLoadCmd{}
+}
+
+func newCoreLoadResult() *CoreLoadResult {
+	return &CoreLoadResult{}
+}
+
+func (r *CoreLoadResult) Status() int {
+	rsp := r.Rsps[len(r.Rsps)-1]
+	return rsp.Rc
+}
+
+func (c *CoreLoadCmd) Run(s sesn.Sesn) (Result, error) {
+	res := newCoreLoadResult()
+	off := 0
+
+	for {
+		r := nmp.NewCoreLoadReq()
+		r.Off = uint32(off)
+
+		rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+		if err != nil {
+			return nil, err
+		}
+		irsp := rsp.(*nmp.CoreLoadRsp)
+
+		if c.ProgressCb != nil {
+			c.ProgressCb(c, irsp)
+		}
+
+		res.Rsps = append(res.Rsps, irsp)
+		if irsp.Rc != 0 {
+			break
+		}
+
+		if len(irsp.Data) == 0 {
+			// Download complete.
+			break
+		}
+
+		off = int(irsp.Off) + len(irsp.Data)
+	}
+
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $coreerase                                                               //
+//////////////////////////////////////////////////////////////////////////////
+
+type CoreEraseCmd struct {
+	CmdBase
+}
+
+type CoreEraseResult struct {
+	Rsp *nmp.CoreEraseRsp
+}
+
+func NewCoreEraseCmd() *CoreEraseCmd {
+	return &CoreEraseCmd{}
+}
+
+func newCoreEraseResult() *CoreEraseResult {
+	return &CoreEraseResult{}
+}
+
+func (r *CoreEraseResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *CoreEraseCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewCoreEraseReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.CoreEraseRsp)
+
+	res := newCoreEraseResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/log.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/log.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/log.go
new file mode 100644
index 0000000..86b348f
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/log.go
@@ -0,0 +1,202 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+//////////////////////////////////////////////////////////////////////////////
+// $read                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type LogShowCmd struct {
+	CmdBase
+	Name      string
+	Timestamp int64
+	Index     uint32
+}
+
+func NewLogShowCmd() *LogShowCmd {
+	return &LogShowCmd{}
+}
+
+type LogShowResult struct {
+	Rsp *nmp.LogShowRsp
+}
+
+func newLogShowResult() *LogShowResult {
+	return &LogShowResult{}
+}
+
+func (r *LogShowResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *LogShowCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewLogShowReq()
+	r.Name = c.Name
+	r.Timestamp = c.Timestamp
+	r.Index = c.Index
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.LogShowRsp)
+
+	res := newLogShowResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $list                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type LogListCmd struct {
+	CmdBase
+}
+
+func NewLogListCmd() *LogListCmd {
+	return &LogListCmd{}
+}
+
+type LogListResult struct {
+	Rsp *nmp.LogListRsp
+}
+
+func newLogListResult() *LogListResult {
+	return &LogListResult{}
+}
+
+func (r *LogListResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *LogListCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewLogListReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.LogListRsp)
+
+	res := newLogListResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $module list                                                             //
+//////////////////////////////////////////////////////////////////////////////
+
+type LogModuleListCmd struct {
+	CmdBase
+}
+
+func NewLogModuleListCmd() *LogModuleListCmd {
+	return &LogModuleListCmd{}
+}
+
+type LogModuleListResult struct {
+	Rsp *nmp.LogModuleListRsp
+}
+
+func newLogModuleListResult() *LogModuleListResult {
+	return &LogModuleListResult{}
+}
+
+func (r *LogModuleListResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *LogModuleListCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewLogModuleListReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.LogModuleListRsp)
+
+	res := newLogModuleListResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $level list                                                              //
+//////////////////////////////////////////////////////////////////////////////
+
+type LogLevelListCmd struct {
+	CmdBase
+}
+
+func NewLogLevelListCmd() *LogLevelListCmd {
+	return &LogLevelListCmd{}
+}
+
+type LogLevelListResult struct {
+	Rsp *nmp.LogLevelListRsp
+}
+
+func newLogLevelListResult() *LogLevelListResult {
+	return &LogLevelListResult{}
+}
+
+func (r *LogLevelListResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *LogLevelListCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewLogLevelListReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.LogLevelListRsp)
+
+	res := newLogLevelListResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $clear                                                                   //
+//////////////////////////////////////////////////////////////////////////////
+
+type LogClearCmd struct {
+	CmdBase
+}
+
+func NewLogClearCmd() *LogClearCmd {
+	return &LogClearCmd{}
+}
+
+type LogClearResult struct {
+	Rsp *nmp.LogClearRsp
+}
+
+func newLogClearResult() *LogClearResult {
+	return &LogClearResult{}
+}
+
+func (r *LogClearResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *LogClearCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewLogClearReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.LogClearRsp)
+
+	res := newLogClearResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/mpstat.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/mpstat.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/mpstat.go
new file mode 100644
index 0000000..acff3e2
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/mpstat.go
@@ -0,0 +1,40 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type MempoolStatCmd struct {
+	CmdBase
+}
+
+func NewMempoolStatCmd() *MempoolStatCmd {
+	return &MempoolStatCmd{}
+}
+
+type MempoolStatResult struct {
+	Rsp *nmp.MempoolStatRsp
+}
+
+func newMempoolStatResult() *MempoolStatResult {
+	return &MempoolStatResult{}
+}
+
+func (r *MempoolStatResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *MempoolStatCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewMempoolStatReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.MempoolStatRsp)
+
+	res := newMempoolStatResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/reset.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/reset.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/reset.go
new file mode 100644
index 0000000..397ad60
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/reset.go
@@ -0,0 +1,41 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type ResetCmd struct {
+	CmdBase
+	Payload string
+}
+
+func NewResetCmd() *ResetCmd {
+	return &ResetCmd{}
+}
+
+type ResetResult struct {
+	Rsp *nmp.ResetRsp
+}
+
+func newResetResult() *ResetResult {
+	return &ResetResult{}
+}
+
+func (r *ResetResult) Status() int {
+	return 0
+}
+
+func (c *ResetCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewResetReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.ResetRsp)
+
+	res := newResetResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/run.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/run.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/run.go
new file mode 100644
index 0000000..28d71a9
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/run.go
@@ -0,0 +1,86 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+//////////////////////////////////////////////////////////////////////////////
+// $test                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type RunTestCmd struct {
+	CmdBase
+	Testname string
+	Token    string
+}
+
+func NewRunTestCmd() *RunTestCmd {
+	return &RunTestCmd{}
+}
+
+type RunTestResult struct {
+	Rsp *nmp.RunTestRsp
+}
+
+func newRunTestResult() *RunTestResult {
+	return &RunTestResult{}
+}
+
+func (r *RunTestResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *RunTestCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewRunTestReq()
+	r.Testname = c.Testname
+	r.Token = c.Token
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.RunTestRsp)
+
+	res := newRunTestResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $list                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type RunListCmd struct {
+	CmdBase
+}
+
+func NewRunListCmd() *RunListCmd {
+	return &RunListCmd{}
+}
+
+type RunListResult struct {
+	Rsp *nmp.RunListRsp
+}
+
+func newRunListResult() *RunListResult {
+	return &RunListResult{}
+}
+
+func (r *RunListResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *RunListCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewRunListReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.RunListRsp)
+
+	res := newRunListResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/stat.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/stat.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/stat.go
new file mode 100644
index 0000000..a38eba9
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/stat.go
@@ -0,0 +1,84 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+//////////////////////////////////////////////////////////////////////////////
+// $read                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type StatReadCmd struct {
+	CmdBase
+	Name string
+}
+
+func NewStatReadCmd() *StatReadCmd {
+	return &StatReadCmd{}
+}
+
+type StatReadResult struct {
+	Rsp *nmp.StatReadRsp
+}
+
+func newStatReadResult() *StatReadResult {
+	return &StatReadResult{}
+}
+
+func (r *StatReadResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *StatReadCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewStatReadReq()
+	r.Name = c.Name
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.StatReadRsp)
+
+	res := newStatReadResult()
+	res.Rsp = srsp
+	return res, nil
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// $list                                                                    //
+//////////////////////////////////////////////////////////////////////////////
+
+type StatListCmd struct {
+	CmdBase
+}
+
+func NewStatListCmd() *StatListCmd {
+	return &StatListCmd{}
+}
+
+type StatListResult struct {
+	Rsp *nmp.StatListRsp
+}
+
+func newStatListResult() *StatListResult {
+	return &StatListResult{}
+}
+
+func (r *StatListResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *StatListCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewStatListReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.StatListRsp)
+
+	res := newStatListResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/taskstat.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/taskstat.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/taskstat.go
new file mode 100644
index 0000000..bb03357
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/taskstat.go
@@ -0,0 +1,40 @@
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type TaskStatCmd struct {
+	CmdBase
+}
+
+func NewTaskStatCmd() *TaskStatCmd {
+	return &TaskStatCmd{}
+}
+
+type TaskStatResult struct {
+	Rsp *nmp.TaskStatRsp
+}
+
+func newTaskStatResult() *TaskStatResult {
+	return &TaskStatResult{}
+}
+
+func (r *TaskStatResult) Status() int {
+	return r.Rsp.Rc
+}
+
+func (c *TaskStatCmd) Run(s sesn.Sesn) (Result, error) {
+	r := nmp.NewTaskStatReq()
+
+	rsp, err := txReq(s, r.Msg(), &c.CmdBase)
+	if err != nil {
+		return nil, err
+	}
+	srsp := rsp.(*nmp.TaskStatRsp)
+
+	res := newTaskStatResult()
+	res.Rsp = srsp
+	return res, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/xact.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/xact.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/xact.go
new file mode 100644
index 0000000..00c177f
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xact/xact.go
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package xact
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+func txReq(s sesn.Sesn, m *nmp.NmpMsg, c *CmdBase) (
+	nmp.NmpRsp, error) {
+
+	if c.abortErr != nil {
+		return nil, c.abortErr
+	}
+
+	c.curNmpSeq = m.Hdr.Seq
+	c.curSesn = s
+	defer func() {
+		c.curNmpSeq = 0
+		c.curSesn = nil
+	}()
+
+	rsp, err := sesn.TxNmp(s, m, c.TxOptions())
+	if err != nil {
+		return nil, err
+	}
+
+	return rsp, nil
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xport/xport.go
----------------------------------------------------------------------
diff --git a/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xport/xport.go b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xport/xport.go
new file mode 100644
index 0000000..85ef2b2
--- /dev/null
+++ b/newtmgr/vendor/mynewt.apache.org/newtmgr/nmxact/xport/xport.go
@@ -0,0 +1,15 @@
+package xport
+
+import (
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+)
+
+type RxFn func(data []byte)
+
+type Xport interface {
+	Start() error
+	Stop() error
+	BuildSesn(cfg sesn.SesnCfg) (sesn.Sesn, error)
+
+	Tx(data []byte) error
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/example/ble_plain/ble_plain.go
----------------------------------------------------------------------
diff --git a/nmxact/example/ble_plain/ble_plain.go b/nmxact/example/ble_plain/ble_plain.go
index 98c8f9f..44d0566 100644
--- a/nmxact/example/ble_plain/ble_plain.go
+++ b/nmxact/example/ble_plain/ble_plain.go
@@ -23,10 +23,10 @@ import (
 	"fmt"
 	"os"
 
-	"mynewt.apache.org/newt/nmxact/bledefs"
-	"mynewt.apache.org/newt/nmxact/nmble"
-	"mynewt.apache.org/newt/nmxact/sesn"
-	"mynewt.apache.org/newt/nmxact/xact"
+	"mynewt.apache.org/newtmgr/nmxact/bledefs"
+	"mynewt.apache.org/newtmgr/nmxact/nmble"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/xact"
 )
 
 func main() {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/example/serial_plain/serial_plain.go
----------------------------------------------------------------------
diff --git a/nmxact/example/serial_plain/serial_plain.go b/nmxact/example/serial_plain/serial_plain.go
index 05fab27..5b0c3b1 100644
--- a/nmxact/example/serial_plain/serial_plain.go
+++ b/nmxact/example/serial_plain/serial_plain.go
@@ -24,9 +24,9 @@ import (
 	"os"
 	"time"
 
-	"mynewt.apache.org/newt/nmxact/nmserial"
-	"mynewt.apache.org/newt/nmxact/sesn"
-	"mynewt.apache.org/newt/nmxact/xact"
+	"mynewt.apache.org/newtmgr/nmxact/nmserial"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/xact"
 )
 
 func main() {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_act.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_act.go b/nmxact/nmble/ble_act.go
index 08c396f..2aa6678 100644
--- a/nmxact/nmble/ble_act.go
+++ b/nmxact/nmble/ble_act.go
@@ -3,7 +3,7 @@ package nmble
 import (
 	"encoding/json"
 
-	"mynewt.apache.org/newt/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
 )
 
 // Blocking

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_fsm.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_fsm.go b/nmxact/nmble/ble_fsm.go
index daa930b..9c96526 100644
--- a/nmxact/nmble/ble_fsm.go
+++ b/nmxact/nmble/ble_fsm.go
@@ -8,10 +8,10 @@ import (
 
 	log "github.com/Sirupsen/logrus"
 
-	. "mynewt.apache.org/newt/nmxact/bledefs"
-	"mynewt.apache.org/newt/nmxact/nmp"
-	"mynewt.apache.org/newt/nmxact/nmxutil"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 )
 
 type BleSesnState int32

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_oic_sesn.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_oic_sesn.go b/nmxact/nmble/ble_oic_sesn.go
index 949d7aa..365efc6 100644
--- a/nmxact/nmble/ble_oic_sesn.go
+++ b/nmxact/nmble/ble_oic_sesn.go
@@ -5,10 +5,10 @@ import (
 	"sync"
 	"time"
 
-	. "mynewt.apache.org/newt/nmxact/bledefs"
-	"mynewt.apache.org/newt/nmxact/nmp"
-	"mynewt.apache.org/newt/nmxact/omp"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/omp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 	"mynewt.apache.org/newt/util"
 )
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_plain_sesn.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_plain_sesn.go b/nmxact/nmble/ble_plain_sesn.go
index 71133e7..a8a46d6 100644
--- a/nmxact/nmble/ble_plain_sesn.go
+++ b/nmxact/nmble/ble_plain_sesn.go
@@ -5,9 +5,9 @@ import (
 	"sync"
 	"time"
 
-	. "mynewt.apache.org/newt/nmxact/bledefs"
-	"mynewt.apache.org/newt/nmxact/nmp"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 	"mynewt.apache.org/newt/util"
 )
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_proto.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_proto.go b/nmxact/nmble/ble_proto.go
index 85a26f8..fe9112d 100644
--- a/nmxact/nmble/ble_proto.go
+++ b/nmxact/nmble/ble_proto.go
@@ -8,7 +8,7 @@ import (
 	"strconv"
 	"strings"
 
-	. "mynewt.apache.org/newt/nmxact/bledefs"
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
 )
 
 type MsgOp int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_util.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_util.go b/nmxact/nmble/ble_util.go
index 08eb8d9..31f0e62 100644
--- a/nmxact/nmble/ble_util.go
+++ b/nmxact/nmble/ble_util.go
@@ -7,8 +7,8 @@ import (
 
 	log "github.com/Sirupsen/logrus"
 
-	. "mynewt.apache.org/newt/nmxact/bledefs"
-	"mynewt.apache.org/newt/nmxact/nmxutil"
+	. "mynewt.apache.org/newtmgr/nmxact/bledefs"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
 )
 
 const NmpPlainSvcUuid = "8D53DC1D-1DB7-4CD3-868B-8A527460AA84"

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmble/ble_xport.go
----------------------------------------------------------------------
diff --git a/nmxact/nmble/ble_xport.go b/nmxact/nmble/ble_xport.go
index 483bfd1..ba38b9d 100644
--- a/nmxact/nmble/ble_xport.go
+++ b/nmxact/nmble/ble_xport.go
@@ -9,8 +9,8 @@ import (
 
 	log "github.com/Sirupsen/logrus"
 
-	"mynewt.apache.org/newt/nmxact/nmxutil"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 	"mynewt.apache.org/newt/util/unixchild"
 )
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmp/nmp.go
----------------------------------------------------------------------
diff --git a/nmxact/nmp/nmp.go b/nmxact/nmp/nmp.go
index b868e25..bb35743 100644
--- a/nmxact/nmp/nmp.go
+++ b/nmxact/nmp/nmp.go
@@ -27,7 +27,7 @@ import (
 	log "github.com/Sirupsen/logrus"
 	"github.com/ugorji/go/codec"
 
-	"mynewt.apache.org/newt/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
 	"mynewt.apache.org/newt/util"
 )
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmserial/serial_plain_sesn.go
----------------------------------------------------------------------
diff --git a/nmxact/nmserial/serial_plain_sesn.go b/nmxact/nmserial/serial_plain_sesn.go
index a407a98..fe7173e 100644
--- a/nmxact/nmserial/serial_plain_sesn.go
+++ b/nmxact/nmserial/serial_plain_sesn.go
@@ -4,9 +4,9 @@ import (
 	"fmt"
 	"sync"
 
-	"mynewt.apache.org/newt/nmxact/nmp"
-	"mynewt.apache.org/newt/nmxact/nmxutil"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 )
 
 type SerialPlainSesn struct {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/nmserial/serial_xport.go
----------------------------------------------------------------------
diff --git a/nmxact/nmserial/serial_xport.go b/nmxact/nmserial/serial_xport.go
index 6f5aa7c..7dbb5ca 100644
--- a/nmxact/nmserial/serial_xport.go
+++ b/nmxact/nmserial/serial_xport.go
@@ -12,8 +12,8 @@ import (
 	"github.com/joaojeronimo/go-crc16"
 	"github.com/tarm/serial"
 
-	"mynewt.apache.org/newt/nmxact/nmxutil"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 	"mynewt.apache.org/newt/util"
 )
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/omp/dispatch.go
----------------------------------------------------------------------
diff --git a/nmxact/omp/dispatch.go b/nmxact/omp/dispatch.go
index fb25f98..44d1022 100644
--- a/nmxact/omp/dispatch.go
+++ b/nmxact/omp/dispatch.go
@@ -22,7 +22,7 @@ package omp
 import (
 	log "github.com/Sirupsen/logrus"
 
-	"mynewt.apache.org/newt/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
 )
 
 type OmpDispatcher struct {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/omp/omp.go
----------------------------------------------------------------------
diff --git a/nmxact/omp/omp.go b/nmxact/omp/omp.go
index 5bed071..77dbd1b 100644
--- a/nmxact/omp/omp.go
+++ b/nmxact/omp/omp.go
@@ -28,7 +28,7 @@ import (
 	"github.com/runtimeco/go-coap"
 	"github.com/ugorji/go/codec"
 
-	"mynewt.apache.org/newt/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
 )
 
 // OIC wrapping adds this many bytes to an NMP message.

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/sesn/sesn.go
----------------------------------------------------------------------
diff --git a/nmxact/sesn/sesn.go b/nmxact/sesn/sesn.go
index f5bbd3c..8ef8934 100644
--- a/nmxact/sesn/sesn.go
+++ b/nmxact/sesn/sesn.go
@@ -3,8 +3,8 @@ package sesn
 import (
 	"time"
 
-	"mynewt.apache.org/newt/nmxact/nmp"
-	"mynewt.apache.org/newt/nmxact/nmxutil"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/nmxutil"
 )
 
 type TxOptions struct {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/sesn/sesn_cfg.go
----------------------------------------------------------------------
diff --git a/nmxact/sesn/sesn_cfg.go b/nmxact/sesn/sesn_cfg.go
index 9e07c71..e18711d 100644
--- a/nmxact/sesn/sesn_cfg.go
+++ b/nmxact/sesn/sesn_cfg.go
@@ -3,7 +3,7 @@ package sesn
 import (
 	"time"
 
-	"mynewt.apache.org/newt/nmxact/bledefs"
+	"mynewt.apache.org/newtmgr/nmxact/bledefs"
 )
 
 type MgmtProto int

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/xact/cmd.go
----------------------------------------------------------------------
diff --git a/nmxact/xact/cmd.go b/nmxact/xact/cmd.go
index f42b2df..d5d7a23 100644
--- a/nmxact/xact/cmd.go
+++ b/nmxact/xact/cmd.go
@@ -22,7 +22,7 @@ package xact
 import (
 	"fmt"
 
-	"mynewt.apache.org/newt/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 )
 
 type Result interface {

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newtmgr/blob/15498bdc/nmxact/xact/config.go
----------------------------------------------------------------------
diff --git a/nmxact/xact/config.go b/nmxact/xact/config.go
index a0d2f70..ddc893b 100644
--- a/nmxact/xact/config.go
+++ b/nmxact/xact/config.go
@@ -1,8 +1,8 @@
 package xact
 
 import (
-	"mynewt.apache.org/newt/nmxact/nmp"
-	"mynewt.apache.org/newt/nmxact/sesn"
+	"mynewt.apache.org/newtmgr/nmxact/nmp"
+	"mynewt.apache.org/newtmgr/nmxact/sesn"
 )
 
 //////////////////////////////////////////////////////////////////////////////