18 #include <arpa/inet.h>
21 #include <netinet/in.h>
25 #include <sys/socket.h>
26 #include <sys/types.h>
32 #define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
35 #define __PRINTF__ printf
36 #define __COUT__ cout << __FILENAME__ << std::dec << " [" << __LINE__ << "]\t"
44 #define MAXBUFLEN 1492
45 #define EMULATOR_PORT "4950"
48 void* get_in_addr(
struct sockaddr* sa)
50 if(sa->sa_family == AF_INET)
52 return &(((
struct sockaddr_in*)sa)->sin_addr);
55 return &(((
struct sockaddr_in6*)sa)->sin6_addr);
59 int makeSocket(
const char* ip,
int port,
struct sockaddr_in &ai_addr)
62 struct addrinfo hints, *servinfo, *p;
69 memset(&hints, 0,
sizeof hints);
70 hints.ai_family = AF_UNSPEC;
71 hints.ai_socktype = SOCK_DGRAM;
73 if((rv = getaddrinfo(ip, std::to_string(port).c_str(), &hints, &servinfo)) != 0)
75 __SS__ <<
"getaddrinfo: " << gai_strerror(rv) << __E__;
80 for(p = servinfo; p != NULL; p = p->ai_next)
82 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
84 __COUT_WARN__ <<
"sw: socket failed, trying other address..." << __E__;
93 __SS__ <<
"sw: failed to create socket" << __E__;
98 memcpy(&ai_addr, p->ai_addr,
sizeof(ai_addr));
100 freeaddrinfo(servinfo);
104 int main(
int argc,
char** argv)
106 std::string emulatorPort(EMULATOR_PORT);
108 emulatorPort = argv[1];
110 __COUT__ << std::hex <<
":::"
111 <<
"\n\nUsing emulatorPort=" << emulatorPort <<
"\n"
114 std::string streamToIP;
115 unsigned short streamToPort;
119 struct addrinfo hints, *servinfo, *p;
122 struct sockaddr_storage their_addr;
123 char buff[MAXBUFLEN];
125 char s[INET6_ADDRSTRLEN];
127 memset(&hints, 0,
sizeof hints);
128 hints.ai_family = AF_UNSPEC;
129 hints.ai_socktype = SOCK_DGRAM;
130 hints.ai_flags = AI_PASSIVE;
132 if((rv = getaddrinfo(NULL, emulatorPort.c_str(), &hints, &servinfo)) != 0)
134 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
139 for(p = servinfo; p != NULL; p = p->ai_next)
141 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
143 perror(
"listener: socket");
147 if(bind(sockfd, p->ai_addr, p->ai_addrlen) == -1)
150 perror(
"listener: bind");
159 fprintf(stderr,
"listener: failed to bind socket\n");
161 __COUT__ <<
"\n\nYou can try a different port by passing an argument.\n\n";
166 freeaddrinfo(servinfo);
169 struct sockaddr_in ai_addr;
176 std::stringstream addressSpaceSS;
177 addressSpaceSS <<
"Address space:\n";
178 addressSpaceSS <<
"\t 0x0000000000001001 \t W/R \t 'Data count'\n";
179 addressSpaceSS <<
"\t 0x0000000000001002 \t W/R \t 'Data rate'\n";
180 addressSpaceSS <<
"\t 0x0000000000001003 \t W/R \t 'LEDs'\n";
181 addressSpaceSS <<
"\t 0x0000000100000006 \t W \t 'Stream destination IP'\n";
184 addressSpaceSS <<
"\t 0x0000000100000008 \t W \t 'Stream destination port'\n";
185 addressSpaceSS <<
"\t 0x0000000100000009 \t W/R \t 'Burst data enable'\n";
187 __COUT__ << addressSpaceSS.str() <<
"\n\n";
190 uint64_t data_gen_cnt = 0;
191 uint64_t data_gen_rate = 100;
192 uint8_t led_register = 0;
193 uint8_t dataEnabled = 0;
195 const unsigned int RX_ADDR_OFFSET = 2;
196 const unsigned int RX_DATA_OFFSET = 10;
197 const unsigned int TX_DATA_OFFSET = 2;
199 bool wasDataEnable =
false;
200 unsigned char sequence = 0;
201 unsigned int packetSz;
205 fd_set readfds, masterfds;
209 FD_SET(sockfd, &masterfds);
214 int totalNumberOfBytes;
222 select(sockfd + 1, &readfds, NULL, NULL, &tv);
224 if(FD_ISSET(sockfd, &readfds))
227 __COUT__ << std::hex <<
":::"
228 <<
"Packet Received!" << std::endl;
230 addr_len =
sizeof their_addr;
231 if((totalNumberOfBytes = recvfrom(sockfd,
235 (
struct sockaddr*)&their_addr,
243 <<
"hw: got packet from "
244 << inet_ntop(their_addr.ss_family,
245 get_in_addr((
struct sockaddr*)&their_addr),
250 <<
"hw: packet total is " << totalNumberOfBytes <<
" bytes long"
266 while(handlerIndex < totalNumberOfBytes &&
267 (numberOfBytes = (buff[handlerIndex + 0]
270 handlerIndex + numberOfBytes <= totalNumberOfBytes)
273 <<
"hw: packet byte index " << handlerIndex << std::endl;
275 <<
"hw: packet is " << numberOfBytes <<
" bytes long"
278 for(
int i = 0; i < numberOfBytes; i++)
280 if((i - RX_ADDR_OFFSET) % 8 == 0)
282 __PRINTF__(
"%2.2X", (
unsigned char)buff[handlerIndex + i]);
289 if(numberOfBytes == 10 &&
290 buff[handlerIndex + 0] == 0)
293 memcpy((
void*)&addr, (
void*)&buff[handlerIndex + RX_ADDR_OFFSET], 8);
295 __COUT__ << std::hex <<
":::"
296 <<
"Read address: 0x" << hex << addr;
297 __PRINTF__(
" 0x%16.16lX \n", addr);
300 buff[handlerIndex + 0] = 0;
301 buff[handlerIndex + 1] =
307 memcpy((
void*)&buff[handlerIndex + TX_DATA_OFFSET],
308 (
void*)&data_gen_cnt,
310 __COUT__ << std::hex <<
":::"
311 <<
"Read data count: 0x" << data_gen_cnt << endl;
314 memcpy((
void*)&buff[handlerIndex + TX_DATA_OFFSET],
315 (
void*)&data_gen_rate,
317 __COUT__ << std::hex <<
":::"
318 <<
"Read data rate: 0x" << data_gen_rate << endl;
321 memset((
void*)&buff[handlerIndex + TX_DATA_OFFSET + 1], 0, 7);
322 memcpy((
void*)&buff[handlerIndex + TX_DATA_OFFSET],
323 (
void*)&led_register,
325 __COUT__ << std::hex <<
":::"
326 <<
"Read LED register: 0x" << (
unsigned int)led_register
329 case 0x0000000100000009:
330 memset((
void*)&buff[handlerIndex + TX_DATA_OFFSET + 1], 0, 7);
331 memcpy((
void*)&buff[handlerIndex + TX_DATA_OFFSET],
334 __COUT__ << std::hex <<
":::"
335 <<
"Read data enable: 0x" << dataEnabled << endl;
338 __COUT__ << std::hex <<
":::"
339 <<
"Unknown read address received." << endl;
342 packetSz = TX_DATA_OFFSET + 8;
343 if((numberOfBytes = sendto(sockfd,
347 (
struct sockaddr*)&their_addr,
348 sizeof(
struct sockaddr_storage))) == -1)
350 perror(
"hw: sendto");
353 __PRINTF__(
"hw: sent %d bytes back. sequence=%d\n",
355 (
unsigned char)buff[handlerIndex + 1]);
357 else if(numberOfBytes >= 18 &&
358 (numberOfBytes - 2) % 8 ==
360 buff[handlerIndex + 0] == 1)
363 memcpy((
void*)&addr, (
void*)&buff[handlerIndex + RX_ADDR_OFFSET], 8);
364 __COUT__ << std::hex <<
":::"
365 <<
"hw: Line " << std::dec << __LINE__ <<
":::"
366 <<
"Write address: 0x" << std::hex << addr;
367 __PRINTF__(
" 0x%16.16lX \n", addr);
372 memcpy((
void*)&data_gen_cnt,
373 (
void*)&buff[handlerIndex + RX_DATA_OFFSET],
375 __COUT__ << std::hex <<
":::"
376 <<
"Write data count: 0x" << data_gen_cnt << endl;
380 memcpy((
void*)&data_gen_rate,
381 (
void*)&buff[handlerIndex + RX_DATA_OFFSET],
383 __COUT__ << std::hex <<
":::"
384 <<
"Write data rate: 0x" << data_gen_rate << endl;
387 memcpy((
void*)&led_register,
388 (
void*)&buff[handlerIndex + RX_DATA_OFFSET],
390 __COUT__ << std::hex <<
":::"
391 <<
"Write LED register: 0x" << (
unsigned int)led_register
395 for(
int l = 0; l < 8; ++l)
396 __COUT__ << ((led_register & (1 << (7 - l))) ?
'*' :
'-');
399 case 0x0000000100000006:
402 struct sockaddr_in socketAddress;
404 (
void*)&ip, (
void*)&buff[handlerIndex + RX_DATA_OFFSET], 4);
406 memcpy((
void*)&socketAddress.sin_addr, (
void*)&ip, 4);
407 streamToIP = inet_ntoa(socketAddress.sin_addr);
408 __COUT__ << std::hex <<
":::"
409 <<
"Stream destination IP: " << streamToIP << std::endl;
410 __COUT__ << streamToIP << std::endl;
413 case 0x0000000100000007:
414 __COUT__ << std::hex <<
":::"
415 <<
"Destination MAC address ignored!" << std::endl;
417 case 0x0000000100000008:
420 memcpy((
void*)&streamToPort,
421 (
void*)&buff[handlerIndex + RX_DATA_OFFSET],
423 __COUT__ << std::hex <<
":::"
424 <<
"Stream destination port: 0x" << streamToPort << dec
425 <<
" " << streamToPort << endl;
430 sendSockfd = makeSocket(streamToIP.c_str(), streamToPort, ai_addr);
433 __COUT__ <<
"************************************************"
436 __COUT__ <<
"************************************************"
439 __COUT__ << std::hex <<
":::"
440 <<
"Streaming to ip: " << streamToIP <<
" port: 0x"
441 << streamToPort << endl;
442 __COUT__ <<
"************************************************"
445 __COUT__ <<
"************************************************"
450 __COUT__ << std::hex <<
":::"
451 <<
"Failed to create streaming socket to ip: "
452 << streamToIP <<
" port: 0x" << streamToPort << endl;
456 case 0x0000000100000009:
457 memcpy((
void*)&dataEnabled,
458 (
void*)&buff[handlerIndex + RX_DATA_OFFSET],
460 __COUT__ << std::hex <<
":::"
461 <<
"Write data enable: 0x" << (int)dataEnabled << endl;
465 __COUT__ << std::hex <<
":::"
466 <<
"Unknown write address received." << endl;
470 __COUT__ << std::hex <<
":::"
471 <<
"ERROR: The formatting of the string received is wrong! "
473 << numberOfBytes <<
" Read/Write " << buff[handlerIndex + 0]
476 handlerIndex += numberOfBytes;
479 __COUT__ << std::hex <<
":::"
481 << addressSpaceSS.str() <<
"\n\n";
495 if(count % data_gen_rate == 0 &&
499 __COUT__ << std::hex <<
":::"
500 <<
"Count: " << count <<
" rate: " << data_gen_rate
501 <<
" packet-counter: " << data_gen_cnt << std::endl;
502 __COUT__ << std::hex <<
":::"
503 <<
"Send Burst at count:" << count << std::endl;
506 wasDataEnable ? 2 : 1;
507 buff[1] = sequence++;
508 memcpy((
void*)&buff[TX_DATA_OFFSET],
514 packetSz = TX_DATA_OFFSET + 8;
523 if((numberOfBytes = sendto(
524 sendSockfd, buff, packetSz, 0, (
struct sockaddr*)&ai_addr,
sizeof(ai_addr)) ==
527 perror(
"Hw: sendto");
530 __PRINTF__(
"hw: sent %d bytes back. sequence=%d\n",
532 (
unsigned char)buff[1]);
534 if(data_gen_cnt != (uint64_t)-1)
538 wasDataEnable =
true;
540 else if(wasDataEnable)
542 wasDataEnable =
false;
543 __COUT__ << std::hex <<
":::"
544 <<
"Send Last in Burst at count:" << count << endl;
547 buff[1] = sequence++;
548 memcpy((
void*)&buff[TX_DATA_OFFSET],
552 packetSz = TX_DATA_OFFSET + 8;
556 if((numberOfBytes = sendto(
557 sendSockfd, buff, packetSz, 0, (
struct sockaddr*)&ai_addr,
sizeof(ai_addr)) ==
560 perror(
"hw: sendto");
563 __PRINTF__(
"hw: sent %d bytes back. sequence=%d\n",
565 (
unsigned char)buff[1]);
568 __COUT__ << std::hex <<
":::"
569 <<
"Send socket not defined." << endl;