code: func decode(packet []byte) (interface{}, error) {
  	var msg interface{}
  	switch packet[0] {
  	case msgDisconnect:
  		msg = new(disconnectMsg)
  	case msgServiceRequest:
  		msg = new(serviceRequestMsg)
  	case msgServiceAccept:
  		msg = new(serviceAcceptMsg)
  	case msgKexInit:
  		msg = new(kexInitMsg)
  	case msgKexDHInit:
  		msg = new(kexDHInitMsg)
  	case msgKexDHReply:
  		msg = new(kexDHReplyMsg)
  	case msgUserAuthRequest:
  		msg = new(userAuthRequestMsg)
  	case msgUserAuthFailure:
  		msg = new(userAuthFailureMsg)
  	case msgUserAuthPubKeyOk:
  		msg = new(userAuthPubKeyOkMsg)
  	case msgGlobalRequest:
  		msg = new(globalRequestMsg)
  	case msgRequestSuccess:
  		msg = new(globalRequestSuccessMsg)
  	case msgRequestFailure:
  		msg = new(globalRequestFailureMsg)
  	case msgChannelOpen:
  		msg = new(channelOpenMsg)
  	case msgChannelOpenConfirm:
  		msg = new(channelOpenConfirmMsg)
  	case msgChannelOpenFailure:
  		msg = new(channelOpenFailureMsg)
  	case msgChannelWindowAdjust:
  		msg = new(windowAdjustMsg)
  	case msgChannelEOF:
  		msg = new(channelEOFMsg)
  	case msgChannelClose:
  		msg = new(channelCloseMsg)
  	case msgChannelRequest:
  		msg = new(channelRequestMsg)
  	case msgChannelSuccess:
  		msg = new(channelRequestSuccessMsg)
  	case msgChannelFailure:
  		msg = new(channelRequestFailureMsg)
  	default:
  		return nil, unexpectedMessageError(0, packet[0])
  	}
  	if err := Unmarshal(packet, msg); err != nil {
  		return nil, err
  	}
  	return msg, nil
  }
docs: // Decode a packet into its corresponding message.