30 #include <netinet/in.h>
35 #include <sys/socket.h>
36 #include <sys/types.h>
40 #define HWPORT "65000"
41 #define MAXBUFLEN 1492
43 #define __COUT__ std::cout
44 #define __E__ std::endl
47 void* get_in_addr(
struct sockaddr* sa)
49 if(sa->sa_family == AF_INET)
51 return &(((
struct sockaddr_in*)sa)->sin_addr);
54 return &(((
struct sockaddr_in6*)sa)->sin6_addr);
57 int makeSocket(
char* ip,
int )
60 struct addrinfo hints, *servinfo, *p;
67 memset(&hints, 0,
sizeof hints);
68 hints.ai_family = AF_UNSPEC;
69 hints.ai_socktype = SOCK_DGRAM;
71 if((rv = getaddrinfo(ip, HWPORT, &hints, &servinfo)) != 0)
73 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
78 for(p = servinfo; p != NULL; p = p->ai_next)
80 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
91 fprintf(stderr,
"sw: failed to create socket\n");
95 freeaddrinfo(servinfo);
100 int main(
int argc,
char* argv[])
107 struct addrinfo hints, *servinfo, *p;
110 struct sockaddr_storage their_addr;
112 char s[INET6_ADDRSTRLEN];
116 fprintf(stderr,
"usage: ./sw <hostname/ip> <type-of-test> <debug>\n");
120 memset(&hints, 0,
sizeof hints);
121 hints.ai_family = AF_UNSPEC;
122 hints.ai_socktype = SOCK_DGRAM;
124 if((rv = getaddrinfo(argv[1], HWPORT, &hints, &servinfo)) != 0)
126 fprintf(stderr,
"getaddrinfo: %s\n", gai_strerror(rv));
131 for(p = servinfo; p != NULL; p = p->ai_next)
133 if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1)
135 perror(
"sw: socket");
144 fprintf(stderr,
"sw: failed to create socket\n");
148 freeaddrinfo(servinfo);
154 char buff[MAXBUFLEN];
155 unsigned int packetSz;
157 std::cout <<
"sw: Line " << __LINE__ <<
":::"
158 <<
"Type of Test: " << type <<
" debug=" << debug << std::endl;
160 int type = atoi(argv[2]);
163 sscanf(argv[3],
"0x%llX", &addr);
166 const unsigned int RX_ADDR_OFFSET = 2;
167 const unsigned int RX_DATA_OFFSET = 10;
168 const unsigned int TX_DATA_OFFSET = 2;
175 sscanf(argv[4],
"0x%llX", &val);
176 cout <<
"====== WRITE "
177 <<
"| addr: 0x" << hex << setw(12) << addr <<
" %d " << dec << setw(10)
178 << addr <<
" \t| write-val: 0x" << hex << setw(12) << val <<
" %d " << dec
179 << setw(10) << val << endl;
196 addr = 0x040000010f000400;
197 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
199 addr = 0x0000000000000000;
200 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
202 addr = 0x0000000000000000;
203 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
205 addr = 0x0100000000000000;
206 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
208 addr = 0x0400000000000000;
209 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
211 memcpy((
void*)&buff[packetSz], (
void*)&val, 4);
216 std::cout <<
"sw: Line " << __LINE__ <<
":::"
217 <<
"Number of packets expecting: " << sz << std::endl;
219 unsigned long long qwords = 0;
221 sendto(sockfd, buff, packetSz, 0, p->ai_addr, p->ai_addrlen)) == -1)
223 perror(
"sw: sendto");
230 for(
int i = 0; i < sz; ++i)
233 std::cout <<
"sw: Line " << __LINE__ <<
":::"
234 <<
"Received " << qwords
235 <<
" qwords. Waiting for data packet: " << i <<
" of " << sz
240 if((numbytes = recvfrom(sockfd,
244 (
struct sockaddr*)&their_addr,
250 qwords += (numbytes - 40) / 8;
253 printf(
"sw: got read response from %s\n",
254 inet_ntop(their_addr.ss_family,
255 get_in_addr((
struct sockaddr*)&their_addr),
258 printf(
"sw: packet is %d bytes long\n", numbytes);
259 printf(
"recv packet contents: ");
261 for(
int i = 0; i < numbytes; ++i)
263 printf(
"%2.2X", (
unsigned char)buff[i]);
269 memcpy((
void*)&val, (
void*)&buff[TX_DATA_OFFSET], 8);
270 std::cout <<
"sw: Line " << __LINE__ <<
":::"
271 <<
"Value read: " << val << std::endl;
273 __COUT__ <<
"Got all " << sz <<
" packet(s)." << __E__;
282 unsigned int defaultSocketReceiveSize_ = 0x10000;
283 unsigned int socketReceiveBufferSize = 1 << 26;
285 __COUT__ <<
"Setting socket receive buffer size = " << socketReceiveBufferSize
286 <<
" 0x" << std::hex << socketReceiveBufferSize << std::dec << __E__;
287 if(setsockopt(sockfd,
290 (
char*)&socketReceiveBufferSize,
291 sizeof(socketReceiveBufferSize)) < 0)
293 __COUT__ <<
"Failed to set socket receive size to "
294 << socketReceiveBufferSize
295 <<
". Attempting to revert to default." << std::endl;
297 socketReceiveBufferSize = defaultSocketReceiveSize_;
299 __COUT__ <<
"Setting socket receive buffer size = "
300 << socketReceiveBufferSize <<
" 0x" << std::hex
301 << socketReceiveBufferSize << std::dec << __E__;
302 if(setsockopt(sockfd,
305 (
char*)&socketReceiveBufferSize,
306 sizeof(socketReceiveBufferSize)) < 0)
308 __COUT__ <<
"Failed to set socket receive size to "
309 << socketReceiveBufferSize
310 <<
". Attempting to revert to default." << std::endl;
329 addr = 0x020000010f000400;
330 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
332 addr = 0x0000000000000000;
333 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
335 addr = 0x0000000000000000;
336 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
338 addr = 0x80841e0000000000;
339 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
341 addr = 0x0000000000000000;
342 memcpy((
void*)&buff[packetSz], (
void*)&addr, 8);
346 2000000 / 179 / 2 + 1;
347 std::cout <<
"sw: Line " << __LINE__ <<
":::"
348 <<
"Number of packets expecting: " << sz << std::endl;
350 unsigned long long qwords = 0;
352 sendto(sockfd, buff, packetSz, 0, p->ai_addr, p->ai_addrlen)) == -1)
354 perror(
"sw: sendto");
362 for(
int i = 0; i < sz; ++i)
365 std::cout <<
"sw: Line " << __LINE__ <<
":::"
366 <<
"Received " << qwords
367 <<
" qwords. Waiting for data packet: " << i <<
" of " << sz
372 if((numbytes = recvfrom(sockfd,
376 (
struct sockaddr*)&their_addr,
382 qwords += (numbytes - 40) / 8;
385 printf(
"sw: got read response from %s\n",
386 inet_ntop(their_addr.ss_family,
387 get_in_addr((
struct sockaddr*)&their_addr),
390 printf(
"sw: packet is %d bytes long\n", numbytes);
391 printf(
"recv packet contents: ");
393 for(
int i = 0; i < numbytes; ++i)
395 printf(
"%2.2X", (
unsigned char)buff[i]);
401 memcpy((
void*)&val, (
void*)&buff[TX_DATA_OFFSET], 8);
402 std::cout <<
"sw: Line " << __LINE__ <<
":::"
403 <<
"Value read: " << val << std::endl;
405 __COUT__ <<
"Got all " << sz <<
" packet(s)." << __E__;
410 std::cout <<
"sw: Line " << __LINE__ <<
":::"
411 <<
"INVALID Type of Test: " << type << std::endl;