summaryrefslogtreecommitdiffstats
path: root/src/vnet/tcp/builtin_proxy.h
blob: c8cde5f70e6f3f0bac49c7999ee4660a671a083c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
 * builtin_proxy.h - skeleton vpp engine plug-in header file
 *
 * Copyright (c) <current-year> <your-organization>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef __included_builtin_proxy_h__
#define __included_builtin_proxy_h__

#include <vnet/vnet.h>
#include <vnet/ip/ip.h>
#include <vnet/ethernet/ethernet.h>

#include <vppinfra/hash.h>
#include <vppinfra/error.h>
#include <vlibmemory/unix_shared_memory_queue.h>
#include <svm/svm_fifo_segment.h>
#include <vnet/session/session.h>
#include <vnet/session/application_interface.h>

typedef struct
{
  svm_fifo_t *server_rx_fifo;
  svm_fifo_t *server_tx_fifo;

  u64 vpp_server_handle;
  u64 vpp_active_open_handle;
} proxy_session_t;

typedef struct
{
  unix_shared_memory_queue_t *vl_input_queue;	/**< vpe input queue */
  /** per-thread vectors */
  unix_shared_memory_queue_t **server_event_queue;
  unix_shared_memory_queue_t **active_open_event_queue;
  u8 **rx_buf;				/**< intermediate rx buffers */

  u32 cli_node_index;			/**< cli process node index */
  u32 server_client_index;		/**< server API client handle */
  u32 server_app_index;			/**< server app index */
  u32 active_open_client_index;		/**< active open API client handle */
  u32 active_open_app_index;		/**< active open index after attach */

  uword *proxy_session_by_server_handle;
  uword *proxy_session_by_active_open_handle;

  /*
   * Configuration params
   */
  u8 *connect_uri;			/**< URI for slave's connect */
  u32 configured_segment_size;
  u32 fifo_size;
  u32 private_segment_count;		/**< Number of private fifo segs */
  u32 private_segment_size;		/**< size of private fifo segs */
  int rcv_buffer_size;

  /*
   * Test state variables
   */
  proxy_session_t *sessions;		/**< Session pool, shared */
  clib_spinlock_t sessions_lock;
  u32 **connection_index_by_thread;
  pthread_t client_thread_handle;

  /*
   * Flags
   */
  u8 is_init;
  u8 prealloc_fifos;		/**< Request fifo preallocation */

  /*
   * Convenience
   */
  vlib_main_t *vlib_main;
  vnet_main_t *vnet_main;
  ethernet_main_t *ethernet_main;
} builtin_proxy_main_t;

extern builtin_proxy_main_t builtin_proxy_main;

#endif /* __included_builtin_proxy_h__ */

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
n> 1); va = clib_pmalloc_alloc_aligned_on_numa (pm, size, align, numa); if (va == 0) clib_error ("Failed to alloc %u byte chunk with align %u on numa %u," "\nerror: %U", size, align, numa, format_clib_error, clib_pmalloc_last_error (pm)); if ((pointer_to_uword (va) & (align - 1)) != 0) clib_error (0, "Alignment error: %p not aligned with %u", va, align); vec_add1 (tm->vas, pointer_to_uword (va)); } fformat (stdout, "%U\n", format_pmalloc, pm, tm->verbose); /* alloc from arena */ if (tm->arena_items) { fformat (stdout, "Allocate %d items from arena ...\n", tm->arena_items); arena = clib_pmalloc_create_shared_arena (pm, "test arena", tm->arena_pages << 21, tm->arena_log2_pg_sz, tm->arena_numa); if (arena == 0) clib_error ("Failed to alloc shared arena: %U", format_clib_error, clib_pmalloc_last_error (pm)); for (i = 0; i < tm->arena_items; i++) { u32 size = tm->item_size ? tm->item_size : 64 + 64 * (i % 8); u32 align = tm->align ? tm->align : 64 << (i % 5); va = clib_pmalloc_alloc_from_arena (pm, arena, size, align); vec_add1 (tm->vas, pointer_to_uword (va)); } fformat (stdout, "\n%U\n", format_pmalloc, pm, tm->verbose); } fformat (stdout, "Freeing %d items ...\n", vec_len (tm->vas)); for (i = 0; i < vec_len (tm->vas); i++) clib_pmalloc_free (pm, (void *) tm->vas[i]); fformat (stdout, "\n%U\n", format_pmalloc, pm, tm->verbose); return 0; } clib_error_t * test_palloc_main (unformat_input_t * i) { test_main_t *tm = &test_main; clib_error_t *error; tm->nitems = 5; tm->arena_pages = 2; tm->arena_numa = CLIB_PMALLOC_NUMA_LOCAL; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "nitems %u", &tm->nitems)) ; else if (unformat (i, "max-numa %u", &tm->max_numa)) ; else if (unformat (i, "item-size %u", &tm->item_size)) ; else if (unformat (i, "align %u", &tm->align)) ; else if (unformat (i, "verbose %d", &tm->verbose)) ; else if (unformat (i, "arena-pages %u", &tm->arena_pages)) ; else if (unformat (i, "arena-numa %u", &tm->arena_numa)) ; else if (unformat (i, "arena-items %u", &tm->arena_items)) ; else if (unformat (i, "arena-log2-page-size %u", &tm->arena_log2_pg_sz)) ; else if (unformat (i, "verbose")) tm->verbose = 1; else return clib_error_return (0, "unknown input '%U'", format_unformat_error, i); } error = test_palloc (tm); return error; } #ifdef CLIB_UNIX int main (int argc, char *argv[]) { unformat_input_t i; int rv = 0; clib_error_t *error; clib_mem_init (0, 3ULL << 30); unformat_init_command_line (&i, argv); error = test_palloc_main (&i); if (error) { clib_error_report (error); rv = 1; } unformat_free (&i); return rv; } #endif /* CLIB_UNIX */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */