1 //******************************************************************
3 // copyright 2014 intel corporation all rights reserved.
4 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 #include <sys/socket.h>
8 #include <sys/select.h>
10 #include <netinet/in.h>
20 #include <linux/if_link.h>
24 //static uint8_t MULTICAST_IP_ADDR[] = {224, 0, 1, 187};
25 //static uint32_t TEST_PORT_NUM = 8888;
28 #define MAX_BUF (1024)
30 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
31 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
32 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
33 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
34 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
35 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
36 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
37 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
38 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
39 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
40 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
41 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
42 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
43 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
44 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
45 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
46 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
47 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
48 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
49 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA,
51 uint32_t g_bfrlen = sizeof(g_bfr);
53 int multicast_test(int argc, char* argv[])
57 int set_option_on = 1;
58 struct sockaddr_in mcastsock, peer;
59 uint8_t recvbuf[MAX_BUF];
60 uint32_t len, bufLen, fromlen;
62 printf("Running multicast tests\n");
64 bufLen = atoi(argv[4]);
65 if (bufLen > g_bfrlen) {
66 printf("Warning: Input buffer provided too big. Trimming to supported size\n");
70 //Create a datagram socket on which to send.
71 sfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
73 printf("Error in opening datagram socket");
77 //Initialize the group sockaddr structure with a
78 memset((char *) &mcastsock, 0, sizeof(mcastsock));
79 mcastsock.sin_family = AF_INET;
80 mcastsock.sin_addr.s_addr = inet_addr(argv[2]);
81 mcastsock.sin_port = htons(atoi(argv[3]));
83 //Disable loopback so you do not receive your own datagrams.
84 if (setsockopt(sfd, IPPROTO_IP, IP_MULTICAST_LOOP,
85 (char *)&loopch, sizeof(loopch)) < 0) {
86 //printf("setting IP_MULTICAST_LOOP:");
91 //Play nice with other processes who may be listening at this
92 //port/IP address combination
93 if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char*) &set_option_on,
94 sizeof(set_option_on)) < 0) {
95 //printf("setting SO_REUSEADDR:");
100 if (bind(sfd, (sockaddr*)&mcastsock, sizeof(mcastsock)) < 0) {
101 printf("bind returns error");
107 memset(&mreq, 0, sizeof(struct ip_mreq));
108 mreq.imr_interface.s_addr = htonl(INADDR_ANY);
109 mreq.imr_multiaddr.s_addr = mcastsock.sin_addr.s_addr;
110 if ((setsockopt(sfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq, sizeof(mreq))) < 0) {
111 printf("multicast -- adding membership failed");
117 len = sendto(sfd, g_bfr, bufLen, 0,
118 (struct sockaddr*)&mcastsock, sizeof(mcastsock));
120 printf ("Send %d bytes to %s\n", len, inet_ntoa(mcastsock.sin_addr));
123 fromlen = sizeof(peer);
124 len = recvfrom(sfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*)&peer, &fromlen);
126 printf("Rcvd %d bytes from %s\n", len, inet_ntoa(peer.sin_addr));
139 int unicast_test(int argc, char* argv[])
142 struct sockaddr_in sa, peer;
143 uint8_t recvbuf[MAX_BUF];
144 uint32_t len, bufLen, fromlen;
146 printf("Running unicast tests\n");
148 bufLen = atoi(argv[4]);
149 if (bufLen > g_bfrlen) {
150 printf("Warning: Input buffer provided too big. Trimming to supported size\n");
154 sfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
156 printf("socket API ret val %d\n", sfd);
160 sa.sin_family = AF_INET;
161 sa.sin_addr.s_addr = INADDR_ANY;
162 sa.sin_port = htons(atoi(argv[3]));
164 if (bind(sfd, (struct sockaddr*)&sa, sizeof(sa)) < 0) {
165 printf("bin API ret val %d\n", sfd);
170 peer.sin_family = AF_INET;
171 inet_aton(argv[2], &peer.sin_addr);
172 peer.sin_port = htons(atoi(argv[3]));
175 len = sendto(sfd, g_bfr, bufLen, 0,
176 (struct sockaddr*)&peer, sizeof(peer));
179 printf ("Send %d bytes to %s\n", len, inet_ntoa(peer.sin_addr));
182 fromlen = sizeof(peer);
183 len = recvfrom(sfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*)&peer, &fromlen);
185 printf("Rcvd %d bytes from %s\n", len, inet_ntoa(peer.sin_addr));
198 int main(int argc, char * argv[])
202 printf("Usage: sendrecv <u|m> <ipAddr 192.168.1.107 | 224.0.1.187> <portnum 8888> <pkt_size 200>\n");
206 if (argv[1][0] == 'u') {
207 unicast_test(argc, argv);
209 multicast_test(argc, argv);