FD.io VPP  v21.01.1
Vector Packet Processing
sock_test.h
Go to the documentation of this file.
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  */
static int sock_test_read(int fd, uint8_t *buf, uint32_t nbytes, vcl_test_stats_t *stats)
Definition: sock_test.h:54
Optimized string handling code, including c11-compliant "safe C library" variants.
uint32_t rx_eagain
Definition: vcl_test.h:104
#define stfail(_fn)
Definition: sock_test.h:46
static int sock_test_write(int fd, uint8_t *buf, uint32_t nbytes, vcl_test_stats_t *stats, uint32_t verbose)
Definition: sock_test.h:87
uint32_t rx_incomp
Definition: vcl_test.h:105
uint64_t tx_bytes
Definition: vcl_test.h:107
uint64_t tx_xacts
Definition: vcl_test.h:106
#define stinf(_fmt, _args...)
Definition: sock_test.h:32
uint32_t tx_eagain
Definition: vcl_test.h:108
uint32_t tx_incomp
Definition: vcl_test.h:109
uint64_t rx_bytes
Definition: vcl_test.h:103
uint64_t rx_xacts
Definition: vcl_test.h:102