/**
 *	Frame a string for output to MTT.  Characters not in [0x20, 0x7e]
 *	are converted to blanks (0x20).
 *
 *	@param	p_dest	(out)	pointer to destination buffer
 *	@param	p_src	(in)	pointer to source buffer
 *	@param	buflen	(in)	size of the destination buffer
 *	@return	int		frame length, or -1 on error
 **/
int BCMMTT_FrameString(char *p_dest, const char *p_src, int buflen)
{
	int slen = MTTLOG_StringLen(p_src);
	int n;
	char *pSbuf;
	unsigned long systime;

	if (slen == 0)
		return 0;

	if (slen > buflen - MTTLOG_NumFrameBytes)
		return 0;

	systime = MTTLOG_GetTime();

	pSbuf = p_dest;

	*pSbuf++ = MTTLOG_FrameSync0;
	*pSbuf++ = MTTLOG_FrameSync1;
	if (CpCrashDumpInProgress())
		*pSbuf++ = cp_crash_frame_counter++;
	else
		pSbuf++;
	*pSbuf++ = MTTLOG_MttVersion;

	*pSbuf++ = (systime >> 24);
	*pSbuf++ = (systime >> 16) & 0xff;
	*pSbuf++ = (systime >> 8) & 0xff;
	*pSbuf++ = (systime) & 0xff;

	*pSbuf++ = MTTLOG_MsgTypeASCII >> 8;
	*pSbuf++ = MTTLOG_MsgTypeASCII & 0xFF;

	*pSbuf++ = slen >> 8;
	*pSbuf++ = slen & 0xFF;

	if (CpCrashDumpInProgress()) {
		n = pSbuf - p_dest;
		*pSbuf++ = MTTLOG_Checksum16((unsigned char *)p_dest, n);
	} else
		pSbuf++;

	while (*p_src) {
		/* [0x20 .. 0x7E] is range of 'printable' characters */
		if (*p_src < 0x20 || *p_src > 0x7E) {
			*pSbuf++ = ' ';
			p_src++;
		} else {
			*pSbuf++ = *p_src++;
		}
	}

	n = MTTLOG_Checksum16((unsigned char *)(pSbuf - slen), slen);

	*pSbuf++ = n >> 8;
	*pSbuf++ = n & 0xFF;

	return MTTLOG_NumFrameBytes + slen;
}
/**
 *	Frame ap crash string for output to MTT.
 *
 *	@param	p_header(out)	pointer to destination header buffer
 *	@param	p_trailer(out)	pointer to destination trailer buffer
 *	@param	p_src	(in)	pointer to source buffer
 *	@return	int		string length, or 0 on error
 **/
int BCMMTT_FrameString_nocopy(char *p_header, char *p_trailer,
			      const char *p_src)
{
	int slen = MTTLOG_StringLen(p_src);
	int n;
	char *pSbuf;
	unsigned long systime;

	if (slen == 0)
		return 0;

	systime = MTTLOG_GetTime();

	pSbuf = p_header;

	*pSbuf++ = MTTLOG_FrameSync0;
	*pSbuf++ = MTTLOG_FrameSync1;
	*pSbuf++ = ap_crash_frame_counter++;
	*pSbuf++ = MTTLOG_MttVersion;

	*pSbuf++ = (systime >> 24);
	*pSbuf++ = (systime >> 16) & 0xff;
	*pSbuf++ = (systime >> 8) & 0xff;
	*pSbuf++ = (systime) & 0xff;

	*pSbuf++ = MTTLOG_MsgTypeASCII >> 8;
	*pSbuf++ = MTTLOG_MsgTypeASCII & 0xFF;

	*pSbuf++ = slen >> 8;
	*pSbuf++ = slen & 0xFF;

	n = pSbuf - p_header;
	*pSbuf++ = MTTLOG_Checksum16((unsigned char *)p_header, n);

	n = MTTLOG_Checksum16((unsigned char *)(p_src), slen);

	*p_trailer++ = n >> 8;
	*p_trailer++ = n & 0xFF;

	return slen;
}
/**
 *	Function build log loss MTT message
 *	@param	ptr (in) allocated memory pointer
 **/
unsigned int BCMLOG_BuildLogLossMessage(char *ptr)
{
	int slen;
	int n;
	char *pSbuf;
	unsigned int systime;

	systime = MTTLOG_GetTime();

	snprintf(ptr + MTT_HEADER_SIZE,
		 BCMLOG_LOGLOSS_SIZE,
		 logloss_format,
		 log_error.logLostStartTime,
		 systime,
		 log_error.msgLostQue,
		 log_error.msgLostMem,
		 log_error.logLostSioFull,
		 log_error.logLostSioSem,
		 log_error.copyLostMem, log_error.msgLostInit);

	slen = strlen(ptr + MTT_HEADER_SIZE);
	if (slen >= BCMLOG_LOGLOSS_SIZE)
		return 0;

	pSbuf = ptr;

	*pSbuf++ = MTTLOG_FrameSync0;
	*pSbuf++ = MTTLOG_FrameSync1;
	pSbuf++;		/* reserved for frame counter */
	*pSbuf++ = MTTLOG_MttVersion;

	*pSbuf++ = (systime >> 24);
	*pSbuf++ = (systime >> 16) & 0xff;
	*pSbuf++ = (systime >> 8) & 0xff;
	*pSbuf++ = (systime) & 0xff;

	*pSbuf++ = MTTLOG_MsgTypeASCII >> 8;
	*pSbuf++ = MTTLOG_MsgTypeASCII & 0xFF;

	*pSbuf++ = slen >> 8;
	*pSbuf++ = slen & 0xFF;

	pSbuf++;		/* reserved for checksum */

	n = MTTLOG_Checksum16((unsigned char *)(ptr + MTT_HEADER_SIZE), slen);

	pSbuf += slen;

	*pSbuf++ = n >> 8;
	*pSbuf++ = n & 0xFF;

	return MTTLOG_NumFrameBytes + slen;
}
/**
 *	Return the MTT frame header required for MTT signal payload of specified size
 *
 *	@param	inPayloadSize (in)	    size of MTT payload to be sent
 *	@param	outFrameHdrBuf (out)    buffer where frame header should be stored
 *                                  (allocated by caller)
 *	@return	int				    size of header written to outFrameHdrBuf or -1 on error
 **/
int BCMMTT_MakeMTTSignalHeader( unsigned short inPayloadSize, unsigned char* outFrameHdrBuf )
{
	unsigned char* pHbuf;
	unsigned short i;
	unsigned long trace_time_stamp;

    
	trace_time_stamp = timer_get_tick_count() / 32;	

	pHbuf = outFrameHdrBuf;

	*pHbuf++ = MTTLOG_FrameSync0;
	*pHbuf++ = MTTLOG_FrameSync1;

	if (CpCrashDumpInProgress())
		*pHbuf++ = cp_crash_frame_counter++;
	else
	pHbuf++;
	*pHbuf++ = MTTLOG_MttVersion;
	*pHbuf++ = trace_time_stamp>>24;
	*pHbuf++ = (trace_time_stamp>>16)&0xFF;
	*pHbuf++ = (trace_time_stamp>>8)&0xFF;
	*pHbuf++ = trace_time_stamp & 0xFF;
	i = MTTLOG_MsgTypeSDL;
	*pHbuf++ = i>>8;
	*pHbuf++ = i & 0xFF;
	*pHbuf++ = inPayloadSize>>8;
	*pHbuf++ = inPayloadSize & 0xFF;
	// done at logging driver to assure sequential increase of 
	if (CpCrashDumpInProgress())
	{
		*pHbuf++ = MTTLOG_Checksum16( outFrameHdrBuf, 12 );
	}
	else
	pHbuf++;

	return (int)(pHbuf - outFrameHdrBuf);
}