⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpiptrcdlg.cpp

📁 lwip tcp/ip 协议栈 adsp BF533 DSP 移植 用 visual dsp++ 编译
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// TCPIPTrcDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TCPIPTrc.h"
#include "TCPIPTrcDlg.h"
#include "DlgProxy.h"
#include <atlconv.h>
#include <atlbase.h>
#include <stddef.h>
#include <winsock.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif




VOID ReaderThread(LPVOID lpvParam);

static char  ADI_TOOLS_TCPIP_RegistryKey[] = "Software\\Analog Devices\\VisualDSP++\\TCPIPTrace";
static char  ADI_TOOLS_TCPIPTraceFile[] = TEXT("TraceFile");

void SaveTraceFileIntoRegistry(char *in_filename)
{
	HKEY hTCPIPKey;
	DWORD dwResult;

	if(RegCreateKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,"REG_SZ",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hTCPIPKey,&dwResult) != ERROR_SUCCESS)
	{
		// creating registry entry failed..returning.
		return;
	}
	
	if(in_filename != NULL)
		RegSetValueEx(hTCPIPKey,ADI_TOOLS_TCPIPTraceFile,0,REG_SZ,(unsigned char*)in_filename,strlen(in_filename));

	RegCloseKey(hTCPIPKey);
}
void SaveDWORDIntoRegistry(char *name, DWORD vl)
{
	HKEY hTCPIPKey;
	DWORD dwResult;

	if(RegCreateKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,"REG_SZ",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hTCPIPKey,&dwResult) != ERROR_SUCCESS)
	{
		// creating registry entry failed..returning.
		return;
	}
	
	RegSetValueEx(hTCPIPKey,name,0,REG_DWORD,(unsigned char*)&vl,sizeof(vl));

	RegCloseKey(hTCPIPKey);
}

// Copies the last file form registry to the path supplied 
//
bool GetTraceFileFromRegistry(char *out_filename)
{
	BYTE  temp_filename[512];
	HKEY  hTCPIPKey;
	DWORD dwType;
	DWORD dwRead;

	if((RegOpenKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,KEY_ALL_ACCESS  | KEY_QUERY_VALUE
		,&hTCPIPKey) != ERROR_SUCCESS))
	{
		// nothing to load..copy null and return..
		*out_filename = '\0';
		return false;
	}
	
	if(out_filename != NULL)
	{
		dwRead = sizeof(temp_filename);
		if((RegQueryValueExA(hTCPIPKey,ADI_TOOLS_TCPIPTraceFile,NULL,&dwType,temp_filename,&dwRead) != ERROR_SUCCESS))
		{
			*out_filename = '\0';
			return false;
		}
		strcpy(out_filename,(char*)temp_filename);
	}

	RegCloseKey(hTCPIPKey);
	return true;
}

bool GetDWORDFromRegistry(char *name, DWORD *vl)
{
	HKEY  hTCPIPKey;
	DWORD dwType;
	DWORD dwRead,tvl;

	if((RegOpenKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,KEY_ALL_ACCESS  | KEY_QUERY_VALUE
		,&hTCPIPKey) != ERROR_SUCCESS))
	{
		// nothing to load..copy null and return..
		return false;
	} else {
	
		dwRead = sizeof(tvl);
		if((RegQueryValueExA(hTCPIPKey,name,NULL,&dwType,(unsigned char *)&tvl,&dwRead) != ERROR_SUCCESS))
		{
			return false;
		}
		if (dwType == REG_DWORD) *vl = tvl;
	}

	RegCloseKey(hTCPIPKey);
	return true;
}

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTCPIPTrcDlg dialog

IMPLEMENT_DYNAMIC(CTCPIPTrcDlg, CDialog);

CTCPIPTrcDlg::CTCPIPTrcDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTCPIPTrcDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTCPIPTrcDlg)
	m_FileName = _T("");
	m_SaveAll = FALSE;
	m_Channel = 0;
	m_NoEvents = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pAutoProxy = NULL;
	m_Stopped = true;
	m_Listen = m_Client = INVALID_SOCKET;
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD( 2, 2 );

	err =WSAStartup( wVersionRequested, &wsaData );
}

CTCPIPTrcDlg::~CTCPIPTrcDlg()
{
	// If there is an automation proxy for this dialog, set
	//  its back pointer to this dialog to NULL, so it knows
	//  the dialog has been deleted.
	if (m_pAutoProxy != NULL)
		m_pAutoProxy->m_pDialog = NULL;
}

void CTCPIPTrcDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTCPIPTrcDlg)
	DDX_Control(pDX, IDC_REPORT, m_ReportCtrl);
	DDX_Control(pDX, IDC_LOCALIP, m_LocalIPCtrl);
	DDX_Control(pDX, IDC_CHANNEL, m_ChannelCtrl);
	DDX_Control(pDX, IDC_STOPACQ, m_StopAcqCtrl);
	DDX_Control(pDX, IDC_STARTACQ, m_StartAcqCtrl);
	DDX_Control(pDX, IDC_SAVECUR, m_SaveCurCtrl);
	DDX_Control(pDX, IDC_SAVEALL, m_SaveAllCtrl);
	DDX_Control(pDX, IDC_PAUSE, m_PauseCtrl);
	DDX_Control(pDX, IDC_NOEVENTS, m_NoEventsCtrl);
	DDX_Control(pDX, IDC_FILENAME, m_FileNameCtrl);
	DDX_Control(pDX, IDC_EVENTLIST, m_EventListCtrl);
	DDX_Text(pDX, IDC_FILENAME, m_FileName);
	DDX_Check(pDX, IDC_SAVEALL, m_SaveAll);
	DDX_Text(pDX, IDC_CHANNEL, m_Channel);
	DDX_Text(pDX, IDC_NOEVENTS, m_NoEvents);
	DDV_MinMaxLong(pDX, m_NoEvents, 0, 1000000000);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTCPIPTrcDlg, CDialog)
	//{{AFX_MSG_MAP(CTCPIPTrcDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CLOSE()
	ON_BN_CLICKED(ID_HELP, OnHelp)
	ON_EN_CHANGE(IDC_FILENAME, OnChangeFilename)
	ON_EN_CHANGE(IDC_NOEVENTS, OnChangeNoevents)
	ON_BN_CLICKED(IDC_PAUSE, OnPause)
	ON_BN_CLICKED(IDC_SAVECUR, OnSavecur)
	ON_BN_CLICKED(IDC_SAVEFILE, OnSavefile)
	ON_BN_CLICKED(IDC_STARTACQ, OnStartacq)
	ON_BN_CLICKED(IDC_STOPACQ, OnStopacq)
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	ON_EN_CHANGE(IDC_CHANNEL, OnChangeChannel)
	ON_BN_CLICKED(IDC_SAVEALL, OnSaveall)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()







/*
 * This function converts the given 32 bit value to host byte order.
 */
static unsigned long dsp_ntohl(unsigned long value)
{
	unsigned long ret_value;

	ret_value = (((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) |
				((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24));

	return(ret_value);}

/*
 * This function converts the given 16 bit value to host byte order.
 */
static short dsp_ntohs(short value)
{
	short ret_value;

	ret_value = ((value & 0x000000FF) << 8) | ((value & 0x0000FF00) >> 8);
	return(ret_value);
}



char *  CTCPIPTrcDlg::FindHostName(int IpAddrs, char *bf)
{
	int i;
	unsigned char *ic;
	
	for (i=0; i<m_NoHostNames; i++) {
		if (IpAddrs == m_HostMap[i].IpAddrs) {
			return (char *)m_HostMap[i].HostName;
		}
	}
	// generate 1.2.3.4
	ic = (unsigned char *)&IpAddrs;
	sprintf(bf,"%u.%u.%u.%u",ic[0],ic[1],ic[2],ic[3]);
	return bf;
}

static GetMac(unsigned char *mac, char *buf)
{
	sprintf(buf,"%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
			mac[0],mac[1],mac[2],
			mac[3],mac[4],mac[5]);
}
void  CTCPIPTrcDlg::DumpIPTraceEntry(
		unsigned char id, int nbytes, unsigned short clk,
		unsigned char *hdr)
{
	int rcvd = (id=='R'); 
	
	if (nbytes>0) {
		// we have to format the buffer
		char adr1[20],adr2[20],adr3[4];
		char *src,*dst,*prot;
		char line[128],codes[32];
		int cnext=0;
		datagram dd;
		datagram *d;
		udp uu;
		udp *u;
		tcp tt;
		tcp *t;
		icmp iicm;
		icmp *icm;
		int hdrlen = nbytes;
		int data=0;
		static char *ctext[] = {"FIN ","SYN ","RST ","PSH ","ACK ","URG ",0};
		int ic=0;
		int ndata;
		
		memcpy(&dd,hdr,sizeof(dd));
		d = &dd; // get fields aligned
		// format the IP header first
		src = FindHostName(d->Source,adr1);
		dst = FindHostName(d->Dest,adr2);
		switch(d->Protocol) {
		case ICMP_PROTOCOL:
			prot = "ICMP";
			break;
		case TCP_PROTOCOL:
			prot = "TCP";
			break;
		case UDP_PROTOCOL:
			prot = "UDP";
			break;
		default:
		    sprintf(adr3,"%d",d->Protocol);
			prot = adr3;
		    break;
		}
		sprintf(m_StrBuffer,"%4.4x %cX src=%s, dest=%s, prot=%s,frag=%u, length=%u",
				clk,(rcvd?'R':'T'),src,dst,prot,d->FlagsFragOffset&0x1fff,dsp_ntohs(d->TotalLnth));
		AppendLine();
		data = ((d->VersHlen&0x0f)*4); /* start of any data */
		switch (d->Protocol) {
		case ICMP_PROTOCOL:
			memcpy(&iicm,(icmp *)(hdr+(d->VersHlen&0x0f)*4),sizeof(iicm));
			icm = &iicm;
			sprintf(m_StrBuffer,"\t   icmp type=%u, qual=%u",
						icm->Type,icm->Qual);
			data += sizeof(iicm);
			AppendLine();
			break;
		case TCP_PROTOCOL:
			memcpy(&tt,(tcp *)(hdr+(d->VersHlen&0x0f)*4),sizeof(tt));
			t = &tt;
			for (ic=0;ic<6;ic++) {
				if ((t->Code>>ic)&1) {
					memcpy(codes+cnext,ctext[ic],4);
					cnext+=4;
				}
			}
			codes[cnext] = 0;
			sprintf(m_StrBuffer,"\t   sport=0x%x, dport=0x%4.4x, seq=%x, ack=0x%x, win=%u code=%s",
						dsp_ntohs(t->SrcPort),dsp_ntohs(t->DstPort),dsp_ntohl(t->SeqNo),dsp_ntohl(t->AckNo),dsp_ntohs(t->Window),codes);
			data += ((tt.Hlen>>4)*4);
			AppendLine();
			break;
		case UDP_PROTOCOL:
			memcpy(&uu,(udp *)(hdr+(d->VersHlen&0x0f)*4),sizeof(uu));
			u = &uu;
			sprintf(m_StrBuffer,"\t   sport=0x%x, dport=0x%4.4x, msg length=%u",
						dsp_ntohs(u->SrcPort),dsp_ntohs(u->DstPort),dsp_ntohs(u->MsgLnth));
			data += sizeof(uu);
			AppendLine();
			break;
		default:
			break;
		}
		ndata = hdrlen  - data;
		
		
		if (ndata>0) {
			int nxt=3;
			int mx=sizeof(line)-2;
			int inl=0;
			char *ch=line+53;

			strcpy(m_StrBuffer,"\t");
			memset(line,' ',72);
			while (ndata>0) {
				sprintf(line+nxt,"%2.2x ",hdr[data]);
				if ((33<=hdr[data]) && (hdr[data]<=126)) {
					*ch = hdr[data];
				} else {
					*ch = '.';
				}
				ch++;
				nxt += 3;
				data++;
				inl++;
				if (inl>15) {
					line[nxt] = ' ';
					*ch  = 0;
					strcat(m_StrBuffer,line);
					AppendLine();
					strcpy(m_StrBuffer,"\t");
					memset(line,' ',72);
					nxt = 3;
					inl = 0;
					ch=line+53;
				}
				ndata--;
			}
			if (nxt>3) {
				line[nxt] = ' ';
				*ch  = 0;
				strcat(m_StrBuffer,line);
				AppendLine();
			}
		}
	} else {
		sprintf(m_StrBuffer,"%4.4x %cX empty IP packet",
					clk,(rcvd?'R':'T'));
		AppendLine();
	}
}

void  CTCPIPTrcDlg::DumpArpTraceEntry(
		unsigned char id, int nbytes, unsigned short clk,
		unsigned char *hdr)
{
	int rcvd = (id=='R');  
	
	if (nbytes>0) {
		// we have to format the buffer
		unsigned short oper;
		char adr1[20],adr2[20],adr3[20],adr4[20];
		char *src,*dst,*prot;
		int ip;
		
		oper = dsp_ntohs(*((unsigned short *)(hdr+6)));
		switch (oper) {
		case 1:
			prot = "AREQ";
			break;
		case 2:
			prot = "ARSP";
			break;
		case 3:
			prot = "RREQ";
			break;
		case 4:
			prot = "RRSP";
			break;
		default:
		    sprintf(adr3,"%2.2x",oper);
			prot = adr3;
		    break;
		}
		
		// format the IP header first
		memcpy(&ip,hdr+14,4);
		src = FindHostName(ip,adr1);
		GetMac(hdr+8,adr3);
		memcpy(&ip,hdr+24,4);
		dst = FindHostName(ip,adr2);
		GetMac(hdr+18,adr4);
		sprintf(m_StrBuffer,"%4.4x %cX ARP OPER=%s Snd MAC=%s Snd IP=%s Tgt MAC=%s Tgt IP=%s",
					clk,(rcvd?'R':'T'),prot,adr3,src,adr4,dst);
	} else {
		sprintf(m_StrBuffer,"%4.4x %cX empty ARP packet",
					clk,(rcvd?'R':'T'));
	}
	AppendLine();
}

void  CTCPIPTrcDlg::DumpDefTraceEntry(
		unsigned char id, int nbytes, unsigned short clk,
		unsigned char *hdr)
{
	char pid[32];
	int i;

	if ((' '<=id) && (id<=126)) {
		pid[0] = id;
		pid[1] = 0;
	} else {
		sprintf(pid,"0x%2.2x",id);
	}
	
	sprintf(m_StrBuffer,"%4.4x ID=%s nbytes=%d ",clk,pid,nbytes);
	if (nbytes>0) {
		if (nbytes>8) nbytes = 8;
		for (i=0;i<nbytes;i++) {
			sprintf(pid,"%2.2x ",hdr[i]);
			strcat(m_StrBuffer,pid);
		}

	}
	AppendLine();
}

void  CTCPIPTrcDlg::DumpTraceEntry(
		unsigned char *hdr)
{
	unsigned short frame;
	int nbytes = hdr[1];
	unsigned short clk,frm;
	int def=0;
	
	m_TrcIndex++;
	if (!m_Paused) m_NoEntries++;
	InterlockedIncrement(&m_TraceListSize);

	if (m_TrcIndex>200) {
		int jj=5;
	}

	if ((hdr[0]=='T') || (hdr[0]=='R')) {
		
		m_LastNdx = -1;
		memcpy(&clk,hdr+2,2);
		memcpy(&frm,hdr+16,2);
		if (nbytes>13)  {
			frame = dsp_ntohs(frm);
			if (frame == 0x0800) {
				DumpIPTraceEntry(hdr[0],nbytes, clk,hdr+18);
			} else if (frame == 0x0806) {
				DumpArpTraceEntry(hdr[0],nbytes, clk,hdr+18);
			} else {
				// dump nothing
				def = 1;
			}
		} else {
			def = 1;
		}
		if (def) {
			DumpDefTraceEntry(hdr[0],nbytes,clk,hdr+4);
		}
		if (m_LastNdx>=0) {
			m_EventListCtrl.SetCurSel(m_LastNdx);
		}
	}
}


void CTCPIPTrcDlg::AppendLine(void)
{
	TraceLine *lin;

	if (m_Trc) {
		fprintf(m_Trc,"%s\n",m_StrBuffer);
	}
	lin = (TraceLine *)malloc(sizeof(TraceLine));
	if (lin!=NULL) {

		EnterCriticalSection(&m_Critical);
		lin->Next = NULL;
		lin->Mark = m_TrcIndex;
		lin->Data = (char *)malloc(strlen(m_StrBuffer)+1);
		if (lin->Data) {
			strcpy(lin->Data,m_StrBuffer);
		} else {
			free(lin);
			lin = NULL;
		}
		if (lin!=NULL) {
			// append it to the tail
			if (m_TraceTail) {
				m_TraceTail->Next = lin;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -