OpenCores
URL https://opencores.org/ocsvn/10_100m_ethernet-fifo_convertor/10_100m_ethernet-fifo_convertor/trunk

Subversion Repositories 10_100m_ethernet-fifo_convertor

[/] [10_100m_ethernet-fifo_convertor/] [verilog/] [concise.cpp] - Rev 10

Compare with Previous | Blame | View Log

#include <stdio.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netpacket/packet.h>
#include <net/ethernet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
 
#define MAC_ADD_FPGA 0x00,0x00,0x00,0x00,0x00,0x01
#define MAC_ADD_PC   0x00,0x00,0x00,0x00,0x00,0x02
 
#define num 8
 
const unsigned char sndhead[]={MAC_ADD_FPGA, MAC_ADD_PC, 0x00, 0x00};
const unsigned char mac_fpga[]={MAC_ADD_FPGA};
 
void printdata(char* str, unsigned char* buf1, int size);
 
int main(){
	int error_cnt=0;
	int frame_cnt=1000;
	long int frame_number, fn1=0, fn2=0, fn3=0;
 
	unsigned int sndlen=14+3+((unsigned int)(148*num/8));
	unsigned int rcvlen=14+3+((unsigned int)(156.25*num/8))+1;
 
	unsigned char sndbuf[sndlen];	//6+6+2+3+8*148
	unsigned char rcvbuf[rcvlen];	//actually is 96 = 6+6+2+3+[4*156.25]+1
 
	unsigned char* sndlentype = sndbuf + 12;
	unsigned char* sndframenumber = sndbuf + 14;
	unsigned char* snddata = sndbuf + 17;
 
	unsigned char* rcvlentype = rcvbuf + 12;	
	unsigned char* rcvframenumber = rcvbuf + 14;
	unsigned char* rcvdata = rcvbuf + 17;
 
	unsigned char* temppoint;
 
	int mSocketFD;
	struct ifreq ifstruct;
	struct sockaddr_ll sll;
	int retval = 0;
 
	struct timeval testtime;
	long int usec2, usec1;
 
	memcpy(sndbuf, sndhead, 14);
 
	// create
	mSocketFD = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
	if (mSocketFD < 0){
		perror("socket()");
	}
 
	//struct ifreq ifstruct;
	strcpy(ifstruct.ifr_name, "eth2");
	retval = ioctl(mSocketFD, SIOCGIFINDEX, &ifstruct);
	if(retval == -1){
		perror("RAWSocket::open(): ioctl()");
	}
 
	//struct sockaddr_ll sll;
	memset(&sll, 0, sizeof(sll));
	sll.sll_family = AF_PACKET;
	sll.sll_protocol = htons(ETH_P_ALL);
	sll.sll_ifindex = ifstruct.ifr_ifindex;
 
	// bind
	retval = bind(mSocketFD, (struct sockaddr *)&sll, sizeof(sll));
	if(retval == -1)
	{
		perror("RAWSocket::open(): bind()");
	}
 
	// set recive buffer size
	//int rcvbuflen = BUFFER_SIZE;
	int rcvbuflen = 4000;//442;//221;
	retval = setsockopt(mSocketFD, SOL_SOCKET, SO_RCVBUF, (char *)&rcvbuflen, sizeof(int));
	if (retval == -1)
	{
		perror("RAWSocket::read(): setsockopt()");
	}
	// set send buffer size
	//int sndbuflen = BUFFER_SIZE;
	int sndbuflen = 15000;
	retval = setsockopt(mSocketFD, SOL_SOCKET, SO_SNDBUF, (char *)&sndbuflen, sizeof(int));
	if (retval == -1)
	{
		perror("RAWSocket::read(): setsockopt()");
	}
 
	frame_number = 0;
	sndframenumber[0] = frame_number;
	sndframenumber[1] = frame_number >> 8;
	sndframenumber[2] = frame_number >> 16;
 
	temppoint=snddata;
	for(int i=0; i< sndlen-17; i++){
		if(frame_number%2==0) 
			*temppoint=0;//((((unsigned char)frame_number)&0x07)<<4)|(((unsigned char)frame_number)&0x07);
		else
			*temppoint= 0xff;
		temppoint++;
	}
 
	retval = send(mSocketFD, sndbuf, sndlen, 0);
	if (retval < 0)
	{
		perror("sendto()");
	}
 
	while( (frame_cnt>=0)&&( (retval = recv(mSocketFD, (void*)rcvbuf, rcvlen, 0)) >=0) ) {
 
		//printf("received data length: %d\n", retval);
 
		if (retval < 42){
			perror("recvfrom():");
			break;
		}
 
 
		fn3 = fn2;	fn2 = fn1;
		fn1 = (long int)(rcvbuf[16]<<16) + (rcvbuf[15]<<8) + rcvbuf[14];
		long int temp;
 
 
		frame_number ++;  frame_cnt--;
			sndframenumber[0] = frame_number;
			sndframenumber[1] = frame_number >> 8;
			sndframenumber[2] = frame_number >> 16;
 
		if (memcmp(mac_fpga, rcvbuf+6, 6) == 0)
		{
			gettimeofday(&testtime, NULL);	
			usec2=usec1;				
			usec1=testtime.tv_usec;
 
			temp=(usec1+1000000-usec2)%1000000;
			printf("%5ld\t%5ld\t%5ld\t%x", temp, fn2, fn1, fn1&0x07);
 
			if( fn2+1 != fn1){
				printf("\t%5ld\t*\n",frame_number);	
				error_cnt++;
			}else printf("\t%5ld\n", frame_number);
 
			printdata(NULL, rcvbuf,rcvlen);
 
			temppoint=snddata;
			for(int i=0; i< sndlen-17; i++){
				if(frame_number%2==0) 
					*temppoint=0;//((((unsigned char)frame_number)&0x07)<<4)|(((unsigned char)frame_number)&0x07);
				else
					*temppoint= 0xff;
				temppoint++;
			}
 
			retval = send(mSocketFD, sndbuf, sndlen, 0);
			if (retval < 0) perror("sendto()");
		}
 
	}
	printf("the total number of wrong frames is:%d\n", error_cnt);	
}
 
 
void printdata(char* str, unsigned char* buf1, int size)
{
	unsigned char temp=0;
	unsigned int i;
	unsigned char* buf=buf1;
 
	i=0;
	printf("%s:\n",str);
	if(size==0){
		printf("\t\tNot data!\n");
	}else{
		printf("\t\t");
		while((size>0)&&(i<512))
		{
			printf(" %02x",*buf);
			temp++; size--; buf++; i++;
			if(!(temp & 3))
			{
				if(temp==16)
				{
					temp=0;
					printf("\n\t\t");
				}else
					printf(" ");
			}
		}
		printf("\n");
	}
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.