summaryrefslogtreecommitdiffstats
path: root/src/vnet/session/stream_session.h
blob: b484efefa013edfe60d9c36f3e3d0494b649abb3 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * Copyright (c) 2017 Cisco and/or its affiliates.
 * 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 SRC_VNET_SESSION_STREAM_SESSION_H_
#define SRC_VNET_SESSION_STREAM_SESSION_H_

#include <vnet/vnet.h>
#include <svm/svm_fifo.h>
#include <vnet/session/transport.h>

typedef u8 session_type_t;

/*
 * Application session state
 */
typedef enum
{
  SESSION_STATE_LISTENING,
  SESSION_STATE_CONNECTING,
  SESSION_STATE_ACCEPTING,
  SESSION_STATE_READY,
  SESSION_STATE_CONNECTING_READY,
  SESSION_STATE_CLOSED,
  SESSION_STATE_N_STATES,
} stream_session_state_t;

typedef struct _stream_session_t
{
  /** fifo pointers. Once allocated, these do not move */
  svm_fifo_t *server_rx_fifo;
  svm_fifo_t *server_tx_fifo;

  /** Type */
  session_type_t session_type;

  /** State */
  volatile u8 session_state;

  u8 thread_index;

  /** To avoid n**2 "one event per frame" check */
  u8 enqueue_epoch;

  /** svm segment index where fifos were allocated */
  u32 svm_segment_index;

  /** Session index in per_thread pool */
  u32 session_index;

  /** Transport specific */
  u32 connection_index;

  /** stream server pool index */
  u32 app_index;

  /** Parent listener session if the result of an accept */
  u32 listener_index;

    CLIB_CACHE_LINE_ALIGN_MARK (pad);
} stream_session_t;

typedef struct _session_endpoint
{
  /*
   * Network specific
   */
#define _(type, name) type name;
  foreach_transport_connection_fields
#undef _
    /*
     * Session specific
     */
  u8 transport_proto;	/**< transport protocol for session */
} session_endpoint_t;

#define SESSION_IP46_ZERO		\
{					\
    .ip6 = {				\
	{ 0, 0, },			\
    },					\
}
#define SESSION_ENDPOINT_NULL 		\
{					\
  .sw_if_index = ENDPOINT_INVALID_INDEX,	\
  .ip = SESSION_IP46_ZERO,		\
  .fib_index = ENDPOINT_INVALID_INDEX,	\
  .is_ip4 = 0,				\
  .port = 0,				\
  .transport_proto = 0,			\
}

#define session_endpoint_to_transport(_sep) ((transport_endpoint_t *)_sep)

always_inline u8
session_endpoint_fib_proto (session_endpoint_t * sep)
{
  return sep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
}

#endif /* SRC_VNET_SESSION_STREAM_SESSION_H_ */

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->next; value = elt->value; } fformat (stdout, "Dump reverse links\n"); elt_index = head->prev; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->prev; value = elt->value; } fformat (stdout, "remove first element\n"); elt_index = clib_dlist_remove_head (tm->test_pool, head_index); elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "removed index %d value %d\n", elt_index, elt->value); head = pool_elt_at_index (tm->test_pool, head_index); fformat (stdout, "Dump forward links\n"); elt_index = head->next; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->next; value = elt->value; } fformat (stdout, "Dump reverse links\n"); elt_index = head->prev; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->prev; value = elt->value; } fformat (stdout, "re-insert index %d value %d at head\n", 1, 1); clib_dlist_addhead (tm->test_pool, head_index, 1); fformat (stdout, "Dump forward links\n"); elt_index = head->next; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->next; value = elt->value; } fformat (stdout, "Dump reverse links\n"); elt_index = head->prev; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->prev; value = elt->value; } fformat (stdout, "Remove middle element\n"); clib_dlist_remove (tm->test_pool, 2); elt = pool_elt_at_index (tm->test_pool, 2); fformat (stdout, "removed index %d value %d\n", elt_index, elt->value); fformat (stdout, "Dump forward links\n"); elt_index = head->next; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->next; value = elt->value; } fformat (stdout, "Dump reverse links\n"); elt_index = head->prev; i = 1; value = 0; while (value != ~0) { elt = pool_elt_at_index (tm->test_pool, elt_index); fformat (stdout, "elt %d value %d\n", i++, elt->value); elt_index = elt->prev; value = elt->value; } return 0; } #ifdef CLIB_UNIX int main (int argc, char *argv[]) { unformat_input_t i; int ret; clib_mem_init (0, 3ULL << 30); unformat_init_command_line (&i, argv); ret = test_dlist_main (&i); unformat_free (&i); return ret; } #endif /* CLIB_UNIX */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */