FD.io VPP  v19.01.3-6-g70449b9b9
Vector Packet Processing
test.c
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * test.c
4  *
5  * Copyright (c) 2016 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <sys/mman.h>
24 #include <sys/stat.h>
25 #include <netinet/in.h>
26 #include <netdb.h>
27 
28 #include <time.h> /* time_t, time (for timestamp in second) */
29 #include <sys/timeb.h> /* ftime, timeb (for timestamp in millisecond) */
30 #include <sys/time.h> /* gettimeofday, timeval (for timestamp in microsecond) */
31 
32 #include <vnet/vnet.h>
33 #include <vlib/vlib.h>
34 #include <vlib/unix/unix.h>
35 #include <vlibapi/api.h>
36 
37 #include <vpp/api/vpe_msg_enum.h>
38 #include <signal.h>
39 #include "vppapiclient.h"
40 
41 #define vl_typedefs /* define message structures */
42 #include <vpp/api/vpe_all_api_h.h>
43 #undef vl_typedefs
44 
45 /* we are not linking with vlib */
48 
49 volatile int sigterm_received = 0;
50 volatile u32 result_ready;
51 volatile u16 result_msg_id;
52 
53 /* M_NOALLOC: construct, but don't yet send a message */
54 
55 #define M_NOALLOC(T,t) \
56  do { \
57  result_ready = 0; \
58  clib_memset (mp, 0, sizeof (*mp)); \
59  mp->_vl_msg_id = ntohs (VL_API_##T); \
60  mp->client_index = am->my_client_index; \
61  } while(0);
62 
63 
64 
65 void
66 wrap_vac_callback (unsigned char *data, int len)
67 {
68  //printf("Callback %d\n", len);
69  result_ready = 1;
70  result_msg_id = ntohs(*((u16 *)data));
71 }
72 
73 static void
75 {
76  static int i;
77  int rv = vac_connect("vac_client", NULL, wrap_vac_callback, 32 /* rx queue-length*/);
78  if (rv != 0) {
79  printf("Connect failed: %d\n", rv);
80  exit(rv);
81  }
82  printf(".");
84  i++;
85 }
86 
87 static void
89 {
90  api_main_t * am = &api_main;
91  vl_api_show_version_t message;
93  int async = 1;
94 
95  int rv = vac_connect("vac_client", NULL, wrap_vac_callback, 32 /* rx queue-length*/);
96  if (rv != 0) {
97  printf("Connect failed: %d\n", rv);
98  exit(rv);
99  }
100  struct timeb timer_msec;
101  long long int timestamp_msec_start; /* timestamp in millisecond. */
102  if (!ftime(&timer_msec)) {
103  timestamp_msec_start = ((long long int) timer_msec.time) * 1000ll +
104  (long long int) timer_msec.millitm;
105  }
106  else {
107  timestamp_msec_start = -1;
108  }
109 
110 
111  /*
112  * Test vpe_api_write and vpe_api_read to send and recv message for an
113  * API
114  */
115  int i;
116  long int no_msgs = 10000;
117  mp = &message;
118 
119  for (i = 0; i < no_msgs; i++) {
120  /* Construct the API message */
121  M_NOALLOC(SHOW_VERSION, show_version);
122  vac_write((char *)mp, sizeof(*mp));
123 #ifndef __COVERITY__
124  /* As given, async is always 1. Shut up Coverity about it */
125  if (!async)
126  while (result_ready == 0);
127 #endif
128  }
129  if (async) {
130  vl_api_control_ping_t control;
132  mp = &control;
133  M_NOALLOC(CONTROL_PING, control_ping);
134  vac_write((char *)mp, sizeof(*mp));
135 
136  while (result_msg_id != VL_API_CONTROL_PING_REPLY);
137  }
138 
139  long long int timestamp_msec_end; /* timestamp in millisecond. */
140  if (!ftime(&timer_msec)) {
141  timestamp_msec_end = ((long long int) timer_msec.time) * 1000ll +
142  (long long int) timer_msec.millitm;
143  }
144  else {
145  timestamp_msec_end = -1;
146  }
147 
148  printf("Took %lld msec, %lld msgs/msec \n", (timestamp_msec_end - timestamp_msec_start),
149  no_msgs/(timestamp_msec_end - timestamp_msec_start));
150  printf("Exiting...\n");
151  vac_disconnect();
152 }
153 
154 int main (int argc, char ** argv)
155 {
156  int i;
157 
158  for (i = 0; i < 1000; i++) {
159  test_connect();
160  }
161  test_messages();
162  exit (0);
163 }
int main(int argc, char **argv)
Definition: test.c:154
#define M_NOALLOC(T, t)
Definition: test.c:55
Control ping from client to api server request.
Definition: vpe.api:60
#define NULL
Definition: clib.h:58
static void test_connect()
Definition: test.c:74
int i
void wrap_vac_callback(unsigned char *data, int len)
Definition: test.c:66
int vac_write(char *p, int l)
Definition: client.c:531
unsigned int u32
Definition: types.h:88
volatile u16 result_msg_id
Definition: test.c:51
volatile u32 result_ready
Definition: test.c:50
int vac_connect(char *name, char *chroot_prefix, vac_callback_t cb, int rx_qlen)
Definition: client.c:318
int vac_disconnect(void)
Definition: client.c:387
unsigned short u16
Definition: types.h:57
u8 len
Definition: ip_types.api:49
API main structure, used by both vpp and binary API clients.
Definition: api_common.h:202
static void test_messages(void)
Definition: test.c:88
show version
Definition: vpe.api:170
vlib_main_t ** vlib_mains
Definition: test.c:47
volatile int sigterm_received
Definition: test.c:49
vlib_main_t vlib_global_main
Definition: test.c:46
api_main_t api_main
Definition: api_shared.c:35