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] - Blame information for rev 10

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 antiquity
#include <stdio.h>
2
#include <errno.h>
3
#include <sys/ioctl.h>
4
#include <net/if.h>
5
#include <netpacket/packet.h>
6
#include <net/ethernet.h>
7
#include <netinet/in.h>
8
#include <string.h>
9
#include <stdlib.h>
10
#include <sys/time.h>
11
 
12
#define MAC_ADD_FPGA 0x00,0x00,0x00,0x00,0x00,0x01
13
#define MAC_ADD_PC   0x00,0x00,0x00,0x00,0x00,0x02
14
 
15
#define num 8
16
 
17
const unsigned char sndhead[]={MAC_ADD_FPGA, MAC_ADD_PC, 0x00, 0x00};
18
const unsigned char mac_fpga[]={MAC_ADD_FPGA};
19
 
20
void printdata(char* str, unsigned char* buf1, int size);
21
 
22
int main(){
23
        int error_cnt=0;
24
        int frame_cnt=1000;
25
        long int frame_number, fn1=0, fn2=0, fn3=0;
26
 
27
        unsigned int sndlen=14+3+((unsigned int)(148*num/8));
28
        unsigned int rcvlen=14+3+((unsigned int)(156.25*num/8))+1;
29
 
30
        unsigned char sndbuf[sndlen];   //6+6+2+3+8*148
31
        unsigned char rcvbuf[rcvlen];   //actually is 96 = 6+6+2+3+[4*156.25]+1
32
 
33
        unsigned char* sndlentype = sndbuf + 12;
34
        unsigned char* sndframenumber = sndbuf + 14;
35
        unsigned char* snddata = sndbuf + 17;
36
 
37
        unsigned char* rcvlentype = rcvbuf + 12;
38
        unsigned char* rcvframenumber = rcvbuf + 14;
39
        unsigned char* rcvdata = rcvbuf + 17;
40
 
41
        unsigned char* temppoint;
42
 
43
        int mSocketFD;
44
        struct ifreq ifstruct;
45
        struct sockaddr_ll sll;
46
        int retval = 0;
47
 
48
        struct timeval testtime;
49
        long int usec2, usec1;
50
 
51
        memcpy(sndbuf, sndhead, 14);
52
 
53
        // create
54
        mSocketFD = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
55
        if (mSocketFD < 0){
56
                perror("socket()");
57
        }
58
 
59
        //struct ifreq ifstruct;
60
        strcpy(ifstruct.ifr_name, "eth2");
61
        retval = ioctl(mSocketFD, SIOCGIFINDEX, &ifstruct);
62
        if(retval == -1){
63
                perror("RAWSocket::open(): ioctl()");
64
        }
65
 
66
        //struct sockaddr_ll sll;
67
        memset(&sll, 0, sizeof(sll));
68
        sll.sll_family = AF_PACKET;
69
        sll.sll_protocol = htons(ETH_P_ALL);
70
        sll.sll_ifindex = ifstruct.ifr_ifindex;
71
 
72
        // bind
73
        retval = bind(mSocketFD, (struct sockaddr *)&sll, sizeof(sll));
74
        if(retval == -1)
75
        {
76
                perror("RAWSocket::open(): bind()");
77
        }
78
 
79
        // set recive buffer size
80
        //int rcvbuflen = BUFFER_SIZE;
81
        int rcvbuflen = 4000;//442;//221;
82
        retval = setsockopt(mSocketFD, SOL_SOCKET, SO_RCVBUF, (char *)&rcvbuflen, sizeof(int));
83
        if (retval == -1)
84
        {
85
                perror("RAWSocket::read(): setsockopt()");
86
        }
87
        // set send buffer size
88
        //int sndbuflen = BUFFER_SIZE;
89
        int sndbuflen = 15000;
90
        retval = setsockopt(mSocketFD, SOL_SOCKET, SO_SNDBUF, (char *)&sndbuflen, sizeof(int));
91
        if (retval == -1)
92
        {
93
                perror("RAWSocket::read(): setsockopt()");
94
        }
95
 
96
        frame_number = 0;
97
        sndframenumber[0] = frame_number;
98
        sndframenumber[1] = frame_number >> 8;
99
        sndframenumber[2] = frame_number >> 16;
100
 
101
        temppoint=snddata;
102
        for(int i=0; i< sndlen-17; i++){
103
                if(frame_number%2==0)
104
                        *temppoint=0;//((((unsigned char)frame_number)&0x07)<<4)|(((unsigned char)frame_number)&0x07);
105
                else
106
                        *temppoint= 0xff;
107
                temppoint++;
108
        }
109
 
110
        retval = send(mSocketFD, sndbuf, sndlen, 0);
111
        if (retval < 0)
112
        {
113
                perror("sendto()");
114
        }
115
 
116
        while( (frame_cnt>=0)&&( (retval = recv(mSocketFD, (void*)rcvbuf, rcvlen, 0)) >=0) ) {
117
 
118
                //printf("received data length: %d\n", retval);
119
 
120
                if (retval < 42){
121
                        perror("recvfrom():");
122
                        break;
123
                }
124
 
125
 
126
                fn3 = fn2;      fn2 = fn1;
127
                fn1 = (long int)(rcvbuf[16]<<16) + (rcvbuf[15]<<8) + rcvbuf[14];
128
                long int temp;
129
 
130
 
131
                frame_number ++;  frame_cnt--;
132
                        sndframenumber[0] = frame_number;
133
                        sndframenumber[1] = frame_number >> 8;
134
                        sndframenumber[2] = frame_number >> 16;
135
 
136
                if (memcmp(mac_fpga, rcvbuf+6, 6) == 0)
137
                {
138
                        gettimeofday(&testtime, NULL);
139
                        usec2=usec1;
140
                        usec1=testtime.tv_usec;
141
 
142
                        temp=(usec1+1000000-usec2)%1000000;
143
                        printf("%5ld\t%5ld\t%5ld\t%x", temp, fn2, fn1, fn1&0x07);
144
 
145
                        if( fn2+1 != fn1){
146
                                printf("\t%5ld\t*\n",frame_number);
147
                                error_cnt++;
148
                        }else printf("\t%5ld\n", frame_number);
149
 
150
                        printdata(NULL, rcvbuf,rcvlen);
151
 
152
                        temppoint=snddata;
153
                        for(int i=0; i< sndlen-17; i++){
154
                                if(frame_number%2==0)
155
                                        *temppoint=0;//((((unsigned char)frame_number)&0x07)<<4)|(((unsigned char)frame_number)&0x07);
156
                                else
157
                                        *temppoint= 0xff;
158
                                temppoint++;
159
                        }
160
 
161
                        retval = send(mSocketFD, sndbuf, sndlen, 0);
162
                        if (retval < 0) perror("sendto()");
163
                }
164
 
165
        }
166
        printf("the total number of wrong frames is:%d\n", error_cnt);
167
}
168
 
169
 
170
void printdata(char* str, unsigned char* buf1, int size)
171
{
172
        unsigned char temp=0;
173
        unsigned int i;
174
        unsigned char* buf=buf1;
175
 
176
        i=0;
177
        printf("%s:\n",str);
178
        if(size==0){
179
                printf("\t\tNot data!\n");
180
        }else{
181
                printf("\t\t");
182
                while((size>0)&&(i<512))
183
                {
184
                        printf(" %02x",*buf);
185
                        temp++; size--; buf++; i++;
186
                        if(!(temp & 3))
187
                        {
188
                                if(temp==16)
189
                                {
190
                                        temp=0;
191
                                        printf("\n\t\t");
192
                                }else
193
                                        printf(" ");
194
                        }
195
                }
196
                printf("\n");
197
        }
198
}
199
 

powered by: WebSVN 2.1.0

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