hsa: refactor socket client app
[vpp.git] / src / plugins / hs_apps / vcl / sock_test.h
1 /*
2  * Copyright (c) 2017-2019 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef __sock_test_h__
17 #define __sock_test_h__
18
19 #include <netdb.h>
20 #include <errno.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <hs_apps/vcl/vcl_test.h>
24
25 #define SOCK_TEST_AF_UNIX_FILENAME    "/tmp/ldp_server_af_unix_socket"
26 #define SOCK_TEST_MIXED_EPOLL_DATA    "Hello, world! (over an AF_UNIX socket)"
27 #define SOCK_TEST_AF_UNIX_ACCEPT_DATA 0xaf0000af
28 #define SOCK_TEST_AF_UNIX_FD_MASK     0x00af0000
29 #define SOCK_TEST_BANNER_STRING \
30   "============================================\n"
31
32 #define stinf(_fmt, _args...)                                           \
33   printf ("st: " _fmt "\n", ##_args)
34 #define stwrn(_fmt, _args...)                                           \
35   printf ("WARNING: " _fmt "\n", ##_args)
36 #define sterr(_fn, _rv)                                                 \
37 {                                                                       \
38   errno = -_rv;                                                         \
39   printf ("\nERROR: " _fn " failed (errno = %d)!\n", -_rv);             \
40 }
41 #define stabrt(_fmt, _args...)                                          \
42 {                                                                       \
43   printf ("\nERROR: " _fmt "\n", ##_args);                              \
44   exit (1);                                                             \
45 }
46 #define stfail(_fn)                                                     \
47 {                                                                       \
48   perror ("ERROR when calling " _fn);                                   \
49   printf ("\nERROR: " _fn " failed (errno = %d)!\n", errno);            \
50   exit (1);                                                             \
51 }
52
53 static inline int
54 sock_test_read (int fd, uint8_t * buf, uint32_t nbytes,
55                 vcl_test_stats_t * stats)
56 {
57   int rx_bytes;
58
59   do
60     {
61       if (stats)
62         stats->rx_xacts++;
63       rx_bytes = read (fd, buf, nbytes);
64       if (stats)
65         {
66           if ((rx_bytes == 0) ||
67               ((rx_bytes < 0)
68                && ((errno == EAGAIN) || (errno == EWOULDBLOCK))))
69             stats->rx_eagain++;
70           else if (rx_bytes < nbytes)
71             stats->rx_incomp++;
72         }
73     }
74   while ((rx_bytes == 0) ||
75          ((rx_bytes < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK))));
76
77   if (rx_bytes < 0)
78     stfail ("sock_test_read()");
79
80   if (stats)
81     stats->rx_bytes += rx_bytes;
82
83   return (rx_bytes);
84 }
85
86 static inline int
87 sock_test_write (int fd, uint8_t * buf, uint32_t nbytes,
88                  vcl_test_stats_t * stats, uint32_t verbose)
89 {
90   int tx_bytes = 0, nbytes_left = nbytes, rv;
91
92   do
93     {
94       if (stats)
95         stats->tx_xacts++;
96       rv = write (fd, buf, nbytes_left);
97       if (rv < 0)
98         {
99           if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
100             {
101               if (stats)
102                 stats->tx_eagain++;
103               continue;
104             }
105           else
106             break;
107         }
108       tx_bytes += rv;
109
110       if (tx_bytes != nbytes)
111         {
112           nbytes_left = nbytes_left - rv;
113           if (stats)
114             stats->tx_incomp++;
115           if (verbose)
116             {
117               stinf ("bytes written (%d) != bytes to write (%d)!\n", tx_bytes,
118                      nbytes);
119             }
120         }
121
122     }
123   while (tx_bytes != nbytes);
124
125   if (tx_bytes < 0)
126     stfail ("sock_test_write()");
127
128   if (stats)
129     stats->tx_bytes += tx_bytes;
130
131   return (tx_bytes);
132 }
133
134 #endif /* __sock_test_h__ */
135
136 /*
137  * fd.io coding-style-patch-verification: ON
138  *
139  * Local Variables:
140  * eval: (c-set-style "gnu")
141  * End:
142  */