in nmxact/nmserial/serial_xport.go [303:372]
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 = errTimeout
sx.scanner = bufio.NewScanner(sx.port)
}
return nil, err
}